JAL-853 use service action attribute to index services in webservices menu and hardwi...
[jalview.git] / src / jalview / ws / jws2 / Jws2Discoverer.java
index 198f01d..9b4c008 100644 (file)
@@ -44,7 +44,9 @@ import jalview.datamodel.AlignmentView;
 import jalview.gui.AlignFrame;
 import jalview.gui.Desktop;
 import jalview.gui.JalviewChangeSupport;
+import jalview.gui.JvSwingUtils;
 import jalview.ws.WSMenuEntryProviderI;
+import jalview.ws.jws2.Jws2Discoverer.Jws2Instance;
 import jalview.ws.params.ParamDatastoreI;
 import compbio.data.msa.MsaWS;
 import compbio.metadata.Option;
@@ -338,8 +340,8 @@ public class Jws2Discoverer implements Runnable, WSMenuEntryProviderI
     {
       // this is only valid for Jaba 1.0 - this formula might have to change!
       return hosturl
-              + (hosturl.lastIndexOf("/") == (hosturl.length() - 1) ? "/"
-                      : "") + serviceType;
+              + (hosturl.lastIndexOf("/") == (hosturl.length() - 1) ? ""
+                      : "/") + serviceType;
     }
 
     private boolean hasParams = false, lookedForParams = false;
@@ -366,38 +368,10 @@ public class Jws2Discoverer implements Runnable, WSMenuEntryProviderI
    */
   protected Vector<Jws2Instance> services;
 
-  /**
-   * find or add a submenu with the given title in the given menu
-   * 
-   * @param menu
-   * @param submenu
-   * @return the new or existing submenu
-   */
-  private JMenu findOrCreateMenu(JMenu menu, String submenu)
-  {
-    JMenu submenuinstance = null;
-    for (int i = 0, iSize = menu.getMenuComponentCount(); i < iSize; i++)
-    {
-      if (menu.getMenuComponent(i) instanceof JMenu
-              && ((JMenu) menu.getMenuComponent(i)).getText().equals(
-                      submenu))
-      {
-        submenuinstance = (JMenu) menu.getMenuComponent(i);
-      }
-    }
-    if (submenuinstance == null)
-    {
-      submenuinstance = new JMenu(submenu);
-      menu.add(submenuinstance);
-    }
-    return submenuinstance;
-
-  }
-
   public void attachWSMenuEntry(JMenu wsmenu, final AlignFrame alignFrame)
   {
     // dynamically regenerate service list.
-    final JMenu jws2al = new JMenu("JABAWS Alignment");
+    final JMenu jws2al = wsmenu; // new JMenu("JABAWS Alignment");
     jws2al.addMenuListener(new MenuListener()
     {
       // TODO: future: add menu listener to parent menu - so submenus are
@@ -444,62 +418,101 @@ public class Jws2Discoverer implements Runnable, WSMenuEntryProviderI
     Vector hostLabels = new Vector();
     jws2al.removeAll();
     String lasthost = null;
-    for (final Jws2Instance service : services)
+    Hashtable<String, ArrayList<Jws2Instance>> hosts = new Hashtable<String, ArrayList<Jws2Instance>>();
+    String[] sorton;
+    for (Jws2Instance service : services)
     {
-      atpoint = jws2al;
-      String host = service.getHost();
-      String type = service.serviceType;
-      if (byhost)
+      ArrayList<Jws2Instance> hostservices = hosts.get(service.getHost());
+      if (hostservices == null)
       {
-        atpoint = findOrCreateMenu(atpoint, host);
-        if (atpoint.getToolTipText() == null)
-        {
-          atpoint.setToolTipText("Services at " + host);
-        }
+        hosts.put(service.getHost(),
+                hostservices = new ArrayList<Jws2Instance>());
       }
-      if (bytype)
+      hostservices.add(service);
+    }
+    sorton = hosts.keySet().toArray(new String[1]);
+    String hostlist[] = sorton.clone();
+    jalview.util.QuickSort.sort(sorton, hostlist);
+    for (String host : hostlist)
+    {
+      Jws2Instance orderedsvcs[] = hosts.get(host).toArray(
+              new Jws2Instance[1]);
+      String sortbytype[] = new String[orderedsvcs.length];
+      for (int i = 0; i < sortbytype.length; i++)
       {
-        atpoint = findOrCreateMenu(atpoint, type);
-        if (atpoint.getToolTipText() == null)
-        {
-          atpoint.setToolTipText(service.getActionText());
-        }
+        sortbytype[i] = orderedsvcs[i].serviceType;
       }
-      if (!byhost
-              && !hostLabels.contains(host + service.serviceType
-                      + service.getActionText()))
-      // !hostLabels.contains(host + (bytype ?
-      // service.serviceType+service.getActionText() : "")))
+      jalview.util.QuickSort.sort(sortbytype, orderedsvcs);
+      for (final Jws2Instance service : orderedsvcs)
       {
-        // add a marker indicating where this service is hosted
-        // relies on services from the same host being listed in a contiguous
-        // group
-        JMenuItem hitm;
-        atpoint.addSeparator();
-        if (lasthost == null || !lasthost.equals(host))
+        atpoint = jws2al;
+        String type = service.serviceType;
+        if (byhost)
         {
-          atpoint.add(hitm = new JMenuItem(host));
-          hitm.setForeground(Color.blue);
-          lasthost = host;
+          atpoint = JvSwingUtils.findOrCreateMenu(atpoint, host);
+          if (atpoint.getToolTipText() == null)
+          {
+            atpoint.setToolTipText("Services at " + host);
+          }
+        }
+        if (bytype)
+        {
+          atpoint = JvSwingUtils.findOrCreateMenu(atpoint, type);
+          if (atpoint.getToolTipText() == null)
+          {
+            atpoint.setToolTipText(service.getActionText());
+          }
+        }
+        if (!byhost
+                && !hostLabels.contains(host + service.serviceType
+                        + service.getActionText()))
+        // !hostLabels.contains(host + (bytype ?
+        // service.serviceType+service.getActionText() : "")))
+        {
+          // add a marker indicating where this service is hosted
+          // relies on services from the same host being listed in a
+          // contiguous
+          // group
+          JMenuItem hitm;
+          atpoint.addSeparator();
+          if (lasthost == null || !lasthost.equals(host))
+          {
+            atpoint.add(hitm = new JMenuItem(host));
+            hitm.setForeground(Color.blue);
+            hitm.addActionListener(new ActionListener()
+            {
+
+              @Override
+              public void actionPerformed(ActionEvent e)
+              {
+                Desktop.showUrl(service.getHost());
+              }
+            });
+            hitm.setToolTipText(JvSwingUtils
+                    .wrapTooltip("Opens the JABAWS server's homepage in web browser"));
+            lasthost = host;
+          }
+          hostLabels.addElement(host + service.serviceType
+                  + service.getActionText());
+          // hostLabels.addElement(host + (bytype ?
+          // service.serviceType+service.getActionText() : ""));
         }
-        hostLabels.addElement(host + service.serviceType
-                + service.getActionText());
-        // hostLabels.addElement(host + (bytype ?
-        // service.serviceType+service.getActionText() : ""));
+        msacl.attachWSMenuEntry(atpoint, service, alignFrame);
+        /*
+         * JMenuItem sitem = new JMenuItem(service.serviceType);
+         * sitem.setToolTipText("Hosted at " + service.hosturl);
+         * sitem.addActionListener(new ActionListener() {
+         * 
+         * @Override public void actionPerformed(ActionEvent e) { AlignmentView
+         * msa = alignFrame.gatherSequencesForAlignment(); MsaWSClient client =
+         * new MsaWSClient(service, "JWS2 Alignment of " +
+         * alignFrame.getTitle(), msa, false, true,
+         * alignFrame.getViewport().getAlignment().getDataset(), alignFrame); }
+         * });
+         */
       }
-      msacl.attachWSMenuEntry(atpoint, service, alignFrame);
-      /*
-       * JMenuItem sitem = new JMenuItem(service.serviceType);
-       * sitem.setToolTipText("Hosted at " + service.hosturl);
-       * sitem.addActionListener(new ActionListener() {
-       * 
-       * @Override public void actionPerformed(ActionEvent e) { AlignmentView
-       * msa = alignFrame.gatherSequencesForAlignment(); MsaWSClient client =
-       * new MsaWSClient(service, "JWS2 Alignment of " + alignFrame.getTitle(),
-       * msa, false, true, alignFrame.getViewport().getAlignment().getDataset(),
-       * alignFrame); } });
-       */
     }
+
   }
 
   public static void main(String[] args)
@@ -700,7 +713,8 @@ public class Jws2Discoverer implements Runnable, WSMenuEntryProviderI
   }
 
   /**
-   * add an 'empty' JABA server to the list. Only servers not already in the 'bad URL' list will be added to this list.
+   * add an 'empty' JABA server to the list. Only servers not already in the
+   * 'bad URL' list will be added to this list.
    * 
    * @param jwsservers
    */