refactored form of vamsas document interaction code
[jalview.git] / src / jalview / io / vamsas / DatastoreItem.java
1 package jalview.io.vamsas;\r
2 \r
3 import jalview.bin.Cache;\r
4 import jalview.gui.TreePanel;\r
5 import jalview.io.VamsasAppDatastore;\r
6 \r
7 import java.util.Enumeration;\r
8 import java.util.Hashtable;\r
9 import java.util.IdentityHashMap;\r
10 import java.util.Vector;\r
11 \r
12 import uk.ac.vamsas.client.IClientDocument;\r
13 import uk.ac.vamsas.client.Vobject;\r
14 import uk.ac.vamsas.client.VorbaId;\r
15 import uk.ac.vamsas.objects.core.Entry;\r
16 import uk.ac.vamsas.objects.core.Provenance;\r
17 import uk.ac.vamsas.objects.core.Seg;\r
18 \r
19 /**\r
20  * Holds all the common machinery for binding objects to vamsas objects\r
21  * @author JimP\r
22  *\r
23  */\r
24 public class DatastoreItem\r
25 {\r
26   /**\r
27    * \r
28    */\r
29   Entry provEntry = null;\r
30 \r
31   IClientDocument cdoc;\r
32 \r
33   Hashtable vobj2jv;\r
34 \r
35   IdentityHashMap jv2vobj;\r
36   /**\r
37    * @return the Vobject bound to Jalview datamodel object\r
38    */\r
39   protected Vobject getjv2vObj(Object jvobj)\r
40   {\r
41     if (jv2vobj.containsKey(jvobj))\r
42     {\r
43       return cdoc.getObject( (VorbaId) jv2vobj.get(jvobj));\r
44     }\r
45     if (Cache.log.isDebugEnabled())\r
46     {\r
47       Cache.log.debug("Returning null VorbaID binding for jalview object "+jvobj);\r
48     }\r
49     return null;\r
50   }\r
51 \r
52   /**\r
53    *\r
54    * @param vobj\r
55    * @return Jalview datamodel object bound to the vamsas document object\r
56    */\r
57   protected Object getvObj2jv(uk.ac.vamsas.client.Vobject vobj)\r
58   {\r
59     if (vobj2jv==null)\r
60       return null;\r
61     VorbaId id = vobj.getVorbaId();\r
62     if (id == null)\r
63     {\r
64       id = cdoc.registerObject(vobj);\r
65       Cache.log\r
66           .debug("Registering new object and returning null for getvObj2jv");\r
67       return null;\r
68     }\r
69     if (vobj2jv.containsKey(vobj.getVorbaId()))\r
70     {\r
71       return vobj2jv.get(vobj.getVorbaId());\r
72     }\r
73     return null;\r
74   }\r
75 \r
76   protected void bindjvvobj(Object jvobj, uk.ac.vamsas.client.Vobject vobj)\r
77   {\r
78     VorbaId id = vobj.getVorbaId();\r
79     if (id == null)\r
80     {\r
81       id = cdoc.registerObject(vobj);\r
82       if (id == null || vobj.getVorbaId() == null || cdoc.getObject(id)!=vobj)\r
83       {\r
84         Cache.log.error("Failed to get id for " +\r
85                         (vobj.isRegisterable() ? "registerable" :\r
86                          "unregisterable") + " object " + vobj);\r
87       }\r
88     }\r
89 \r
90     if (vobj2jv.containsKey(vobj.getVorbaId()) &&\r
91         ! ( (VorbaId) vobj2jv.get(vobj.getVorbaId())).equals(jvobj))\r
92     {\r
93       Cache.log.debug("Warning? Overwriting existing vamsas id binding for " +\r
94                       vobj.getVorbaId(),\r
95                       new Exception("Overwriting vamsas id binding."));\r
96     }\r
97     else if (jv2vobj.containsKey(jvobj) &&\r
98              ! ( (VorbaId) jv2vobj.get(jvobj)).equals(vobj.getVorbaId()))\r
99     {\r
100       Cache.log.debug(\r
101           "Warning? Overwriting existing jalview object binding for " + jvobj,\r
102           new Exception("Overwriting jalview object binding."));\r
103     }\r
104     /* Cache.log.error("Attempt to make conflicting object binding! "+vobj+" id " +vobj.getVorbaId()+" already bound to "+getvObj2jv(vobj)+" and "+jvobj+" already bound to "+getjv2vObj(jvobj),new Exception("Excessive call to bindjvvobj"));\r
105          }*/\r
106     // we just update the hash's regardless!\r
107     Cache.log.debug("Binding "+vobj.getVorbaId()+" to "+jvobj);\r
108     vobj2jv.put(vobj.getVorbaId(), jvobj);\r
109     // JBPNote - better implementing a hybrid invertible hash.\r
110     jv2vobj.put(jvobj, vobj.getVorbaId());\r
111   }\r
112 \r
113   public DatastoreItem() {\r
114     super();\r
115   }\r
116   public DatastoreItem(VamsasAppDatastore datastore)\r
117   {\r
118     this();\r
119     initDatastoreItem(datastore);\r
120     // TODO Auto-generated constructor stub\r
121   }\r
122 \r
123   public void initDatastoreItem(VamsasAppDatastore ds)\r
124   {\r
125     initDatastoreItem(ds.getProvEntry(), ds.getClientDocument(), ds.getVamsasObjectBinding(), ds.getJvObjectBinding());\r
126   }\r
127   public void initDatastoreItem(Entry provEntry, IClientDocument cdoc, Hashtable vobj2jv, IdentityHashMap jv2vobj)\r
128   {\r
129     this.provEntry = provEntry;\r
130     this.cdoc = cdoc;\r
131     this.vobj2jv = vobj2jv;\r
132     this.jv2vobj = jv2vobj;\r
133   }\r
134 \r
135   protected boolean isModifiable(String modifiable)\r
136   {\r
137     return modifiable==null; // TODO: USE VAMSAS LIBRARY OBJECT LOCK METHODS)\r
138   }\r
139 \r
140   protected Vector getjv2vObjs(Vector alsq)\r
141   {\r
142     Vector vObjs = new Vector();\r
143     Enumeration elm = alsq.elements();\r
144     while (elm.hasMoreElements())\r
145     {\r
146       vObjs.addElement(getjv2vObj(elm.nextElement()));\r
147     }\r
148     return vObjs;\r
149   }\r
150   // utility functions\r
151   /**\r
152    * get start<end range of segment, adjusting for inclusivity flag and\r
153    * polarity.\r
154    *\r
155    * @param visSeg\r
156    * @param ensureDirection when true - always ensure start is less than end.\r
157    * @return int[] { start, end, direction} where direction==1 for range running from end to start.\r
158    */\r
159   public int[] getSegRange(Seg visSeg, boolean ensureDirection)\r
160   {\r
161     boolean incl = visSeg.getInclusive();\r
162     // adjust for inclusive flag.\r
163     int pol = (visSeg.getStart() <= visSeg.getEnd()) ? 1 : -1; // polarity of\r
164     // region.\r
165     int start = visSeg.getStart() + (incl ? 0 : pol);\r
166     int end = visSeg.getEnd() + (incl ? 0 : -pol);\r
167     if (ensureDirection && pol == -1)\r
168     {\r
169       // jalview doesn't deal with inverted ranges, yet.\r
170       int t = end;\r
171       end = start;\r
172       start = t;\r
173     }\r
174     return new int[]\r
175         {\r
176         start, end, pol < 0 ? 1 : 0};\r
177   }\r
178   /**\r
179    * provenance bits\r
180    */\r
181   protected jalview.datamodel.Provenance getJalviewProvenance(Provenance prov)\r
182   {\r
183     // TODO: fix App and Action entries and check use of provenance in jalview.\r
184     jalview.datamodel.Provenance jprov = new jalview.datamodel.Provenance();\r
185     for (int i = 0; i < prov.getEntryCount(); i++)\r
186     {\r
187       jprov.addEntry(prov.getEntry(i).getUser(), prov.getEntry(i).getAction(),\r
188                      prov.getEntry(i).getDate(),\r
189                      prov.getEntry(i).getId());\r
190     }\r
191 \r
192     return jprov;\r
193   }\r
194 \r
195   /**\r
196    *\r
197    * @return default initial provenance list for a Jalview created vamsas\r
198    *         object.\r
199    */\r
200   Provenance dummyProvenance()\r
201   {\r
202     return dummyProvenance(null);\r
203   }\r
204 \r
205   protected Entry dummyPEntry(String action)\r
206   {\r
207     Entry entry = new Entry();\r
208     entry.setApp(this.provEntry.getApp());\r
209     if (action != null)\r
210     {\r
211       entry.setAction(action);\r
212     }\r
213     else\r
214     {\r
215       entry.setAction("created.");\r
216     }\r
217     entry.setDate(new java.util.Date());\r
218     entry.setUser(this.provEntry.getUser());\r
219     return entry;\r
220   }\r
221 \r
222   protected Provenance dummyProvenance(String action)\r
223   {\r
224     Provenance prov = new Provenance();\r
225     prov.addEntry(dummyPEntry(action));\r
226     return prov;\r
227   }\r
228 \r
229   protected void addProvenance(Provenance p, String action)\r
230   {\r
231     p.addEntry(dummyPEntry(action));\r
232   }\r
233 \r
234 }\r