update author list in license for (JAL-826)
[jalview.git] / src / jalview / io / vamsas / Datasetsequence.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7)\r
3  * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, 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(),\r
65             vseq.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.warn("Potential Client Error ! - mismatch of dataset sequence: and jalview internal dataset sequence.");\r
80     }\r
81     else\r
82     {\r
83       // verify and update principal attributes.\r
84       if (sequence.getDescription() != null\r
85               && (sequence.getDescription() == null || !sequence\r
86                       .getDescription().equals(sq.getDescription())))\r
87       {\r
88         sequence.setDescription(sq.getDescription());\r
89         modified = true;\r
90       }\r
91       if (sequence.getSequence() == null\r
92               || !sequence.getSequenceAsString().equals(sq.getSequence()))\r
93       {\r
94         if (sequence.getStart() != sq.getStart()\r
95                 || sequence.getEnd() != sq.getEnd())\r
96         {\r
97           // update modified sequence.\r
98           sequence.setSequence(sq.getSequence());\r
99           sequence.setStart((int) sq.getStart());\r
100           sequence.setEnd((int) sq.getEnd());\r
101           modified = true;\r
102         }\r
103       }\r
104       if (!sequence.getName().equals(sq.getName()))\r
105       {\r
106         sequence.setName(sq.getName());\r
107         modified = true;\r
108       }\r
109       modified |= updateJvDbRefs();\r
110       // updateJvFeatures();\r
111     }\r
112   }\r
113 \r
114   /*\r
115    * private void updateJvFeatures() { Sequence vsq = (Sequence) vobj;\r
116    * \r
117    * // add or update any new features/references on dataset sequence if\r
118    * (vsq.getgetSequenceFeatures() != null) { int sfSize =\r
119    * sq.getSequenceFeatures().length;\r
120    * \r
121    * for (int sf = 0; sf < sfSize; sf++) { new\r
122    * jalview.io.vamsas.Sequencefeature(datastore,\r
123    * (jalview.datamodel.SequenceFeature) sq .getSequenceFeatures()[sf], dataset,\r
124    * (Sequence) vobj); } } }\r
125    */\r
126   private boolean updateSqFeatures()\r
127   {\r
128     boolean modified = false;\r
129     SequenceI sq = (SequenceI) jvobj;\r
130 \r
131     // add or update any new features/references on dataset sequence\r
132     if (sq.getSequenceFeatures() != null)\r
133     {\r
134       int sfSize = sq.getSequenceFeatures().length;\r
135 \r
136       for (int sf = 0; sf < sfSize; sf++)\r
137       {\r
138         modified |= new jalview.io.vamsas.Sequencefeature(datastore,\r
139                 (jalview.datamodel.SequenceFeature) sq\r
140                         .getSequenceFeatures()[sf], dataset,\r
141                 (Sequence) vobj).docWasUpdated();\r
142       }\r
143     }\r
144     return modified;\r
145   }\r
146 \r
147   public void addToDocument()\r
148   {\r
149     SequenceI sq = (SequenceI) jvobj;\r
150     Sequence sequence = new Sequence();\r
151     bindjvvobj(sq, sequence);\r
152     sq.setVamsasId(sequence.getVorbaId().getId());\r
153     sequence.setSequence(sq.getSequenceAsString());\r
154     sequence.setDictionary(dict);\r
155     sequence.setName(sq.getName());\r
156     sequence.setStart(sq.getStart());\r
157     sequence.setEnd(sq.getEnd());\r
158     sequence.setDescription(sq.getDescription());\r
159     dataset.addSequence(sequence);\r
160     vobj = sequence;\r
161     updateSqFeatures();\r
162     updateDbRefs();// sq,(Sequence) vobj, dataset);\r
163   }\r
164 \r
165   /**\r
166    * sync database references from jv to document\r
167    * \r
168    * @return true if document was modified\r
169    */\r
170   private boolean updateDbRefs()\r
171   {\r
172     boolean modifiedthedoc = false;\r
173     SequenceI sq = (SequenceI) jvobj;\r
174 \r
175     if (sq.getDatasetSequence() == null && sq.getDBRef() != null)\r
176     {\r
177       // only sync database references for dataset sequences\r
178       DBRefEntry[] entries = sq.getDBRef();\r
179       // jalview.datamodel.DBRefEntry dbentry;\r
180       for (int db = 0; db < entries.length; db++)\r
181       {\r
182         modifiedthedoc |= new jalview.io.vamsas.Dbref(datastore,\r
183         // dbentry =\r
184                 entries[db], sq, (Sequence) vobj, dataset).docWasUpdated();\r
185 \r
186       }\r
187 \r
188     }\r
189     return modifiedthedoc;\r
190   }\r
191 \r
192   /**\r
193    * sync database references from document to jv sequence\r
194    * \r
195    * @return true if local sequence refs were modified\r
196    */\r
197   private boolean updateJvDbRefs()\r
198   {\r
199     boolean modifiedtheseq = false;\r
200     SequenceI sq = (SequenceI) jvobj;\r
201     Sequence vsq = (Sequence) vobj;\r
202     if (vsq.getDbRefCount() > 0)\r
203     {\r
204       // only sync database references for dataset sequences\r
205       DbRef[] entries = vsq.getDbRef();\r
206       // DbRef dbentry;\r
207       for (int db = 0; db < entries.length; db++)\r
208       {\r
209         modifiedtheseq |= new jalview.io.vamsas.Dbref(datastore,\r
210         // dbentry =\r
211                 entries[db], vsq, sq).jvWasUpdated();\r
212       }\r
213     }\r
214     return modifiedtheseq;\r
215   }\r
216 \r
217   public void conflict()\r
218   {\r
219     log.warn("Conflict in dataset sequence update to document. Overwriting document");\r
220     // TODO: could try to import from document data to jalview first. and then\r
221     updateToDoc();\r
222   }\r
223 \r
224   boolean modified = false;\r
225 \r
226   public void updateToDoc()\r
227   {\r
228     SequenceI sq = (SequenceI) jvobj;\r
229     Sequence sequence = (Sequence) vobj;\r
230     // verify and update principal attributes.\r
231     if (sequence.getDescription() != null\r
232             && (sequence.getDescription() == null || !sequence\r
233                     .getDescription().equals(sq.getDescription())))\r
234     {\r
235       sequence.setDescription(sq.getDescription());\r
236       modified = true;\r
237     }\r
238     if (sequence.getSequence() == null\r
239             || !sequence.getSequence().equals(sq.getSequenceAsString()))\r
240     {\r
241       if (sequence.getStart() != sq.getStart()\r
242               || sequence.getEnd() != sq.getEnd())\r
243       {\r
244         // update modified sequence.\r
245         sequence.setSequence(sq.getSequenceAsString());\r
246         sequence.setStart(sq.getStart());\r
247         sequence.setEnd(sq.getEnd());\r
248         modified = true;\r
249       }\r
250     }\r
251     if (!dict.equals(sequence.getDictionary()))\r
252     {\r
253       sequence.setDictionary(dict);\r
254       modified = true;\r
255     }\r
256     if (!sequence.getName().equals(sq.getName()))\r
257     {\r
258       sequence.setName(sq.getName());\r
259       modified = true;\r
260     }\r
261     modified |= updateDbRefs();\r
262     modified |= updateSqFeatures();\r
263   }\r
264 \r
265   /**\r
266    * (probably could just do vobj.isModified(), but..)\r
267    * \r
268    * @return true if document's dataset sequence was modified\r
269    */\r
270   public boolean getModified()\r
271   {\r
272     return modified;\r
273   }\r
274 \r
275 }\r