X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fws%2Fslivkaws%2FSlivkaWSDiscoverer.java;h=7a41431ba8482970085d103b438d50344573f850;hb=076b3b34bc3e02a033213cdac4300444e3c57b74;hp=e9d0d53de2b98ca7dbe84dff83fa317de6cbf5b4;hpb=450e45b30f7bd3913fca34511e534fec955b8195;p=jalview.git diff --git a/src/jalview/ws/slivkaws/SlivkaWSDiscoverer.java b/src/jalview/ws/slivkaws/SlivkaWSDiscoverer.java index e9d0d53..7a41431 100644 --- a/src/jalview/ws/slivkaws/SlivkaWSDiscoverer.java +++ b/src/jalview/ws/slivkaws/SlivkaWSDiscoverer.java @@ -1,36 +1,36 @@ package jalview.ws.slivkaws; -import jalview.datamodel.AlignmentView; +import jalview.bin.Cache; import jalview.gui.AlignFrame; -import jalview.ws.WSMenuEntryProviderI; -import jalview.ws.jws2.MsaWSClient; +import jalview.ws.WSDiscovererI; +import jalview.ws.api.ServiceWithParameters; +import jalview.ws.jws2.PreferredServiceRegistry; -import java.awt.event.ActionEvent; -import java.io.IOError; +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; import java.io.IOException; -import java.net.URISyntaxException; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; import javax.swing.JMenu; -import javax.swing.JMenuItem; import uk.ac.dundee.compbio.slivkaclient.SlivkaClient; import uk.ac.dundee.compbio.slivkaclient.SlivkaService; -public class SlivkaWSDiscoverer implements Runnable, WSMenuEntryProviderI +public class SlivkaWSDiscoverer implements WSDiscovererI { + private static final String SLIVKA_HOST_URLS = "SLIVKAHOSTURLS"; + + private static final String COMPBIO_SLIVKA = "https://www.compbio.dundee.ac.uk/slivka/"; + private static SlivkaWSDiscoverer instance = null; - private SlivkaClient client; + private List services = List.of(); private SlivkaWSDiscoverer() { - try - { - client = new SlivkaClient("gjb-www-1.cluster.lifesci.dundee.ac.uk", 3203); - } catch (URISyntaxException e) - { - throw new RuntimeException(e); - } } public static SlivkaWSDiscoverer getInstance() @@ -42,71 +42,208 @@ public class SlivkaWSDiscoverer implements Runnable, WSMenuEntryProviderI return instance; } + private PropertyChangeSupport changeSupport = new PropertyChangeSupport( + this); + @Override public void attachWSMenuEntry(JMenu wsmenu, final AlignFrame alignFrame) { JMenu slivkaMenu = new JMenu("Slivka"); wsmenu.add(slivkaMenu); - JMenu categoryMenu = new JMenu("Alignment"); - slivkaMenu.add(categoryMenu); - try + JMenu alignmentMenu = new JMenu("Sequence Alignment"); + slivkaMenu.add(alignmentMenu); + JMenu disorderMenu = new JMenu("Protein sequence analysis"); + slivkaMenu.add(disorderMenu); + JMenu conservationMenu = new JMenu("Conservation"); + slivkaMenu.add(conservationMenu); + PreferredServiceRegistry.getRegistry().populateWSMenuEntry(services, + changeSupport, slivkaMenu, alignFrame, null); + + } + + volatile boolean ready = false; + + volatile Thread discovererThread = null; + + private class DiscovererThread extends Thread + { + private Thread oldThread; + + DiscovererThread(Thread oldThread) + { + super(); + this.oldThread = oldThread; + } + + @Override + public void run() + { + if (oldThread != null) + { + oldThread.interrupt(); + try + { + oldThread.join(); + } catch (InterruptedException e) + { + return; + } finally + { + oldThread = null; + } + } + ready = false; + reloadServices(); + ready = !isInterrupted(); + } + } + + Thread discoverer = null; + + @Override + public Thread startDiscoverer(PropertyChangeListener changeListener) + { + changeSupport.addPropertyChangeListener(changeListener); + ready = false; + (discovererThread = new DiscovererThread(discovererThread)).start(); + return discovererThread; + } + + private void reloadServices() + { + Cache.log.info("Reloading Slivka services"); + changeSupport.firePropertyChange("services", services, List.of()); + ArrayList instances = new ArrayList<>(); + + for (String url : getServiceUrls()) { - for (SlivkaService service : client.getServices()) + Cache.log.info(url); + SlivkaClient client; + client = new SlivkaClient(url); + try { - msaClassifier: + for (SlivkaService service : client.getServices()) { + SlivkaWSInstance newinstance = null; for (String classifier : service.classifiers) { if (classifier.contains("Multiple sequence alignment")) { - break msaClassifier; + newinstance = new SlivkaMsaServiceInstance(client, service); } - } - continue; - } - SlivkaMsaServiceInstance instance = new SlivkaMsaServiceInstance(client, service); - JMenuItem defaultEntry = new JMenuItem(String.format("%s with defaults", service.label)); - defaultEntry.addActionListener((ActionEvent evt) -> { - AlignmentView msa = alignFrame.gatherSequencesForAlignment(); - if (msa != null) - { - new MsaWSClient(instance, alignFrame.getTitle(), msa, false, true, - alignFrame.getViewport().getAlignment().getDataset(), alignFrame); - } - }); - categoryMenu.add(defaultEntry); - - JMenuItem customEntry = new JMenuItem(String.format("%s with custom parameters", service.label)); - customEntry.addActionListener((ActionEvent evt) -> { - AlignmentView msa = alignFrame.gatherSequencesForAlignment(); - if (msa != null) - { - try + if (classifier.contains("Protein sequence analysis") + && newinstance == null) { - SlivkaParamSet paramSet = new SlivkaParamSet(service); - new MsaWSClient(instance, paramSet, null, true, alignFrame.getTitle(), msa, false, true, - alignFrame.getViewport().getAlignment().getDataset(), alignFrame); - } catch (IOException exc) + newinstance = new SlivkaAnnotationServiceInstance(client, + service, false); + } + if (classifier + .contains("Sequence alignment analysis (conservation)")) { - throw new IOError(exc); + newinstance = new SlivkaAnnotationServiceInstance(client, + service, true); } } - }); - categoryMenu.add(customEntry); + if (newinstance != null) + { + instances.add(newinstance); + } + } + } catch (IOException e) + { + continue; + } + } + + services = instances; + changeSupport.firePropertyChange("services", List.of(), services); + + Cache.log.info("Slivka services reloading finished"); + } + + @Override + public List getServices() + { + return services; + } + + @Override + public boolean hasServices() + { + return ready == true && services.size() > 0; + } + + @Override + public boolean isRunning() + { + return discovererThread == null || discovererThread.isAlive() + || discovererThread.getState() == Thread.State.NEW; + } + + @Override + public void setServiceUrls(List wsUrls) + { + if (wsUrls != null && !wsUrls.isEmpty()) + { + Cache.setProperty(SLIVKA_HOST_URLS, String.join(",", wsUrls)); + } + else + { + Cache.removeProperty(SLIVKA_HOST_URLS); + } + } - categoryMenu.addSeparator(); + @Override + public List getServiceUrls() + { + String surls = Cache.getDefault(SLIVKA_HOST_URLS, COMPBIO_SLIVKA); + String[] urls = surls.split(","); + ArrayList valid = new ArrayList<>(urls.length); + for (String url : urls) + { + try + { + new URL(url); + valid.add(url); + } catch (MalformedURLException e) + { + Cache.log.warn("Problem whilst trying to make a URL from '" + + ((url != null) ? url : "") + "'"); + Cache.log.warn( + "This was probably due to a malformed comma separated list" + + " in the " + SLIVKA_HOST_URLS + + " entry of $(HOME)/.jalview_properties)"); + Cache.log.debug("Exception was ", e); } + } + return valid; + } + + @Override + public boolean testServiceUrl(URL url) + { + return getServerStatusFor(url.toString()) == STATUS_OK; + } + + @Override + public int getServerStatusFor(String url) + { + try + { + List services = new SlivkaClient(url).getServices(); + return services.isEmpty() ? STATUS_NO_SERVICES : STATUS_OK; } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + Cache.log.error("Slivka could not retrieve services list", e); + return STATUS_INVALID; } } @Override - public void run() + public String getErrorMessages() { - + // TODO Auto-generated method stub + return ""; } }