Merge branch 'Jalview-JS/develop' into merge_js_develop
[jalview.git] / src / jalview / ws / jws2 / jabaws2 / Jws2Instance.java
index 7954db0..47fb9c6 100644 (file)
  */
 package jalview.ws.jws2.jabaws2;
 
-import jalview.gui.AlignFrame;
 import jalview.gui.Desktop;
 import jalview.util.MessageManager;
+import jalview.ws.api.JalviewServiceEndpointProviderI;
+import jalview.ws.api.ServiceWithParameters;
 import jalview.ws.jws2.JabaParamStore;
-import jalview.ws.jws2.MsaWSClient;
-import jalview.ws.jws2.SequenceAnnotationWSClient;
 import jalview.ws.params.ParamDatastoreI;
+import jalview.ws.params.ParamManager;
 
 import java.io.Closeable;
-
-import javax.swing.JMenu;
+import java.net.URL;
 
 import compbio.data.msa.JABAService;
 import compbio.data.msa.MsaWS;
@@ -38,20 +37,12 @@ import compbio.data.msa.SequenceAnnotation;
 import compbio.metadata.PresetManager;
 import compbio.metadata.RunnerConfig;
 
-public class Jws2Instance implements AutoCloseable
+public class Jws2Instance extends ServiceWithParameters
+        implements JalviewServiceEndpointProviderI, AutoCloseable
 {
-  public String hosturl;
-
-  public String serviceType;
-
-  public String action;
 
   public JABAService service;
 
-  public String description;
-
-  public String docUrl;
-
   /**
    * 
    * @param hosturl
@@ -69,20 +60,40 @@ public class Jws2Instance implements AutoCloseable
   public Jws2Instance(String hosturl, String serviceType, String action,
           String description, JABAService service)
   {
-    super();
-    this.hosturl = hosturl;
-    this.serviceType = serviceType;
+    super(action, action, serviceType, description, hosturl);
     this.service = service;
-    this.action = action;
-    this.description = description;
+    if (service instanceof MsaWS<?>)
+    {
+      style = ServiceClient.MSAWSCLIENT;
+    }
+    else if (service instanceof SequenceAnnotation<?>)
+    {
+      style = ServiceClient.SEQUENCEANNOTATIONWSCLIENT;
+    }
+
     int p = description.indexOf("MORE INFORMATION:");
     if (p > -1)
     {
-      docUrl = description.substring(description.indexOf("http", p)).trim();
+      String docUrl = description.substring(description.indexOf("http", p))
+              .trim();
       if (docUrl.indexOf('\n') > -1)
       {
         docUrl = docUrl.substring(0, docUrl.indexOf("\n")).trim();
       }
+      if (docUrl.length() > 0)
+      {
+        try
+        {
+          URL url = new URL(docUrl);
+          if (url != null)
+          {
+            setDocumentationUrl(docUrl);
+          }
+        } catch (Exception x)
+        {
+
+        }
+      }
 
     }
   }
@@ -115,32 +126,12 @@ public class Jws2Instance implements AutoCloseable
       } catch (Exception ex)
       {
         System.err.println("Exception when retrieving presets for service "
-                + serviceType + " at " + hosturl);
+                + getServiceType() + " at " + getHostURL());
       }
     }
     return presets;
   }
 
-  public String getHost()
-  {
-    return hosturl;
-    /*
-     * try { URL serviceurl = new URL(hosturl); if (serviceurl.getPort()!=80) {
-     * return serviceurl.getHost()+":"+serviceurl.getPort(); } return
-     * serviceurl.getHost(); } catch (Exception e) {
-     * System.err.println("Failed to parse service URL '" + hosturl +
-     * "' as a valid URL!"); } return null;
-     */
-  }
-
-  /**
-   * @return short description of what the service will do
-   */
-  public String getActionText()
-  {
-    return action + " with " + serviceType;
-  }
-
   /**
    * non-thread safe - blocks whilst accessing service to get complete set of
    * available options and parameters
@@ -160,7 +151,7 @@ public class Jws2Instance implements AutoCloseable
     throw new Error(MessageManager.formatMessage(
             "error.implementation_error_runner_config_not_available",
             new String[]
-            { serviceType, service.getClass().toString() }));
+            { getServiceType(), service.getClass().toString() }));
   }
 
   @Override
@@ -179,6 +170,7 @@ public class Jws2Instance implements AutoCloseable
     // super.finalize();
   }
 
+  @Override
   public ParamDatastoreI getParamStore()
   {
     if (paramStore == null)
@@ -198,17 +190,9 @@ public class Jws2Instance implements AutoCloseable
     return paramStore;
   }
 
-  public String getUri()
-  {
-    // this is only valid for Jaba 1.0 - this formula might have to change!
-    return hosturl
-            + (hosturl.lastIndexOf("/") == (hosturl.length() - 1) ? ""
-                    : "/")
-            + serviceType;
-  }
-
   private boolean hasParams = false, lookedForParams = false;
 
+  @Override
   public boolean hasParameters()
   {
     if (!lookedForParams)
@@ -225,28 +209,62 @@ public class Jws2Instance implements AutoCloseable
     return hasParams;
   }
 
-  public void attachWSMenuEntry(JMenu atpoint, AlignFrame alignFrame)
+  /**
+   * initialise a parameter store for this service
+   * 
+   * @param userParameterStore
+   *          - the user ParamManager (e.g. Desktop.getUserParameterStore() )
+   */
+  @Override
+  public void initParamStore(ParamManager userParameterStore)
   {
-    if (service instanceof MsaWS<?>)
-    {
-      new MsaWSClient().attachWSMenuEntry(atpoint, this, alignFrame);
-    }
-    else if (service instanceof SequenceAnnotation<?>)
+    if (paramStore == null)
     {
-      new SequenceAnnotationWSClient().attachWSMenuEntry(atpoint, this,
-              alignFrame);
+      paramStore = new JabaParamStore(this, userParameterStore);
     }
   }
 
-  public String getServiceTypeURI()
+  /**
+   * an object that implements one or more interfaces in jalview.ws.api
+   * 
+   * @return
+   */
+  @Override
+  public Object getEndpoint()
   {
-    return "java:" + serviceType;
-  }
-
-  jalview.ws.uimodel.AlignAnalysisUIText aaui;
+    if (service instanceof MsaWS<?>)
+    {
+      if (aaui != null)
+      {
+        throw new Error(
+                "JABAWS MsaWS based instant calculation not implemented.");
 
-  public jalview.ws.uimodel.AlignAnalysisUIText getAlignAnalysisUI()
-  {
-    return aaui;
+      }
+      else
+      {
+        return new JabawsMsaInstance(this);
+      }
+    }
+    else
+    {
+      if (service instanceof compbio.data.msa.SequenceAnnotation)
+      {
+        if (aaui != null)
+        {
+          try
+          {
+            // probably a factory would be nicer but..
+            return aaui.getClient().getConstructor(getClass())
+                    .newInstance(this);
+          } catch (Throwable t)
+          {
+            throw new Error("Implementation Error in web service framework",
+                    t);
+          }
+        }
+        return new AADisorderClient(this);
+      }
+      return null;
+    }
   }
 }