KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > codehaus > aspectwerkz > util > UuidGenerator


1 /**************************************************************************************
2  * Copyright (c) Jonas BonŽr, Alexandre Vasseur. All rights reserved. *
3  * http://aspectwerkz.codehaus.org *
4  * ---------------------------------------------------------------------------------- *
5  * The software in this package is published under the terms of the LGPL license *
6  * a copy of which has been included with this distribution in the license.txt file. *
7  **************************************************************************************/

8 package org.codehaus.aspectwerkz.util;
9
10 import java.net.InetAddress JavaDoc;
11 import java.security.SecureRandom JavaDoc;
12
13 /**
14  * Generates a UUID. <p/>A Universally Unique Identifier (UUID) is a 128 bit number generated according to an algorithm
15  * that is garanteed to be unique in time A space from all other UUIDs.
16  *
17  * @author <a HREF="mailto:jboner@codehaus.org">Jonas BonŽr </a>
18  */

19 public class UuidGenerator {
20     /**
21      * Random seeder.
22      */

23     private static SecureRandom JavaDoc s_seeder = null;
24
25     /**
26      * Mid value, needed for calculation.
27      */

28     private static String JavaDoc s_midValue = null;
29
30     /**
31      * Defines if the generator is initialized or not.
32      */

33     private static boolean s_initialized = false;
34
35     /**
36      * Private constructor to prevent subclassing
37      */

38     private UuidGenerator() {
39     }
40
41     /**
42      * Returns a unique uuid.
43      *
44      * @param obj the calling object (this)
45      * @return a unique uuid
46      */

47     public static String JavaDoc generate(Object JavaDoc obj) {
48         if (!s_initialized) {
49             initialize(obj);
50         }
51         long timeNow = System.currentTimeMillis();
52
53         // get int value as unsigned
54
int timeLow = (int) timeNow & 0xFFFFFFFF;
55         int node = s_seeder.nextInt();
56         return (hexFormat(timeLow, 8) + s_midValue + hexFormat(node, 8));
57     }
58
59     /**
60      * Initializes the factory.
61      *
62      * @param obj
63      */

64     private synchronized static void initialize(final Object JavaDoc obj) {
65         try {
66             InetAddress JavaDoc inet = InetAddress.getLocalHost();
67             byte[] bytes = inet.getAddress();
68             String JavaDoc hexInetAddress = hexFormat(getInt(bytes), 8);
69             String JavaDoc thisHashCode = hexFormat(System.identityHashCode(obj), 8);
70             s_midValue = hexInetAddress + thisHashCode;
71             s_seeder = new SecureRandom JavaDoc();
72             s_seeder.nextInt();
73         } catch (java.net.UnknownHostException JavaDoc e) {
74             throw new Error JavaDoc("can not initialize the UuidGenerator generator");
75         }
76         s_initialized = true;
77     }
78
79     /**
80      * Utility method.
81      *
82      * @param abyte
83      * @return
84      */

85     private static int getInt(final byte[] abyte) {
86         int i = 0;
87         int j = 24;
88         for (int k = 0; j >= 0; k++) {
89             int l = abyte[k] & 0xff;
90             i += (l << j);
91             j -= 8;
92         }
93         return i;
94     }
95
96     /**
97      * Utility method.
98      *
99      * @param i
100      * @param j
101      * @return
102      */

103     private static String JavaDoc hexFormat(final int i, final int j) {
104         String JavaDoc s = Integer.toHexString(i);
105         return padHex(s, j) + s;
106     }
107
108     /**
109      * Utility method.
110      *
111      * @param str
112      * @param i
113      * @return
114      */

115     private static String JavaDoc padHex(final String JavaDoc str, final int i) {
116         StringBuffer JavaDoc buf = new StringBuffer JavaDoc();
117         if (str.length() < i) {
118             for (int j = 0; j < (i - str.length()); j++) {
119                 buf.append('0');
120             }
121         }
122         return buf.toString();
123     }
124 }
Popular Tags