1 package jalview.io.vamsas;
3 import java.util.Enumeration;
4 import java.util.IdentityHashMap;
5 import java.util.Iterator;
8 import uk.ac.vamsas.client.Vobject;
10 public class DatastoreRegistry
12 protected static org.apache.log4j.Logger log = org.apache.log4j.Logger
13 .getLogger(DatastoreRegistry.class);
16 * map between Datastore objects and the objects they are handling- used to
17 * prevent cycles in the synchronization pattern. Keys are both vamsas objects
18 * and jalview objects, values are datastore objects.
20 IdentityHashMap dsObjReg;
23 * all datastore items - value is [jvObject,vObject]
25 IdentityHashMap dsItemReg;
27 public DatastoreRegistry()
29 dsObjReg = new IdentityHashMap();
30 dsItemReg = new IdentityHashMap();
36 * @return true if obj is in the registry
38 public boolean isInvolvedInDsitem(Object obj)
40 return (obj instanceof DatastoreItem) ? dsItemReg.containsKey(obj)
41 : dsObjReg.containsKey(obj);
47 * @return DatastoreItem associated with obj - or null
49 public DatastoreItem getDatastoreItemFor(Object obj)
51 if (obj instanceof DatastoreItem)
53 log.debug("Returning DatastoreItem self reference.");// TODO: we could
58 return (DatastoreItem) obj;
60 return (DatastoreItem) dsObjReg.get(obj);
63 public void registerDsObj(DatastoreItem dsitem)
65 synchronized (dsItemReg)
67 Object[] dsregitem = (Object[]) dsItemReg.get(dsitem);
68 if (dsregitem == null)
70 // create a new item entry
71 dsregitem = new Object[]
72 { dsitem.jvobj, dsitem.vobj };
73 dsItemReg.put(dsitem, dsregitem);
75 // atomic update of the jv and vobject references in the dsObjReg
76 synchronized (dsObjReg)
79 if (dsitem.jvobj != dsregitem[0])
81 // overwrite existing involved entries.
82 if (dsregitem[0] != null)
84 dsObjReg.remove(dsregitem[0]);
86 if ((dsregitem[0] = dsitem.jvobj) != null)
88 dsObjReg.put(dsregitem[0], dsitem);
91 // and for the vobject
92 if (dsitem.vobj != dsregitem[1])
94 // overwrite existing involved entries.
95 if (dsregitem[1] != null)
97 dsObjReg.remove(dsregitem[1]);
99 if ((dsregitem[1] = dsitem.vobj) != null)
101 dsObjReg.put(dsregitem[1], dsitem);
109 * Remove dsitem from the registry
112 * @return null or last known Object[] { jvobject, vobject } references for
115 public Object[] removeDsObj(DatastoreItem dsitem)
117 Object[] dsregitem = null;
118 synchronized (dsItemReg)
120 synchronized (dsObjReg)
122 dsregitem = (Object[]) dsItemReg.remove(dsitem);
123 if (dsregitem != null)
125 // eliminate object refs too
126 if (dsregitem[0] != null)
128 dsObjReg.remove(dsregitem[0]);
130 if (dsregitem[1] != null)
132 dsObjReg.remove(dsregitem[1]);
140 protected void finalize()
142 if (dsObjReg != null)
144 Iterator items = dsObjReg.entrySet().iterator();
145 // avoid the nested reference memory leak.
146 while (items.hasNext())
148 Object[] vals = (Object[]) ((Map.Entry) items.next()).getValue();