From: Mateusz Warowny Date: Tue, 6 Jul 2021 13:42:38 +0000 (+0200) Subject: JAL-3848 Update slivka client library. X-Git-Url: http://source.jalview.org/gitweb/?p=jalview.git;a=commitdiff_plain;h=c8dfa0a1b91d46b9c11dc6ce7b2b4bfcbc71c13e JAL-3848 Update slivka client library. --- diff --git a/j11lib/slivka-client.jar b/j11lib/slivka-client.jar index 68cc932..895366c 100644 Binary files a/j11lib/slivka-client.jar and b/j11lib/slivka-client.jar differ diff --git a/src/jalview/ws/slivkaws/SlivkaAnnotationServiceInstance.java b/src/jalview/ws/slivkaws/SlivkaAnnotationServiceInstance.java index b3509b0..3c80fbc 100644 --- a/src/jalview/ws/slivkaws/SlivkaAnnotationServiceInstance.java +++ b/src/jalview/ws/slivkaws/SlivkaAnnotationServiceInstance.java @@ -19,6 +19,7 @@ import jalview.ws.uimodel.AlignAnalysisUIText; import java.io.IOError; import java.io.IOException; import java.util.Arrays; +import java.util.Collection; import java.util.List; import java.util.Map; @@ -55,7 +56,7 @@ public class SlivkaAnnotationServiceInstance extends SlivkaWSInstance implements } @Override - public List getAnnotationResult(JobId job, + public List getAnnotationResult(JobId jobId, List seqs, Map featureColours, Map featureFilters) throws Throwable { @@ -63,14 +64,15 @@ public class SlivkaAnnotationServiceInstance extends SlivkaWSInstance implements RemoteFile featFile = null; try { - List files = client.getJobResults(job.getJobId()); + var slivkaJob = client.getJob(jobId.getJobId()); + Collection files = slivkaJob.getResults(); for (RemoteFile f : files) { - if (f.getMimeType().equals("application/jalview-annotations")) + if (f.getMediaType().equals("application/jalview-annotations")) { annotFile = f; } - else if (f.getMimeType().equals("application/jalview-features")) + else if (f.getMediaType().equals("application/jalview-features")) { featFile = f; } @@ -81,15 +83,21 @@ public class SlivkaAnnotationServiceInstance extends SlivkaWSInstance implements } Alignment aln = new Alignment(seqs.toArray(new SequenceI[0])); if (annotFile == null - || !new AnnotationFile().readAnnotationFile(aln, annotFile.getURL().toString(), DataSourceType.URL)) + || !new AnnotationFile().readAnnotationFile(aln, annotFile.getContentUrl().toString(), DataSourceType.URL)) { Cache.log.debug("No annotation from slivka job\n" + annotFile); } + else { + Cache.log.debug("Annotation file loaded " + annotFile); + } if (featFile == null - || !new FeaturesFile(featFile.getURL().toString(), DataSourceType.URL).parse(aln, featureColours, true)) + || !new FeaturesFile(featFile.getContentUrl().toString(), DataSourceType.URL).parse(aln, featureColours, true)) { Cache.log.debug("No features from slivka job\n" + featFile); } + else { + Cache.log.debug("Features feil loaded " + featFile); + } return Arrays.asList(aln.getAlignmentAnnotation()); } } diff --git a/src/jalview/ws/slivkaws/SlivkaMsaServiceInstance.java b/src/jalview/ws/slivkaws/SlivkaMsaServiceInstance.java index 9a33b04..03dda3f 100644 --- a/src/jalview/ws/slivkaws/SlivkaMsaServiceInstance.java +++ b/src/jalview/ws/slivkaws/SlivkaMsaServiceInstance.java @@ -1,5 +1,6 @@ package jalview.ws.slivkaws; +import jalview.bin.Cache; import jalview.datamodel.AlignmentI; import jalview.datamodel.SequenceI; import jalview.io.DataSourceType; @@ -14,6 +15,7 @@ import jalview.ws.params.WsParamSetI; import java.io.IOError; import java.io.IOException; import java.rmi.ServerError; +import java.util.Collection; import java.util.List; import compbio.data.msa.Category; @@ -37,19 +39,20 @@ public class SlivkaMsaServiceInstance extends SlivkaWSInstance implements Multip @Override public AlignmentI getAlignmentFor(JobId jobId) throws InvalidArgumentException, ServerError, IOError { - List files; + Collection files; try { - files = client.getJobResults(jobId.getJobId()); + var slivkaJob = client.getJob(jobId.getJobId()); + files = slivkaJob.getResults(); for (RemoteFile f : files) { - if (f.getMimeType().equals("application/clustal")) + if (f.getMediaType().equals("application/clustal")) { - return new FormatAdapter().readFile(f.getURL().toString(), DataSourceType.URL, FileFormat.Clustal); + return new FormatAdapter().readFile(f.getContentUrl().toString(), DataSourceType.URL, FileFormat.Clustal); } - else if (f.getMimeType().equals("application/fasta")) + else if (f.getMediaType().equals("application/fasta")) { - return new FormatAdapter().readFile(f.getURL().toString(), DataSourceType.URL, FileFormat.Fasta); + return new FormatAdapter().readFile(f.getContentUrl().toString(), DataSourceType.URL, FileFormat.Fasta); } } } catch (IOException e) diff --git a/src/jalview/ws/slivkaws/SlivkaParamSet.java b/src/jalview/ws/slivkaws/SlivkaParamSet.java index 7e81684..8a1d382 100644 --- a/src/jalview/ws/slivkaws/SlivkaParamSet.java +++ b/src/jalview/ws/slivkaws/SlivkaParamSet.java @@ -9,85 +9,90 @@ import jalview.ws.params.simple.StringParameter; import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; import java.util.List; -import uk.ac.dundee.compbio.slivkaclient.BooleanField; -import uk.ac.dundee.compbio.slivkaclient.ChoiceField; -import uk.ac.dundee.compbio.slivkaclient.DecimalField; -import uk.ac.dundee.compbio.slivkaclient.FormField; -import uk.ac.dundee.compbio.slivkaclient.IntegerField; -import uk.ac.dundee.compbio.slivkaclient.SlivkaForm; +import uk.ac.dundee.compbio.slivkaclient.Parameter; import uk.ac.dundee.compbio.slivkaclient.SlivkaService; -import uk.ac.dundee.compbio.slivkaclient.TextField; - - public class SlivkaParamSet implements WsParamSetI { private SlivkaService service; + private List args = new ArrayList<>(); - SlivkaParamSet(SlivkaService service) throws IOException { + SlivkaParamSet(SlivkaService service) throws IOException + { this.service = service; - SlivkaForm form = service.getForm(); - for (FormField field : form.getFields()) + for (Parameter param : service.getParameters()) { - switch (field.getType()) { - case BOOLEAN: - BooleanField boolField = (BooleanField) field; - args.add(new BooleanOption( - field.getName(), field.getDescription(), field.getLabel(), - field.isRequired(), boolField.getDefault(), null - )); - break; - case TEXT: - TextField textField = (TextField) field; - args.add(new StringParameter( - field.getName(), field.getDescription(), field.isRequired(), - textField.getDefault(), textField.getDefault() - )); - break; - case INTEGER: - IntegerField intField = (IntegerField) field; - args.add(new IntegerParameter( - field.getName(), field.getDescription(), field.isRequired(), - intField.getDefault(), intField.getMin(), intField.getMax() - )); - break; - case DECIMAL: - DecimalField doubleField = (DecimalField) field; - args.add(new DoubleParameter( - field.getName(), field.getDescription(), field.isRequired(), - doubleField.getDefault(), doubleField.getMin(), - doubleField.getMax() - )); - break; - case CHOICE: - ChoiceField choiceField = (ChoiceField) field; - List choices = new ArrayList<>(choiceField.getChoices()); - if (field.hasMultipleValues()) { - int counter = 0; - for (String choice : choices) { + Object defaultValue = param.getDefault() instanceof List ? ((List) param.getDefault()).get(0) + : param.getDefault(); + if (param instanceof Parameter.FlagParameter) + { + args.add(new BooleanOption(param.getId(), param.getDescription(), + param.getName(), param.isRequired(), (Boolean) defaultValue, null)); + } + else if (param instanceof Parameter.TextParameter) + { + args.add(new StringParameter(param.getId(), param.getDescription(), + param.isRequired(), (String) defaultValue, (String) defaultValue)); + } + else if (param instanceof Parameter.IntegerParameter) + { + Integer min = ((Parameter.IntegerParameter) param).getMin(); + Integer max = ((Parameter.IntegerParameter) param).getMax(); + Integer defVal = defaultValue != null ? ((Number) defaultValue).intValue() : null; + args.add(new IntegerParameter(param.getId(), param.getDescription(), + param.isRequired(), defVal, (min == null) ? Integer.MIN_VALUE : min, + (max == null) ? Integer.MAX_VALUE : max)); + } + else if (param instanceof Parameter.DecimalParameter) + { + Double min = ((Parameter.DecimalParameter) param).getMin(); + Double max = ((Parameter.DecimalParameter) param).getMax(); + Double defVal = defaultValue != null ? ((Number) defaultValue).doubleValue() : null; + args.add(new DoubleParameter(param.getId(), param.getDescription(), + param.isRequired(), defVal, (min == null) ? -Double.MAX_VALUE : min, + (max == null) ? Double.MAX_VALUE : max)); + } + else if (param instanceof Parameter.ChoiceParameter) + { + List choices = ((Parameter.ChoiceParameter) param) + .getChoices(); + if (param.isArray()) + { + int i = 0; + List selected = param.getDefault() != null + ? (List) param.getDefault() + : Collections.EMPTY_LIST; + for (String choice : choices) + { args.add(new BooleanOption( - String.format("%s$%d", field.getName(), counter++), - field.getDescription(), choice, field.isRequired(), - choice.equals(choiceField.getDefault()), choice, - null - )); + String.format("%s$%d", param.getId(), i++), + param.getDescription(), choice, param.isRequired(), + selected.contains(choice), choice, null)); } } else { args.add(new StringParameter( - field.getName(), field.getDescription(), - field.isRequired(), choiceField.getDefault(), choiceField.getDefault(), - choices, choices - )); + param.getId(), param.getDescription(), + param.isRequired(), (String) param.getDefault(), + (String) defaultValue, choices, choices)); } - break; - case FILE: - default: - continue; + } + else if (param instanceof Parameter.FileParameter) + { + // skip: files are provided from sequences + } + else + { + String defaultVal = param.getDefault() != null + ? param.getDefault().toString() + : null; + args.add(new StringParameter(param.getId(), param.getDescription(), + param.isRequired(), defaultVal, defaultVal)); } } } @@ -107,7 +112,7 @@ public class SlivkaParamSet implements WsParamSetI @Override public String[] getApplicableUrls() { - return new String[] { service.getURL().toString() }; + return new String[] { service.getUrl().toString() }; } @Override diff --git a/src/jalview/ws/slivkaws/SlivkaWSDiscoverer.java b/src/jalview/ws/slivkaws/SlivkaWSDiscoverer.java index e849f97..accb40d 100644 --- a/src/jalview/ws/slivkaws/SlivkaWSDiscoverer.java +++ b/src/jalview/ws/slivkaws/SlivkaWSDiscoverer.java @@ -215,7 +215,7 @@ public class SlivkaWSDiscoverer implements WSDiscovererI { List services = new SlivkaClient(url).getServices(); return services.isEmpty() ? STATUS_NO_SERVICES : STATUS_OK; - } catch (IOException e) + } catch (IOException | org.json.JSONException e) { Cache.log.error("Slivka could not retrieve services list", e); return STATUS_INVALID; diff --git a/src/jalview/ws/slivkaws/SlivkaWSInstance.java b/src/jalview/ws/slivkaws/SlivkaWSInstance.java index 75e5722..658d99e 100644 --- a/src/jalview/ws/slivkaws/SlivkaWSInstance.java +++ b/src/jalview/ws/slivkaws/SlivkaWSInstance.java @@ -13,6 +13,7 @@ import jalview.ws.params.ArgumentI; import jalview.ws.params.ParamDatastoreI; import jalview.ws.params.ParamManager; import jalview.ws.params.WsParamSetI; +import javajs.http.ClientProtocolException; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -20,22 +21,18 @@ import java.io.IOError; import java.io.IOException; import java.io.InputStream; import java.util.Arrays; +import java.util.Collection; import java.util.EnumMap; import java.util.HashSet; import java.util.List; -import java.util.Optional; import java.util.Set; -import uk.ac.dundee.compbio.slivkaclient.FieldType; -import uk.ac.dundee.compbio.slivkaclient.FileField; -import uk.ac.dundee.compbio.slivkaclient.FormField; -import uk.ac.dundee.compbio.slivkaclient.FormValidationException; -import uk.ac.dundee.compbio.slivkaclient.JobState; +import uk.ac.dundee.compbio.slivkaclient.Job; +import uk.ac.dundee.compbio.slivkaclient.JobRequest; +import uk.ac.dundee.compbio.slivkaclient.Parameter; import uk.ac.dundee.compbio.slivkaclient.RemoteFile; import uk.ac.dundee.compbio.slivkaclient.SlivkaClient; -import uk.ac.dundee.compbio.slivkaclient.SlivkaForm; import uk.ac.dundee.compbio.slivkaclient.SlivkaService; -import uk.ac.dundee.compbio.slivkaclient.ValidationException; public abstract class SlivkaWSInstance extends ServiceWithParameters implements JalviewServiceEndpointProviderI, JalviewWebServiceI @@ -46,19 +43,19 @@ public abstract class SlivkaWSInstance extends ServiceWithParameters protected SlivkaDatastore store = null; - protected static final EnumMap stateMap = new EnumMap<>(JobState.class); + protected static final EnumMap stateMap = new EnumMap<>(Job.Status.class); { - stateMap.put(JobState.PENDING, WsJob.JobState.QUEUED); - stateMap.put(JobState.REJECTED, WsJob.JobState.INVALID); - stateMap.put(JobState.ACCEPTED, WsJob.JobState.QUEUED); - stateMap.put(JobState.QUEUED, WsJob.JobState.QUEUED); - stateMap.put(JobState.RUNNING, WsJob.JobState.RUNNING); - stateMap.put(JobState.COMPLETED, WsJob.JobState.FINISHED); - stateMap.put(JobState.INTERRUPTED, WsJob.JobState.CANCELLED); - stateMap.put(JobState.DELETED, WsJob.JobState.CANCELLED); - stateMap.put(JobState.FAILED, WsJob.JobState.FAILED); - stateMap.put(JobState.ERROR, WsJob.JobState.SERVERERROR); - stateMap.put(JobState.UNKNOWN, WsJob.JobState.UNKNOWN); + stateMap.put(Job.Status.PENDING, WsJob.JobState.QUEUED); + stateMap.put(Job.Status.REJECTED, WsJob.JobState.INVALID); + stateMap.put(Job.Status.ACCEPTED, WsJob.JobState.QUEUED); + stateMap.put(Job.Status.QUEUED, WsJob.JobState.QUEUED); + stateMap.put(Job.Status.RUNNING, WsJob.JobState.RUNNING); + stateMap.put(Job.Status.COMPLETED, WsJob.JobState.FINISHED); + stateMap.put(Job.Status.INTERRUPTED, WsJob.JobState.CANCELLED); + stateMap.put(Job.Status.DELETED, WsJob.JobState.CANCELLED); + stateMap.put(Job.Status.FAILED, WsJob.JobState.FAILED); + stateMap.put(Job.Status.ERROR, WsJob.JobState.SERVERERROR); + stateMap.put(Job.Status.UNKNOWN, WsJob.JobState.UNKNOWN); } protected final Set failedStates = new HashSet<>(Arrays.asList( WsJob.JobState.INVALID, WsJob.JobState.BROKEN, WsJob.JobState.FAILED, @@ -67,7 +64,7 @@ public abstract class SlivkaWSInstance extends ServiceWithParameters public SlivkaWSInstance(SlivkaClient client, SlivkaService service, String action) { - super(action, action, service.getLabel(), "Slivka", client.getUrl().toString()); + super(action, action, service.getName(), "Slivka", client.getUrl().toString()); this.client = client; this.service = service; } @@ -75,16 +72,17 @@ public abstract class SlivkaWSInstance extends ServiceWithParameters protected final JobId submit(List sequences, WsParamSetI preset, List args) throws Throwable { - SlivkaForm form = service.getForm(); - for (FormField field : form.getFields()) + var parameters = service.getParameters(); + var request = new JobRequest(); + for (Parameter param : parameters) { - if (field.getType() == FieldType.FILE) + if (param instanceof Parameter.FileParameter) { FormatAdapter fa = new FormatAdapter(); fa.setNewlineString("\r\n"); - FileField fileField = (FileField) field; + Parameter.FileParameter fileParam = (Parameter.FileParameter) param; FileFormat format; - switch (fileField.getMediaType()) + switch (fileParam.getMediaType()) { case "application/pfam": format = FileFormat.Pfam; @@ -100,9 +98,7 @@ public abstract class SlivkaWSInstance extends ServiceWithParameters InputStream stream = new ByteArrayInputStream( fa.formatSequences(format, sequences.toArray(new SequenceI[0])) .getBytes()); - RemoteFile rf = client.uploadFile(stream, "input", - fileField.getMediaType()); - form.insert(field.getName(), rf); + request.addFile(param.getId(), stream); } } if (args != null) @@ -111,22 +107,22 @@ public abstract class SlivkaWSInstance extends ServiceWithParameters { // multiple choice field names are name$number to avoid duplications // the number is stripped here - String fieldName = arg.getName().split("\\$", 2)[0]; - FormField field = form.getField(fieldName); - if (field.getType() == FieldType.BOOLEAN) - { - form.insert(fieldName, - (arg.getValue() != null && !arg.getValue().isBlank()) - ? true - : false); + String paramId = arg.getName().split("\\$", 2)[0]; + Parameter param = service.getParameter(paramId); + if (param instanceof Parameter.FlagParameter) { + if (arg.getValue() != null && !arg.getValue().isBlank()) + request.addData(paramId, true); + else + request.addData(paramId, false); } else { - form.insert(fieldName, arg.getValue()); + request.addData(paramId, arg.getValue()); } } } - return new JobId(service.getName(), service.getName(), form.submit()); + var job = service.submitJob(request); + return new JobId(service.getName(), service.getName(), job.getId()); } @Override @@ -134,7 +130,8 @@ public abstract class SlivkaWSInstance extends ServiceWithParameters { try { - job.setState(stateMap.get(client.getJobState(job.getJobId()))); + var slivkaJob = client.getJob(job.getJobId()); + job.setState(stateMap.get(slivkaJob.getStatus())); } catch (IOException e) { throw new IOError(e); @@ -143,8 +140,9 @@ public abstract class SlivkaWSInstance extends ServiceWithParameters @Override public final boolean updateJobProgress(WsJob job) throws IOException - { - List files = client.getJobResults(job.getJobId()); + { + var slivkaJob = client.getJob(job.getJobId()); + Collection files = slivkaJob.getResults(); RemoteFile logFile=null; for (RemoteFile f : files) { @@ -196,17 +194,10 @@ public abstract class SlivkaWSInstance extends ServiceWithParameters @Override public final boolean handleSubmitError(Throwable _lex, WsJob j, WebserviceInfo wsInfo) { - if (_lex instanceof FormValidationException) + if (_lex instanceof ClientProtocolException) { - FormValidationException formError = (FormValidationException) _lex; - String[] messages = new String[formError.getErrors().size()]; - int i = 0; - for (ValidationException e : formError.getErrors()) - { - messages[i++] = String.format("%s: %s,", e.getField().getName(), e.getMessage()); - } j.setState(WsJob.JobState.INVALID); - j.setStatus(String.join(", ", messages)); + j.setStatus(_lex.getMessage()); return true; } return false;