JAL-1645 Version-Rel Version 2.9 Year-Rel 2015 Licensing glob
[jalview.git] / src / jalview / io / vamsas / Datasetsequence.java
index 39ff94d..297b854 100644 (file)
-/*\r
- * Jalview - A Sequence Alignment Editor and Viewer (Development Version 2.4.1)\r
- * Copyright (C) 2009 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
- * \r
- * This program is free software; you can redistribute it and/or\r
- * modify it under the terms of the GNU General Public License\r
- * as published by the Free Software Foundation; either version 2\r
- * of the License, or (at your option) any later version.\r
- * \r
- * This program is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
- * GNU General Public License for more details.\r
- * \r
- * You should have received a copy of the GNU General Public License\r
- * along with this program; if not, write to the Free Software\r
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
- */\r
-package jalview.io.vamsas;\r
-\r
-import jalview.datamodel.AlignmentI;\r
-import jalview.datamodel.DBRefEntry;\r
-import jalview.datamodel.SequenceI;\r
-import jalview.io.VamsasAppDatastore;\r
-import uk.ac.vamsas.objects.core.DataSet;\r
-import uk.ac.vamsas.objects.core.Sequence;\r
-\r
-/**\r
- * synchronize a vamsas dataset sequence with a jalview dataset sequence.\r
- * This class deals with all sequence features and database references associated with\r
- * the jalview sequence.\r
- * @author JimP\r
- *\r
- */\r
-public class Datasetsequence extends DatastoreItem\r
-{\r
-  String dict;\r
-  private DataSet dataset;\r
-  // private AlignmentI jvdset;\r
-\r
-  public Datasetsequence(VamsasAppDatastore vamsasAppDatastore,\r
-          SequenceI sq, String dict, DataSet dataset)\r
-  {\r
-    super(vamsasAppDatastore, sq, uk.ac.vamsas.objects.core.Sequence.class);\r
-    this.dataset = dataset;\r
-    // this.jvdset = jvdset;\r
-    this.dict = dict;\r
-    doSync();\r
-  }\r
-\r
-  public Datasetsequence(VamsasAppDatastore vamsasAppDatastore,\r
-          Sequence vdseq)\r
-  {\r
-    super(vamsasAppDatastore, vdseq, SequenceI.class);\r
-    doJvUpdate();\r
-  }\r
-\r
-  public void addFromDocument()\r
-  {\r
-    Sequence vseq = (Sequence) vobj;\r
-    SequenceI dsseq = new jalview.datamodel.Sequence(vseq.getName(), \r
-            vseq.getSequence(),\r
-            (int) vseq.getStart(), (int) vseq.getEnd());\r
-    dsseq.setDescription(vseq.getDescription());\r
-    bindjvvobj(dsseq, vseq);\r
-    dsseq.setVamsasId(vseq.getVorbaId().getId());\r
-    jvobj = dsseq;\r
-    modified=true;\r
-  }\r
-  public void updateFromDoc()\r
-  {\r
-    Sequence sq = (Sequence) vobj;\r
-    SequenceI sequence = (SequenceI) jvobj;\r
-    if (!sequence.getSequenceAsString().equals(sq.getSequence()))\r
-    {\r
-      log.warn("Potential Client Error ! - mismatch of dataset sequence: and jalview internal dataset sequence.");\r
-    } else {\r
-      // verify and update principal attributes.\r
-      if (sequence.getDescription() != null\r
-              && (sequence.getDescription() == null || !sequence\r
-                      .getDescription().equals(sq.getDescription())))\r
-      {\r
-        sequence.setDescription(sq.getDescription());\r
-        modified = true;\r
-      }\r
-      if (sequence.getSequence() == null\r
-              || !sequence.getSequenceAsString().equals(\r
-                      sq.getSequence()))\r
-      {\r
-        if (sequence.getStart() != sq.getStart()\r
-                || sequence.getEnd() != sq.getEnd())\r
-        {\r
-          // update modified sequence.\r
-          sequence.setSequence(sq.getSequence());\r
-          sequence.setStart((int)sq.getStart());\r
-          sequence.setEnd((int)sq.getEnd());\r
-          modified = true;\r
-        }\r
-      }\r
-      if (!sequence.getName().equals(sq.getName()))\r
-      {\r
-        sequence.setName(sq.getName());\r
-        modified = true;\r
-      }\r
-    }    \r
-  }\r
-\r
-\r
-  public void addToDocument()\r
-  {\r
-    SequenceI sq = (SequenceI) jvobj;\r
-    Sequence sequence = new Sequence();\r
-    bindjvvobj(sq, sequence);\r
-    sq.setVamsasId(sequence.getVorbaId().getId());\r
-    sequence.setSequence(sq.getSequenceAsString());\r
-    sequence.setDictionary(dict);\r
-    sequence.setName(sq.getName());\r
-    sequence.setStart(sq.getStart());\r
-    sequence.setEnd(sq.getEnd());\r
-    sequence.setDescription(sq.getDescription());\r
-    dataset.addSequence(sequence);\r
-    vobj = sequence;\r
-    // add or update any new features/references on dataset sequence\r
-    if (sq.getSequenceFeatures() != null)\r
-    {\r
-      int sfSize = sq.getSequenceFeatures().length;\r
-\r
-      for (int sf = 0; sf < sfSize; sf++)\r
-      {\r
-        new jalview.io.vamsas.Sequencefeature(datastore, (jalview.datamodel.SequenceFeature) sq\r
-                .getSequenceFeatures()[sf], dataset, (Sequence) vobj);\r
-      }\r
-    }\r
-    if (sq.getDatasetSequence() == null && sq.getDBRef() != null)\r
-    {\r
-      // only sync database references for dataset sequences\r
-      DBRefEntry[] entries = sq.getDBRef();\r
-      jalview.datamodel.DBRefEntry dbentry;\r
-      for (int db = 0; db < entries.length; db++)\r
-      {\r
-        Rangetype dbr = new jalview.io.vamsas.Dbref(datastore,\r
-                dbentry = entries[db], sq, (Sequence) vobj, dataset);\r
-      }\r
-\r
-    }\r
-    \r
-  }\r
-\r
-  public void conflict()\r
-  {\r
-    log.warn("Conflict in dataset sequence update to document. Overwriting document");\r
-    // TODO: could try to import from document data to jalview first. and then\r
-    updateToDoc();\r
-  }\r
-  boolean modified = false;\r
-  public void updateToDoc()\r
-  {\r
-    SequenceI sq = (SequenceI) jvobj;\r
-    Sequence sequence = (Sequence) vobj;\r
-    // verify and update principal attributes.\r
-    if (sequence.getDescription() != null\r
-            && (sequence.getDescription() == null || !sequence\r
-                    .getDescription().equals(sq.getDescription())))\r
-    {\r
-      sequence.setDescription(sq.getDescription());\r
-      modified = true;\r
-    }\r
-    if (sequence.getSequence() == null\r
-            || !sequence.getSequence().equals(\r
-                    sq.getSequenceAsString()))\r
-    {\r
-      if (sequence.getStart() != sq.getStart()\r
-              || sequence.getEnd() != sq.getEnd())\r
-      {\r
-        // update modified sequence.\r
-        sequence.setSequence(sq.getSequenceAsString());\r
-        sequence.setStart(sq.getStart());\r
-        sequence.setEnd(sq.getEnd());\r
-        modified = true;\r
-      }\r
-    }\r
-    if (!dict.equals(sequence.getDictionary()))\r
-    {\r
-      sequence.setDictionary(dict);\r
-      modified = true;\r
-    }\r
-    if (!sequence.getName().equals(sq.getName()))\r
-    {\r
-      sequence.setName(sq.getName());\r
-      modified = true;\r
-    }\r
-  }\r
-\r
-  /**\r
-   * (probably could just do vobj.isModified(), but..)\r
-   * @return true if document's dataset sequence was modified\r
-   */\r
-  public boolean getModified()\r
-  {\r
-    return modified;\r
-  }\r
-\r
-}\r
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.9)
+ * Copyright (C) 2015 The Jalview Authors
+ * 
+ * This file is part of Jalview.
+ * 
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License 
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *  
+ * Jalview is distributed in the hope that it will be useful, but 
+ * WITHOUT ANY WARRANTY; without even the implied warranty 
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+ * PURPOSE.  See the GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+package jalview.io.vamsas;
+
+import jalview.datamodel.DBRefEntry;
+import jalview.datamodel.SequenceI;
+import jalview.io.VamsasAppDatastore;
+
+import uk.ac.vamsas.objects.core.DataSet;
+import uk.ac.vamsas.objects.core.DbRef;
+import uk.ac.vamsas.objects.core.Sequence;
+
+/**
+ * synchronize a vamsas dataset sequence with a jalview dataset sequence. This
+ * class deals with all sequence features and database references associated
+ * with the jalview sequence.
+ * 
+ * @author JimP
+ * 
+ */
+public class Datasetsequence extends DatastoreItem
+{
+  String dict;
+
+  private DataSet dataset;
+
+  // private AlignmentI jvdset;
+
+  public Datasetsequence(VamsasAppDatastore vamsasAppDatastore,
+          SequenceI sq, String dict, DataSet dataset)
+  {
+    super(vamsasAppDatastore, sq, uk.ac.vamsas.objects.core.Sequence.class);
+    this.dataset = dataset;
+    // this.jvdset = jvdset;
+    this.dict = dict;
+    doSync();
+  }
+
+  public Datasetsequence(VamsasAppDatastore vamsasAppDatastore,
+          Sequence vdseq)
+  {
+    super(vamsasAppDatastore, vdseq, SequenceI.class);
+    doJvUpdate();
+  }
+
+  public void addFromDocument()
+  {
+    Sequence vseq = (Sequence) vobj;
+    SequenceI dsseq = new jalview.datamodel.Sequence(vseq.getName(),
+            vseq.getSequence(), (int) vseq.getStart(), (int) vseq.getEnd());
+    dsseq.setDescription(vseq.getDescription());
+    bindjvvobj(dsseq, vseq);
+    dsseq.setVamsasId(vseq.getVorbaId().getId());
+    jvobj = dsseq;
+    modified = true;
+  }
+
+  public void updateFromDoc()
+  {
+    Sequence sq = (Sequence) vobj;
+    SequenceI sequence = (SequenceI) jvobj;
+    if (!sequence.getSequenceAsString().equals(sq.getSequence()))
+    {
+      log.warn("Potential Client Error ! - mismatch of dataset sequence: and jalview internal dataset sequence.");
+    }
+    else
+    {
+      // verify and update principal attributes.
+      if (sequence.getDescription() != null
+              && (sequence.getDescription() == null || !sequence
+                      .getDescription().equals(sq.getDescription())))
+      {
+        sequence.setDescription(sq.getDescription());
+        modified = true;
+      }
+      if (sequence.getSequence() == null
+              || !sequence.getSequenceAsString().equals(sq.getSequence()))
+      {
+        if (sequence.getStart() != sq.getStart()
+                || sequence.getEnd() != sq.getEnd())
+        {
+          // update modified sequence.
+          sequence.setSequence(sq.getSequence());
+          sequence.setStart((int) sq.getStart());
+          sequence.setEnd((int) sq.getEnd());
+          modified = true;
+        }
+      }
+      if (!sequence.getName().equals(sq.getName()))
+      {
+        sequence.setName(sq.getName());
+        modified = true;
+      }
+      modified |= updateJvDbRefs();
+      // updateJvFeatures();
+    }
+  }
+
+  /*
+   * private void updateJvFeatures() { Sequence vsq = (Sequence) vobj;
+   * 
+   * // add or update any new features/references on dataset sequence if
+   * (vsq.getgetSequenceFeatures() != null) { int sfSize =
+   * sq.getSequenceFeatures().length;
+   * 
+   * for (int sf = 0; sf < sfSize; sf++) { new
+   * jalview.io.vamsas.Sequencefeature(datastore,
+   * (jalview.datamodel.SequenceFeature) sq .getSequenceFeatures()[sf], dataset,
+   * (Sequence) vobj); } } }
+   */
+  private boolean updateSqFeatures()
+  {
+    boolean modified = false;
+    SequenceI sq = (SequenceI) jvobj;
+
+    // add or update any new features/references on dataset sequence
+    if (sq.getSequenceFeatures() != null)
+    {
+      int sfSize = sq.getSequenceFeatures().length;
+
+      for (int sf = 0; sf < sfSize; sf++)
+      {
+        modified |= new jalview.io.vamsas.Sequencefeature(datastore,
+                (jalview.datamodel.SequenceFeature) sq
+                        .getSequenceFeatures()[sf], dataset,
+                (Sequence) vobj).docWasUpdated();
+      }
+    }
+    return modified;
+  }
+
+  public void addToDocument()
+  {
+    SequenceI sq = (SequenceI) jvobj;
+    Sequence sequence = new Sequence();
+    bindjvvobj(sq, sequence);
+    sq.setVamsasId(sequence.getVorbaId().getId());
+    sequence.setSequence(sq.getSequenceAsString());
+    sequence.setDictionary(dict);
+    sequence.setName(sq.getName());
+    sequence.setStart(sq.getStart());
+    sequence.setEnd(sq.getEnd());
+    sequence.setDescription(sq.getDescription());
+    dataset.addSequence(sequence);
+    vobj = sequence;
+    updateSqFeatures();
+    updateDbRefs();// sq,(Sequence) vobj, dataset);
+  }
+
+  /**
+   * sync database references from jv to document
+   * 
+   * @return true if document was modified
+   */
+  private boolean updateDbRefs()
+  {
+    boolean modifiedthedoc = false;
+    SequenceI sq = (SequenceI) jvobj;
+
+    if (sq.getDatasetSequence() == null && sq.getDBRef() != null)
+    {
+      // only sync database references for dataset sequences
+      DBRefEntry[] entries = sq.getDBRef();
+      // jalview.datamodel.DBRefEntry dbentry;
+      for (int db = 0; db < entries.length; db++)
+      {
+        modifiedthedoc |= new jalview.io.vamsas.Dbref(datastore,
+        // dbentry =
+                entries[db], sq, (Sequence) vobj, dataset).docWasUpdated();
+
+      }
+
+    }
+    return modifiedthedoc;
+  }
+
+  /**
+   * sync database references from document to jv sequence
+   * 
+   * @return true if local sequence refs were modified
+   */
+  private boolean updateJvDbRefs()
+  {
+    boolean modifiedtheseq = false;
+    SequenceI sq = (SequenceI) jvobj;
+    Sequence vsq = (Sequence) vobj;
+    if (vsq.getDbRefCount() > 0)
+    {
+      // only sync database references for dataset sequences
+      DbRef[] entries = vsq.getDbRef();
+      // DbRef dbentry;
+      for (int db = 0; db < entries.length; db++)
+      {
+        modifiedtheseq |= new jalview.io.vamsas.Dbref(datastore,
+        // dbentry =
+                entries[db], vsq, sq).jvWasUpdated();
+      }
+    }
+    return modifiedtheseq;
+  }
+
+  public void conflict()
+  {
+    log.warn("Conflict in dataset sequence update to document. Overwriting document");
+    // TODO: could try to import from document data to jalview first. and then
+    updateToDoc();
+  }
+
+  boolean modified = false;
+
+  public void updateToDoc()
+  {
+    SequenceI sq = (SequenceI) jvobj;
+    Sequence sequence = (Sequence) vobj;
+    // verify and update principal attributes.
+    if (sequence.getDescription() != null
+            && (sequence.getDescription() == null || !sequence
+                    .getDescription().equals(sq.getDescription())))
+    {
+      sequence.setDescription(sq.getDescription());
+      modified = true;
+    }
+    if (sequence.getSequence() == null
+            || !sequence.getSequence().equals(sq.getSequenceAsString()))
+    {
+      if (sequence.getStart() != sq.getStart()
+              || sequence.getEnd() != sq.getEnd())
+      {
+        // update modified sequence.
+        sequence.setSequence(sq.getSequenceAsString());
+        sequence.setStart(sq.getStart());
+        sequence.setEnd(sq.getEnd());
+        modified = true;
+      }
+    }
+    if (!dict.equals(sequence.getDictionary()))
+    {
+      sequence.setDictionary(dict);
+      modified = true;
+    }
+    if (!sequence.getName().equals(sq.getName()))
+    {
+      sequence.setName(sq.getName());
+      modified = true;
+    }
+    modified |= updateDbRefs();
+    modified |= updateSqFeatures();
+  }
+
+  /**
+   * (probably could just do vobj.isModified(), but..)
+   * 
+   * @return true if document's dataset sequence was modified
+   */
+  public boolean getModified()
+  {
+    return modified;
+  }
+
+}