package org.ovirt.engine.core.compat; import java.util.UUID; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlType; @XmlAccessorType(XmlAccessType.NONE) @XmlType(name = "nguid", namespace = "http://service.engine.ovirt.org") public class NGuid implements Serializable { protected static final String EMPTY_GUID_VALUE = "00000000-0000-0000-0000-000000000000"; /** * Needed for the serialization/deserialization mechanism. */ private static final long serialVersionUID = 27305745737022810L; private static final byte[] CHANGE_BYTE_ORDER_INDICES = { 3, 2, 1, 0, 5, 4, 7, 6, 8, 9, 10, 11, 12, 13, 14, 15 }; private static final byte[] KEEP_BYTE_ORDER_INDICES = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; public final static Guid Empty = new Guid(); public static Guid NewGuid() { return new Guid(UUID.randomUUID()); } @XmlElement(required = true) protected UUID uuid; protected Guid guid; public NGuid() { this(EMPTY_GUID_VALUE); } public NGuid(byte[] guid, boolean keepByteOrder) { String guidAsStr = getStrRepresentationOfGuid(guid, keepByteOrder); if (guidAsStr.isEmpty()) { uuid = UUID.fromString(EMPTY_GUID_VALUE); } else { uuid = UUID.fromString(guidAsStr); } } public NGuid(String candidate) { if (candidate == null) { throw new NullPointerException( "candidate can not be null please use static method createGuidFromString"); } if (candidate.isEmpty()) { uuid = UUID.fromString(EMPTY_GUID_VALUE); } else { uuid = UUID.fromString(candidate); } } public static NGuid createGuidFromString(String candidate) { if (candidate == null) { return null; } else { return new NGuid(candidate); } } public NGuid(UUID uuid) { this.uuid = uuid; } public Guid getValue() { if (this.guid == null) { this.guid = new Guid(uuid); } return this.guid; } @Override public String toString() { if (uuid == null) return null; else return uuid.toString(); } public UUID getUuid() { return uuid; } @Override public boolean equals(Object other) { if (other == null || !(other instanceof NGuid)) { return false; } NGuid otherGuid = (NGuid) other; return uuid.equals(otherGuid.getUuid()); } @Override public int hashCode() { return uuid.hashCode(); } /** * Gets a string representation of GUID * * @param inguid * byte array containing the GUID data. * @param keepByteOrder * determines if to keep the byte order in the string representation or not. For some systems as MSSQL * the bytes order should be swapped before converting to String, and for other systems (such as * ActiveDirectory) it should be kept. * @return String representation of GUID */ public String getStrRepresentationOfGuid(byte[] inguid, boolean keepByteOrder) { StringBuilder strGUID = new StringBuilder(); byte[] byteOrderIndices = null; if (keepByteOrder) { byteOrderIndices = KEEP_BYTE_ORDER_INDICES; } else { byteOrderIndices = CHANGE_BYTE_ORDER_INDICES; } int length = inguid.length; // A GUID format looks like xxxx-xx-xx-xx-xxxxxx where each "x" // represents a byte in hexadecimal format strGUID.append(AddLeadingZero((int) inguid[byteOrderIndices[0 % length]] & 0xFF)); strGUID.append(AddLeadingZero((int) inguid[byteOrderIndices[1 % length]] & 0xFF)); strGUID.append(AddLeadingZero((int) inguid[byteOrderIndices[2 % length]] & 0xFF)); strGUID.append(AddLeadingZero((int) inguid[byteOrderIndices[3 % length]] & 0xFF)); strGUID.append("-"); strGUID.append(AddLeadingZero((int) inguid[byteOrderIndices[4 % length]] & 0xFF)); strGUID.append(AddLeadingZero((int) inguid[byteOrderIndices[5 % length]] & 0xFF)); strGUID.append("-"); strGUID.append(AddLeadingZero((int) inguid[byteOrderIndices[6 % length]] & 0xFF)); strGUID.append(AddLeadingZero((int) inguid[byteOrderIndices[7 % length]] & 0xFF)); strGUID.append("-"); strGUID.append(AddLeadingZero((int) inguid[byteOrderIndices[8 % length]] & 0xFF)); strGUID.append(AddLeadingZero((int) inguid[byteOrderIndices[9 % length]] & 0xFF)); strGUID.append("-"); strGUID.append(AddLeadingZero((int) inguid[byteOrderIndices[10 % length]] & 0xFF)); strGUID.append(AddLeadingZero((int) inguid[byteOrderIndices[11 % length]] & 0xFF)); strGUID.append(AddLeadingZero((int) inguid[byteOrderIndices[12 % length]] & 0xFF)); strGUID.append(AddLeadingZero((int) inguid[byteOrderIndices[13 % length]] & 0xFF)); strGUID.append(AddLeadingZero((int) inguid[byteOrderIndices[14 % length]] & 0xFF)); strGUID.append(AddLeadingZero((int) inguid[byteOrderIndices[15 % length]] & 0xFF)); return strGUID.toString(); } private static String AddLeadingZero(int k) { return (k <= 0xF) ? "0" + Integer.toHexString(k) : Integer .toHexString(k); } }