1 package jalview.ws.slivkaws;
3 import jalview.gui.AlignFrame;
4 import jalview.ws.WSMenuEntryProviderI;
5 import jalview.ws.api.ServiceWithParameters;
6 import jalview.ws.jws2.PreferredServiceRegistry;
8 import java.beans.PropertyChangeSupport;
9 import java.io.IOError;
10 import java.io.IOException;
11 import java.net.URISyntaxException;
12 import java.util.ArrayList;
13 import java.util.List;
15 import javax.swing.JMenu;
17 import uk.ac.dundee.compbio.slivkaclient.SlivkaClient;
18 import uk.ac.dundee.compbio.slivkaclient.SlivkaService;
20 public class SlivkaWSDiscoverer implements Runnable, WSMenuEntryProviderI
22 private static SlivkaWSDiscoverer instance = null;
24 private SlivkaClient slivkaClient;
26 private SlivkaWSDiscoverer()
30 slivkaClient = new SlivkaClient("https://www.compbio.dundee.ac.uk/slivka");
31 } catch (URISyntaxException e)
33 throw new RuntimeException(e);
37 public static SlivkaWSDiscoverer getInstance()
41 instance = new SlivkaWSDiscoverer();
47 * TODO: tests needed for logic for determining type of each discovered
48 * service. Then reimplement this routine !
50 * @return (MSA instances, one AAUI type instance, and the remaining all
51 * sequence analysis instances taking 1 sequence only)
53 List<ServiceWithParameters> getServiceInstances()
55 List<ServiceWithParameters> instances = new ArrayList<>();
56 for (SlivkaService service : services)
58 ServiceWithParameters newinstance = null;
59 for (String classifier : service.classifiers)
61 if (classifier.contains("Multiple sequence alignment"))
63 // MSA services always overwrite
64 newinstance = new SlivkaMsaServiceInstance(slivkaClient, service);
66 if (classifier.contains("Protein sequence analysis"))
68 if (newinstance == null)
70 newinstance = (new SlivkaAnnotationServiceInstance(
78 .contains("Sequence alignment analysis (conservation)"))
80 // always overwrite other instances
81 newinstance = new SlivkaAnnotationServiceInstance(slivkaClient,
85 if (newinstance != null)
87 instances.add(newinstance);
93 private PropertyChangeSupport changeSupport = new PropertyChangeSupport(
97 public void attachWSMenuEntry(JMenu wsmenu, final AlignFrame alignFrame)
99 JMenu slivkaMenu = new JMenu("Slivka");
100 wsmenu.add(slivkaMenu);
102 JMenu alignmentMenu = new JMenu("Sequence Alignment");
103 slivkaMenu.add(alignmentMenu);
104 JMenu disorderMenu = new JMenu("Protein sequence analysis");
105 slivkaMenu.add(disorderMenu);
106 JMenu conservationMenu = new JMenu("Conservation");
107 slivkaMenu.add(conservationMenu);
108 PreferredServiceRegistry.getRegistry().populateWSMenuEntry(
109 getServiceInstances(),
110 changeSupport, slivkaMenu, alignFrame, null);
114 List<SlivkaService>services=null;
116 volatile boolean started = false, finished = false;
118 Thread discoverer = null;
122 discoverer = Thread.currentThread();
126 services = slivkaClient.getServices();
127 } catch (IOException e)
129 throw new IOError(e);
134 public static List<ServiceWithParameters> getServices()
136 SlivkaWSDiscoverer us = getInstance();
137 if (us.services == null)
141 return us.getServiceInstances();
144 public boolean hasServices()
146 return finished == true && services != null && services.size() > 0;
149 public boolean isRunning()
151 return discoverer != null && discoverer.isAlive();