Merge branch 'alpha/JAL-3362_Jalview_212_alpha' into alpha/merge_212_JalviewJS_2112
[jalview.git] / src / jalview / ws / slivkaws / SlivkaWSDiscoverer.java
diff --git a/src/jalview/ws/slivkaws/SlivkaWSDiscoverer.java b/src/jalview/ws/slivkaws/SlivkaWSDiscoverer.java
new file mode 100644 (file)
index 0000000..2b4a958
--- /dev/null
@@ -0,0 +1,153 @@
+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("https://www.compbio.dundee.ac.uk/slivka");
+    } catch (URISyntaxException e)
+    {
+      throw new RuntimeException(e);
+    }
+  }
+
+  public static SlivkaWSDiscoverer getInstance()
+  {
+    if (instance == null)
+    {
+      instance = new SlivkaWSDiscoverer();
+    }
+    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<ServiceWithParameters> getServiceInstances()
+  {
+    List<ServiceWithParameters> instances = new ArrayList<>();
+    for (SlivkaService service : services)
+    {
+      ServiceWithParameters newinstance = null;
+      for (String classifier : service.classifiers)
+      {
+        if (classifier.contains("Multiple sequence alignment"))
+        {
+          // MSA services always overwrite
+          newinstance = new SlivkaMsaServiceInstance(slivkaClient, service);
+        }
+        if (classifier.contains("Protein sequence analysis"))
+        {
+          if (newinstance == null)
+            {
+              newinstance = (new SlivkaAnnotationServiceInstance(
+                      slivkaClient,
+
+                      service, false));
+            }
+          }
+
+        if (classifier
+                .contains("Sequence alignment analysis (conservation)"))
+        {
+          // always overwrite other instances
+          newinstance = new SlivkaAnnotationServiceInstance(slivkaClient,
+                  service, true);
+        }
+      }
+      if (newinstance != null)
+      {
+        instances.add(newinstance);
+      }
+    }
+    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);
+    
+  }
+
+  List<SlivkaService>services=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<ServiceWithParameters> 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();
+  }
+}