package org.jgroups.protocols.relay; import org.jgroups.Global; import org.jgroups.util.UUID; import org.jgroups.util.Util; import java.io.*; import java.util.Collection; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; /** * Implementation of SiteAddress * @author Bela Ban * @since 3.2 */ public class SiteUUID extends UUID implements SiteAddress { private static final long serialVersionUID=3748908939644729773L; protected String name; // logical name, can be null protected short site; // Maps between site-IDs (shorts) and site names protected static final ConcurrentMap<Short,String> site_cache=new ConcurrentHashMap<Short,String>(10); public SiteUUID() { } public SiteUUID(long mostSigBits, long leastSigBits, String name, short site) { super(mostSigBits,leastSigBits); this.name=name; this.site=site; } public SiteUUID(UUID uuid, String name, short site) { super(uuid.getMostSignificantBits(), uuid.getLeastSignificantBits()); this.name=name; this.site=site; } public String getName() { return name; } public static void addToCache(short site, String name) { site_cache.putIfAbsent(site, name); } public static void replaceInCache(short site, String name) { site_cache.put(site, name); } public static Collection<String> cacheValues() {return site_cache.values();} public static boolean hasCacheValues() {return !site_cache.isEmpty();} public static String getSiteName(short site) { return site_cache.get(site); } public static void clearCache() { site_cache.clear(); } public short getSite() { return site; } // public int compareTo(Address other) { // int retval=super.compareTo(other); // if(retval != 0) // return retval; // SiteUUID tmp=(SiteUUID)other; // return site == tmp.site ? 0: site < tmp.site? -1 : 1; // } public UUID copy() { return new SiteUUID(mostSigBits, leastSigBits, name, site); } // public boolean equals(Object obj) { // return obj instanceof UUID && compareTo((Address)obj) == 0; // } // public int hashCode() { // return super.hashCode() + site; // } public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { super.readExternal(in); name=in.readUTF(); site=in.readShort(); } public void writeExternal(ObjectOutput out) throws IOException { super.writeExternal(out); out.writeUTF(name); out.writeShort(site); } public void readFrom(DataInput in) throws Exception { super.readFrom(in); name=Util.readString(in); site=in.readShort(); } public void writeTo(DataOutput out) throws Exception { super.writeTo(out); Util.writeString(name, out); out.writeShort(site); } public int size() { return super.size() + Util.size(name) + Global.SHORT_SIZE; } public String toString() { String retval=name != null? name : super.toString(); String suffix=site_cache.get(site); return retval + ":" + (suffix != null? suffix : String.valueOf(site)); } protected static short getSite(String site_name) { for(Map.Entry<Short,String> entry: site_cache.entrySet()) { if(entry.getValue().equals(site_name)) return entry.getKey(); } throw new IllegalArgumentException("site \"" + site_name + "\" does not have a corresponding ID"); } }