refactored to propery separate addToDocument,addFromDocument, updateToDocument, updat...
[jalview.git] / src / jalview / io / vamsas / Datasetsequence.java
1 package jalview.io.vamsas;\r
2 \r
3 import jalview.datamodel.AlignmentI;\r
4 import jalview.datamodel.DBRefEntry;\r
5 import jalview.datamodel.SequenceI;\r
6 import jalview.io.VamsasAppDatastore;\r
7 import uk.ac.vamsas.objects.core.DataSet;\r
8 import uk.ac.vamsas.objects.core.Sequence;\r
9 \r
10 /**\r
11  * synchronize a vamsas dataset sequence with a jalview dataset sequence.\r
12  * This class deals with all sequence features and database references associated with\r
13  * the jalview sequence.\r
14  * @author JimP\r
15  *\r
16  */\r
17 public class Datasetsequence extends DatastoreItem\r
18 {\r
19   String dict;\r
20   private DataSet dataset;\r
21   // private AlignmentI jvdset;\r
22 \r
23   public Datasetsequence(VamsasAppDatastore vamsasAppDatastore,\r
24           SequenceI sq, String dict, DataSet dataset)\r
25   {\r
26     super(vamsasAppDatastore, sq, uk.ac.vamsas.objects.core.Sequence.class);\r
27     this.dataset = dataset;\r
28     // this.jvdset = jvdset;\r
29     this.dict = dict;\r
30     doSync();\r
31   }\r
32 \r
33   public Datasetsequence(VamsasAppDatastore vamsasAppDatastore,\r
34           Sequence vdseq)\r
35   {\r
36     super(vamsasAppDatastore, vdseq, SequenceI.class);\r
37     doJvUpdate();\r
38   }\r
39 \r
40   public void addFromDocument()\r
41   {\r
42     Sequence vseq = (Sequence) vobj;\r
43     SequenceI dsseq = new jalview.datamodel.Sequence(vseq.getName(), \r
44             vseq.getSequence(),\r
45             (int) vseq.getStart(), (int) vseq.getEnd());\r
46     dsseq.setDescription(vseq.getDescription());\r
47     bindjvvobj(dsseq, vseq);\r
48     dsseq.setVamsasId(vseq.getVorbaId().getId());\r
49     jvobj = dsseq;\r
50     modified=true;\r
51   }\r
52   public void updateFromDoc()\r
53   {\r
54     Sequence sq = (Sequence) vobj;\r
55     SequenceI sequence = (SequenceI) jvobj;\r
56     if (!sequence.getSequenceAsString().equals(sq.getSequence()))\r
57     {\r
58       log.warn("Potential Client Error ! - mismatch of dataset sequence: and jalview internal dataset sequence.");\r
59     } else {\r
60       // verify and update principal attributes.\r
61       if (sequence.getDescription() != null\r
62               && (sequence.getDescription() == null || !sequence\r
63                       .getDescription().equals(sq.getDescription())))\r
64       {\r
65         sequence.setDescription(sq.getDescription());\r
66         modified = true;\r
67       }\r
68       if (sequence.getSequence() == null\r
69               || !sequence.getSequenceAsString().equals(\r
70                       sq.getSequence()))\r
71       {\r
72         if (sequence.getStart() != sq.getStart()\r
73                 || sequence.getEnd() != sq.getEnd())\r
74         {\r
75           // update modified sequence.\r
76           sequence.setSequence(sq.getSequence());\r
77           sequence.setStart((int)sq.getStart());\r
78           sequence.setEnd((int)sq.getEnd());\r
79           modified = true;\r
80         }\r
81       }\r
82       if (!sequence.getName().equals(sq.getName()))\r
83       {\r
84         sequence.setName(sq.getName());\r
85         modified = true;\r
86       }\r
87     }    \r
88   }\r
89 \r
90 \r
91   public void addToDocument()\r
92   {\r
93     SequenceI sq = (SequenceI) jvobj;\r
94     Sequence sequence = new Sequence();\r
95     bindjvvobj(sq, sequence);\r
96     sq.setVamsasId(sequence.getVorbaId().getId());\r
97     sequence.setSequence(sq.getSequenceAsString());\r
98     sequence.setDictionary(dict);\r
99     sequence.setName(sq.getName());\r
100     sequence.setStart(sq.getStart());\r
101     sequence.setEnd(sq.getEnd());\r
102     sequence.setDescription(sq.getDescription());\r
103     dataset.addSequence(sequence);\r
104     vobj = sequence;\r
105     // add or update any new features/references on dataset sequence\r
106     if (sq.getSequenceFeatures() != null)\r
107     {\r
108       int sfSize = sq.getSequenceFeatures().length;\r
109 \r
110       for (int sf = 0; sf < sfSize; sf++)\r
111       {\r
112         new jalview.io.vamsas.Sequencefeature(datastore, (jalview.datamodel.SequenceFeature) sq\r
113                 .getSequenceFeatures()[sf], dataset, (Sequence) vobj);\r
114       }\r
115     }\r
116     if (sq.getDatasetSequence() == null && sq.getDBRef() != null)\r
117     {\r
118       // only sync database references for dataset sequences\r
119       DBRefEntry[] entries = sq.getDBRef();\r
120       jalview.datamodel.DBRefEntry dbentry;\r
121       for (int db = 0; db < entries.length; db++)\r
122       {\r
123         Rangetype dbr = new jalview.io.vamsas.Dbref(datastore,\r
124                 dbentry = entries[db], sq, (Sequence) vobj, dataset);\r
125       }\r
126 \r
127     }\r
128     \r
129   }\r
130 \r
131   public void conflict()\r
132   {\r
133     log.warn("Conflict in dataset sequence update to document. Overwriting document");\r
134     // TODO: could try to import from document data to jalview first. and then\r
135     updateToDoc();\r
136   }\r
137   boolean modified = false;\r
138   public void updateToDoc()\r
139   {\r
140     SequenceI sq = (SequenceI) jvobj;\r
141     Sequence sequence = (Sequence) vobj;\r
142     // verify and update principal attributes.\r
143     if (sequence.getDescription() != null\r
144             && (sequence.getDescription() == null || !sequence\r
145                     .getDescription().equals(sq.getDescription())))\r
146     {\r
147       sequence.setDescription(sq.getDescription());\r
148       modified = true;\r
149     }\r
150     if (sequence.getSequence() == null\r
151             || !sequence.getSequence().equals(\r
152                     sq.getSequenceAsString()))\r
153     {\r
154       if (sequence.getStart() != sq.getStart()\r
155               || sequence.getEnd() != sq.getEnd())\r
156       {\r
157         // update modified sequence.\r
158         sequence.setSequence(sq.getSequenceAsString());\r
159         sequence.setStart(sq.getStart());\r
160         sequence.setEnd(sq.getEnd());\r
161         modified = true;\r
162       }\r
163     }\r
164     if (!dict.equals(sequence.getDictionary()))\r
165     {\r
166       sequence.setDictionary(dict);\r
167       modified = true;\r
168     }\r
169     if (!sequence.getName().equals(sq.getName()))\r
170     {\r
171       sequence.setName(sq.getName());\r
172       modified = true;\r
173     }\r
174   }\r
175 \r
176   /**\r
177    * (probably could just do vobj.isModified(), but..)\r
178    * @return true if document's dataset sequence was modified\r
179    */\r
180   public boolean getModified()\r
181   {\r
182     return modified;\r
183   }\r
184 \r
185 }\r