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