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