proper vamsas style binding of alignment sequence objects to newick node labels....
[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   VamsasAppDatastore datastore = null;\r
123   public void initDatastoreItem(VamsasAppDatastore ds)\r
124   {\r
125     datastore = ds;\r
126     initDatastoreItem(ds.getProvEntry(), ds.getClientDocument(), ds.getVamsasObjectBinding(), ds.getJvObjectBinding());\r
127   }\r
128   public void initDatastoreItem(Entry provEntry, IClientDocument cdoc, Hashtable vobj2jv, IdentityHashMap jv2vobj)\r
129   {\r
130     this.provEntry = provEntry;\r
131     this.cdoc = cdoc;\r
132     this.vobj2jv = vobj2jv;\r
133     this.jv2vobj = jv2vobj;\r
134   }\r
135 \r
136   protected boolean isModifiable(String modifiable)\r
137   {\r
138     return modifiable==null; // TODO: USE VAMSAS LIBRARY OBJECT LOCK METHODS)\r
139   }\r
140 \r
141   protected Vector getjv2vObjs(Vector alsq)\r
142   {\r
143     Vector vObjs = new Vector();\r
144     Enumeration elm = alsq.elements();\r
145     while (elm.hasMoreElements())\r
146     {\r
147       vObjs.addElement(getjv2vObj(elm.nextElement()));\r
148     }\r
149     return vObjs;\r
150   }\r
151   // utility functions\r
152   /**\r
153    * get start<end range of segment, adjusting for inclusivity flag and\r
154    * polarity.\r
155    *\r
156    * @param visSeg\r
157    * @param ensureDirection when true - always ensure start is less than end.\r
158    * @return int[] { start, end, direction} where direction==1 for range running from end to start.\r
159    */\r
160   public int[] getSegRange(Seg visSeg, boolean ensureDirection)\r
161   {\r
162     boolean incl = visSeg.getInclusive();\r
163     // adjust for inclusive flag.\r
164     int pol = (visSeg.getStart() <= visSeg.getEnd()) ? 1 : -1; // polarity of\r
165     // region.\r
166     int start = visSeg.getStart() + (incl ? 0 : pol);\r
167     int end = visSeg.getEnd() + (incl ? 0 : -pol);\r
168     if (ensureDirection && pol == -1)\r
169     {\r
170       // jalview doesn't deal with inverted ranges, yet.\r
171       int t = end;\r
172       end = start;\r
173       start = t;\r
174     }\r
175     return new int[]\r
176         {\r
177         start, end, pol < 0 ? 1 : 0};\r
178   }\r
179   /**\r
180    * provenance bits\r
181    */\r
182   protected jalview.datamodel.Provenance getJalviewProvenance(Provenance prov)\r
183   {\r
184     // TODO: fix App and Action entries and check use of provenance in jalview.\r
185     jalview.datamodel.Provenance jprov = new jalview.datamodel.Provenance();\r
186     for (int i = 0; i < prov.getEntryCount(); i++)\r
187     {\r
188       jprov.addEntry(prov.getEntry(i).getUser(), prov.getEntry(i).getAction(),\r
189                      prov.getEntry(i).getDate(),\r
190                      prov.getEntry(i).getId());\r
191     }\r
192 \r
193     return jprov;\r
194   }\r
195 \r
196   /**\r
197    *\r
198    * @return default initial provenance list for a Jalview created vamsas\r
199    *         object.\r
200    */\r
201   Provenance dummyProvenance()\r
202   {\r
203     return dummyProvenance(null);\r
204   }\r
205 \r
206   protected Entry dummyPEntry(String action)\r
207   {\r
208     Entry entry = new Entry();\r
209     entry.setApp(this.provEntry.getApp());\r
210     if (action != null)\r
211     {\r
212       entry.setAction(action);\r
213     }\r
214     else\r
215     {\r
216       entry.setAction("created.");\r
217     }\r
218     entry.setDate(new java.util.Date());\r
219     entry.setUser(this.provEntry.getUser());\r
220     return entry;\r
221   }\r
222 \r
223   protected Provenance dummyProvenance(String action)\r
224   {\r
225     Provenance prov = new Provenance();\r
226     prov.addEntry(dummyPEntry(action));\r
227     return prov;\r
228   }\r
229 \r
230   protected void addProvenance(Provenance p, String action)\r
231   {\r
232     p.addEntry(dummyPEntry(action));\r
233   }\r
234 \r
235 }\r