From f149a335b5467a4802eded5da0ca2fc732d7caf7 Mon Sep 17 00:00:00 2001 From: jprocter Date: Wed, 17 Aug 2011 16:10:26 +0100 Subject: [PATCH] JAL-853 use service action attribute to index services in webservices menu and hardwire jaba services to populate Alignment service menu --- src/jalview/gui/AlignFrame.java | 41 ++++-- src/jalview/gui/JvSwingUtils.java | 29 ++++ src/jalview/ws/jws2/Jws2Discoverer.java | 170 ++++++++++++----------- src/jalview/ws/rest/RestClient.java | 11 ++ src/jalview/ws/rest/RestServiceDescription.java | 2 +- 5 files changed, 159 insertions(+), 94 deletions(-) diff --git a/src/jalview/gui/AlignFrame.java b/src/jalview/gui/AlignFrame.java index 06272c3..ba112b8 100755 --- a/src/jalview/gui/AlignFrame.java +++ b/src/jalview/gui/AlignFrame.java @@ -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 } diff --git a/src/jalview/gui/JvSwingUtils.java b/src/jalview/gui/JvSwingUtils.java index f41e85a..437f430 100644 --- a/src/jalview/gui/JvSwingUtils.java +++ b/src/jalview/gui/JvSwingUtils.java @@ -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; + + } + } diff --git a/src/jalview/ws/jws2/Jws2Discoverer.java b/src/jalview/ws/jws2/Jws2Discoverer.java index 198f01d..9b4c008 100644 --- a/src/jalview/ws/jws2/Jws2Discoverer.java +++ b/src/jalview/ws/jws2/Jws2Discoverer.java @@ -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 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> hosts = new Hashtable>(); + String[] sorton; + for (Jws2Instance service : services) { - atpoint = jws2al; - String host = service.getHost(); - String type = service.serviceType; - if (byhost) + ArrayList 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()); } - 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 */ diff --git a/src/jalview/ws/rest/RestClient.java b/src/jalview/ws/rest/RestClient.java index 606d927..ac4f44e 100644 --- a/src/jalview/ws/rest/RestClient.java +++ b/src/jalview/ws/rest/RestClient.java @@ -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; + } + } diff --git a/src/jalview/ws/rest/RestServiceDescription.java b/src/jalview/ws/rest/RestServiceDescription.java index bf1b375..17d7a6e 100644 --- a/src/jalview/ws/rest/RestServiceDescription.java +++ b/src/jalview/ws/rest/RestServiceDescription.java @@ -71,7 +71,7 @@ public class RestServiceDescription String Name; String description; } - UIinfo details = new UIinfo(); + public UIinfo details = new UIinfo(); /** Service base URL */ -- 1.7.10.2