X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fws%2Fslivkaws%2FSlivkaWSDiscoverer.java;h=cd296c6fb202df825651134e625807be3435f00f;hb=ee9a37025c3bf1a79f11f53ff16bb5597ce0b52b;hp=1b3a273519f2d7f3507a0d19bd902245d7544d59;hpb=354311765aa6a7b597da92ef319b8b03191eba8e;p=jalview.git diff --git a/src/jalview/ws/slivkaws/SlivkaWSDiscoverer.java b/src/jalview/ws/slivkaws/SlivkaWSDiscoverer.java index 1b3a273..cd296c6 100644 --- a/src/jalview/ws/slivkaws/SlivkaWSDiscoverer.java +++ b/src/jalview/ws/slivkaws/SlivkaWSDiscoverer.java @@ -1,37 +1,37 @@ package jalview.ws.slivkaws; -import jalview.gui.AlignFrame; -import jalview.ws.WSMenuEntryProviderI; +import jalview.bin.Cache; +import jalview.ws.ServiceChangeListener; +import jalview.ws.WSDiscovererI; import jalview.ws.api.ServiceWithParameters; -import jalview.ws.jws2.PreferredServiceRegistry; - -import java.beans.PropertyChangeSupport; -import java.io.IOError; import java.io.IOException; -import java.net.URISyntaxException; +import java.net.MalformedURLException; +import java.net.URL; import java.util.ArrayList; +import java.util.Collections; import java.util.List; - -import javax.swing.JMenu; - +import java.util.Set; +import java.util.Vector; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CopyOnWriteArraySet; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; 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 slivkaClient; + private List services = List.of(); private SlivkaWSDiscoverer() { - try - { - slivkaClient = new SlivkaClient("http://www.compbio.dundee.ac.uk/slivka"); - } catch (URISyntaxException e) - { - throw new RuntimeException(e); - } } public static SlivkaWSDiscoverer getInstance() @@ -43,111 +43,176 @@ public class SlivkaWSDiscoverer implements Runnable, WSMenuEntryProviderI return instance; } - /** - * TODO: tests needed for logic for determining type of each discovered - * service. Then reimplement this routine ! - * - * @return (MSA instances, one AAUI type instance, and the remaining all - * sequence analysis instances taking 1 sequence only) - */ - List getServiceInstances() + private Set serviceListeners = new CopyOnWriteArraySet<>(); + + @Override + public void addServiceChangeListener(ServiceChangeListener l) + { + serviceListeners.add(l); + } + + @Override + public void removeServiceChangeListener(ServiceChangeListener l) + { + serviceListeners.remove(l); + } + + public void notifyServiceListeners(List services) { - List instances = new ArrayList<>(); - for (SlivkaService service : services) + for (var listener : serviceListeners) { - ServiceWithParameters newinstance = null; - for (String classifier : service.classifiers) + listener.servicesChanged(this, services); + } + } + + private final ExecutorService executor = Executors.newSingleThreadExecutor(); + private Vector> discoveryTasks = new Vector<>(); + + public CompletableFuture startDiscoverer() + { + CompletableFuture task = CompletableFuture + .supplyAsync(() -> { + reloadServices(); + return SlivkaWSDiscoverer.this; + }, executor); + discoveryTasks.add(task); + return task; + } + + private List reloadServices() + { + Cache.log.info("Reloading Slivka services"); + notifyServiceListeners(Collections.emptyList()); + ArrayList instances = new ArrayList<>(); + + for (String url : getServiceUrls()) + { + Cache.log.info(url); + SlivkaClient client; + client = new SlivkaClient(url); + try { - if (classifier.contains("Multiple sequence alignment")) - { - // MSA services always overwrite - newinstance = new SlivkaMsaServiceInstance(slivkaClient, service); - } - if (classifier.contains("Protein sequence analysis")) + for (SlivkaService service : client.getServices()) { - if (newinstance == null) + SlivkaWSInstance newinstance = null; + for (String classifier : service.classifiers) + { + if (classifier.contains("Multiple sequence alignment")) { - newinstance = (new SlivkaAnnotationServiceInstance( - slivkaClient, - - service, false)); + newinstance = new SlivkaMsaServiceInstance(client, service); } - } - - if (classifier + if (classifier.contains("Protein sequence analysis") + && newinstance == null) + { + newinstance = new SlivkaAnnotationServiceInstance(client, + service, false); + } + if (classifier .contains("Sequence alignment analysis (conservation)")) - { - // always overwrite other instances - newinstance = new SlivkaAnnotationServiceInstance(slivkaClient, + { + newinstance = new SlivkaAnnotationServiceInstance(client, service, true); + } + } + if (newinstance != null) + { + instances.add(newinstance); + } } - } - if (newinstance != null) + } catch (IOException e) { - instances.add(newinstance); + e.printStackTrace(); + continue; } } + + services = instances; + notifyServiceListeners(instances); + Cache.log.info("Slivka services reloading finished"); return instances; } - private PropertyChangeSupport changeSupport = new PropertyChangeSupport( - this); - @Override - public void attachWSMenuEntry(JMenu wsmenu, final AlignFrame alignFrame) + public List getServices() { - JMenu slivkaMenu = new JMenu("Slivka"); - wsmenu.add(slivkaMenu); - - 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( - getServiceInstances(), - changeSupport, slivkaMenu, alignFrame, null); - + return services; } - Listservices=null; + @Override + public boolean hasServices() + { + return !isRunning() && services.size() > 0; + } - volatile boolean started = false, finished = false; + @Override + public boolean isRunning() + { + return !discoveryTasks.stream().allMatch(Future::isDone); + } - Thread discoverer = null; @Override - public void run() + public void setServiceUrls(List wsUrls) { - discoverer = Thread.currentThread(); - started = true; - try + if (wsUrls != null && !wsUrls.isEmpty()) { - services = slivkaClient.getServices(); - } catch (IOException e) + Cache.setProperty(SLIVKA_HOST_URLS, String.join(",", wsUrls)); + } + else { - throw new IOError(e); + Cache.removeProperty(SLIVKA_HOST_URLS); } - finished = true; } - public static List getServices() + @Override + public List getServiceUrls() { - SlivkaWSDiscoverer us = getInstance(); - if (us.services == null) + String surls = Cache.getDefault(SLIVKA_HOST_URLS, COMPBIO_SLIVKA); + String[] urls = surls.split(","); + ArrayList valid = new ArrayList<>(urls.length); + for (String url : urls) { - us.run(); + 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 us.getServiceInstances(); + return valid; } - public boolean hasServices() + @Override + public boolean testServiceUrl(URL url) { - return finished == true && services != null && services.size() > 0; + return getServerStatusFor(url.toString()) == STATUS_OK; } - public boolean isRunning() + @Override + public int getServerStatusFor(String url) + { + try + { + List services = new SlivkaClient(url).getServices(); + return services.isEmpty() ? STATUS_NO_SERVICES : STATUS_OK; + } catch (IOException e) + { + Cache.log.error("Slivka could not retrieve services list", e); + return STATUS_INVALID; + } + } + + @Override + public String getErrorMessages() { - return discoverer != null && discoverer.isAlive(); + // TODO Auto-generated method stub + return ""; } }