JAL-4199 Update slivka client
authorMateusz Warowny <mmzwarowny@dundee.ac.uk>
Wed, 14 Jun 2023 14:24:35 +0000 (16:24 +0200)
committerMateusz Warowny <mmzwarowny@dundee.ac.uk>
Wed, 14 Jun 2023 14:27:07 +0000 (16:27 +0200)
This is a library update that moves all client functionality
to SlivkaClient class, making all other classes simple data
objects.

j11lib/slivka-client.jar
src/jalview/ws/slivkaws/SlivkaAnnotationServiceInstance.java
src/jalview/ws/slivkaws/SlivkaMsaServiceInstance.java
src/jalview/ws/slivkaws/SlivkaWSDiscoverer.java
src/jalview/ws/slivkaws/SlivkaWSInstance.java
src/jalview/ws2/client/slivka/SlivkaWSClient.java
src/jalview/ws2/client/slivka/SlivkaWSDiscoverer.java
utils/jalviewjs/libjs/slivka-client-site.zip

index 49ab4fc..3c5290d 100644 (file)
Binary files a/j11lib/slivka-client.jar and b/j11lib/slivka-client.jar differ
index 999951a..5c98cbe 100644 (file)
@@ -65,8 +65,7 @@ public class SlivkaAnnotationServiceInstance extends SlivkaWSInstance implements
     RemoteFile featFile = null;
     try
     {
-      var slivkaJob = client.getJob(jobId.getJobId());
-      Collection<RemoteFile> files = slivkaJob.getResults();
+      Collection<RemoteFile> files = client.fetchFilesList(jobId.getJobId());
       for (RemoteFile f : files)
       {
         if (f.getMediaType().equals("application/jalview-annotations"))
index 374d2eb..337073e 100644 (file)
@@ -40,8 +40,7 @@ public class SlivkaMsaServiceInstance extends SlivkaWSInstance implements Multip
     Collection<RemoteFile> files;
     try
     {
-      var slivkaJob = client.getJob(jobId.getJobId());
-      files = slivkaJob.getResults();
+      files = client.fetchFilesList(jobId.getJobId());
       for (RemoteFile f : files)
       {
         if (f.getMediaType().equals("application/clustal"))
index d21d5d1..104560a 100644 (file)
@@ -94,7 +94,7 @@ public class SlivkaWSDiscoverer implements WSDiscovererI
 
     for (String url : getServiceUrls())
     {
-      SlivkaClient client = new SlivkaClient(url);
+      SlivkaClient client = SlivkaClient.newInstance(url);
 
       List<SlivkaService> services;
       try
@@ -220,7 +220,7 @@ public class SlivkaWSDiscoverer implements WSDiscovererI
   {
     try
     {
-      List<?> services = new SlivkaClient(url).getServices();
+      List<?> services = SlivkaClient.newInstance(url).getServices();
       return services.isEmpty() ? STATUS_NO_SERVICES : STATUS_OK;
     } catch (IOException | org.json.JSONException e)
     {
index 613c702..d3701ac 100644 (file)
@@ -30,7 +30,7 @@ import javajs.http.ClientProtocolException;
 
 import java.util.Collection;
 import uk.ac.dundee.compbio.slivkaclient.Job;
-import uk.ac.dundee.compbio.slivkaclient.JobRequest;
+import uk.ac.dundee.compbio.slivkaclient.RequestValues;
 import uk.ac.dundee.compbio.slivkaclient.Parameter;
 import uk.ac.dundee.compbio.slivkaclient.RemoteFile;
 import uk.ac.dundee.compbio.slivkaclient.SlivkaClient;
@@ -75,7 +75,7 @@ public abstract class SlivkaWSInstance extends ServiceWithParameters
           WsParamSetI preset, List<ArgumentI> args) throws Throwable
   {
     var parameters = service.getParameters();
-    var request = new JobRequest();
+    var request = new RequestValues();
     for (Parameter param : parameters)
     {
       if (param instanceof Parameter.FileParameter)
@@ -126,8 +126,8 @@ public abstract class SlivkaWSInstance extends ServiceWithParameters
         }
       }
     }
-    var job = service.submitJob(request);
-    return new JobId(service.getName(), service.getName(), job.getId());
+    var jobId = client.submitJob(service, request);
+    return new JobId(service.getName(), service.getName(), jobId);
   }
 
   @Override
@@ -135,8 +135,7 @@ public abstract class SlivkaWSInstance extends ServiceWithParameters
   {
     try
     {
-      var slivkaJob = client.getJob(job.getJobId());
-      job.setState(stateMap.get(slivkaJob.getStatus()));
+      job.setState(stateMap.get(client.fetchJobStatus(job.getJobId())));
     } catch (IOException e)
     {
       throw new IOError(e);
@@ -146,8 +145,7 @@ public abstract class SlivkaWSInstance extends ServiceWithParameters
   @Override
   public final boolean updateJobProgress(WsJob job) throws IOException
   {      
-    var slivkaJob = client.getJob(job.getJobId());
-    Collection<RemoteFile> files = slivkaJob.getResults();
+    Collection<RemoteFile> files = client.fetchFilesList(job.getJobId());
     RemoteFile logFile=null;
     for (RemoteFile f : files)
     {
@@ -161,7 +159,7 @@ public abstract class SlivkaWSInstance extends ServiceWithParameters
     if (logFile!=null)
     {
       ByteArrayOutputStream output = new ByteArrayOutputStream();
-      logFile.writeTo(output);
+      client.writeFileTo(logFile, output);
       if (output.size() > job.getNextChunk())
       {
         newContent = true;
@@ -185,7 +183,7 @@ public abstract class SlivkaWSInstance extends ServiceWithParameters
       if (errLogFile!=null)
       {
         ByteArrayOutputStream output = new ByteArrayOutputStream();
-        errLogFile.writeTo(output);
+        client.writeFileTo(errLogFile, output);
         if (output.size() > 0)
         {
           newContent = true;
index bef502b..7dcdae1 100644 (file)
@@ -46,10 +46,10 @@ public class SlivkaWSClient implements WebServiceClientI
 
   final SlivkaClient client;
 
-  SlivkaWSClient(SlivkaService service)
+  SlivkaWSClient(SlivkaClient client, SlivkaService service)
   {
     this.service = service;
-    this.client = service.getClient();
+    this.client = client;
   }
 
   @Override
@@ -72,7 +72,7 @@ public class SlivkaWSClient implements WebServiceClientI
   public WebServiceJobHandle submit(List<SequenceI> sequences,
       List<ArgumentI> args, Credentials credentials) throws IOException
   {
-    var request = new uk.ac.dundee.compbio.slivkaclient.JobRequest();
+    var request = new uk.ac.dundee.compbio.slivkaclient.RequestValues();
     for (Parameter param : service.getParameters())
     {
       // TODO: restrict input sequences parameter name to "sequences"
@@ -131,8 +131,8 @@ public class SlivkaWSClient implements WebServiceClientI
         }
       }
     }
-    var job = service.submitJob(request);
-    return createJobHandle(job.getId());
+    var jobId = client.submitJob(service, request);
+    return createJobHandle(jobId);
   }
 
   protected WebServiceJobHandle createJobHandle(String jobId)
@@ -145,8 +145,7 @@ public class SlivkaWSClient implements WebServiceClientI
   @Override
   public JobStatus getStatus(WebServiceJobHandle job) throws IOException
   {
-    var slivkaJob = client.getJob(job.getJobId());
-    return statusMap.getOrDefault(slivkaJob.getStatus(), JobStatus.UNKNOWN);
+    return statusMap.getOrDefault(client.fetchJobStatus(job.getJobId()), JobStatus.UNKNOWN);
   }
 
   protected static final EnumMap<Job.Status, JobStatus> statusMap = new EnumMap<>(Job.Status.class);
@@ -168,13 +167,12 @@ public class SlivkaWSClient implements WebServiceClientI
   @Override
   public String getLog(WebServiceJobHandle job) throws IOException
   {
-    var slivkaJob = client.getJob(job.getJobId());
-    for (var f : slivkaJob.getResults())
+    for (var f : client.fetchFilesList(job.getJobId()))
     {
       if (f.getLabel().equals("log"))
       {
         ByteArrayOutputStream stream = new ByteArrayOutputStream();
-        f.writeTo(stream);
+        client.writeFileTo(f, stream);
         return stream.toString("UTF-8");
       }
     }
@@ -184,13 +182,12 @@ public class SlivkaWSClient implements WebServiceClientI
   @Override
   public String getErrorLog(WebServiceJobHandle job) throws IOException
   {
-    var slivkaJob = client.getJob(job.getJobId());
-    for (var f : slivkaJob.getResults())
+    for (var f : client.fetchFilesList(job.getJobId()))
     {
       if (f.getLabel().equals("error-log"))
       {
         ByteArrayOutputStream stream = new ByteArrayOutputStream();
-        f.writeTo(stream);
+        client.writeFileTo(f, stream);
         return stream.toString("UTF-8");
       }
     }
@@ -210,16 +207,15 @@ class SlivkaAlignmentWSClient extends SlivkaWSClient
     implements AlignmentWebServiceClientI
 {
 
-  SlivkaAlignmentWSClient(SlivkaService service)
+  SlivkaAlignmentWSClient(SlivkaClient client, SlivkaService service)
   {
-    super(service);
+    super(client, service);
   }
 
   @Override
   public AlignmentI getAlignment(WebServiceJobHandle job) throws IOException
   {
-    var slivkaJob = client.getJob(job.getJobId());
-    for (var f : slivkaJob.getResults())
+    for (var f : client.fetchFilesList(job.getJobId()))
     {
       // TODO: restrict result file label to "alignment"
       FileFormat format;
@@ -245,9 +241,9 @@ class SlivkaAlignmentWSClient extends SlivkaWSClient
 class SlivkaAnnotationWSClient extends SlivkaWSClient
     implements AnnotationWebServiceClientI
 {
-  SlivkaAnnotationWSClient(SlivkaService service)
+  SlivkaAnnotationWSClient(SlivkaClient client, SlivkaService service)
   {
-    super(service);
+    super(client, service);
   }
 
   @Override
@@ -255,10 +251,9 @@ class SlivkaAnnotationWSClient extends SlivkaWSClient
       List<SequenceI> sequences, Map<String, FeatureColourI> colours,
       Map<String, FeatureMatcherSetI> filters) throws IOException
   {
-    var slivkaJob = client.getJob(job.getJobId());
     var aln = new Alignment(sequences.toArray(new SequenceI[sequences.size()]));
     boolean featPresent = false, annotPresent = false;
-    for (var f : slivkaJob.getResults())
+    for (var f : client.fetchFilesList(job.getJobId()))
     {
       // TODO: restrict file label to "annotations" or "features"
       var match = mediaTypePattern.matcher(f.getMediaType());
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();
index 2e64029..c0b582d 100644 (file)
Binary files a/utils/jalviewjs/libjs/slivka-client-site.zip and b/utils/jalviewjs/libjs/slivka-client-site.zip differ