refactored for non-interactive import and initiation of sessions. apply gpl developme...
authorjprocter <Jim Procter>
Mon, 8 Jun 2009 11:17:06 +0000 (11:17 +0000)
committerjprocter <Jim Procter>
Mon, 8 Jun 2009 11:17:06 +0000 (11:17 +0000)
src/jalview/gui/VamsasApplication.java

index 16da5db..2879c2f 100644 (file)
@@ -1,6 +1,6 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.4)
- * Copyright (C) 2008 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
+ * 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
  * 
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -115,7 +115,7 @@ public class VamsasApplication implements SelectionSource
 
   /**
    * @throws IOException
-   *                 or other if clientfactory instantiation failed.
+   *           or other if clientfactory instantiation failed.
    * @return list of current sessions or null if no session exists.
    */
   public static String[] getSessionList() throws Exception
@@ -128,9 +128,9 @@ public class VamsasApplication implements SelectionSource
    * session
    * 
    * @param sess
-   *                null or a valid session url
+   *          null or a valid session url
    * @param vamsasDocument
-   *                null or a valid vamsas document file
+   *          null or a valid vamsas document file
    * @return false if no vamsas connection was made
    */
   private boolean initClientSession(String sess, File vamsasDocument)
@@ -303,24 +303,32 @@ public class VamsasApplication implements SelectionSource
         Cache.log.info("Jalview updating to the Vamsas Session.");
 
         dealWithDocumentUpdate(true);
-        /*
-         * IClientDocument cdoc=null; try { cdoc = vclient.getClientDocument(); }
-         * catch (Exception e) { Cache.log.error("Failed to get client document
-         * for update."); // RAISE A WARNING DIALOG disableGui(false); return; }
-         * updateVamsasDocument(cdoc); updateJalviewGui();
-         * cdoc.setVamsasRoots(cdoc.getVamsasRoots()); // propagate update flags
-         * back vclient.updateDocument(cdoc);
-         */
         Cache.log.info("Jalview finished updating to the Vamsas Session.");
-        // TODO Auto-generated method stub
       }
 
     });
     udthread.start();
   }
 
+  /**
+   * leave a session, prompting the user to save if necessary
+   */
   public void end_session()
   {
+    end_session(true);
+  }
+
+  private boolean promptUser = true;
+
+  /**
+   * leave a session, optionally prompting the user to save if necessary
+   * 
+   * @param promptUser
+   *          when true enable prompting by this application
+   */
+
+  public void end_session(boolean promptUser)
+  {
     if (!inSession())
       throw new Error("Jalview not connected to Vamsas session.");
     Cache.log.info("Jalview disconnecting from the Vamsas Session.");
@@ -328,8 +336,11 @@ public class VamsasApplication implements SelectionSource
     {
       if (joinedSession)
       {
+        boolean ourprompt = this.promptUser;
+        this.promptUser = promptUser;
         vclient.finalizeClient();
         Cache.log.info("Jalview has left the session.");
+        this.promptUser = ourprompt; // restore default value
       }
       else
       {
@@ -521,7 +532,7 @@ public class VamsasApplication implements SelectionSource
    * do a vamsas document update or update jalview from the vamsas document
    * 
    * @param fromJalview
-   *                true to update from jalview to the vamsas document
+   *          true to update from jalview to the vamsas document
    */
   protected void dealWithDocumentUpdate(boolean fromJalview)
   {
@@ -612,24 +623,33 @@ public class VamsasApplication implements SelectionSource
             {
               public void propertyChange(PropertyChangeEvent evt)
               {
-                Cache.log
-                        .debug("Asking user if the vamsas session should be stored.");
-                int reply = JOptionPane
-                        .showInternalConfirmDialog(
-                                Desktop.desktop,
-                                "The current VAMSAS session has unsaved data - do you want to save it ?",
-                                "VAMSAS Session Shutdown",
-                                JOptionPane.YES_NO_OPTION,
-                                JOptionPane.QUESTION_MESSAGE);
-
-                if (reply == JOptionPane.YES_OPTION)
+                if (client.promptUser)
                 {
-                  Cache.log.debug("Prompting for vamsas store filename.");
-                  Desktop.instance.vamsasSave_actionPerformed(null);
-                  Cache.log.debug("Finished attempt at storing document.");
+                  Cache.log
+                          .debug("Asking user if the vamsas session should be stored.");
+                  int reply = JOptionPane
+                          .showInternalConfirmDialog(
+                                  Desktop.desktop,
+                                  "The current VAMSAS session has unsaved data - do you want to save it ?",
+                                  "VAMSAS Session Shutdown",
+                                  JOptionPane.YES_NO_OPTION,
+                                  JOptionPane.QUESTION_MESSAGE);
+
+                  if (reply == JOptionPane.YES_OPTION)
+                  {
+                    Cache.log.debug("Prompting for vamsas store filename.");
+                    Desktop.instance.vamsasSave_actionPerformed(null);
+                    Cache.log
+                            .debug("Finished attempt at storing document.");
+                  }
+                  Cache.log
+                          .debug("finished dealing with REQUESTTOCLOSE event.");
+                }
+                else
+                {
+                  Cache.log
+                          .debug("Ignoring store document request (promptUser==false)");
                 }
-                Cache.log
-                        .debug("finished dealing with REQUESTTOCLOSE event.");
               }
             });
     Cache.log.debug("Added Jalview handler for vamsas document updates.");
@@ -658,7 +678,7 @@ public class VamsasApplication implements SelectionSource
    * IO failed
    * 
    * @throws Error
-   *                 if backup_objectMapping was not called.
+   *           if backup_objectMapping was not called.
    */
   public void recover_objectMappingBackup()
   {
@@ -748,12 +768,14 @@ public class VamsasApplication implements SelectionSource
               // we only care about AlignmentSequence selections
               SelectionMessage sm = (SelectionMessage) message;
               sm.validate();
-              System.err.println("Received\n"+sm.getRawMessage());
-              Object[] jvobjs = sm.getVorbaIDs()==null ? null : new Object[sm.getVorbaIDs().length];
-              if (jvobjs==null)
+              System.err.println("Received\n" + sm.getRawMessage());
+              Object[] jvobjs = sm.getVorbaIDs() == null ? null
+                      : new Object[sm.getVorbaIDs().length];
+              if (jvobjs == null)
               {
-                // TODO: rationalise : can only clear a selection over a referred to object
-                ssm.sendSelection(null,null,me);
+                // TODO: rationalise : can only clear a selection over a
+                // referred to object
+                ssm.sendSelection(null, null, me);
                 return;
               }
               Class type = null;
@@ -764,7 +786,7 @@ public class VamsasApplication implements SelectionSource
                 if (jvobjs[o] == null)
                 {
                   // can't cope with selections for unmapped objects
-                  //continue;
+                  // continue;
                 }
                 if (type == null)
                 {
@@ -773,9 +795,9 @@ public class VamsasApplication implements SelectionSource
                 ;
                 if (type != jvobjs[o].getClass())
                 {
-                  send=false;
+                  send = false;
                   // discard - can't cope with selections over mixed objects
-                  //continue;
+                  // continue;
                 }
               }
               SequenceGroup jselection = null;
@@ -784,7 +806,8 @@ public class VamsasApplication implements SelectionSource
               {
                 if (jvobjs.length == 1)
                 {
-                  // TODO if (sm.isNone())// send a message to select the specified columns over the
+                  // TODO if (sm.isNone())// send a message to select the
+                  // specified columns over the
                   // given
                   // alignment
 
@@ -797,15 +820,17 @@ public class VamsasApplication implements SelectionSource
                 SequenceI seq;
                 boolean aligned = ((jalview.datamodel.Sequence) jvobjs[0])
                         .getDatasetSequence() != null;
-                int maxWidth=0;
+                int maxWidth = 0;
                 if (aligned)
                 {
                   jselection = new SequenceGroup();
-                  jselection.addSequence(seq =
-                        (jalview.datamodel.Sequence) jvobjs[0], false);
+                  jselection.addSequence(
+                          seq = (jalview.datamodel.Sequence) jvobjs[0],
+                          false);
                   maxWidth = seq.getLength();
                 }
-                for (int c = 1; aligned && jvobjs.length > 1 && c < jvobjs.length; c++)
+                for (int c = 1; aligned && jvobjs.length > 1
+                        && c < jvobjs.length; c++)
                 {
                   if (((jalview.datamodel.Sequence) jvobjs[c])
                           .getDatasetSequence() == null)
@@ -816,12 +841,13 @@ public class VamsasApplication implements SelectionSource
                   else
                   {
                     jselection.addSequence(
-                            seq = (jalview.datamodel.Sequence) jvobjs[c], false);
-                    if (maxWidth<seq.getLength())
+                            seq = (jalview.datamodel.Sequence) jvobjs[c],
+                            false);
+                    if (maxWidth < seq.getLength())
                     {
                       maxWidth = seq.getLength();
                     }
-                    
+
                   }
                 }
                 if (!aligned)
@@ -844,41 +870,51 @@ public class VamsasApplication implements SelectionSource
                   // select the associated ranges on them.
                   if (sm.getRanges() != null)
                   {
-                    int[] prange = uk.ac.vamsas.objects.utils.Range.getBounds(sm.getRanges());
-                    boolean rangeset=false;
+                    int[] prange = uk.ac.vamsas.objects.utils.Range
+                            .getBounds(sm.getRanges());
+                    boolean rangeset = false;
                     colsel = new ColumnSelection();
-                    prange = uk.ac.vamsas.objects.utils.Range.getIntervals(sm.getRanges());
-                    for (int p=0;p<prange.length;p+=2)
+                    prange = uk.ac.vamsas.objects.utils.Range
+                            .getIntervals(sm.getRanges());
+                    for (int p = 0; p < prange.length; p += 2)
                     {
-                      int d = (prange[p]<=prange[p+1]) ? 1 : -1;
+                      int d = (prange[p] <= prange[p + 1]) ? 1 : -1;
                       if (!rangeset)
                       {
-                        if (jselection!=null)
+                        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;
+                          // set the bounds of the selected area using the first
+                          // interval.
+                          jselection.setStartRes(prange[p] - 1);
+                          jselection.setEndRes(prange[p + 1] - 1);
+                          rangeset = true;
                         }
-                      } else {
-                        // try to join up adjacent columns to make a larger selection
+                      }
+                      else
+                      {
+                        // 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())
+                        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);
+                          jselection.setStartRes(prange[p + l] - 1);
                         }
-                        if (jselection.getEndRes()<=maxWidth && prange[p+u]==(jselection.getEndRes()+2))
+                        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+d; sr!=de; sr+=d)
+                      for (int sr = prange[p], er = prange[p + 1], de = er
+                              + d; sr != de; sr += d)
                       {
-                        colsel.addElement(sr-1);
+                        colsel.addElement(sr - 1);
                       }
                     }
                   }
@@ -915,8 +951,9 @@ public class VamsasApplication implements SelectionSource
               VorbaId v = (VorbaId) jv2vobj.get(seq);
               if (v != null)
               {
-                Cache.log.debug("Mouse over " + v.getId() + " bound to "
-                        + seq + " at " + index);
+                // this should really be a trace message.
+                // Cache.log.debug("Mouse over " + v.getId() + " bound to "
+                // + seq + " at " + index);
                 last = seq;
                 i = index;
                 MouseOverMessage message = new MouseOverMessage(v.getId(),
@@ -932,15 +969,16 @@ public class VamsasApplication implements SelectionSource
           public void selection(SequenceGroup seqsel,
                   ColumnSelection colsel, SelectionSource source)
           {
-            if (vobj2jv==null)
+            if (vobj2jv == null)
             {
-              Cache.log.warn("Selection listener still active for dead session.");
+              Cache.log
+                      .warn("Selection listener still active for dead session.");
               // not in a session.
               return;
             }
             if (source != me)
             {
-              AlignmentI visal=null;
+              AlignmentI visal = null;
               if (source instanceof AlignViewport)
               {
                 visal = ((AlignViewport) source).getAlignment();
@@ -953,8 +991,12 @@ public class VamsasApplication implements SelectionSource
                 if (source instanceof AlignViewport)
                 {
                   // the empty selection.
-                  sm = new SelectionMessage("jalview", new String[] { ((AlignViewport)source).getSequenceSetId()}, null, true);
-                } else {
+                  sm = new SelectionMessage("jalview", new String[]
+                  { ((AlignViewport) source).getSequenceSetId() }, null,
+                          true);
+                }
+                else
+                {
                   // the empty selection.
                   sm = new SelectionMessage("jalview", null, null, true);
                 }
@@ -981,39 +1023,57 @@ public class VamsasApplication implements SelectionSource
                   t = null;
                 }
                 Input range = null;
-                if (seqsel!=null && colsel != null)
+                if (seqsel != null && colsel != null)
                 {
                   // deparse the colsel into positions on the vamsas alignment
                   // sequences
                   range = new Input();
-                  if (colsel.getSelected()!=null && colsel.getSelected().size()>0 && visal!=null && seqsel.getSize()==visal.getHeight())
+                  if (colsel.getSelected() != null
+                          && colsel.getSelected().size() > 0
+                          && visal != null
+                          && seqsel.getSize() == visal.getHeight())
                   {
-                    // gather selected columns outwith the sequence positions too
+                    // gather selected columns outwith the sequence positions
+                    // too
                     Enumeration cols = colsel.getSelected().elements();
                     while (cols.hasMoreElements())
                     {
                       int ival = ((Integer) cols.nextElement()).intValue();
                       Pos p = new Pos();
-                      p.setI(ival+1);
+                      p.setI(ival + 1);
                       range.addPos(p);
                     }
-                  } else {
-                    int[] intervals = colsel.getVisibleContigs(seqsel.getStartRes(), seqsel.getEndRes()+1);
-                    for (int iv=0;iv<intervals.length; iv+=2)
+                  }
+                  else
+                  {
+                    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.
-                      s.setEnd(intervals[iv+1]+1);
+                      s.setStart(intervals[iv] + 1); // vamsas indices begin at
+                                                     // 1, not zero.
+                      s.setEnd(intervals[iv + 1] + 1);
                       s.setInclusive(true);
                       range.addSeg(s);
                     }
                   }
                 }
-                sm = new SelectionMessage("jalview", vobj, range);
+                if (vobj.length > 0)
+                {
+                  sm = new SelectionMessage("jalview", vobj, range);
+                }
+                else
+                {
+                  sm = null;
+                }
+              }
+              if (sm != null)
+              {
+                sm.validate(); // debug
+                Cache.log.debug("Selection Message\n" + sm.getRawMessage());
+                pm.sendMessage(sm);
               }
-              sm.validate(); // debug
-              Cache.log.debug("Selection Message\n"+sm.getRawMessage());
-              pm.sendMessage(sm);
             }
           }
 
@@ -1026,4 +1086,13 @@ public class VamsasApplication implements SelectionSource
       }
     }
   }
+
+  public String getCurrentSession()
+  {
+    if (vclient != null)
+    {
+      return (vclient.getSessionUrn());
+    }
+    return null;
+  }
 }