VMID.java |
/*************************************** * * * JBoss: The OpenSource J2EE WebOS * * * * Distributable under LGPL license. * * See terms of license at gnu.org. * * * ***************************************/ package org.jboss.util.id; import java.net.InetAddress; import java.security.AccessController; import java.security.PrivilegedAction; import org.jboss.util.Primitives; import org.jboss.util.HashCode; import org.jboss.util.platform.PID; /** * An object that uniquely identifies a virtual machine. * * <p>The identifier is composed of: * <ol> * <li>The Internet address of the physical machine.</li> * <li>The process identifier of the virtual machine.</li> * <li>A UID to guarantee uniqness across multipule virtual * machines on the same physical machine.</li> * </ol> * * <pre> * [ address ] - [ process id ] - [ time ] - [ counter ] * |------- UID --------| * </pre> * * <p>Numbers are converted to radix(Character.MAX_RADIX) when converting * to strings. * * @see UID * * @version <tt>$Revision: 1.1 $</tt> * @author <a href="mailto:jason@planet57.com">Jason Dillon</a> */ public class VMID implements ID { /** The address of the current virtual machine */ protected final byte[] address; /** The process identifier of the current virtual machine */ protected final PID pid; /** A unique identifier to ensure uniqueness across the host machine */ protected final UID uid; /** The hash code of this VMID */ protected final int hashCode; /** * Construct a new VMID. * * @param address The address of the current virtual machine. * @param pid Process identifier. * @param uid Unique identifier. * * @see #getInstance() For getting a VMID instance reference. */ protected VMID(final byte[] address, final PID pid, final UID uid) { this.address = address; this.pid = pid; this.uid = uid; // generate a hashCode for this VMID int code = pid.hashCode(); code ^= uid.hashCode(); code ^= HashCode.generate(address); hashCode = code; } /** * Copy a VMID. * * @param vmid VMID to copy. */ protected VMID(final VMID vmid) { this.address = vmid.address; this.pid = vmid.pid; this.uid = vmid.uid; this.hashCode = vmid.hashCode; } /** * Get the address portion of this VMID. * * @return The address portion of this VMID. */ public final byte[] getAddress() { return address; } /** * Get the process identifier portion of this VMID. * * @return The process identifier portion of this VMID. */ public final PID getProcessID() { return pid; } /** * Get the UID portion of this VMID. * * @return The UID portion of this VMID. */ public final UID getUID() { return uid; } /** * Return a string representation of this VMID. * * @return A string representation of this VMID. */ public String toString() { StringBuffer buff = new StringBuffer(); for (int i=0; i<address.length; i++) { int n = (int) (address[i] & 0xFF); buff.append(Integer.toString(n, Character.MAX_RADIX)); } buff.append("-").append(pid.toString(Character.MAX_RADIX)); buff.append("-").append(uid); return buff.toString(); } /** * Return the hash code of this VMID. * * @return The hash code of this VMID. */ public final int hashCode() { return hashCode; } /** * Check if the given object is equal to this VMID. * * <p>A VMID is equals to another VMID if the address, * process identifer and UID portions are equal. * * @param obj Object to test equality with. * @return True if object is equals to this VMID. */ public boolean equals(final Object obj) { if (obj == this) return true; if (obj != null && obj.getClass() == getClass()) { VMID vmid = (VMID)obj; return Primitives.equals(vmid.address, address) && vmid.pid.equals(pid) && vmid.uid.equals(uid); } return false; } /** * Returns a copy of this VMID. * * @return A copy of this VMID. */ public Object clone() { try { return super.clone(); } catch (CloneNotSupportedException e) { throw new InternalError(); } } /** * Returns a VMID as a string. * * @return VMID as a string. */ public static String asString() { return getInstance().toString(); } ///////////////////////////////////////////////////////////////////////// // Instance Access // ///////////////////////////////////////////////////////////////////////// /** The single instance of VMID for the running Virtual Machine */ private static VMID instance = null; /** * Get the VMID for the current virtual machine. * * @return Virtual machine identifier. * * @throws NestedError Failed to create VMID instance. */ public synchronized static VMID getInstance() { if (instance == null) { instance = create(); } return instance; } /** * The address used when conventional methods fail to return the address * of the current machine. */ public static final byte[] UNKNOWN_HOST = { 0, 0, 0, 0 }; /** * Return the current host internet address. */ private static byte[] getHostAddress() { return (byte[]) AccessController.doPrivileged(new PrivilegedAction() { public Object run() { try { return InetAddress.getLocalHost().getAddress(); } catch (Exception e) { return UNKNOWN_HOST; } } }); } /** * Create the VMID for the current virtual mahcine. * * @return Virtual machine identifer. */ private static VMID create() { // get the local internet address for the current host byte[] address = getHostAddress(); return new VMID(address, PID.getInstance(), new UID()); } }
VMID.java |