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