Jalview 2.6 source licence
[jalview.git] / src / jalview / ws / EnfinEnvision2OneWay.java
index 53d5b4a..f40831c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.5)
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.6)
  * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle
  * 
  * This file is part of Jalview.
@@ -23,7 +23,9 @@ import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
 import jalview.gui.AlignFrame;
 import jalview.gui.Desktop;
+import jalview.gui.JvSwingUtils;
 import jalview.util.GroupUrlLink;
+import jalview.util.GroupUrlLink.UrlStringTooLongException;
 
 import java.awt.Component;
 import java.awt.Cursor;
@@ -35,6 +37,7 @@ import java.io.BufferedReader;
 import java.io.InputStreamReader;
 import java.net.URL;
 import java.util.Hashtable;
+import java.util.Map;
 import java.util.Vector;
 
 import javax.swing.JMenu;
@@ -281,7 +284,7 @@ public class EnfinEnvision2OneWay extends DefaultHandler implements
    *          Object array returned from the makeUrlStubs function.
    */
   private void addshowLink(JMenu linkMenu, String label, String descr,
-          final GroupUrlLink urlgenerator, final Object[] urlstub)
+          String dbname, final GroupUrlLink urlgenerator, final Object[] urlstub)
   {
     Component[] jmi = linkMenu.getMenuComponents();
     for (int i = 0; i < jmi.length; i++)
@@ -293,10 +296,20 @@ public class EnfinEnvision2OneWay extends DefaultHandler implements
         return;
       }
     }
+    boolean seqsorids = (urlgenerator.getGroupURLType() & urlgenerator.SEQUENCEIDS) == 0;
+    int i = urlgenerator.getNumberInvolved(urlstub);
     JMenuItem item = new JMenuItem(label);
-    item.setToolTipText("Submit ("
-            + urlgenerator.getNumberInvolved(urlstub)
-            + " seqs) to workflow: " + descr);
+    // 
+    if (dbname==null || dbname.trim().length()==0)
+    {
+      dbname = "";
+    }
+    item.setToolTipText("<html>"
+            + JvSwingUtils.wrapTooltip("Submit " + i + " " +
+                    dbname +" "
+                    + (seqsorids ? "sequence" : "sequence id") + (i > 1 ? "s" : "")
+                    
+            + " to<br/>" + descr) + "</html>");
     item.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -306,7 +319,12 @@ public class EnfinEnvision2OneWay extends DefaultHandler implements
 
           public void run()
           {
-            showLink(urlgenerator.constructFrom(urlstub));
+            try {
+              showLink(urlgenerator.constructFrom(urlstub));
+            } catch (UrlStringTooLongException ex)
+            {
+              Cache.log.warn("Not showing link: URL is too long!", ex);
+            }
           }
 
         }).start();
@@ -348,6 +366,10 @@ public class EnfinEnvision2OneWay extends DefaultHandler implements
   private void buildGroupLinkMenu(JMenu enfinServiceMenu,
           AlignFrame alignFrame)
   {
+    if (running || !started)
+    {
+      return;
+    }
     SequenceI[] seqs = alignFrame.getViewport().getSelectionAsNewSequence();
     SequenceGroup sg = alignFrame.getViewport().getSelectionGroup();
     if (sg == null)
@@ -382,16 +404,13 @@ public class EnfinEnvision2OneWay extends DefaultHandler implements
    */
   private JMenu buildGroupURLMenu(SequenceI[] seqs, SequenceGroup sg)
   {
-
+    if (groupURLdescr==null || groupURLLinks==null)
+      return null;
     // TODO: usability: thread off the generation of group url content so root
     // menu appears asap
     // sequence only URLs
     // ID/regex match URLs
     JMenu groupLinksMenu = new JMenu("Group Link");
-    JMenu[] linkMenus = new JMenu[]
-    { null, new JMenu("IDS"), new JMenu("Sequences"),
-        new JMenu("IDS and Sequences") }; // three types of url that might be
-                                          // created.
     String[][] idandseqs = GroupUrlLink.formStrings(seqs);
     Hashtable commonDbrefs = new Hashtable();
     for (int sq = 0; sq < seqs.length; sq++)
@@ -453,12 +472,16 @@ public class EnfinEnvision2OneWay extends DefaultHandler implements
       }
     }
     // now create group links for all distinct ID/sequence sets.
-    boolean addMenu = false; // indicates if there are any group links to give
-                             // to user
+    Hashtable<String, JMenu[]> gurlMenus = new Hashtable<String, JMenu[]>();
+    /**
+     * last number of sequences where URL generation failed
+     */
+    int[] nsqtype = new int[] { 0,0,0,0,0,0,0,0,0,0};
     for (int i = 0; i < groupURLLinks.size(); i++)
     {
-      String link = groupURLLinks.elementAt(i).toString();
-      String descr = groupURLdescr.elementAt(i).toString();
+      String link = (String) groupURLLinks.elementAt(i);
+      String descr = (String) groupURLdescr.elementAt(i);
+
       // boolean specialCase =
       // additionalPar.elementAt(i).toString().equals(BACKGROUND);
       GroupUrlLink urlLink = null;
@@ -478,6 +501,18 @@ public class EnfinEnvision2OneWay extends DefaultHandler implements
         continue;
       }
       final String label = urlLink.getLabel();
+      // create/recover the sub menus that might be populated for this link.
+      JMenu[] wflinkMenus = gurlMenus.get(label);
+      if (wflinkMenus == null)
+      {
+        // three types of url that might be
+        // created.
+        wflinkMenus = new JMenu[]
+        { null, new JMenu("IDS"), new JMenu("Sequences"),
+            new JMenu("IDS and Sequences") };
+        gurlMenus.put(label, wflinkMenus);
+      }
+
       boolean usingNames = false;
       // Now see which parts of the group apply for this URL
       String ltarget;
@@ -492,6 +527,10 @@ public class EnfinEnvision2OneWay extends DefaultHandler implements
           String[] allids = ((String[]) idset[1]);
           seqstr = new String[numinput];
           ids = new String[numinput];
+          if (nsqtype[urlLink.getGroupURLType()]>0 && numinput>=nsqtype[urlLink.getGroupURLType()])
+          {
+            continue;
+          }
           for (int sq = 0, idcount = 0; sq < seqs.length; sq++)
           {
             if (allids[sq] != null)
@@ -500,30 +539,48 @@ public class EnfinEnvision2OneWay extends DefaultHandler implements
               seqstr[idcount++] = idandseqs[1][sq];
             }
           }
-          addMenu = addMenu
-                  | createAndAddLinks(linkMenus, false, urlLink, label,
-                          ltarget, descr, ids, seqstr);
+          try {createAndAddLinks(wflinkMenus, false, urlLink, ltarget, null,
+                  descr, ids, seqstr);
+          } catch (UrlStringTooLongException ex)
+          {
+            nsqtype[urlLink.getGroupURLType()] = numinput;
+          }
         }
       }
       // also do names only.
       seqstr = idandseqs[1];
       ids = idandseqs[0];
-      addMenu = addMenu
-              | createAndAddLinks(linkMenus, true, urlLink, label, "Names",
-                      descr, ids, seqstr);
+      if (nsqtype[urlLink.getGroupURLType()]>0 && idandseqs[0].length>=nsqtype[urlLink.getGroupURLType()])
+      {
+        continue;
+      }
+      
+      try {createAndAddLinks(wflinkMenus, true, urlLink, "Any", null, descr,
+              ids, seqstr);
+      }catch (UrlStringTooLongException ex)
+      {
+        nsqtype[urlLink.getGroupURLType()] = idandseqs[0].length;
+      }
     }
-    if (addMenu)
+    boolean anyadded = false; // indicates if there are any group links to give
+    // to user
+    for (Map.Entry<String, JMenu[]> menues : gurlMenus.entrySet())
     {
-      groupLinksMenu = new JMenu("Group Links");
-      for (int m = 0; m < linkMenus.length; m++)
+      JMenu grouplinkset = new JMenu(menues.getKey());
+      JMenu[] wflinkMenus = menues.getValue();
+      for (int m = 0; m < wflinkMenus.length; m++)
       {
-        if (linkMenus[m] != null
-                && linkMenus[m].getMenuComponentCount() > 0)
+        if (wflinkMenus[m] != null
+                && wflinkMenus[m].getMenuComponentCount() > 0)
         {
-          groupLinksMenu.add(linkMenus[m]);
+          anyadded = true;
+          grouplinkset.add(wflinkMenus[m]);
         }
       }
-
+      groupLinksMenu.add(grouplinkset);
+    }
+    if (anyadded)
+    {
       return groupLinksMenu;
     }
     return null;
@@ -531,10 +588,11 @@ public class EnfinEnvision2OneWay extends DefaultHandler implements
 
   private boolean createAndAddLinks(JMenu[] linkMenus, boolean usingNames,
           GroupUrlLink urlLink, String label, String ltarget, String descr,
-          String[] ids, String[] seqstr)
+          String[] ids, String[] seqstr) throws UrlStringTooLongException
   {
-    Object[] urlset = urlLink.makeUrlStubs(ids, seqstr, "FromJalview"
+    Object[] urlset= urlLink.makeUrlStubs(ids, seqstr, "FromJalview"
             + System.currentTimeMillis(), false);
+
     if (urlset != null)
     {
       int type = urlLink.getGroupURLType() & 3;
@@ -542,15 +600,21 @@ public class EnfinEnvision2OneWay extends DefaultHandler implements
       // +" "+((String[])urlset[3])[0]);
       // first two bits ofurlLink type bitfield are sequenceids and sequences
       // TODO: FUTURE: ensure the groupURL menu structure can be generalised
-      addshowLink(linkMenus[type], label
-              + " "
-              + (usingNames ? (((type & 1) == 1) ? "(Names)" : "") : ("("
-                      + ltarget + ")")), descr, urlLink, urlset);
+      addshowLink(
+              linkMenus[type],
+              label
+                      + " "
+                      + (ltarget == null ? (((type & 1) == 1 ? "ID"
+                              : "Sequence") + (urlLink
+                              .getNumberInvolved(urlset) > 1 ? "s" : ""))
+                              : (usingNames ? (((type & 1) == 1) ? "(Names)"
+                                      : "")
+                                      : ("(" + ltarget + ")"))), descr,
+              usingNames ? null : label, urlLink, urlset);
       return true;
     }
     return false;
   }
-
   // / end of stuff copied from popupmenu
   public void attachWSMenuEntry(final JMenu wsmenu,
           final AlignFrame alignFrame)
@@ -577,8 +641,10 @@ public class EnfinEnvision2OneWay extends DefaultHandler implements
 
       public void menuSelected(MenuEvent e)
       {
-        if (refresh)
+        if (refresh && !isRunning())
         {
+          new Thread(new Runnable() {
+            public void run() {
           try
           {
             buildGroupLinkMenu(enfinServiceMenu, alignFrame);
@@ -589,6 +655,7 @@ public class EnfinEnvision2OneWay extends DefaultHandler implements
                     ex);
             enfinServiceMenu.setEnabled(false);
           }
+            }}).start();
           refresh = false;
         }
       }