!!! Overview
A [How To] [DirXML Examples] on calling Java from a [DirXML] [Policy]

%%information
This was done on IDM 3.5 and eDirectory 8.8.1 so somethings may vary for your implementation.
%%

This is just a simple application to show how to call a java application from Novell's IdM product.

Be sure the [DirXML Script namespace definitions|DirXML Script namespace definitions|target='_blank'] are set within the policy where using the Java call.

You will also need to place the [Java jar files in the correct location.|IDM Location of jar files|target='_blank']

The idea is to supply a [UUID] as defined in [RFC 4122|http://www.faqs.org/rfcs/rfc4122.html].

The [UUID] will be a string and look similar to:
{{{
cd2c0ce6-5d5d-11dc-a188-f53b0a4780f0
}}}

!!!The Policy
The [Example] policy is [Source code] attached to the bottom of page. The file [uuidGenPolicy.xml|IDM Call Java Example/uuidGenPolicy.xml] contains the policy and the output from dstrace.

Shows a [DirXML Example] and [XPATH Example] for working with [{$pagename}].
%%prettify 
{{{
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE policy PUBLIC "policy-builder-dtd"
 "C:\novell\Designer\eclipse\plugins\com.novell.designer.idm.policybuilder_2.0.0.200703152140\DTD\dirxmlscript.dtd">
 <policy xmlns:uuid="http://www.novell.com/nxsl/java/com.willeke.uuid.UUIDGen">
	<rule>
		<description>GUID Generate</description>
		<conditions>
			<and/>
		</conditions>
		<actions>
			<do-set-local-variable name="mac" scope="policy">
				<arg-string>
					<token-text xml:space="preserve">f5:3b:0a:47:80:f0</token-text>
				</arg-string>
			</do-set-local-variable>
			<do-set-local-variable name="myguid" scope="policy">
				<arg-string>
					<token-xpath expression="uuid:genUUID($mac)"/>
				</arg-string>
			</do-set-local-variable>
			<do-trace-message>
				<arg-string>
					<token-text xml:space="preserve">### </token-text>
					<token-local-variable name="myguid"/>
					<token-text xml:space="preserve"> ###</token-text>
				</arg-string>
			</do-trace-message>
		</actions>
	</rule>
</policy>
}}}
/%

!!! Java Code
As our objective is to set a value within [eDirectory] using [DirXML], we want the application to return a string. Although there are a couple of methods in the java code, we are only interested in the "genUUID" method which returns a string.

In the example, we supply a MAC Address as a local variable which could be from a GCV. The value should be a "real" MAC Address of the machine the generator runs on to comply with the RFC.

Here is the [Java] [source code] of the application:
%%prettify 
{{{
/**
 * A wrapper around the Java Uuid Generator (JUG)
 * See: http://jug.safehaus.org/Home
 */
package com.willeke.uuid;

/**
 * @author jim@willeke.com
 */
public class UUIDGen
{
	/**
	 * Just here for fun
	 */
	public UUIDGen(String macaddress)
	{
		System.out.println(genUUID(macaddress));
	}

	/**
	 * @param mac -
	 *            Mac address of Machine
	 * @return - String of UUID
	 */
	public static String genUUID(String mac)
	{
		return org.safehaus.uuid.UUIDGenerator.getInstance().generateTimeBasedUUID(new org.safehaus.uuid.EthernetAddress(mac)).toString();
	}

	/**
	 * Prints to the system console
	 * 
	 * @param macaddress
	 */
	public static void printUUID(String macaddress)
	{
		System.out.println(genUUID(macaddress));
	}

	/*
	 * Just to test with
	 */
	public static void main(String[] args)
	{
		printUUID(args[0]);
	}
}
}}} /%

!! More Information
There might be more information for this subject on one of the following:
[{ReferringPagesPlugin before='*' after='\n' }]
!!!How to make it happen
We generated a [single jar file|Novell IDM Call Java Example/UUIDGeneratorForIDM.jar|DirXML Calling Java Example] with both the com.willeke.uuid class and the files from the jug-lgpl-2.0.0.jar file. For those who want to know, we used Eclipse to write the Java code and the [Fat Jar Plugin|http://fjep.sourceforge.net/].

Copy the jar file to the [correct location for Jars for IDM|IDM Location of jar files]. 

You will have to stop and start the IdM engine for the jar file to be read.

Install the policy and watch it work.

!!!The Output
{{{
12:17:16 964A5BA0 Drvrs: Generic Null ST:Applying policy: Temp.
12:17:16 964A5BA0 Drvrs: Generic Null ST: Applying to modify #1.
12:17:16 964A5BA0 Drvrs: Generic Null ST: Evaluating selection criteria for rule 'GUID Generate'.
12:17:16 964A5BA0 Drvrs: Generic Null ST: Rule selected.
12:17:16 964A5BA0 Drvrs: Generic Null ST: Applying rule 'GUID Generate'.
12:17:16 964A5BA0 Drvrs: Generic Null ST: Action: do-set-local-variable("mac",scope="policy","f5:3b:0a:47:80:f0").
12:17:16 964A5BA0 Drvrs: Generic Null ST: arg-string("f5:3b:0a:47:80:f0")
12:17:16 964A5BA0 Drvrs: Generic Null ST: token-text("f5:3b:0a:47:80:f0")
12:17:16 964A5BA0 Drvrs: Generic Null ST: Arg Value: "f5:3b:0a:47:80:f0".
12:17:16 964A5BA0 Drvrs: Generic Null ST: Action: do-set-local-variable("myguid",scope="policy",token-xpath("uuid:genUUID($mac)")).
12:17:16 964A5BA0 Drvrs: Generic Null ST: arg-string(token-xpath("uuid:genUUID($mac)"))
12:17:16 964A5BA0 Drvrs: Generic Null ST: token-xpath("uuid:genUUID($mac)")
12:17:16 964A5BA0 Drvrs: Generic Null ST: Token Value: "cd2c0ce6-5d5d-11dc-a188-f53b0a4780f0".
12:17:16 964A5BA0 Drvrs: Generic Null ST: Arg Value: "cd2c0ce6-5d5d-11dc-a188-f53b0a4780f0".
12:17:16 964A5BA0 Drvrs: Generic Null ST: Action: do-trace-message("### "+token-local-variable("myguid")+" ###").
12:17:16 964A5BA0 Drvrs: Generic Null ST: arg-string("### "+token-local-variable("myguid")+" ###")
12:17:16 964A5BA0 Drvrs: Generic Null ST: token-text("### ")
12:17:16 964A5BA0 Drvrs: Generic Null ST: token-local-variable("myguid")
12:17:16 964A5BA0 Drvrs: Generic Null ST: Token Value: "cd2c0ce6-5d5d-11dc-a188-f53b0a4780f0".
12:17:16 964A5BA0 Drvrs: Generic Null ST: token-text(" ###")
12:17:16 964A5BA0 Drvrs: Generic Null ST: Arg Value: "### cd2c0ce6-5d5d-11dc-a188-f53b0a4780f0 ###".
12:17:16 964A5BA0 Drvrs: Generic Null ST:### cd2c0ce6-5d5d-11dc-a188-f53b0a4780f0 ###
}}}

!! More Information
There might be more information for this subject on one of the following:
[{ReferringPagesPlugin before='*' after='\n' }]