JAL-853 use service action attribute to index services in webservices menu and hardwi...
authorjprocter <jprocter@compbio.dundee.ac.uk>
Wed, 17 Aug 2011 15:10:26 +0000 (16:10 +0100)
committerjprocter <jprocter@compbio.dundee.ac.uk>
Wed, 17 Aug 2011 15:10:26 +0000 (16:10 +0100)
src/jalview/gui/AlignFrame.java
src/jalview/gui/JvSwingUtils.java
src/jalview/ws/jws2/Jws2Discoverer.java
src/jalview/ws/rest/RestClient.java
src/jalview/ws/rest/RestServiceDescription.java

index 06272c3..ba112b8 100755 (executable)
@@ -71,6 +71,7 @@ import jalview.schemes.TaylorColourScheme;
 import jalview.schemes.TurnColourScheme;
 import jalview.schemes.UserColourScheme;
 import jalview.schemes.ZappoColourScheme;
+import jalview.ws.WSMenuEntryProviderI;
 import jalview.ws.jws1.Discoverer;
 import jalview.ws.jws2.Jws2Discoverer;
 
@@ -3960,6 +3961,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
           // object broker mechanism.
           final Vector wsmenu = new Vector();
           final IProgressIndicator af = me;
+          final JMenu msawsmenu = new JMenu("Alignment");
+          final JMenu secstrmenu = new JMenu(
+                  "Secondary Structure Prediction");
+          final JMenu seqsrchmenu = new JMenu(
+                  "Sequence Database Search");
+          final JMenu analymenu = new JMenu(
+                  "Analyse Alignment");
+          
           if (Cache.getDefault("SHOW_JWS1_SERVICES", true)
                   && Discoverer.services != null
                   && (Discoverer.services.size() > 0))
@@ -3978,7 +3987,6 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
             if (msaws != null)
             {
               // Add any Multiple Sequence Alignment Services
-              final JMenu msawsmenu = new JMenu("Alignment");
               for (int i = 0, j = msaws.size(); i < j; i++)
               {
                 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws
@@ -3988,13 +3996,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                 impl.attachWSMenuEntry(msawsmenu, me);
 
               }
-              wsmenu.add(msawsmenu);
             }
             if (secstrpr != null)
             {
               // Add any secondary structure prediction services
-              final JMenu secstrmenu = new JMenu(
-                      "Secondary Structure Prediction");
               for (int i = 0, j = secstrpr.size(); i < j; i++)
               {
                 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) secstrpr
@@ -4003,13 +4008,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                         .getServiceClient(sh);
                 impl.attachWSMenuEntry(secstrmenu, me);
               }
-              wsmenu.add(secstrmenu);
             }
             if (seqsrch != null)
             {
               // Add any sequence search services
-              final JMenu seqsrchmenu = new JMenu(
-                      "Sequence Database Search");
               for (int i = 0, j = seqsrch.size(); i < j; i++)
               {
                 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) seqsrch
@@ -4018,7 +4020,6 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                         .getServiceClient(sh);
                 impl.attachWSMenuEntry(seqsrchmenu, me);
               }
-              wsmenu.add(seqsrchmenu);
             }
           }
 
@@ -4031,14 +4032,22 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
               if (jws2servs.hasServices())
               {
                 JMenu jws2men = new JMenu("Jaba Web Services");
-                jws2servs.attachWSMenuEntry(jws2men, me);
-                for (int i = 0, iSize = jws2men.getMenuComponentCount(); i < iSize; i++)
-                {
-                  wsmenu.add(jws2men.getMenuComponent(i));
-                }
+                jws2servs.attachWSMenuEntry(msawsmenu, me);
+//                for (int i = 0, iSize = jws2men.getMenuComponentCount(); i < iSize; i++)
+//                {
+//                  msawsmenu.add(jws2men.getMenuComponent(i));
+//                }
               }
             }
           }
+          if (msawsmenu.getMenuComponentCount()>0)
+            wsmenu.add(msawsmenu);
+          if (secstrmenu.getMenuComponentCount()>0)
+            wsmenu.add(secstrmenu);
+          if (analymenu.getMenuComponentCount()>0)
+            wsmenu.add(analymenu);
+          if (seqsrchmenu.getMenuComponentCount()>0)
+            wsmenu.add(seqsrchmenu);
 
           javax.swing.SwingUtilities.invokeLater(new Runnable()
           {
@@ -4116,8 +4125,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     // TODO: refactor to RestClient discoverer and merge menu entries for
     // rest-style services with other types of analysis/calculation service
     // SHmmr test client - still being implemented.
-    jalview.ws.rest.RestClient.makeShmmrRestClient().attachWSMenuEntry(
-            webService, this);
+    
+    for (jalview.ws.rest.RestClient client: jalview.ws.rest.RestClient.getRestClients()) {
+      client.attachWSMenuEntry(JvSwingUtils.findOrCreateMenu(webService, client.getAction()), this);
+    }
     // DEBUG - alignmentView
   }
 
index f41e85a..437f430 100644 (file)
@@ -22,6 +22,7 @@ import java.awt.Font;
 import java.awt.event.ActionListener;
 
 import javax.swing.JButton;
+import javax.swing.JMenu;
 import javax.swing.SwingConstants;
 
 /**
@@ -68,4 +69,32 @@ public final class JvSwingUtils
     return button;
   }
 
+  /**
+   * find or add a submenu with the given title in the given menu
+   * 
+   * @param menu
+   * @param submenu
+   * @return the new or existing submenu
+   */
+  public static 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;
+  
+  }
+
 }
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
    */
index 606d927..ac4f44e 100644 (file)
@@ -5,6 +5,7 @@ package jalview.ws.rest;
 
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
+import java.util.Collection;
 import java.util.Hashtable;
 
 import javax.swing.JMenu;
@@ -340,4 +341,14 @@ public class RestClient extends WSClient implements WSClientI,
     return true;
   }
 
+  public static RestClient[] getRestClients()
+  {
+    return new RestClient[] { makeShmmrRestClient() };
+  }
+
+  public String getAction()
+  {
+    return service.details.Action;
+  }
+
 }
index bf1b375..17d7a6e 100644 (file)
@@ -71,7 +71,7 @@ public class RestServiceDescription
     String Name;
     String description;
   }
-  UIinfo details = new UIinfo();
+  public UIinfo details = new UIinfo();
   
   /** Service base URL
    */