package org.jgroups.util; import org.jgroups.Global; import java.io.*; import java.security.SecureRandom; /** * Subclass of {@link org.jgroups.util.UUID} which adds a string as payload. An instance of this can be fed to * {@link org.jgroups.JChannel#setAddressGenerator(org.jgroups.stack.AddressGenerator)}, with the address generator * creating PayloadUUIDs. * @author Bela Ban */ public class AdditionalDataUUID extends UUID { private static final long serialVersionUID=4583682459482601554L; protected byte[] payload; public AdditionalDataUUID() { } protected AdditionalDataUUID(byte[] data, byte[] payload) { super(data); this.payload=payload; } public static AdditionalDataUUID randomUUID(byte[] payload) { return new AdditionalDataUUID(generateRandomBytes(), payload); } public static AdditionalDataUUID randomUUID(String logical_name, byte[] payload) { AdditionalDataUUID retval=new AdditionalDataUUID(generateRandomBytes(), payload); UUID.add(retval, logical_name); return retval; } protected static byte[] generateRandomBytes() { SecureRandom ng=numberGenerator; if(ng == null) numberGenerator=ng=new SecureRandom(); byte[] randomBytes=new byte[16]; ng.nextBytes(randomBytes); return randomBytes; } public int size() { int retval=super.size() + Global.BYTE_SIZE; if(payload != null) retval+=payload.length; return retval; } public void writeExternal(ObjectOutput out) throws IOException { super.writeExternal(out); try { Util.writeByteBuffer(payload, out); } catch(Exception e) { throw new IOException(e); } } public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { super.readExternal(in); try { payload=Util.readByteBuffer(in); } catch(Exception e) { throw new IOException(e); } } public void writeTo(DataOutput out) throws Exception { super.writeTo(out); Util.writeByteBuffer(payload, out); } public void readFrom(DataInput in) throws Exception { super.readFrom(in); payload=Util.readByteBuffer(in); } public String toString() { if(print_uuids) return toStringLong() + (payload == null? "" : " (" + payload.length + " bytes)"); return super.toString() + (payload == null? "" : " (" + payload.length + " bytes)"); } }