package jalview.ws.slivkaws; import jalview.gui.AlignFrame; import jalview.ws.WSMenuEntryProviderI; 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.util.ArrayList; import java.util.List; import javax.swing.JMenu; import uk.ac.dundee.compbio.slivkaclient.SlivkaClient; import uk.ac.dundee.compbio.slivkaclient.SlivkaService; public class SlivkaWSDiscoverer implements Runnable, WSMenuEntryProviderI { private static SlivkaWSDiscoverer instance = null; private SlivkaClient slivkaClient; private SlivkaWSDiscoverer() { try { slivkaClient = new SlivkaClient("localhost", 4954); } catch (URISyntaxException e) { throw new RuntimeException(e); } } public static SlivkaWSDiscoverer getInstance() { if (instance == null) { instance = new SlivkaWSDiscoverer(); } return instance; } List getServiceInstances() { List instances = new ArrayList<>(); for (SlivkaService service : services) { for (String classifier : service.classifiers) { if (classifier.contains("Multiple sequence alignment")) { instances .add(new SlivkaMsaServiceInstance(slivkaClient, service)); } else if (classifier.contains("Protein sequence analysis")) { instances.add(new SlivkaAnnotationServiceInstance(slivkaClient, service, false)); } else if (classifier .contains("Sequence alignment analysis (conservation)")) { instances.add(new SlivkaAnnotationServiceInstance(slivkaClient, service, true)); } } } return instances; } private PropertyChangeSupport changeSupport = new PropertyChangeSupport( this); @Override public void attachWSMenuEntry(JMenu wsmenu, final AlignFrame alignFrame) { 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); } Listservices=null; volatile boolean started = false, finished = false; Thread discoverer = null; @Override public void run() { discoverer = Thread.currentThread(); started = true; try { services = slivkaClient.getServices(); } catch (IOException e) { throw new IOError(e); } finished = true; } public static List getServices() { SlivkaWSDiscoverer us = getInstance(); if (us.services == null) { us.run(); } return us.getServiceInstances(); } public boolean hasServices() { return finished == true && services != null && services.size() > 0; } public boolean isRunning() { return discoverer != null && discoverer.isAlive(); } }