39ff94dea1d322e7d6ed28006eb1cb64a02464be
[jalview.git] / src / jalview / io / vamsas / Datasetsequence.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer (Development Version 2.4.1)\r
3  * Copyright (C) 2009 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
4  * \r
5  * This program is free software; you can redistribute it and/or\r
6  * modify it under the terms of the GNU General Public License\r
7  * as published by the Free Software Foundation; either version 2\r
8  * of the License, or (at your option) any later version.\r
9  * \r
10  * This program is distributed in the hope that it will be useful,\r
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13  * GNU General Public License for more details.\r
14  * \r
15  * You should have received a copy of the GNU General Public License\r
16  * along with this program; if not, write to the Free Software\r
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
18  */\r
19 package jalview.io.vamsas;\r
20 \r
21 import jalview.datamodel.AlignmentI;\r
22 import jalview.datamodel.DBRefEntry;\r
23 import jalview.datamodel.SequenceI;\r
24 import jalview.io.VamsasAppDatastore;\r
25 import uk.ac.vamsas.objects.core.DataSet;\r
26 import uk.ac.vamsas.objects.core.Sequence;\r
27 \r
28 /**\r
29  * synchronize a vamsas dataset sequence with a jalview dataset sequence.\r
30  * This class deals with all sequence features and database references associated with\r
31  * the jalview sequence.\r
32  * @author JimP\r
33  *\r
34  */\r
35 public class Datasetsequence extends DatastoreItem\r
36 {\r
37   String dict;\r
38   private DataSet dataset;\r
39   // private AlignmentI jvdset;\r
40 \r
41   public Datasetsequence(VamsasAppDatastore vamsasAppDatastore,\r
42           SequenceI sq, String dict, DataSet dataset)\r
43   {\r
44     super(vamsasAppDatastore, sq, uk.ac.vamsas.objects.core.Sequence.class);\r
45     this.dataset = dataset;\r
46     // this.jvdset = jvdset;\r
47     this.dict = dict;\r
48     doSync();\r
49   }\r
50 \r
51   public Datasetsequence(VamsasAppDatastore vamsasAppDatastore,\r
52           Sequence vdseq)\r
53   {\r
54     super(vamsasAppDatastore, vdseq, SequenceI.class);\r
55     doJvUpdate();\r
56   }\r
57 \r
58   public void addFromDocument()\r
59   {\r
60     Sequence vseq = (Sequence) vobj;\r
61     SequenceI dsseq = new jalview.datamodel.Sequence(vseq.getName(), \r
62             vseq.getSequence(),\r
63             (int) vseq.getStart(), (int) vseq.getEnd());\r
64     dsseq.setDescription(vseq.getDescription());\r
65     bindjvvobj(dsseq, vseq);\r
66     dsseq.setVamsasId(vseq.getVorbaId().getId());\r
67     jvobj = dsseq;\r
68     modified=true;\r
69   }\r
70   public void updateFromDoc()\r
71   {\r
72     Sequence sq = (Sequence) vobj;\r
73     SequenceI sequence = (SequenceI) jvobj;\r
74     if (!sequence.getSequenceAsString().equals(sq.getSequence()))\r
75     {\r
76       log.warn("Potential Client Error ! - mismatch of dataset sequence: and jalview internal dataset sequence.");\r
77     } else {\r
78       // verify and update principal attributes.\r
79       if (sequence.getDescription() != null\r
80               && (sequence.getDescription() == null || !sequence\r
81                       .getDescription().equals(sq.getDescription())))\r
82       {\r
83         sequence.setDescription(sq.getDescription());\r
84         modified = true;\r
85       }\r
86       if (sequence.getSequence() == null\r
87               || !sequence.getSequenceAsString().equals(\r
88                       sq.getSequence()))\r
89       {\r
90         if (sequence.getStart() != sq.getStart()\r
91                 || sequence.getEnd() != sq.getEnd())\r
92         {\r
93           // update modified sequence.\r
94           sequence.setSequence(sq.getSequence());\r
95           sequence.setStart((int)sq.getStart());\r
96           sequence.setEnd((int)sq.getEnd());\r
97           modified = true;\r
98         }\r
99       }\r
100       if (!sequence.getName().equals(sq.getName()))\r
101       {\r
102         sequence.setName(sq.getName());\r
103         modified = true;\r
104       }\r
105     }    \r
106   }\r
107 \r
108 \r
109   public void addToDocument()\r
110   {\r
111     SequenceI sq = (SequenceI) jvobj;\r
112     Sequence sequence = new Sequence();\r
113     bindjvvobj(sq, sequence);\r
114     sq.setVamsasId(sequence.getVorbaId().getId());\r
115     sequence.setSequence(sq.getSequenceAsString());\r
116     sequence.setDictionary(dict);\r
117     sequence.setName(sq.getName());\r
118     sequence.setStart(sq.getStart());\r
119     sequence.setEnd(sq.getEnd());\r
120     sequence.setDescription(sq.getDescription());\r
121     dataset.addSequence(sequence);\r
122     vobj = sequence;\r
123     // add or update any new features/references on dataset sequence\r
124     if (sq.getSequenceFeatures() != null)\r
125     {\r
126       int sfSize = sq.getSequenceFeatures().length;\r
127 \r
128       for (int sf = 0; sf < sfSize; sf++)\r
129       {\r
130         new jalview.io.vamsas.Sequencefeature(datastore, (jalview.datamodel.SequenceFeature) sq\r
131                 .getSequenceFeatures()[sf], dataset, (Sequence) vobj);\r
132       }\r
133     }\r
134     if (sq.getDatasetSequence() == null && sq.getDBRef() != null)\r
135     {\r
136       // only sync database references for dataset sequences\r
137       DBRefEntry[] entries = sq.getDBRef();\r
138       jalview.datamodel.DBRefEntry dbentry;\r
139       for (int db = 0; db < entries.length; db++)\r
140       {\r
141         Rangetype dbr = new jalview.io.vamsas.Dbref(datastore,\r
142                 dbentry = entries[db], sq, (Sequence) vobj, dataset);\r
143       }\r
144 \r
145     }\r
146     \r
147   }\r
148 \r
149   public void conflict()\r
150   {\r
151     log.warn("Conflict in dataset sequence update to document. Overwriting document");\r
152     // TODO: could try to import from document data to jalview first. and then\r
153     updateToDoc();\r
154   }\r
155   boolean modified = false;\r
156   public void updateToDoc()\r
157   {\r
158     SequenceI sq = (SequenceI) jvobj;\r
159     Sequence sequence = (Sequence) vobj;\r
160     // verify and update principal attributes.\r
161     if (sequence.getDescription() != null\r
162             && (sequence.getDescription() == null || !sequence\r
163                     .getDescription().equals(sq.getDescription())))\r
164     {\r
165       sequence.setDescription(sq.getDescription());\r
166       modified = true;\r
167     }\r
168     if (sequence.getSequence() == null\r
169             || !sequence.getSequence().equals(\r
170                     sq.getSequenceAsString()))\r
171     {\r
172       if (sequence.getStart() != sq.getStart()\r
173               || sequence.getEnd() != sq.getEnd())\r
174       {\r
175         // update modified sequence.\r
176         sequence.setSequence(sq.getSequenceAsString());\r
177         sequence.setStart(sq.getStart());\r
178         sequence.setEnd(sq.getEnd());\r
179         modified = true;\r
180       }\r
181     }\r
182     if (!dict.equals(sequence.getDictionary()))\r
183     {\r
184       sequence.setDictionary(dict);\r
185       modified = true;\r
186     }\r
187     if (!sequence.getName().equals(sq.getName()))\r
188     {\r
189       sequence.setName(sq.getName());\r
190       modified = true;\r
191     }\r
192   }\r
193 \r
194   /**\r
195    * (probably could just do vobj.isModified(), but..)\r
196    * @return true if document's dataset sequence was modified\r
197    */\r
198   public boolean getModified()\r
199   {\r
200     return modified;\r
201   }\r
202 \r
203 }\r