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