tidy imports
[jalview.git] / src / jalview / io / vamsas / Dbref.java
index c4d72c3..d4aafe8 100644 (file)
@@ -1,7 +1,25 @@
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8)
+ * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle
+ * 
+ * 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/>.
+ */
 package jalview.io.vamsas;
 
 import jalview.datamodel.DBRefEntry;
 import jalview.datamodel.SequenceI;
+import uk.ac.vamsas.objects.core.DataSet;
 import uk.ac.vamsas.objects.core.DbRef;
 import uk.ac.vamsas.objects.core.Map;
 import uk.ac.vamsas.objects.core.Sequence;
@@ -10,106 +28,208 @@ import jalview.io.VamsasAppDatastore;
 public class Dbref extends Rangetype
 {
   jalview.datamodel.SequenceI sq = null;
+
   uk.ac.vamsas.objects.core.Sequence sequence = null;
-  DbRef dbref = null;
-  DBRefEntry dbentry=null;
-  public Dbref(VamsasAppDatastore datastore, DBRefEntry dbentry, jalview.datamodel.SequenceI sq2, uk.ac.vamsas.objects.core.Sequence sequence2)
+
+  DataSet ds;
+
+  public Dbref(VamsasAppDatastore datastore, DBRefEntry dbentry,
+          jalview.datamodel.SequenceI sq2,
+          uk.ac.vamsas.objects.core.Sequence sequence2, DataSet dataset)
   {
-    super(datastore);
-    dbref = (DbRef) getjv2vObj(dbentry);
+    super(datastore, dbentry, DbRef.class);
+    // initialise object specific attributes
     sq = sq2;
     sequence = sequence2;
-    this.dbentry = dbentry;
-    if (dbref==null)
+    this.jvobj = dbentry;
+    ds = dataset;
+    // call the accessors
+    doSync();
+  }
+
+  public Dbref(VamsasAppDatastore datastore, DbRef ref, Sequence vdseq,
+          SequenceI dsseq)
+  {
+    super(datastore, ref, jalview.datamodel.DBRefEntry.class);
+    sequence = vdseq;
+    sq = dsseq;
+    ds = (DataSet) vdseq.getV_parent();
+    doJvUpdate();
+  }
+
+  public void updateToDoc()
+  {
+    DbRef dbref = (DbRef) this.vobj;
+    DBRefEntry jvobj = (DBRefEntry) this.jvobj;
+    dbref.setAccessionId(jvobj.getAccessionId());
+    dbref.setSource(jvobj.getSource());
+    dbref.setVersion(jvobj.getVersion());
+    if (jvobj.getMap() != null)
     {
-      add();
-    } else {
-      if (dbref.isUpdated())
+      // Record mapping to external database coordinate system.
+      jalview.datamodel.Mapping mp = jvobj.getMap();
+      if (mp.getMap() != null)
       {
-        conflict();
-      } else {
-        update();
+        Map vMap = null;
+        if (dbref.getMapCount() == 0)
+        {
+          vMap = new Map();
+          initMapType(vMap, mp.getMap(), true);
+          dbref.addMap(vMap);
+        }
+        else
+        {
+          // we just update the data anyway.
+          vMap = dbref.getMap(0);
+          initMapType(vMap, mp.getMap(), true);
+        }
+        updateMapTo(mp);
       }
-        
     }
-    
+    else
+    {
+      jalview.bin.Cache.log.debug("Ignoring mapless DbRef.Map "
+              + jvobj.getSrcAccString());
+    }
+
   }
 
-  public Dbref(VamsasAppDatastore datastore, DbRef ref, Sequence vdseq, SequenceI dsseq)
+  /**
+   * ugly hack to try to get the embedded sequences within a database reference
+   * to be stored in the document's dataset.
+   * 
+   * @param mp
+   */
+  private void updateMapTo(jalview.datamodel.Mapping mp)
   {
-    super(datastore);
-    dbref = ref;
-    sequence = vdseq;
-    sq = dsseq;
-    dbentry = (jalview.datamodel.DBRefEntry) getvObj2jv(dbref);
-    if (dbentry == null)
+    log.info("Performing updateMapTo remove this message when we know what we're doing.");
+    // TODO determine how sequences associated with database mappings are stored
+    // in the document
+    if (mp != null && mp.getTo() != null)
     {
-      addFromDocument();
-    } else {
-      if (dbref.isUpdated())
+      if (mp.getTo().getDatasetSequence() == null)
       {
-        update();
+        // TODO: fix this hinky sh!t
+        DatastoreItem dssync = dsReg.getDatastoreItemFor(mp.getTo());
+        if (dssync == null)
+        {
+          // sync the dataset sequence, if it hasn't been done already.
+          // TODO: ensure real dataset sequence corresponding to getTo is
+          // recovered
+          dssync = new Datasetsequence(
+                  datastore,
+                  mp.getTo(),
+                  (mp.getMappedWidth() == mp.getWidth()) ? sequence
+                          .getDictionary()
+                          : ((mp.getMappedWidth() == 3) ? uk.ac.vamsas.objects.utils.SymbolDictionary.STANDARD_NA
+                                  : uk.ac.vamsas.objects.utils.SymbolDictionary.STANDARD_AA),
+                  ds);
+        }
+        //
+        // TODO: NOW add a mapping between new dataset sequence and sequence
+        // associated with the database reference
+
+        // dna mappings only...
+        // new jalview.io.vamsas.Sequencemapping(datastore, mp, sequence, ds);
+
       }
+
+    }
+    else
+    {
+      log.debug("Ignoring non-dataset sequence mapping.");
     }
   }
 
-  private void update()
+  public void updateFromDoc()
   {
-    // TODO: verify and update dbrefs in vamsas document
-    // there will be trouble when a dataset sequence is modified to
-    // contain more residues than were originally referenced - we must
-    // then make a number of dataset sequence entries - this info is already stored 
-    jalview.bin.Cache.log.debug("TODO verify update of dataset sequence database references.");
+    DbRef vobj = (DbRef) this.vobj;
+    DBRefEntry jvobj = (DBRefEntry) this.jvobj;
+    jvobj.setAccessionId(vobj.getAccessionId());
+    jvobj.setSource(vobj.getSource());
+    jvobj.setVersion(vobj.getVersion());
+    // add new dbref
+    if (vobj.getMapCount() > 0)
+    {
+      // TODO: Jalview ignores all the other maps
+      if (vobj.getMapCount() > 1)
+      {
+        jalview.bin.Cache.log
+                .debug("Ignoring additional mappings on DbRef: "
+                        + jvobj.getSource() + ":" + jvobj.getAccessionId());
+      }
+      jalview.datamodel.Mapping mp = new jalview.datamodel.Mapping(
+              parsemapType(vobj.getMap(0)));
+      if (jvobj.getMap() == null || !mp.equals(jvobj.getMap()))
+      {
+        jvobj.setMap(mp);
+      }
+    }
   }
 
-  private void conflict()
+  public void conflict()
   {
-    jalview.bin.Cache.log.debug("Conflict in dbentry update for "+dbref.getAccessionId()+dbref.getSource()+" "+dbref.getVorbaId());
+    DbRef vobj = (DbRef) this.vobj;
+    DBRefEntry jvobj = (DBRefEntry) this.jvobj;
+    jalview.bin.Cache.log.debug("Conflict in dbentry update for "
+            + vobj.getAccessionId() + vobj.getSource() + " "
+            + vobj.getVorbaId());
     // TODO Auto-generated method stub
-    
+
   }
-  private void addFromDocument()
+
+  public void addFromDocument()
   {
+    DbRef vobj = (DbRef) this.vobj;
+    DBRefEntry jvobj = (DBRefEntry) this.jvobj;
     // add new dbref
-    sq.addDBRef(dbentry = new jalview.datamodel.DBRefEntry
-            (
-                    dbref.getSource().toString(),
-                 dbref.getVersion().toString(),
-                 dbref.getAccessionId().toString()));
-    if (dbref.getMapCount()>0)
+    sq.addDBRef(jvobj = new jalview.datamodel.DBRefEntry(vobj.getSource()
+            .toString(), vobj.getVersion().toString(), vobj
+            .getAccessionId().toString()));
+    if (vobj.getMapCount() > 0)
     {
       // TODO: Jalview ignores all the other maps
-      if (dbref.getMapCount()>1)
+      if (vobj.getMapCount() > 1)
       {
-        jalview.bin.Cache.log.debug("Ignoring additional mappings on DbRef: "+dbentry.getSource()+":"+dbentry.getAccessionId());
+        jalview.bin.Cache.log
+                .debug("Ignoring additional mappings on DbRef: "
+                        + jvobj.getSource() + ":" + jvobj.getAccessionId());
       }
-      jalview.datamodel.Mapping mp = new jalview.datamodel.Mapping(parsemapType(dbref.getMap(0)));
-      dbentry.setMap(mp);
+      jalview.datamodel.Mapping mp = new jalview.datamodel.Mapping(
+              parsemapType(vobj.getMap(0)));
+      jvobj.setMap(mp);
     }
-    // TODO: jalview ignores links and properties because it doesn't know what to do with them.
-    
-    bindjvvobj(dbentry, dbref);
+    // TODO: jalview ignores links and properties because it doesn't know what
+    // to do with them.
+
+    bindjvvobj(jvobj, vobj);
   }
-  private void add()
+
+  public void addToDocument()
   {
+    DBRefEntry jvobj = (DBRefEntry) this.jvobj;
     DbRef dbref = new DbRef();
-    bindjvvobj(dbentry, dbref);
-    dbref.setAccessionId(dbentry.getAccessionId());
-    dbref.setSource(dbentry.getSource());
-    dbref.setVersion(dbentry.getVersion());
-    if (dbentry.getMap()!=null)
+    bindjvvobj(jvobj, dbref);
+    dbref.setAccessionId(jvobj.getAccessionId());
+    dbref.setSource(jvobj.getSource());
+    dbref.setVersion(jvobj.getVersion());
+    sequence.addDbRef(dbref);
+    if (jvobj.getMap() != null)
     {
-      jalview.datamodel.Mapping mp = dbentry.getMap();
-      if (mp.getMap()!=null)
+      jalview.datamodel.Mapping mp = jvobj.getMap();
+      if (mp.getMap() != null)
       {
         Map vMap = new Map();
         initMapType(vMap, mp.getMap(), true);
         dbref.addMap(vMap);
-      } else {
-        jalview.bin.Cache.log.debug("Ignoring mapless DbRef.Map "+dbentry.getSrcAccString());
+        updateMapTo(mp);
+      }
+      else
+      {
+        jalview.bin.Cache.log.debug("Ignoring mapless DbRef.Map "
+                + jvobj.getSrcAccString());
       }
     }
-    sequence.addDbRef(dbref);
   }
 
 }