early bail out for long urls, and threaded off group url construction: JAL-402
[jalview.git] / src / jalview / ws / EnfinEnvision2OneWay.java
index ae2792c..b36956c 100644 (file)
@@ -25,6 +25,7 @@ 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;
@@ -318,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();
@@ -462,6 +468,10 @@ public class EnfinEnvision2OneWay extends DefaultHandler implements
     }
     // now create group links for all distinct ID/sequence sets.
     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();
@@ -512,6 +522,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)
@@ -520,15 +534,28 @@ public class EnfinEnvision2OneWay extends DefaultHandler implements
               seqstr[idcount++] = idandseqs[1][sq];
             }
           }
-          createAndAddLinks(wflinkMenus, false, urlLink, ltarget, null,
+          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];
-      createAndAddLinks(wflinkMenus, true, urlLink, "Any", null, descr,
+      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;
+      }
     }
     boolean anyadded = false; // indicates if there are any group links to give
     // to user
@@ -556,10 +583,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;
@@ -582,7 +610,6 @@ public class EnfinEnvision2OneWay extends DefaultHandler implements
     }
     return false;
   }
-
   // / end of stuff copied from popupmenu
   public void attachWSMenuEntry(final JMenu wsmenu,
           final AlignFrame alignFrame)
@@ -611,6 +638,8 @@ public class EnfinEnvision2OneWay extends DefaultHandler implements
       {
         if (refresh)
         {
+          new Thread(new Runnable() {
+            public void run() {
           try
           {
             buildGroupLinkMenu(enfinServiceMenu, alignFrame);
@@ -621,6 +650,7 @@ public class EnfinEnvision2OneWay extends DefaultHandler implements
                     ex);
             enfinServiceMenu.setEnabled(false);
           }
+            }}).start();
           refresh = false;
         }
       }