JAL-4298 comment markers
[jalview.git] / src / jalview / io / vamsas / Datasetsequence.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ 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.SequenceFeature;
25 import jalview.datamodel.SequenceI;
26 import jalview.io.VamsasAppDatastore;
27
28 import java.util.List;
29
30 import uk.ac.vamsas.objects.core.DataSet;
31 import uk.ac.vamsas.objects.core.DbRef;
32 import uk.ac.vamsas.objects.core.Sequence;
33
34 /**
35  * synchronize a vamsas dataset sequence with a jalview dataset sequence. This
36  * class deals with all sequence features and database references associated
37  * with the jalview sequence.
38  * 
39  * @author JimP
40  * 
41  */
42 public class Datasetsequence extends DatastoreItem
43 {
44   String dict;
45
46   private DataSet dataset;
47
48   // private AlignmentI jvdset;
49
50   public Datasetsequence(VamsasAppDatastore vamsasAppDatastore,
51           SequenceI sq, String theDict, DataSet theDataset)
52   {
53     super(vamsasAppDatastore, sq, uk.ac.vamsas.objects.core.Sequence.class);
54     this.dataset = theDataset;
55     // this.jvdset = jvdset;
56     this.dict = theDict;
57     doSync();
58   }
59
60   public Datasetsequence(VamsasAppDatastore vamsasAppDatastore,
61           Sequence vdseq)
62   {
63     super(vamsasAppDatastore, vdseq, SequenceI.class);
64     doJvUpdate();
65   }
66
67   @Override
68   public void addFromDocument()
69   {
70     Sequence vseq = (Sequence) vobj;
71     SequenceI dsseq = new jalview.datamodel.Sequence(vseq.getName(),
72             vseq.getSequence(), (int) vseq.getStart(), (int) vseq.getEnd());
73     dsseq.setDescription(vseq.getDescription());
74     bindjvvobj(dsseq, vseq);
75     dsseq.setVamsasId(vseq.getVorbaId().getId());
76     jvobj = dsseq;
77     modified = true;
78   }
79
80   @Override
81   public void updateFromDoc()
82   {
83     Sequence sq = (Sequence) vobj;
84     SequenceI sequence = (SequenceI) jvobj;
85     if (!sequence.getSequenceAsString().equals(sq.getSequence()))
86     {
87       log.warn(
88               "Potential Client Error ! - mismatch of dataset sequence: and jalview internal dataset sequence.");
89     }
90     else
91     {
92       // verify and update principal attributes.
93       if (sequence.getDescription() != null
94               && (sequence.getDescription() == null || !sequence
95                       .getDescription().equals(sq.getDescription())))
96       {
97         sequence.setDescription(sq.getDescription());
98         modified = true;
99       }
100       if (sequence.getSequence() == null
101               || !sequence.getSequenceAsString().equals(sq.getSequence()))
102       {
103         if (sequence.getStart() != sq.getStart()
104                 || sequence.getEnd() != sq.getEnd())
105         {
106           // update modified sequence.
107           sequence.setSequence(sq.getSequence());
108           sequence.setStart((int) sq.getStart());
109           sequence.setEnd((int) sq.getEnd());
110           modified = true;
111         }
112       }
113       if (!sequence.getName().equals(sq.getName()))
114       {
115         sequence.setName(sq.getName());
116         modified = true;
117       }
118       modified |= updateJvDbRefs();
119       // updateJvFeatures();
120     }
121   }
122
123   /*
124    * private void updateJvFeatures() { Sequence vsq = (Sequence) vobj;
125    * 
126    * // add or update any new features/references on dataset sequence if
127    * (vsq.getgetSequenceFeatures() != null) { int sfSize =
128    * sq.getSequenceFeatures().length;
129    * 
130    * for (int sf = 0; sf < sfSize; sf++) { new
131    * jalview.io.vamsas.Sequencefeature(datastore,
132    * (jalview.datamodel.SequenceFeature) sq .getSequenceFeatures()[sf], dataset,
133    * (Sequence) vobj); } } }
134    */
135   private boolean updateSqFeatures()
136   {
137     boolean changed = false;
138     SequenceI sq = (SequenceI) jvobj;
139
140     // add or update any new features/references on dataset sequence
141     List<SequenceFeature> sfs = sq.getSequenceFeatures();
142     for (SequenceFeature sf : sfs)
143     {
144       changed |= new jalview.io.vamsas.Sequencefeature(datastore, sf,
145               dataset, (Sequence) vobj).docWasUpdated();
146     }
147
148     return changed;
149   }
150
151   @Override
152   public void addToDocument()
153   {
154     SequenceI sq = (SequenceI) jvobj;
155     Sequence sequence = new Sequence();
156     bindjvvobj(sq, sequence);
157     sq.setVamsasId(sequence.getVorbaId().getId());
158     sequence.setSequence(sq.getSequenceAsString());
159     sequence.setDictionary(dict);
160     sequence.setName(sq.getName());
161     sequence.setStart(sq.getStart());
162     sequence.setEnd(sq.getEnd());
163     sequence.setDescription(sq.getDescription());
164     dataset.addSequence(sequence);
165     vobj = sequence;
166     updateSqFeatures();
167     updateDbRefs();// sq,(Sequence) vobj, dataset);
168   }
169
170   /**
171    * sync database references from jv to document
172    * 
173    * @return true if document was modified
174    */
175   private boolean updateDbRefs()
176   {
177     boolean modifiedthedoc = false;
178     SequenceI sq = (SequenceI) jvobj;
179
180     if (sq.getDatasetSequence() == null && sq.getDBRefs() != null)
181     {
182       // only sync database references for dataset sequences
183       List<DBRefEntry> entries = sq.getDBRefs();
184       // jalview.datamodel.DBRefEntry dbentry;
185       for (int db = 0, dn = entries.size(); db < dn; db++)
186       {
187         modifiedthedoc |= new jalview.io.vamsas.Dbref(datastore,
188                 // dbentry =
189                 entries.get(db), sq, (Sequence) vobj, dataset)
190                         .docWasUpdated();
191
192       }
193
194     }
195     return modifiedthedoc;
196   }
197
198   /**
199    * sync database references from document to jv sequence
200    * 
201    * @return true if local sequence refs were modified
202    */
203   private boolean updateJvDbRefs()
204   {
205     boolean modifiedtheseq = false;
206     SequenceI sq = (SequenceI) jvobj;
207     Sequence vsq = (Sequence) vobj;
208     if (vsq.getDbRefCount() > 0)
209     {
210       // only sync database references for dataset sequences
211       DbRef[] entries = vsq.getDbRef();
212       // DbRef dbentry;
213       for (int db = 0; db < entries.length; db++)
214       {
215         modifiedtheseq |= new jalview.io.vamsas.Dbref(datastore,
216                 // dbentry =
217                 entries[db], vsq, sq).jvWasUpdated();
218       }
219     }
220     return modifiedtheseq;
221   }
222
223   @Override
224   public void conflict()
225   {
226     log.warn(
227             "Conflict in dataset sequence update to document. Overwriting document");
228     // TODO: could try to import from document data to jalview first. and then
229     updateToDoc();
230   }
231
232   boolean modified = false;
233
234   @Override
235   public void updateToDoc()
236   {
237     SequenceI sq = (SequenceI) jvobj;
238     Sequence sequence = (Sequence) vobj;
239     // verify and update principal attributes.
240     if (sequence.getDescription() != null
241             && (sequence.getDescription() == null || !sequence
242                     .getDescription().equals(sq.getDescription())))
243     {
244       sequence.setDescription(sq.getDescription());
245       modified = true;
246     }
247     if (sequence.getSequence() == null
248             || !sequence.getSequence().equals(sq.getSequenceAsString()))
249     {
250       if (sequence.getStart() != sq.getStart()
251               || sequence.getEnd() != sq.getEnd())
252       {
253         // update modified sequence.
254         sequence.setSequence(sq.getSequenceAsString());
255         sequence.setStart(sq.getStart());
256         sequence.setEnd(sq.getEnd());
257         modified = true;
258       }
259     }
260     if (!dict.equals(sequence.getDictionary()))
261     {
262       sequence.setDictionary(dict);
263       modified = true;
264     }
265     if (!sequence.getName().equals(sq.getName()))
266     {
267       sequence.setName(sq.getName());
268       modified = true;
269     }
270     modified |= updateDbRefs();
271     modified |= updateSqFeatures();
272   }
273
274   /**
275    * (probably could just do vobj.isModified(), but..)
276    * 
277    * @return true if document's dataset sequence was modified
278    */
279   public boolean getModified()
280   {
281     return modified;
282   }
283
284 }