JAL-1503 update version in GPL header
[jalview.git] / src / jalview / gui / VamsasApplication.java
index 2879c2f..5ee7e36 100644 (file)
@@ -1,20 +1,20 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Development Version 2.4.1)
- * Copyright (C) 2009 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1)
+ * Copyright (C) 2014 The Jalview Authors
  * 
- * This program 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 2
- * of the License, or (at your option) any later version.
+ * This file is part of Jalview.
  * 
- * This program 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.
+ * 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 this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ * 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.gui;
 
@@ -28,6 +28,7 @@ import jalview.structure.SelectionListener;
 import jalview.structure.SelectionSource;
 import jalview.structure.StructureSelectionManager;
 import jalview.structure.VamsasListener;
+import jalview.structure.VamsasSource;
 
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
@@ -45,7 +46,6 @@ import uk.ac.vamsas.client.ClientHandle;
 import uk.ac.vamsas.client.IClient;
 import uk.ac.vamsas.client.IClientDocument;
 import uk.ac.vamsas.client.InvalidSessionDocumentException;
-import uk.ac.vamsas.client.NoDefaultSessionException;
 import uk.ac.vamsas.client.UserHandle;
 import uk.ac.vamsas.client.VorbaId;
 import uk.ac.vamsas.client.picking.IMessageHandler;
@@ -62,7 +62,7 @@ import uk.ac.vamsas.objects.core.Seg;
  * @author jimp
  * 
  */
-public class VamsasApplication implements SelectionSource
+public class VamsasApplication implements SelectionSource, VamsasSource
 {
   IClient vclient = null;
 
@@ -72,16 +72,19 @@ public class VamsasApplication implements SelectionSource
 
   Desktop jdesktop = null; // our jalview desktop reference
 
+  private boolean inInitialUpdate = true;
+
   // Cache.preferences for vamsas client session arena
   // preferences for check for default session at startup.
   // user and organisation stuff.
-  public VamsasApplication(Desktop jdesktop, File sessionPath)
+  public VamsasApplication(Desktop jdesktop, File sessionPath,
+          String sessionName)
   {
     // JBPNote:
     // we should create a session URI from the sessionPath and pass it to
     // the clientFactory - but the vamsas api doesn't cope with that yet.
     this.jdesktop = jdesktop;
-    initClientSession(null, sessionPath);
+    initClientSession(null, sessionPath, sessionName);
   }
 
   private static uk.ac.vamsas.client.IClientFactory getClientFactory()
@@ -133,7 +136,13 @@ public class VamsasApplication implements SelectionSource
    *          null or a valid vamsas document file
    * @return false if no vamsas connection was made
    */
-  private boolean initClientSession(String sess, File vamsasDocument)
+  private void initClientSession(String sess, File vamsasDocument)
+  {
+    initClientSession(sess, vamsasDocument, null);
+  }
+
+  private boolean initClientSession(String sess, File vamsasDocument,
+          String newDocSessionName)
   {
     try
     {
@@ -149,8 +158,16 @@ public class VamsasApplication implements SelectionSource
         }
         try
         {
-          vclient = clientfactory.openAsNewSessionIClient(app,
-                  vamsasDocument);
+          if (newDocSessionName != null)
+          {
+            vclient = clientfactory.openAsNewSessionIClient(app,
+                    vamsasDocument, newDocSessionName);
+          }
+          else
+          {
+            vclient = clientfactory.openAsNewSessionIClient(app,
+                    vamsasDocument);
+          }
         } catch (InvalidSessionDocumentException e)
         {
           JOptionPane
@@ -206,14 +223,12 @@ public class VamsasApplication implements SelectionSource
     } catch (Error e)
     {
       Cache.log
-              .warn(
-                      "Probable SERIOUS VAMSAS client incompatibility - carrying on regardless",
+              .warn("Probable SERIOUS VAMSAS client incompatibility - carrying on regardless",
                       e);
     } catch (Exception e)
     {
       Cache.log
-              .warn(
-                      "Probable VAMSAS client incompatibility - carrying on regardless",
+              .warn("Probable VAMSAS client incompatibility - carrying on regardless",
                       e);
     }
   }
@@ -225,8 +240,8 @@ public class VamsasApplication implements SelectionSource
    */
   private ClientHandle getJalviewHandle()
   {
-    return new ClientHandle("jalview.bin.Jalview", jalview.bin.Cache
-            .getProperty("VERSION"));
+    return new ClientHandle("jalview.bin.Jalview",
+            jalview.bin.Cache.getProperty("VERSION"));
   }
 
   /**
@@ -252,9 +267,11 @@ public class VamsasApplication implements SelectionSource
     addDocumentUpdateHandler();
     addStoreDocumentHandler();
     startSession();
+    inInitialUpdate = true;
     Cache.log
             .debug("Jalview loading the Vamsas Session for the first time.");
     dealWithDocumentUpdate(false); // we don't push an update out to the
+    inInitialUpdate = false;
     // document yet.
     Cache.log.debug("... finished update for the first time.");
   }
@@ -287,8 +304,7 @@ public class VamsasApplication implements SelectionSource
     } catch (Exception e)
     {
       Cache.log
-              .warn(
-                      "Exception whilst refreshing jalview windows after a vamsas document update.",
+              .warn("Exception whilst refreshing jalview windows after a vamsas document update.",
                       e);
     }
   }
@@ -420,9 +436,11 @@ public class VamsasApplication implements SelectionSource
    * bindings is made.
    * 
    * @param doc
+   * @return number of views stored in document (updated and new views)
    */
-  public void updateVamsasDocument(IClientDocument doc)
+  public int updateVamsasDocument(IClientDocument doc)
   {
+    int storedviews = 0;
     ensureJvVamsas();
     errorsDuringUpdate = false;
     errorsDuringAppUpdate = false;
@@ -434,7 +452,7 @@ public class VamsasApplication implements SelectionSource
 
     if (frames == null)
     {
-      return;
+      return 0;
     }
     Hashtable skipList = new Hashtable();
     Hashtable viewset = new Hashtable();
@@ -471,6 +489,7 @@ public class VamsasApplication implements SelectionSource
             }
             else
             {
+              storedviews++;
               // could try to eliminate sequenceSetId from skiplist ..
               // (skipList.containsKey(af.getViewport().getSequenceSetId()))
               // remember sequenceSetId so we can skip all the other views on
@@ -516,6 +535,7 @@ public class VamsasApplication implements SelectionSource
       errorsDuringAppUpdate = true;
     }
     vds.clearSkipList();
+    return storedviews;
   }
 
   private Entry baseProvEntry()
@@ -533,9 +553,11 @@ public class VamsasApplication implements SelectionSource
    * 
    * @param fromJalview
    *          true to update from jalview to the vamsas document
+   * @return total number of stored alignments in the document after the update
    */
-  protected void dealWithDocumentUpdate(boolean fromJalview)
+  protected int dealWithDocumentUpdate(boolean fromJalview)
   {
+    int storedviews = 0;
     // called by update handler for document update.
     Cache.log.debug("Updating jalview from changed vamsas document.");
     disableGui(true);
@@ -551,7 +573,7 @@ public class VamsasApplication implements SelectionSource
       }
       if (fromJalview)
       {
-        this.updateVamsasDocument(cdoc);
+        storedviews += updateVamsasDocument(cdoc);
         if (Cache.log.isDebugEnabled())
         {
           Cache.log
@@ -593,10 +615,12 @@ public class VamsasApplication implements SelectionSource
       ee.printStackTrace(System.err);
       // recover object map backup, since its probably corrupted with references
       // to Vobjects that don't exist anymore.
-      this.recover_objectMappingBackup();
+      recover_objectMappingBackup();
+      storedviews = 0;
     }
     Cache.log.debug("Finished updating from document change.");
     disableGui(false);
+    return storedviews;
   }
 
   private void addDocumentUpdateHandler()
@@ -684,6 +708,12 @@ public class VamsasApplication implements SelectionSource
   {
     if (_backup_vobj2jv == null)
     {
+      if (inInitialUpdate)
+      {
+        // nothing to recover so just
+        return;
+      }
+
       throw new Error(
               "IMPLEMENTATION ERROR: Cannot recover vamsas object mappings - no backup was made.");
     }
@@ -726,8 +756,8 @@ public class VamsasApplication implements SelectionSource
       {
         final IPickManager pm = vclient.getPickManager();
         final StructureSelectionManager ssm = StructureSelectionManager
-                .getStructureSelectionManager();
-        final SelectionSource me = this;
+                .getStructureSelectionManager(Desktop.instance);
+        final VamsasApplication me = this;
         pm.registerMessageHandler(new IMessageHandler()
         {
           String last = null;
@@ -759,8 +789,8 @@ public class VamsasApplication implements SelectionSource
                 // Cache.log.debug("Handling Mouse over "+mm.getVorbaID()+"
                 // bound to "+jvobj+" at "+mm.getPosition());
                 // position is character position in aligned sequence
-                ssm.mouseOverVamsasSequence((SequenceI) jvobj, mm
-                        .getPosition());
+                ssm.mouseOverVamsasSequence((SequenceI) jvobj,
+                        mm.getPosition(), me);
               }
             }
             if (message instanceof uk.ac.vamsas.client.picking.SelectionMessage)
@@ -786,7 +816,7 @@ public class VamsasApplication implements SelectionSource
                 if (jvobjs[o] == null)
                 {
                   // can't cope with selections for unmapped objects
-                  // continue;
+                  continue;
                 }
                 if (type == null)
                 {
@@ -872,43 +902,29 @@ public class VamsasApplication implements SelectionSource
                   {
                     int[] prange = uk.ac.vamsas.objects.utils.Range
                             .getBounds(sm.getRanges());
-                    boolean rangeset = false;
-                    colsel = new ColumnSelection();
+                    jselection.setStartRes(prange[0] - 1);
+                    jselection.setEndRes(prange[1] - 1);
                     prange = uk.ac.vamsas.objects.utils.Range
                             .getIntervals(sm.getRanges());
+                    colsel = new ColumnSelection();
                     for (int p = 0; p < prange.length; p += 2)
                     {
                       int d = (prange[p] <= prange[p + 1]) ? 1 : -1;
-                      if (!rangeset)
+                      // try to join up adjacent columns to make a larger
+                      // selection
+                      // lower and upper bounds
+                      int l = (d < 0) ? 1 : 0;
+                      int u = (d > 0) ? 1 : 0;
+
+                      if (jselection.getStartRes() > 0
+                              && prange[p + l] == jselection.getStartRes())
                       {
-                        if (jselection != null)
-                        {
-                          // set the bounds of the selected area using the first
-                          // interval.
-                          jselection.setStartRes(prange[p] - 1);
-                          jselection.setEndRes(prange[p + 1] - 1);
-                          rangeset = true;
-                        }
+                        jselection.setStartRes(prange[p + l] - 1);
                       }
-                      else
+                      if (jselection.getEndRes() <= maxWidth
+                              && prange[p + u] == (jselection.getEndRes() + 2))
                       {
-                        // try to join up adjacent columns to make a larger
-                        // selection
-                        // lower and upper bounds
-                        int l = (d < 0) ? 1 : 0;
-                        int u = (d > 0) ? 1 : 0;
-
-                        if (jselection.getStartRes() > 0
-                                && prange[p + l] == jselection
-                                        .getStartRes())
-                        {
-                          jselection.setStartRes(prange[p + l] - 1);
-                        }
-                        if (jselection.getEndRes() <= maxWidth
-                                && prange[p + u] == (jselection.getEndRes() + 2))
-                        {
-                          jselection.setEndRes(prange[p + u] - 1);
-                        }
+                        jselection.setEndRes(prange[p + u] - 1);
                       }
                       // mark all the columns in the range.
                       for (int sr = prange[p], er = prange[p + 1], de = er
@@ -942,7 +958,8 @@ public class VamsasApplication implements SelectionSource
 
           int i = -1;
 
-          public void mouseOver(SequenceI seq, int index)
+          public void mouseOver(SequenceI seq, int index,
+                  VamsasSource source)
           {
             if (jv2vobj == null)
               return;
@@ -1005,10 +1022,8 @@ public class VamsasApplication implements SelectionSource
               {
                 String[] vobj = new String[seqsel.getSize()];
                 int o = 0;
-                Enumeration sels = seqsel.getSequences(null).elements();
-                while (sels.hasMoreElements())
+                for (SequenceI sel : seqsel.getSequences(null))
                 {
-                  SequenceI sel = (SequenceI) sels.nextElement();
                   VorbaId v = (VorbaId) jv2vobj.get(sel);
                   if (v != null)
                   {
@@ -1046,13 +1061,13 @@ public class VamsasApplication implements SelectionSource
                   }
                   else
                   {
-                    int[] intervals = colsel.getVisibleContigs(seqsel
-                            .getStartRes(), seqsel.getEndRes() + 1);
+                    int[] intervals = colsel.getVisibleContigs(
+                            seqsel.getStartRes(), seqsel.getEndRes() + 1);
                     for (int iv = 0; iv < intervals.length; iv += 2)
                     {
                       Seg s = new Seg();
                       s.setStart(intervals[iv] + 1); // vamsas indices begin at
-                                                     // 1, not zero.
+                      // 1, not zero.
                       s.setEnd(intervals[iv + 1] + 1);
                       s.setInclusive(true);
                       range.addSeg(s);