User: pathoss
Date: 02/04/05 01:59:51
Modified: core/resources/xdoclet/ejb util.j
Log:
Added a GUID generator in the util object. This is disabled by default. Add
includeGUID to the <utilobject/> subtask.
Revision Changes Path
1.16 +81 -1 xdoclet/core/resources/xdoclet/ejb/util.j
Index: util.j
===================================================================
RCS file: /cvsroot/xdoclet/xdoclet/core/resources/xdoclet/ejb/util.j,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -w -r1.15 -r1.16
--- util.j 28 Mar 2002 00:00:57 -0000 1.15
+++ util.j 5 Apr 2002 09:59:51 -0000 1.16
@@ -11,6 +11,11 @@
import java.util.Hashtable;
+<XDtConfig:ifConfigParamEquals paramName="includeGUID" value="true">
+import java.net.InetAddress;
+import java.security.SecureRandom;
+</XDtConfig:ifConfigParamEquals>
+
/**
* <XDtI18n:getString bundle="xdoclet.ejb.Messages" resource="utility_class_for"
arguments="<XDtEjb:ejbName/>"/>
<XDtClass:classCommentTags indent="0"/> */
@@ -73,4 +78,79 @@
<XDtMerge:merge file="util-custom.j">
</XDtMerge:merge>
+
+ <XDtConfig:ifConfigParamEquals paramName="includeGUID" value="true">
+ /** Cached per JVM server IP. */
+ private static String hexServerIP = null;
+
+ // initialise the secure random instance
+ private static final SecureRandom seeder = new SecureRandom();
+
+ /**
+ * A 32 byte GUID generator (Globally Unique ID). These artificial keys SHOULD
<strong>NOT</strong> be seen by the user,
+ * not even touched by the DBA but with very rare exceptions, just manipulated
by the database and the programs.
+ *
+ * <p>Usage: Add an <code>id</code> field (type java.lang.String) to your EJB,
and add <code>setId(XXXUtil.generateGUID(this));</code>
+ * to the <code>ejbCreate</code> method.
+ */
+ public static final String generateGUID(Object o) {
+ StringBuffer tmpBuffer = new StringBuffer(16);
+ if (hexServerIP == null) {
+ InetAddress localInetAddress = null;
+ try {
+ // get the inet address
+ localInetAddress = InetAddress.getLocalHost();
+ }
+ catch (java.net.UnknownHostException uhe) {
+
System.err.println("<XDtClass:classOf><XDtEjbUtilObj:utilClass/></XDtClass:classOf>:
could not get the local IP address using InetAddress.getLocalHost()!");
+ // todo: find better way to get around this...
+ uhe.printStackTrace();
+ return null;
+ }
+ byte serverIP[] = localInetAddress.getAddress();
+ hexServerIP = hexFormat(getInt(serverIP), 8);
+ }
+ // get the hashcode
+ String hashcode = hexFormat(System.identityHashCode(o), 8);
+ // set up a middle value as this is the same per method
+ // call as is object specific and is the ...-xxxx-xxxx-xxxx-xxxx..
+ // mid part of the sequence
+ tmpBuffer.append(hexServerIP);
+ tmpBuffer.append(hashcode);
+ long timeNow = System.currentTimeMillis();
+ int timeLow = (int)timeNow & 0xFFFFFFFF;
+ int node = seeder.nextInt();
+ StringBuffer guid = new StringBuffer(32);
+ guid.append(hexFormat(timeLow, 8));
+ guid.append(tmpBuffer.toString());
+ guid.append(hexFormat(node, 8));
+ return guid.toString();
+ }
+
+ private static int getInt(byte bytes[]) {
+ int i = 0;
+ int j = 24;
+ for (int k = 0; j >= 0; k++) {
+ int l = bytes[k] & 0xff;
+ i += l << j;
+ j -= 8;
+ }
+ return i;
+ }
+
+ private static String hexFormat(int i, int j) {
+ String s = Integer.toHexString(i);
+ return padHex(s, j) + s;
+ }
+
+ private static String padHex(String s, int i) {
+ StringBuffer tmpBuffer = new StringBuffer();
+ if (s.length() < i) {
+ for (int j = 0; j < i - s.length(); j++) {
+ tmpBuffer.append('0');
+ }
+ }
+ return tmpBuffer.toString();
+ }
+ </XDtConfig:ifConfigParamEquals>
}
_______________________________________________
Xdoclet-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/xdoclet-devel