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