You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by rw...@apache.org on 2004/12/16 17:50:45 UTC
cvs commit: jakarta-commons-sandbox/id/src/java/org/apache/commons/id/uuid UUID.java
rwinston 2004/12/16 08:50:45
Modified: id/src/java/org/apache/commons/id/uuid UUID.java
Log:
Remove commons-codec dependency
Revision Changes Path
1.11 +436 -436 jakarta-commons-sandbox/id/src/java/org/apache/commons/id/uuid/UUID.java
Index: UUID.java
===================================================================
RCS file: /home/cvs/jakarta-commons-sandbox/id/src/java/org/apache/commons/id/uuid/UUID.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- UUID.java 14 Dec 2004 12:39:59 -0000 1.10
+++ UUID.java 16 Dec 2004 16:50:45 -0000 1.11
@@ -20,10 +20,10 @@
import java.io.Serializable;
import java.util.StringTokenizer;
+import org.apache.commons.id.DecoderException;
import org.apache.commons.id.IdentifierUtils;
-import org.apache.commons.codec.DecoderException;
-import org.apache.commons.codec.binary.Hex;
-import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.commons.id.uuid.utils.DigestUtils;
+import org.apache.commons.id.uuid.utils.Hex;
/**
@@ -39,439 +39,439 @@
*/
public class UUID implements Constants, Serializable, Comparable {
-
- /** byte array to store 128-bits composing this UUID */
- private byte[] rawBytes = new byte[UUID_BYTE_LENGTH];
-
- /** Holds node identifier for this UUID */
- private Long node = null;
-
- /** Holds timestamp for this UUID */
- private long timestamp = -1;
-
- /** Holds the clock sequence field */
- private Short clockSq = null;
-
- /** Holds the version field of this UUID */
- private int version = -1;
-
- /** Holds the variant field of this UUID */
- private int variant = -1;
-
- /** Holds the internal string value of the UUID */
- private String stringValue = null;
-
-
- /** Constructs a nil UUID */
- public UUID() {
- super();
- }
-
- /**
- * <p>Constructs a UUID from a 128 bit java.math.BigInteger.</p>
- * <p>Method is protected as their is no standard as to the internal representation of a UUID.
- * In this case a BigInteger is used with signum always positive.</p>
- *
- * @param bigIntValue the 128 bit BigInteger to construct this UUID from.
- * @throws IllegalArgumentException argument must be 128 bit
- */
- /* protected UUID(BigInteger bigIntValue) throws IllegalArgumentException {
- super();
- if (bigIntValue.bitLength() > UUID.UUID_BIT_LENGTH) {
- throw new IllegalArgumentException("UUID must be contructed using a 128 bit BigInteger");
- }
- numberValue = bigIntValue;
- } */
-
- /**
- * <p>Copy constructor.</p>
- *
- * @param copyFrom the UUID to copy to create this UUID.
- */
- public UUID(UUID copyFrom) {
- super();
- rawBytes = copyFrom.getRawBytes();
- }
-
- /**
- * <p>Constructs a UUID from a 16 byte array.</p>
- *
- * @param byteArray the 16 byte array to construct this UUID from.
- * @throws IllegalArgumentException argument must be 16 bytes
- */
- public UUID(byte[] byteArray) throws IllegalArgumentException {
- super();
- if (byteArray.length != UUID_BYTE_LENGTH) {
- throw new IllegalArgumentException("UUID must be contructed using a 16 byte array.");
- }
- // UUID must be immutable so a copy is used.
- System.arraycopy(byteArray, 0, rawBytes, 0, UUID_BYTE_LENGTH);
- }
-
- /**
- * <p>Constructs a UUID from a DataInput. Note if 16 bytes are not available this method will block.</p>
- *
- * @param input the datainput with 16 bytes to read in from.
- * @throws IOException exception if there is an IO problem also argument must contain 16 bytes.
- */
- public UUID(DataInput input) throws IOException {
- super();
- input.readFully(rawBytes, 0, UUID_BYTE_LENGTH);
- }
-
- /**
- * <p>Constructs a UUID from two long values in most significant byte, and least significant bytes order.</p>
- *
- * @param mostSignificant - the most significant 8 bytes of the uuid to be constructed.
- * @param leastSignificant - the least significant 8 bytes of the uuid to be constructed.
- */
- public UUID(long mostSignificant, long leastSignificant) {
- rawBytes = Bytes.append(Bytes.toBytes(mostSignificant), Bytes.toBytes(leastSignificant));
- }
-
- /**
- * <p>Constructs a UUID from a UUID formatted String.</p>
- *
- * @param uuidString the String representing a UUID to construct this UUID
- * @throws UUIDFormatException String must be a properly formatted UUID string
- */
- public UUID(String uuidString) throws UUIDFormatException {
- //Calls the copy constructor
- this(UUID.fromString(uuidString));
- }
-
- /**
- * <p>Parses a string for a UUID.</p>
- *
- * @param uuidString the UUID formatted String to parse.
- * @throws UUIDFormatException the String must be a properly formatted UUID String.
- * @return Returns a UUID or null if the formatted string could not be parsed.
- */
- public static UUID fromString(String uuidString)
- throws UUIDFormatException {
- String leanString = uuidString.toLowerCase();
- UUID tmpUUID = null;
-
- //Handle prefixed UUIDs
- // e.g. urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6
- int pos = uuidString.lastIndexOf(":");
- if (pos > 1) {
- leanString = uuidString.substring(++pos, uuidString.length());
- }
-
- //Check for 36 char length
- if (leanString.length() != UUID_FORMATTED_LENGTH) {
- throw new UUIDFormatException();
- }
-
- //Check for 5 fields
- StringTokenizer tok = new StringTokenizer(leanString, "-");
- if ( tok.countTokens() != TOKENS_IN_UUID ) {
- throw new UUIDFormatException();
- }
-
- //Remove the "-" from the formatted string and test token sizes
- StringBuffer buf = new StringBuffer(UUID_UNFORMATTED_LENGTH);
- String token = null;
- int count = 0;
- while (tok.hasMoreTokens()) {
- token = tok.nextToken();
- if (token.length() != TOKEN_LENGTHS[count++]) {
- throw new UUIDFormatException();
- }
- buf.append(token);
- }
-
- //Create from the hex value
- try {
- char[] chars = buf.toString().toCharArray();
- tmpUUID = new UUID(Hex.decodeHex(chars));
- } catch (DecoderException de) {
- throw new UUIDFormatException(de.getMessage());
- }
- return tmpUUID;
- }
-
- /**
- * <p>Returns a string representation of the UUID.</p>
- *
- * @return a string representation of the UUID formatted according to the specification.
- */
- public String toString() {
- //set string value if not set
- if (stringValue == null) {
- StringBuffer buf = new StringBuffer(new String(Hex.encodeHex(rawBytes)));
- while (buf.length() != UUID_UNFORMATTED_LENGTH) {
- buf.insert(0, "0");
- }
- buf.ensureCapacity(UUID_FORMATTED_LENGTH);
- buf.insert(FORMAT_POSITION1, '-');
- buf.insert(FORMAT_POSITION2, '-');
- buf.insert(FORMAT_POSITION3, '-');
- buf.insert(FORMAT_POSITION4, '-');
- stringValue = buf.toString();
- }
- return stringValue;
- }
-
- /**
- * <p>Returns a urn representation of the UUID. This is same as the
- * toString() value prefixed with <code>urn:uuid:</code></p>
- *
- * @return Returns the urn string representation of the UUID
- */
- public String toUrn() {
- return URN_PREFIX + this.toString();
- }
-
- /**
- * <p>Compares two UUID for equality.</p>
- *
- * @see java.lang.Object#equals(Object)
- */
-
- public boolean equals(Object obj) {
- if (!(obj instanceof UUID)) {
- return false;
- }
- return Bytes.areEqual( ((UUID) obj).getRawBytes(), rawBytes);
- }
-
- /**
- * <p>Returns a hash code value for the object.</p>
- *
- * @see java.lang.Object#hashCode()
- */
- public int hashCode() {
- int iConstant = 37;
- int iTotal = 17;
- for (int i = 0; i < rawBytes.length; i++) {
- iTotal = iTotal * iConstant + rawBytes[i];
- }
- return iTotal;
- }
-
- /**
- * <p>Compares two UUID's for equality</p>
- *
- * @see Comparable#compareTo(Object)
- */
- public int compareTo(Object compareTo) throws ClassCastException {
- if (!(compareTo instanceof UUID)) {
- throw new ClassCastException();
- }
- return (Bytes.compareTo(rawBytes, ((UUID) compareTo).getRawBytes()));
- }
-
- /**
- * <p>Returns the clock sequence value in the UUID. The clock sequence is a random assigned to a particular clock instance that
- * generated the time in the timestamp of a time based UUID.</p>
- *
- * @return the clock sequence value in the UUID.
- * @throws UnsupportedOperationException thrown if this is not a IETF variant or not a time-based UUID.
- */
- public int clockSequence() throws UnsupportedOperationException {
- //if variant is not mealling leach salz throw unsupported operation exception
- if (variant() != VARIANT_IETF_DRAFT || version() != VERSION_ONE) {
- throw new UnsupportedOperationException(WRONG_VAR_VER_MSG);
- }
- if (clockSq == null) {
- byte[] b = {((byte) (rawBytes[8] & 0x3F)), rawBytes[9]};
- clockSq = new Short(Bytes.toShort(b));
- }
- return clockSq.intValue();
- }
-
- /**
- * <p>Returns the version of the UUID.
- * <ul>
- * <li>VERSION_ONE - The time-based version</li>
- * <li>VERSION_TWO - DCE Security version, with embedded POSIX UIDs.</li>
- * <li>VERSION_THREE - Name based UUID with MD5 hashing.</li>
- * <li>VERSION_FOUR - Random based UUID.</li>
- * <li>VERSION_FIVE - Name based UUID with SHA-1 hashing.</li>
- * </ul>
- * </p>
- * @return the version of the UUID.
- */
- public int version() {
- if (version == -1) {
- version = ((rawBytes[6] >>> 4) & 0x0F);
- }
- return version;
- }
-
- /**
- * <p>Returns the variant field of the UUID.</p>
- *
- * @return Returns the variant field of the UUID.
- * @see UUID#VARIANT_NCS_COMPAT
- * @see UUID#VARIANT_IETF_DRAFT
- * @see UUID#VARIANT_MS
- * @see UUID#VARIANT_FUTURE
- */
- public int variant() {
- if (variant == -1) {
- if ((rawBytes[8] & 0x80) == 0x0) {
- variant = VARIANT_NCS_COMPAT;
- } else if ((rawBytes[8] & 0x40) == 0x0) {
- variant = VARIANT_IETF_DRAFT;
- } else if ((rawBytes[8] & 0x20) == 0x0) {
- variant = VARIANT_MS;
- } else {
- variant = VARIANT_FUTURE;
- }
- }
- return variant;
- }
-
- /**
- * <p>Returns the node identifier found in this UUID. The specification was written such that this value holds the IEEE 802 MAC
- * address. The specification permits this value to be calculated from other sources other than the MAC.</p>
- *
- * @return the node identifier found in this UUID.
- * @throws UnsupportedOperationException thrown if this is not a IETF variant or not a time-based UUID.
- */
- public long node() throws UnsupportedOperationException {
- //if variant is not mealling leach salz throw unsupported operation exception
- if (variant() != VARIANT_IETF_DRAFT || version() != VERSION_ONE) {
- throw new UnsupportedOperationException(WRONG_VAR_VER_MSG);
- }
- if (node == null) {
- byte[] b = new byte[8];
- System.arraycopy(rawBytes, 10, b, 2, 6);
- node = new Long((Bytes.toLong(b) & 0xFFFFFFFFFFFFL));
- }
- return node.longValue();
- }
-
- /**
- * <p>Returns the timestamp value of the UUID as 100-nano second intervals since the Gregorian change offset (00:00:00.00, 15
- * October 1582 ).</p>
- *
- * @return the timestamp value of the UUID as 100-nano second intervals since the Gregorian change offset.
- * @throws UnsupportedOperationException thrown if this is not a IETF variant or not a time-based UUID.
- */
- public long timestamp() throws UnsupportedOperationException {
- //if variant is not mealling leach salz throw unsupported operation exception
- if (variant() != VARIANT_IETF_DRAFT || version() != VERSION_ONE) {
- throw new UnsupportedOperationException(WRONG_VAR_VER_MSG);
- }
- if (timestamp == -1) {
- byte[] longVal = new byte[8];
- System.arraycopy(rawBytes, TIME_HI_START_POS, longVal, TIME_HI_TS_POS, TIME_HI_BYTE_LEN);
- System.arraycopy(rawBytes, TIME_MID_START_POS, longVal, TIME_MID_TS_POS, TIME_MID_BYTE_LEN);
- System.arraycopy(rawBytes, TIME_LOW_START_POS, longVal, TIME_LOW_TS_POS, TIME_LOW_BYTE_LEN);
- longVal[TIME_HI_TS_POS] &= 0x0F;
- timestamp = Bytes.toLong(longVal);
- }
- return timestamp;
- }
-
- /**
- * <p>Returns the least significant bits stored in the uuid's internal structure.</p>
- *
- * @return the least significant bits stored in the uuid's internal structure.
- */
- long getLeastSignificantBits() {
- byte[] lsb = new byte[8];
- System.arraycopy(rawBytes, 8, lsb, 0, 8);
- return Bytes.toLong(lsb);
- }
-
- /**
- * <p>Returns the least significant bits stored in the uuid's internal structure.</p>
- *
- * @return the least significant bits stored in the uuid's internal structure.
- */
- long getMostSignificantBits() {
- byte[] msb = new byte[8];
- System.arraycopy(rawBytes, 0, msb, 0, 8);
- return Bytes.toLong(msb);
- }
-
- /**
- * <p>Returns a copy of the byte values contained in this UUID.
- *
- * @return a copy of the byte values contained in this UUID.
- */
- public byte[] getRawBytes() {
- byte[] ret = new byte[UUID_BYTE_LENGTH];
- System.arraycopy(rawBytes, 0, ret, 0, UUID_BYTE_LENGTH);
- return ret;
- }
-
- /**
- * <p>Returns a new version 4 UUID, based upon Random bits.</p>
- *
- * @return a new version 4 UUID, based upon Random bits.
- */
- static UUID randomUUID() {
- return (UUID) IdentifierUtils.UUID_VERSION_FOUR_GENERATOR.nextIdentifier();
- }
-
- /**
- * <p>Returns a new version 1 UUID, based upon node identifier and time stamp.</p>
- *
- * @return a new version 1 UUID, based upon node identifier and time stamp.
- */
- static UUID timeUUID() {
- return (UUID) IdentifierUtils.UUID_VERSION_ONE_GENERATOR.nextIdentifier();
- }
-
- /**
- * <p>Returns a new version three (MD5) or five (SHA-1) UUID, using the specified encoding
- * given a name and the namespace's UUID.</p>
- *
- * @param name String the name to calculate the UUID for.
- * @param namespace UUID assigned to this namespace.
- * @param encoding The encoding to use, either #{link UUID.MD5_ENCODING} or #{link UUID.SHA1_ENCODING}
- * @return a new version three UUID given a name and the namespace's UUID.
- */
- static UUID nameUUIDFromString(String name, UUID namespace, String encoding) {
- byte[] nameAsBytes = name.getBytes();
- byte[] concat = new byte[UUID_BYTE_LENGTH + nameAsBytes.length];
- System.arraycopy(namespace.getRawBytes(), 0, concat, 0, UUID_BYTE_LENGTH);
- System.arraycopy(nameAsBytes, 0, concat, UUID_BYTE_LENGTH, nameAsBytes.length);
-
- byte[] raw = null;
-
- if(encoding.equals(UUID.MD5_ENCODING)) {
- raw = DigestUtils.md5(concat);
- }
- else if(encoding.equals(UUID.SHA1_ENCODING)) {
- byte[] shaDigest = DigestUtils.sha(concat);
- // Truncate digest to 16 bytes (SHA-1 returns a 20-byte digest)
- raw = new byte[16];
- System.arraycopy(shaDigest, 0, raw, 0, 16);
- }
- else {
- throw new RuntimeException("Unsupported encoding " + encoding);
+
+ /** byte array to store 128-bits composing this UUID */
+ private byte[] rawBytes = new byte[UUID_BYTE_LENGTH];
+
+ /** Holds node identifier for this UUID */
+ private Long node = null;
+
+ /** Holds timestamp for this UUID */
+ private long timestamp = -1;
+
+ /** Holds the clock sequence field */
+ private Short clockSq = null;
+
+ /** Holds the version field of this UUID */
+ private int version = -1;
+
+ /** Holds the variant field of this UUID */
+ private int variant = -1;
+
+ /** Holds the internal string value of the UUID */
+ private String stringValue = null;
+
+
+ /** Constructs a nil UUID */
+ public UUID() {
+ super();
}
+ /**
+ * <p>Constructs a UUID from a 128 bit java.math.BigInteger.</p>
+ * <p>Method is protected as their is no standard as to the internal representation of a UUID.
+ * In this case a BigInteger is used with signum always positive.</p>
+ *
+ * @param bigIntValue the 128 bit BigInteger to construct this UUID from.
+ * @throws IllegalArgumentException argument must be 128 bit
+ */
+ /* protected UUID(BigInteger bigIntValue) throws IllegalArgumentException {
+ super();
+ if (bigIntValue.bitLength() > UUID.UUID_BIT_LENGTH) {
+ throw new IllegalArgumentException("UUID must be contructed using a 128 bit BigInteger");
+ }
+ numberValue = bigIntValue;
+ } */
+
+ /**
+ * <p>Copy constructor.</p>
+ *
+ * @param copyFrom the UUID to copy to create this UUID.
+ */
+ public UUID(UUID copyFrom) {
+ super();
+ rawBytes = copyFrom.getRawBytes();
+ }
+
+ /**
+ * <p>Constructs a UUID from a 16 byte array.</p>
+ *
+ * @param byteArray the 16 byte array to construct this UUID from.
+ * @throws IllegalArgumentException argument must be 16 bytes
+ */
+ public UUID(byte[] byteArray) throws IllegalArgumentException {
+ super();
+ if (byteArray.length != UUID_BYTE_LENGTH) {
+ throw new IllegalArgumentException("UUID must be contructed using a 16 byte array.");
+ }
+ // UUID must be immutable so a copy is used.
+ System.arraycopy(byteArray, 0, rawBytes, 0, UUID_BYTE_LENGTH);
+ }
+
+ /**
+ * <p>Constructs a UUID from a DataInput. Note if 16 bytes are not available this method will block.</p>
+ *
+ * @param input the datainput with 16 bytes to read in from.
+ * @throws IOException exception if there is an IO problem also argument must contain 16 bytes.
+ */
+ public UUID(DataInput input) throws IOException {
+ super();
+ input.readFully(rawBytes, 0, UUID_BYTE_LENGTH);
+ }
+
+ /**
+ * <p>Constructs a UUID from two long values in most significant byte, and least significant bytes order.</p>
+ *
+ * @param mostSignificant - the most significant 8 bytes of the uuid to be constructed.
+ * @param leastSignificant - the least significant 8 bytes of the uuid to be constructed.
+ */
+ public UUID(long mostSignificant, long leastSignificant) {
+ rawBytes = Bytes.append(Bytes.toBytes(mostSignificant), Bytes.toBytes(leastSignificant));
+ }
+
+ /**
+ * <p>Constructs a UUID from a UUID formatted String.</p>
+ *
+ * @param uuidString the String representing a UUID to construct this UUID
+ * @throws UUIDFormatException String must be a properly formatted UUID string
+ */
+ public UUID(String uuidString) throws UUIDFormatException {
+ //Calls the copy constructor
+ this(UUID.fromString(uuidString));
+ }
+
+ /**
+ * <p>Parses a string for a UUID.</p>
+ *
+ * @param uuidString the UUID formatted String to parse.
+ * @throws UUIDFormatException the String must be a properly formatted UUID String.
+ * @return Returns a UUID or null if the formatted string could not be parsed.
+ */
+ public static UUID fromString(String uuidString)
+ throws UUIDFormatException {
+ String leanString = uuidString.toLowerCase();
+ UUID tmpUUID = null;
+
+ //Handle prefixed UUIDs
+ // e.g. urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6
+ int pos = uuidString.lastIndexOf(":");
+ if (pos > 1) {
+ leanString = uuidString.substring(++pos, uuidString.length());
+ }
+
+ //Check for 36 char length
+ if (leanString.length() != UUID_FORMATTED_LENGTH) {
+ throw new UUIDFormatException();
+ }
+
+ //Check for 5 fields
+ StringTokenizer tok = new StringTokenizer(leanString, "-");
+ if ( tok.countTokens() != TOKENS_IN_UUID ) {
+ throw new UUIDFormatException();
+ }
+
+ //Remove the "-" from the formatted string and test token sizes
+ StringBuffer buf = new StringBuffer(UUID_UNFORMATTED_LENGTH);
+ String token = null;
+ int count = 0;
+ while (tok.hasMoreTokens()) {
+ token = tok.nextToken();
+ if (token.length() != TOKEN_LENGTHS[count++]) {
+ throw new UUIDFormatException();
+ }
+ buf.append(token);
+ }
+
+ //Create from the hex value
+ try {
+ char[] chars = buf.toString().toCharArray();
+ tmpUUID = new UUID(Hex.decodeHex(chars));
+ } catch (DecoderException de) {
+ throw new UUIDFormatException(de.getMessage());
+ }
+ return tmpUUID;
+ }
+
+ /**
+ * <p>Returns a string representation of the UUID.</p>
+ *
+ * @return a string representation of the UUID formatted according to the specification.
+ */
+ public String toString() {
+ //set string value if not set
+ if (stringValue == null) {
+ StringBuffer buf = new StringBuffer(new String(Hex.encodeHex(rawBytes)));
+ while (buf.length() != UUID_UNFORMATTED_LENGTH) {
+ buf.insert(0, "0");
+ }
+ buf.ensureCapacity(UUID_FORMATTED_LENGTH);
+ buf.insert(FORMAT_POSITION1, '-');
+ buf.insert(FORMAT_POSITION2, '-');
+ buf.insert(FORMAT_POSITION3, '-');
+ buf.insert(FORMAT_POSITION4, '-');
+ stringValue = buf.toString();
+ }
+ return stringValue;
+ }
+
+ /**
+ * <p>Returns a urn representation of the UUID. This is same as the
+ * toString() value prefixed with <code>urn:uuid:</code></p>
+ *
+ * @return Returns the urn string representation of the UUID
+ */
+ public String toUrn() {
+ return URN_PREFIX + this.toString();
+ }
+
+ /**
+ * <p>Compares two UUID for equality.</p>
+ *
+ * @see java.lang.Object#equals(Object)
+ */
+
+ public boolean equals(Object obj) {
+ if (!(obj instanceof UUID)) {
+ return false;
+ }
+ return Bytes.areEqual( ((UUID) obj).getRawBytes(), rawBytes);
+ }
+
+ /**
+ * <p>Returns a hash code value for the object.</p>
+ *
+ * @see java.lang.Object#hashCode()
+ */
+ public int hashCode() {
+ int iConstant = 37;
+ int iTotal = 17;
+ for (int i = 0; i < rawBytes.length; i++) {
+ iTotal = iTotal * iConstant + rawBytes[i];
+ }
+ return iTotal;
+ }
+
+ /**
+ * <p>Compares two UUID's for equality</p>
+ *
+ * @see Comparable#compareTo(Object)
+ */
+ public int compareTo(Object compareTo) throws ClassCastException {
+ if (!(compareTo instanceof UUID)) {
+ throw new ClassCastException();
+ }
+ return (Bytes.compareTo(rawBytes, ((UUID) compareTo).getRawBytes()));
+ }
+
+ /**
+ * <p>Returns the clock sequence value in the UUID. The clock sequence is a random assigned to a particular clock instance that
+ * generated the time in the timestamp of a time based UUID.</p>
+ *
+ * @return the clock sequence value in the UUID.
+ * @throws UnsupportedOperationException thrown if this is not a IETF variant or not a time-based UUID.
+ */
+ public int clockSequence() throws UnsupportedOperationException {
+ //if variant is not mealling leach salz throw unsupported operation exception
+ if (variant() != VARIANT_IETF_DRAFT || version() != VERSION_ONE) {
+ throw new UnsupportedOperationException(WRONG_VAR_VER_MSG);
+ }
+ if (clockSq == null) {
+ byte[] b = {((byte) (rawBytes[8] & 0x3F)), rawBytes[9]};
+ clockSq = new Short(Bytes.toShort(b));
+ }
+ return clockSq.intValue();
+ }
+
+ /**
+ * <p>Returns the version of the UUID.
+ * <ul>
+ * <li>VERSION_ONE - The time-based version</li>
+ * <li>VERSION_TWO - DCE Security version, with embedded POSIX UIDs.</li>
+ * <li>VERSION_THREE - Name based UUID with MD5 hashing.</li>
+ * <li>VERSION_FOUR - Random based UUID.</li>
+ * <li>VERSION_FIVE - Name based UUID with SHA-1 hashing.</li>
+ * </ul>
+ * </p>
+ * @return the version of the UUID.
+ */
+ public int version() {
+ if (version == -1) {
+ version = ((rawBytes[6] >>> 4) & 0x0F);
+ }
+ return version;
+ }
+
+ /**
+ * <p>Returns the variant field of the UUID.</p>
+ *
+ * @return Returns the variant field of the UUID.
+ * @see UUID#VARIANT_NCS_COMPAT
+ * @see UUID#VARIANT_IETF_DRAFT
+ * @see UUID#VARIANT_MS
+ * @see UUID#VARIANT_FUTURE
+ */
+ public int variant() {
+ if (variant == -1) {
+ if ((rawBytes[8] & 0x80) == 0x0) {
+ variant = VARIANT_NCS_COMPAT;
+ } else if ((rawBytes[8] & 0x40) == 0x0) {
+ variant = VARIANT_IETF_DRAFT;
+ } else if ((rawBytes[8] & 0x20) == 0x0) {
+ variant = VARIANT_MS;
+ } else {
+ variant = VARIANT_FUTURE;
+ }
+ }
+ return variant;
+ }
+
+ /**
+ * <p>Returns the node identifier found in this UUID. The specification was written such that this value holds the IEEE 802 MAC
+ * address. The specification permits this value to be calculated from other sources other than the MAC.</p>
+ *
+ * @return the node identifier found in this UUID.
+ * @throws UnsupportedOperationException thrown if this is not a IETF variant or not a time-based UUID.
+ */
+ public long node() throws UnsupportedOperationException {
+ //if variant is not mealling leach salz throw unsupported operation exception
+ if (variant() != VARIANT_IETF_DRAFT || version() != VERSION_ONE) {
+ throw new UnsupportedOperationException(WRONG_VAR_VER_MSG);
+ }
+ if (node == null) {
+ byte[] b = new byte[8];
+ System.arraycopy(rawBytes, 10, b, 2, 6);
+ node = new Long((Bytes.toLong(b) & 0xFFFFFFFFFFFFL));
+ }
+ return node.longValue();
+ }
+
+ /**
+ * <p>Returns the timestamp value of the UUID as 100-nano second intervals since the Gregorian change offset (00:00:00.00, 15
+ * October 1582 ).</p>
+ *
+ * @return the timestamp value of the UUID as 100-nano second intervals since the Gregorian change offset.
+ * @throws UnsupportedOperationException thrown if this is not a IETF variant or not a time-based UUID.
+ */
+ public long timestamp() throws UnsupportedOperationException {
+ //if variant is not mealling leach salz throw unsupported operation exception
+ if (variant() != VARIANT_IETF_DRAFT || version() != VERSION_ONE) {
+ throw new UnsupportedOperationException(WRONG_VAR_VER_MSG);
+ }
+ if (timestamp == -1) {
+ byte[] longVal = new byte[8];
+ System.arraycopy(rawBytes, TIME_HI_START_POS, longVal, TIME_HI_TS_POS, TIME_HI_BYTE_LEN);
+ System.arraycopy(rawBytes, TIME_MID_START_POS, longVal, TIME_MID_TS_POS, TIME_MID_BYTE_LEN);
+ System.arraycopy(rawBytes, TIME_LOW_START_POS, longVal, TIME_LOW_TS_POS, TIME_LOW_BYTE_LEN);
+ longVal[TIME_HI_TS_POS] &= 0x0F;
+ timestamp = Bytes.toLong(longVal);
+ }
+ return timestamp;
+ }
+
+ /**
+ * <p>Returns the least significant bits stored in the uuid's internal structure.</p>
+ *
+ * @return the least significant bits stored in the uuid's internal structure.
+ */
+ long getLeastSignificantBits() {
+ byte[] lsb = new byte[8];
+ System.arraycopy(rawBytes, 8, lsb, 0, 8);
+ return Bytes.toLong(lsb);
+ }
+
+ /**
+ * <p>Returns the least significant bits stored in the uuid's internal structure.</p>
+ *
+ * @return the least significant bits stored in the uuid's internal structure.
+ */
+ long getMostSignificantBits() {
+ byte[] msb = new byte[8];
+ System.arraycopy(rawBytes, 0, msb, 0, 8);
+ return Bytes.toLong(msb);
+ }
+
+ /**
+ * <p>Returns a copy of the byte values contained in this UUID.
+ *
+ * @return a copy of the byte values contained in this UUID.
+ */
+ public byte[] getRawBytes() {
+ byte[] ret = new byte[UUID_BYTE_LENGTH];
+ System.arraycopy(rawBytes, 0, ret, 0, UUID_BYTE_LENGTH);
+ return ret;
+ }
+
+ /**
+ * <p>Returns a new version 4 UUID, based upon Random bits.</p>
+ *
+ * @return a new version 4 UUID, based upon Random bits.
+ */
+ public static UUID randomUUID() {
+ return (UUID) IdentifierUtils.UUID_VERSION_FOUR_GENERATOR.nextIdentifier();
+ }
+
+ /**
+ * <p>Returns a new version 1 UUID, based upon node identifier and time stamp.</p>
+ *
+ * @return a new version 1 UUID, based upon node identifier and time stamp.
+ */
+ public static UUID timeUUID() {
+ return (UUID) IdentifierUtils.UUID_VERSION_ONE_GENERATOR.nextIdentifier();
+ }
+
+ /**
+ * <p>Returns a new version three (MD5) or five (SHA-1) UUID, using the specified encoding
+ * given a name and the namespace's UUID.</p>
+ *
+ * @param name String the name to calculate the UUID for.
+ * @param namespace UUID assigned to this namespace.
+ * @param encoding The encoding to use, either #{link UUID.MD5_ENCODING} or #{link UUID.SHA1_ENCODING}
+ * @return a new version three UUID given a name and the namespace's UUID.
+ */
+ public static UUID nameUUIDFromString(String name, UUID namespace, String encoding) {
+ byte[] nameAsBytes = name.getBytes();
+ byte[] concat = new byte[UUID_BYTE_LENGTH + nameAsBytes.length];
+ System.arraycopy(namespace.getRawBytes(), 0, concat, 0, UUID_BYTE_LENGTH);
+ System.arraycopy(nameAsBytes, 0, concat, UUID_BYTE_LENGTH, nameAsBytes.length);
+
+ byte[] raw = null;
+
+ if(encoding.equals(UUID.MD5_ENCODING)) {
+ raw = DigestUtils.md5(concat);
+ }
+ else if(encoding.equals(UUID.SHA1_ENCODING)) {
+ byte[] shaDigest = DigestUtils.sha(concat);
+ // Truncate digest to 16 bytes (SHA-1 returns a 20-byte digest)
+ raw = new byte[16];
+ System.arraycopy(shaDigest, 0, raw, 0, 16);
+ }
+ else {
+ throw new RuntimeException("Unsupported encoding " + encoding);
+ }
+
+
+ //Set version (version 3 and version 5 are identical on a bit-level,
+ //thus we only need ever set one of them
+ raw[TIME_HI_AND_VERSION_BYTE_6] &= 0x0F;
+ raw[TIME_HI_AND_VERSION_BYTE_6] |= (UUID.VERSION_THREE << 4);
+
+ //Set variant
+ raw[CLOCK_SEQ_HI_AND_RESERVED_BYTE_8] &= 0x3F; //0011 1111
+ raw[CLOCK_SEQ_HI_AND_RESERVED_BYTE_8] |= 0x80; //1000 0000
+
+ return new UUID(raw);
+ }
+
+ /**
+ * <p>Returns a new version three UUID given a name and the namespace's UUID.</p>
+ *
+ * @param name String the name to calculate the UUID for.
+ * @param namespace UUID assigned to this namespace.
+ * @return a new version three UUID given a name and the namespace's UUID.
+ *
+ */
+ public static UUID nameUUIDFromString(String name, UUID namespace) {
+ return nameUUIDFromString(name, namespace, UUID.MD5_ENCODING);
+ }
- //Set version (version 3 and version 5 are identical on a bit-level,
- //thus we only need ever set one of them
- raw[TIME_HI_AND_VERSION_BYTE_6] &= 0x0F;
- raw[TIME_HI_AND_VERSION_BYTE_6] |= (UUID.VERSION_THREE << 4);
-
- //Set variant
- raw[CLOCK_SEQ_HI_AND_RESERVED_BYTE_8] &= 0x3F; //0011 1111
- raw[CLOCK_SEQ_HI_AND_RESERVED_BYTE_8] |= 0x80; //1000 0000
-
- return new UUID(raw);
- }
-
- /**
- * <p>Returns a new version three UUID given a name and the namespace's UUID.</p>
- *
- * @param name String the name to calculate the UUID for.
- * @param namespace UUID assigned to this namespace.
- * @return a new version three UUID given a name and the namespace's UUID.
- *
- */
- static UUID nameUUIDFromString(String name, UUID namespace) {
- return nameUUIDFromString(name, namespace, UUID.MD5_ENCODING);
- }
-
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org