4 package uk.ac.vamsas.client.simpleclient;
6 import org.apache.commons.logging.Log;
7 import org.apache.commons.logging.LogFactory;
8 import org.vamsas.client.ClientHandle;
9 import org.vamsas.client.SessionHandle;
10 import org.vamsas.client.UserHandle;
11 import org.vamsas.client.VorbaId;
12 import org.vamsas.client.VorbaIdFactory;
13 import org.vamsas.client.Vobject;
14 import org.vamsas.objects.utils.document.VersionEntries;
16 import java.util.Hashtable;
17 import java.util.zip.CRC32;
19 * Simplest VorbaId constructor
23 public class IdFactory extends VorbaIdFactory {
24 static Log log = LogFactory.getLog(IdFactory.class);
25 private SessionHandle session=null;
26 private ClientHandle client;
27 private UserHandle user;
28 private CRC32 unique=new CRC32(); // used to attempt a unique but predictable stream for IDs
29 private String idstring;
30 int sequence=1; // incrementing value for next new ID
36 // TODO Auto-generated constructor stub
44 protected IdFactory(SessionHandle session, ClientHandle client, UserHandle user) {
46 this.session = session;
50 unique.update(new Object[] { session, client, user}.toString().getBytes());
51 // TODO: Ensure format of URNs and use standard composition methods.
52 idstring = client.getClientName()+":"+unique.getValue()+".";
53 extantids=new Hashtable();
54 this.extanthashv=new Hashtable();
57 * values for keys in this hash can be used to reference the org.vamsas.client.Vobject instance for the VorbaId string.
58 * @return the hash of all VorbaIds
60 protected Hashtable getVorbaIdHash() {
64 * values for keys in this hash are Vobjhash objects created for each Vobj with a VorbaId
65 * after this factory has been used to write a vamsas archive.
66 * @return the hash of all VorbaIds and their hash values.
68 protected Hashtable getVobjhashVals() {
72 * @see org.vamsas.client.VorbaIdFactory#makeVorbaId()
74 public VorbaId makeVorbaId(Vobject vobject) {
76 throw new Error("makeVorbaId called on improperly initialised IdFactory Vobject!");
77 if (!vobject.isRegisterable())
78 throw new Error("makeVorbaId called on unregisterable object.");
79 if (vobject.isRegistered())
80 throw new Error("makeVorbaId called on already registered object.");
89 newidstring=idstring+Integer.toString(sequence);
90 } while (extantids.containsKey(newidstring));
91 extantids.put(newidstring, vobject); // hash the Vobject by its new Id
92 VorbaId id = newId(newidstring); // VorbaId.hash()==newidstring.hash() so we can still recover vobject
97 * @see org.vamsas.client.VorbaIdFactory#setSession(org.vamsas.client.SessionHandle)
99 protected void setSession(SessionHandle sessionhandle) {
100 if (sessionhandle!=null)
101 session=sessionhandle;
103 log.warn("setSession(null) called.");
107 * @see org.vamsas.client.VorbaIdFactory#getSessionHandle()
109 public SessionHandle getSessionHandle() {
114 * @see org.vamsas.client.VorbaIdFactory#setClient(org.vamsas.client.ClientHandle)
116 protected void setClient(ClientHandle appHandle) {
120 log.warn("setClient(null) called.");
124 * @see org.vamsas.client.VorbaIdFactory#getClientHandle()
126 public ClientHandle getClientHandle() {
131 * @see org.vamsas.client.VorbaIdFactory#setUser(org.vamsas.client.UserHandle)
133 protected void setUser(UserHandle userHandle) {
134 if (userHandle!=null)
137 log.warn("setUser(null) called.");
141 * @see org.vamsas.client.VorbaIdFactory#getUserHandle()
143 public UserHandle getUserHandle() {
147 * Convenience method used for default behaviour in testing
148 * and any anonymous internal vamsasDocument unmarshalling
152 protected static IdFactory getDummyFactory(String clientname) {
153 if (clientname==null)
154 clientname="uk.ac.vamsas.client.simpleclient.IdFactory";
155 return new IdFactory(new SessionHandle("dummy.session"),
156 new ClientHandle(clientname,VersionEntries.latestVersion()),
157 new UserHandle(clientname, "Arnold User's Inc."));