01: /*
02: * Version: MPL 1.1/GPL 2.0/LGPL 2.1
03: *
04: * "The contents of this file are subject to the Mozilla Public License
05: * Version 1.1 (the "License"); you may not use this file except in
06: * compliance with the License. You may obtain a copy of the License at
07: * http://www.mozilla.org/MPL/
08: *
09: * Software distributed under the License is distributed on an "AS IS"
10: * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
11: * License for the specific language governing rights and limitations under
12: * the License.
13: *
14: * The Original Code is ICEfaces 1.5 open source software code, released
15: * November 5, 2006. The Initial Developer of the Original Code is ICEsoft
16: * Technologies Canada, Corp. Portions created by ICEsoft are Copyright (C)
17: * 2004-2006 ICEsoft Technologies Canada, Corp. All Rights Reserved.
18: *
19: * Contributor(s): _____________________.
20: *
21: * Alternatively, the contents of this file may be used under the terms of
22: * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"
23: * License), in which case the provisions of the LGPL License are
24: * applicable instead of those above. If you wish to allow use of your
25: * version of this file only under the terms of the LGPL License and not to
26: * allow others to use your version of this file under the MPL, indicate
27: * your decision by deleting the provisions above and replace them with
28: * the notice and other provisions required by the LGPL License. If you do
29: * not delete the provisions above, a recipient may use your version of
30: * this file under either the MPL or the LGPL License."
31: *
32: */
33:
34: package com.icesoft.util;
35:
36: import com.icesoft.util.encoding.Base64;
37:
38: import java.net.InetAddress;
39: import java.net.UnknownHostException;
40: import java.security.MessageDigest;
41: import java.security.NoSuchAlgorithmException;
42: import java.util.Random;
43:
44: /**
45: * The <code>IdGenerator</code> is responsible for generating a unique ID based
46: * on a counter, the current time in milliseconds, an arbitrary string, the IP
47: * address of the localhost, and a random number. </p>
48: */
49: public class IdGenerator {
50: private String seed;
51: private long counter;
52: private String ipAddress;
53: private static MessageDigest md5;
54:
55: public IdGenerator() {
56: this (String.valueOf(new Random().nextInt()));
57: }
58:
59: public IdGenerator(String seed) {
60: this .seed = seed.trim();
61: this .counter = 0;
62: try {
63: ipAddress = InetAddress.getLocalHost().getHostAddress();
64: md5 = MessageDigest.getInstance("MD5");
65: } catch (NoSuchAlgorithmException e) {
66: throw new RuntimeException(e);
67: } catch (UnknownHostException e) {
68: throw new RuntimeException(e);
69: }
70: }
71:
72: /**
73: * Creates a unique ID based on the specified <code>string</code>. </p>
74: *
75: * @return a unique ID.
76: */
77: public synchronized String newIdentifier() {
78: StringBuffer buffer = new StringBuffer();
79: buffer.append(++counter);
80: buffer.append(System.currentTimeMillis());
81: buffer.append(seed);
82: buffer.append(ipAddress);
83: buffer.append(Math.random());
84: byte[] digest = md5.digest(buffer.toString().getBytes());
85: byte[] encodedDigest = Base64.encodeForURL(digest);
86: return new String(encodedDigest);
87: }
88: }
|