14120079d23ff7f4fd211ee867c46fe0fe836988
[jalview.git] / src / jalview / io / vamsas / Datasetsequence.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer (Development Version 2.4.1)\r
3  * Copyright (C) 2009 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
4  * \r
5  * This program is free software; you can redistribute it and/or\r
6  * modify it under the terms of the GNU General Public License\r
7  * as published by the Free Software Foundation; either version 2\r
8  * of the License, or (at your option) any later version.\r
9  * \r
10  * This program is distributed in the hope that it will be useful,\r
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13  * GNU General Public License for more details.\r
14  * \r
15  * You should have received a copy of the GNU General Public License\r
16  * along with this program; if not, write to the Free Software\r
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
18  */\r
19 package jalview.io.vamsas;\r
20 \r
21 import jalview.datamodel.AlignmentI;\r
22 import jalview.datamodel.DBRefEntry;\r
23 import jalview.datamodel.SequenceI;\r
24 import jalview.io.VamsasAppDatastore;\r
25 import uk.ac.vamsas.objects.core.DataSet;\r
26 import uk.ac.vamsas.objects.core.DbRef;\r
27 import uk.ac.vamsas.objects.core.Sequence;\r
28 \r
29 /**\r
30  * synchronize a vamsas dataset sequence with a jalview dataset sequence.\r
31  * This class deals with all sequence features and database references associated with\r
32  * the jalview sequence.\r
33  * @author JimP\r
34  *\r
35  */\r
36 public class Datasetsequence extends DatastoreItem\r
37 {\r
38   String dict;\r
39   private DataSet dataset;\r
40   // private AlignmentI jvdset;\r
41 \r
42   public Datasetsequence(VamsasAppDatastore vamsasAppDatastore,\r
43           SequenceI sq, String dict, DataSet dataset)\r
44   {\r
45     super(vamsasAppDatastore, sq, uk.ac.vamsas.objects.core.Sequence.class);\r
46     this.dataset = dataset;\r
47     // this.jvdset = jvdset;\r
48     this.dict = dict;\r
49     doSync();\r
50   }\r
51 \r
52   public Datasetsequence(VamsasAppDatastore vamsasAppDatastore,\r
53           Sequence vdseq)\r
54   {\r
55     super(vamsasAppDatastore, vdseq, SequenceI.class);\r
56     doJvUpdate();\r
57   }\r
58 \r
59   public void addFromDocument()\r
60   {\r
61     Sequence vseq = (Sequence) vobj;\r
62     SequenceI dsseq = new jalview.datamodel.Sequence(vseq.getName(), \r
63             vseq.getSequence(),\r
64             (int) vseq.getStart(), (int) vseq.getEnd());\r
65     dsseq.setDescription(vseq.getDescription());\r
66     bindjvvobj(dsseq, vseq);\r
67     dsseq.setVamsasId(vseq.getVorbaId().getId());\r
68     jvobj = dsseq;\r
69     modified=true;\r
70   }\r
71   public void updateFromDoc()\r
72   {\r
73     Sequence sq = (Sequence) vobj;\r
74     SequenceI sequence = (SequenceI) jvobj;\r
75     if (!sequence.getSequenceAsString().equals(sq.getSequence()))\r
76     {\r
77       log.warn("Potential Client Error ! - mismatch of dataset sequence: and jalview internal dataset sequence.");\r
78     } else {\r
79       // verify and update principal attributes.\r
80       if (sequence.getDescription() != null\r
81               && (sequence.getDescription() == null || !sequence\r
82                       .getDescription().equals(sq.getDescription())))\r
83       {\r
84         sequence.setDescription(sq.getDescription());\r
85         modified = true;\r
86       }\r
87       if (sequence.getSequence() == null\r
88               || !sequence.getSequenceAsString().equals(\r
89                       sq.getSequence()))\r
90       {\r
91         if (sequence.getStart() != sq.getStart()\r
92                 || sequence.getEnd() != sq.getEnd())\r
93         {\r
94           // update modified sequence.\r
95           sequence.setSequence(sq.getSequence());\r
96           sequence.setStart((int)sq.getStart());\r
97           sequence.setEnd((int)sq.getEnd());\r
98           modified = true;\r
99         }\r
100       }\r
101       if (!sequence.getName().equals(sq.getName()))\r
102       {\r
103         sequence.setName(sq.getName());\r
104         modified = true;\r
105       }\r
106       modified |= updateJvDbRefs();\r
107       // updateJvFeatures();\r
108     }    \r
109   }\r
110 \r
111 /*\r
112   private void updateJvFeatures()\r
113   {\r
114     Sequence vsq = (Sequence) vobj;\r
115     \r
116     // add or update any new features/references on dataset sequence\r
117     if (vsq.getgetSequenceFeatures() != null)\r
118     {\r
119       int sfSize = sq.getSequenceFeatures().length;\r
120 \r
121       for (int sf = 0; sf < sfSize; sf++)\r
122       {\r
123         new jalview.io.vamsas.Sequencefeature(datastore, (jalview.datamodel.SequenceFeature) sq\r
124                 .getSequenceFeatures()[sf], dataset, (Sequence) vobj);\r
125       }\r
126     }    \r
127   }\r
128 */\r
129   private boolean updateSqFeatures()\r
130   {\r
131     boolean modified=false;\r
132     SequenceI sq = (SequenceI) jvobj;\r
133     \r
134     // add or update any new features/references on dataset sequence\r
135     if (sq.getSequenceFeatures() != null)\r
136     {\r
137       int sfSize = sq.getSequenceFeatures().length;\r
138 \r
139       for (int sf = 0; sf < sfSize; sf++)\r
140       {\r
141         modified|=new jalview.io.vamsas.Sequencefeature(datastore, (jalview.datamodel.SequenceFeature) sq\r
142                 .getSequenceFeatures()[sf], dataset, (Sequence) vobj).docWasUpdated();\r
143       }\r
144     }\r
145     return modified;\r
146   }\r
147 \r
148   public void addToDocument()\r
149   {\r
150     SequenceI sq = (SequenceI) jvobj;\r
151     Sequence sequence = new Sequence();\r
152     bindjvvobj(sq, sequence);\r
153     sq.setVamsasId(sequence.getVorbaId().getId());\r
154     sequence.setSequence(sq.getSequenceAsString());\r
155     sequence.setDictionary(dict);\r
156     sequence.setName(sq.getName());\r
157     sequence.setStart(sq.getStart());\r
158     sequence.setEnd(sq.getEnd());\r
159     sequence.setDescription(sq.getDescription());\r
160     dataset.addSequence(sequence);\r
161     vobj = sequence;\r
162     updateSqFeatures();\r
163     updateDbRefs();//sq,(Sequence) vobj, dataset);\r
164   }\r
165   /**\r
166    * sync database references from jv to document\r
167    * @return true if document was modified\r
168    */\r
169   private boolean updateDbRefs() {\r
170     boolean modifiedthedoc=false;\r
171     SequenceI sq = (SequenceI) jvobj;\r
172     \r
173     if (sq.getDatasetSequence() == null && sq.getDBRef() != null)\r
174     {\r
175       // only sync database references for dataset sequences\r
176       DBRefEntry[] entries = sq.getDBRef();\r
177       //jalview.datamodel.DBRefEntry dbentry;\r
178       for (int db = 0; db < entries.length; db++)\r
179       {\r
180         modifiedthedoc|= new jalview.io.vamsas.Dbref(datastore,\r
181                 //dbentry = \r
182                   entries[db], sq, (Sequence) vobj, dataset).docWasUpdated();\r
183         \r
184       }\r
185 \r
186     }\r
187     return modifiedthedoc;\r
188   }\r
189   /**\r
190    * sync database references from document to jv sequence\r
191    * @return true if local sequence refs were modified\r
192    */\r
193   private boolean updateJvDbRefs() {\r
194     boolean modifiedtheseq=false;\r
195     SequenceI sq = (SequenceI) jvobj;\r
196     Sequence vsq = (Sequence) vobj;\r
197     if (vsq.getDbRefCount()>0) {\r
198       // only sync database references for dataset sequences\r
199       DbRef[] entries = vsq.getDbRef();\r
200       //DbRef dbentry;\r
201       for (int db = 0; db < entries.length; db++)\r
202       {\r
203         modifiedtheseq|= new jalview.io.vamsas.Dbref(datastore,\r
204                 //dbentry = \r
205                   entries[db], vsq, sq).jvWasUpdated();\r
206       }\r
207     }\r
208     return modifiedtheseq;\r
209   }\r
210 \r
211   public void conflict()\r
212   {\r
213     log.warn("Conflict in dataset sequence update to document. Overwriting document");\r
214     // TODO: could try to import from document data to jalview first. and then\r
215     updateToDoc();\r
216   }\r
217   boolean modified = false;\r
218   public void updateToDoc()\r
219   {\r
220     SequenceI sq = (SequenceI) jvobj;\r
221     Sequence sequence = (Sequence) vobj;\r
222     // verify and update principal attributes.\r
223     if (sequence.getDescription() != null\r
224             && (sequence.getDescription() == null || !sequence\r
225                     .getDescription().equals(sq.getDescription())))\r
226     {\r
227       sequence.setDescription(sq.getDescription());\r
228       modified = true;\r
229     }\r
230     if (sequence.getSequence() == null\r
231             || !sequence.getSequence().equals(\r
232                     sq.getSequenceAsString()))\r
233     {\r
234       if (sequence.getStart() != sq.getStart()\r
235               || sequence.getEnd() != sq.getEnd())\r
236       {\r
237         // update modified sequence.\r
238         sequence.setSequence(sq.getSequenceAsString());\r
239         sequence.setStart(sq.getStart());\r
240         sequence.setEnd(sq.getEnd());\r
241         modified = true;\r
242       }\r
243     }\r
244     if (!dict.equals(sequence.getDictionary()))\r
245     {\r
246       sequence.setDictionary(dict);\r
247       modified = true;\r
248     }\r
249     if (!sequence.getName().equals(sq.getName()))\r
250     {\r
251       sequence.setName(sq.getName());\r
252       modified = true;\r
253     }\r
254     modified |= updateDbRefs();\r
255     modified |= updateSqFeatures();\r
256   }\r
257 \r
258   /**\r
259    * (probably could just do vobj.isModified(), but..)\r
260    * @return true if document's dataset sequence was modified\r
261    */\r
262   public boolean getModified()\r
263   {\r
264     return modified;\r
265   }\r
266 \r
267 }\r