JAL-4199 Update slivka client
[jalview.git] / src / jalview / ws2 / client / slivka / SlivkaWSDiscoverer.java
index 70e1c94..2509a19 100644 (file)
@@ -2,10 +2,12 @@ package jalview.ws2.client.slivka;
 
 import java.io.IOException;
 import java.net.MalformedURLException;
+import java.net.URI;
 import java.net.URISyntaxException;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.function.Function;
 
 import jalview.bin.Cache;
 import jalview.bin.Console;
@@ -36,15 +38,18 @@ public class SlivkaWSDiscoverer extends AbstractWebServiceDiscoverer
   private static SlivkaWSDiscoverer instance = null;
 
   private static ParamManager paramManager = null;
+  
+  private final Function<URI, SlivkaClient> clientFactory;
 
-  private SlivkaWSDiscoverer()
+  SlivkaWSDiscoverer(Function<URI, SlivkaClient> clientFactory)
   {
+    this.clientFactory = clientFactory;
   }
 
   public static SlivkaWSDiscoverer getInstance()
   {
     if (instance == null)
-      instance = new SlivkaWSDiscoverer();
+      instance = new SlivkaWSDiscoverer(SlivkaClient::newInstance);
     return instance;
   }
 
@@ -58,8 +63,12 @@ public class SlivkaWSDiscoverer extends AbstractWebServiceDiscoverer
   {
     try
     {
-      List<?> services = new SlivkaClient(url.toString()).getServices();
+      List<?> services = clientFactory.apply(url.toURI()).getServices();
       return services.isEmpty() ? STATUS_NO_SERVICES : STATUS_OK;
+    } catch (URISyntaxException e)
+    {
+      Console.error("invalid URL " + url, e);
+      return STATUS_INVALID;
     } catch (IOException e)
     {
       Console.error("slivka could not retrieve services from " + url, e);
@@ -86,7 +95,7 @@ public class SlivkaWSDiscoverer extends AbstractWebServiceDiscoverer
     SlivkaClient slivkaClient;
     try
     {
-      slivkaClient = new SlivkaClient(url.toURI());
+      slivkaClient = clientFactory.apply(url.toURI());
     } catch (URISyntaxException e)
     {
       throw new MalformedURLException(e.getMessage());
@@ -97,14 +106,14 @@ public class SlivkaWSDiscoverer extends AbstractWebServiceDiscoverer
       if (serviceClass == SERVICE_CLASS_MSA)
       {
         var wsb = WebService.<AlignmentAction> newBuilder();
-        initServiceBuilder(slivkaService, wsb);
+        initServiceBuilder(slivkaClient, slivkaService, wsb);
         wsb.category("Alignment");
         wsb.interactive(false);
         wsb.actionClass(AlignmentAction.class);
         var msaService = wsb.build();
 
         boolean canRealign = msaService.getName().contains("lustal");
-        var client = new SlivkaAlignmentWSClient(slivkaService);
+        var client = new SlivkaAlignmentWSClient(slivkaClient, slivkaService);
         var actionBuilder = AlignmentAction.newBuilder(client);
         actionBuilder.name("Alignment");
         actionBuilder.webService(msaService);
@@ -124,12 +133,12 @@ public class SlivkaWSDiscoverer extends AbstractWebServiceDiscoverer
       else if (serviceClass == SERVICE_CLASS_PROT_SEQ_ANALYSIS)
       {
         var wsb = WebService.<AnnotationAction> newBuilder();
-        initServiceBuilder(slivkaService, wsb);
+        initServiceBuilder(slivkaClient, slivkaService, wsb);
         wsb.category("Protein Disorder");
         wsb.interactive(false);
         wsb.actionClass(AnnotationAction.class);
         var psaService = wsb.build();
-        var client = new SlivkaAnnotationWSClient(slivkaService);
+        var client = new SlivkaAnnotationWSClient(slivkaClient, slivkaService);
         var actionBuilder = AnnotationAction.newBuilder(client);
         actionBuilder.webService(psaService);
         actionBuilder.name("Analysis");
@@ -139,12 +148,12 @@ public class SlivkaWSDiscoverer extends AbstractWebServiceDiscoverer
       else if (serviceClass == SERVICE_CLASS_CONSERVATION)
       {
         var wsb = WebService.<AnnotationAction> newBuilder();
-        initServiceBuilder(slivkaService, wsb);
+        initServiceBuilder(slivkaClient, slivkaService, wsb);
         wsb.category("Conservation");
         wsb.interactive(true);
         wsb.actionClass(AnnotationAction.class);
         var conService = wsb.build();
-        var client = new SlivkaAnnotationWSClient(slivkaService);
+        var client = new SlivkaAnnotationWSClient(slivkaClient, slivkaService);
         var actionBuilder = AnnotationAction.newBuilder(client);
         actionBuilder.webService(conService);
         actionBuilder.name("");
@@ -157,12 +166,12 @@ public class SlivkaWSDiscoverer extends AbstractWebServiceDiscoverer
       else if (serviceClass == SERVICE_CLASS_RNA_SEC_STR_PRED)
       {
         var wsb = WebService.<AnnotationAction> newBuilder();
-        initServiceBuilder(slivkaService, wsb);
+        initServiceBuilder(slivkaClient, slivkaService, wsb);
         wsb.category("Secondary Structure Prediction");
         wsb.interactive(true);
         wsb.actionClass(AnnotationAction.class);
         var predService = wsb.build();
-        var client = new SlivkaAnnotationWSClient(slivkaService);
+        var client = new SlivkaAnnotationWSClient(slivkaClient, slivkaService);
         var actionBuilder = AnnotationAction.newBuilder(client);
         actionBuilder.webService(predService);
         actionBuilder.name("Prediction");
@@ -183,11 +192,11 @@ public class SlivkaWSDiscoverer extends AbstractWebServiceDiscoverer
     return allServices;
   }
 
-  private void initServiceBuilder(SlivkaService service, WebService.Builder<?> wsBuilder)
+  private void initServiceBuilder(SlivkaClient client, SlivkaService service, WebService.Builder<?> wsBuilder)
   {
     try
     {
-      wsBuilder.url(service.getClient().getUrl().toURL());
+      wsBuilder.url(client.getUrl().toURL());
     } catch (MalformedURLException e)
     {
       e.printStackTrace();