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 synchronized void registerDsObj(DatastoreItem dsitem)
65 Object[] dsregitem = (Object[]) dsItemReg.get(dsitem);
66 if (dsregitem == null)
68 // create a new item entry
69 dsregitem = new Object[]
70 { dsitem.jvobj, dsitem.vobj };
71 dsItemReg.put(dsitem, dsregitem);
72 dsObjReg.put(dsitem.jvobj, dsitem);
73 dsObjReg.put(dsitem.vobj, dsitem);
77 // update registry for any changed references
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);
108 * Remove dsitem from the registry
111 * @return null or last known Object[] { jvobject, vobject } references for
114 public synchronized Object[] removeDsObj(DatastoreItem dsitem)
116 Object[] dsregitem = null;
117 // synchronized (dsItemReg)
119 // synchronized (dsObjReg)
121 dsregitem = (Object[]) dsItemReg.remove(dsitem);
122 if (dsregitem != null)
124 // eliminate object refs too
125 if (dsregitem[0] != null)
127 dsObjReg.remove(dsregitem[0]);
129 if (dsregitem[1] != null)
131 dsObjReg.remove(dsregitem[1]);
139 protected void finalize()
141 if (dsObjReg != null)
143 Iterator items = dsObjReg.entrySet().iterator();
144 // avoid the nested reference memory leak.
145 while (items.hasNext())
147 Object[] vals = (Object[]) ((Map.Entry) items.next()).getValue();
154 if (dsItemReg != null)