JAL-3070 reinstate the internal test service URL for Slivka-bio
[jalview.git] / src / jalview / ws / slivkaws / SlivkaWSDiscoverer.java
index 6b3856a..7720b11 100644 (file)
@@ -1,18 +1,18 @@
 package jalview.ws.slivkaws;
 
-import jalview.datamodel.AlignmentView;
 import jalview.gui.AlignFrame;
 import jalview.ws.WSMenuEntryProviderI;
-import jalview.ws.jws2.MsaWSClient;
-import jalview.ws.jws2.SequenceAnnotationWSClient;
+import jalview.ws.api.ServiceWithParameters;
+import jalview.ws.jws2.PreferredServiceRegistry;
 
-import java.awt.event.ActionEvent;
+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 javax.swing.JMenuItem;
 
 import uk.ac.dundee.compbio.slivkaclient.SlivkaClient;
 import uk.ac.dundee.compbio.slivkaclient.SlivkaService;
@@ -21,13 +21,14 @@ public class SlivkaWSDiscoverer implements Runnable, WSMenuEntryProviderI
 {
   private static SlivkaWSDiscoverer instance = null;
 
-  private SlivkaClient client;
+  private SlivkaClient slivkaClient;
 
   private SlivkaWSDiscoverer()
   {
     try
     {
-      client = new SlivkaClient("gjb-www-1.cluster.lifesci.dundee.ac.uk", 3203);
+      slivkaClient = new SlivkaClient(
+              "gjb-www-1.cluster.lifesci.dundee.ac.uk", 3203);
     } catch (URISyntaxException e)
     {
       throw new RuntimeException(e);
@@ -43,109 +44,93 @@ public class SlivkaWSDiscoverer implements Runnable, WSMenuEntryProviderI
     return instance;
   }
 
-  @Override
-  public void attachWSMenuEntry(JMenu wsmenu, final AlignFrame alignFrame)
+  List<ServiceWithParameters> getServiceInstances()
   {
-    JMenu slivkaMenu = new JMenu("Slivka");
-    wsmenu.add(slivkaMenu);
-
-    JMenu alignmentMenu = new JMenu("Sequence Alignment");
-    slivkaMenu.add(alignmentMenu);
-    try
+    List<ServiceWithParameters> instances = new ArrayList<>();
+    for (SlivkaService service : services)
     {
-      for (SlivkaService service : client.getServices())
+      for (String classifier : service.classifiers)
       {
-        msaClassifier:
+        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)"))
         {
-          for (String classifier : service.classifiers)
-          {
-            if (classifier.contains("Multiple sequence alignment"))
-            {
-              break msaClassifier;
-            }
-          }
-          continue;
+          instances.add(new SlivkaAnnotationServiceInstance(slivkaClient,
+                  service, true));
         }
-        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);
-          }
-        });
-        alignmentMenu.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
-            {
-              SlivkaParamSet paramSet = new SlivkaParamSet(service);
-              new MsaWSClient(instance, paramSet, null, true, alignFrame.getTitle(), msa, false, true,
-                  alignFrame.getViewport().getAlignment().getDataset(), alignFrame);
-            } catch (IOException exc)
-            {
-              throw new IOError(exc);
-            }
-          }
-        });
-        alignmentMenu.add(customEntry);
-
-        alignmentMenu.addSeparator();
+
       }
-    } catch (IOException e)
-    {
-      // TODO Auto-generated catch block
-      e.printStackTrace();
     }
+    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
     {
-      for (SlivkaService service : client.getServices())
-      {
-        msaClassifier:
-        {
-          for (String classifier : service.classifiers)
-          {
-            if (classifier.contains("Protein sequence analysis"))
-            {
-              break msaClassifier;
-            }
-          }
-          continue;
-        }
-        JMenuItem menuEntry = new JMenuItem(String.format("%s with custom parameters", service.label));
-        disorderMenu.add(menuEntry);
-        SlivkaAnnotationServiceInstance serviceInstance = new SlivkaAnnotationServiceInstance(client, service);
-        menuEntry.addActionListener((ActionEvent evt) -> {
-          try
-          {
-            SlivkaParamSet paramSet = new SlivkaParamSet(service);
-            SequenceAnnotationWSClient client = new SequenceAnnotationWSClient();
-            client.initSequenceAnnotationWSClient(serviceInstance, alignFrame, paramSet, true);
-          } catch (IOException e)
-          {
-            throw new IOError(e);
-          }
-
-        });
-      }
+      services = slivkaClient.getServices();
     } catch (IOException e)
     {
       throw new IOError(e);
     }
+    finished = true;
   }
 
-  @Override
-  public void run()
+  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();
   }
 }