X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fws%2Fslivkaws%2FSlivkaWSInstance.java;h=138b4323a6bc7ed491c1547e044666ffb7b8b62e;hb=b6bd3fa646b6728cd59c8d0de91270ab6c70f86f;hp=a5c809faff8041b3c6a1aa9b6eec2abd8ee567d6;hpb=736815bebc732aa97efaad70a7c2b3b4f4e77941;p=jalview.git diff --git a/src/jalview/ws/slivkaws/SlivkaWSInstance.java b/src/jalview/ws/slivkaws/SlivkaWSInstance.java index a5c809f..138b432 100644 --- a/src/jalview/ws/slivkaws/SlivkaWSInstance.java +++ b/src/jalview/ws/slivkaws/SlivkaWSInstance.java @@ -1,17 +1,10 @@ package jalview.ws.slivkaws; -import jalview.gui.WebserviceInfo; -import jalview.ws.api.JalviewServiceEndpointProviderI; -import jalview.ws.api.JalviewWebServiceI; -import jalview.ws.api.ServiceWithParameters; -import jalview.ws.gui.WsJob; -import jalview.ws.params.ParamDatastoreI; -import jalview.ws.params.ParamManager; - +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.IOError; import java.io.IOException; import java.io.InputStream; -import java.io.InputStreamReader; import java.util.Arrays; import java.util.EnumMap; import java.util.HashSet; @@ -19,10 +12,28 @@ import java.util.List; import java.util.Optional; import java.util.Set; +import jalview.datamodel.AlignmentI; +import jalview.datamodel.SequenceI; +import jalview.gui.WebserviceInfo; +import jalview.io.DataSourceType; +import jalview.io.FileFormat; +import jalview.io.FormatAdapter; +import jalview.ws.api.JalviewServiceEndpointProviderI; +import jalview.ws.api.JalviewWebServiceI; +import jalview.ws.api.JobId; +import jalview.ws.api.ServiceWithParameters; +import jalview.ws.gui.WsJob; +import jalview.ws.params.ArgumentI; +import jalview.ws.params.ParamDatastoreI; +import jalview.ws.params.ParamManager; +import jalview.ws.params.WsParamSetI; +import uk.ac.dundee.compbio.slivkaclient.FieldType; +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.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; @@ -38,9 +49,13 @@ public abstract class SlivkaWSInstance extends ServiceWithParameters protected static final EnumMap stateMap = new EnumMap<>(JobState.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); @@ -52,11 +67,55 @@ public abstract class SlivkaWSInstance extends ServiceWithParameters public SlivkaWSInstance(SlivkaClient client, SlivkaService service, String action) { - super(service.getName(), action, service.getLabel(), "Slivka", client.getUrl().toString()); + super(action, action, service.getLabel(), "Slivka", client.getUrl().toString()); this.client = client; this.service = service; } + protected final JobId submit(List sequences, + WsParamSetI preset, List args) throws Throwable + { + SlivkaForm form = service.getForm(); + Optional inputField = form.getFields().stream() + .filter(f -> f.getType() == FieldType.FILE).findFirst(); + if (inputField.isPresent()) + { + StringBuilder builder = new StringBuilder(); + for (SequenceI seq : sequences) + { + builder.append(">").append(seq.getName()).append("\n") + .append(seq.getSequence()).append("\n"); + } + InputStream stream = new ByteArrayInputStream( + builder.toString().getBytes()); + RemoteFile file = client.uploadFile(stream, "input.fa", + "application/fasta"); + form.insert(inputField.get().getName(), file); + } + if (args != null) + { + for (ArgumentI arg : args) + { + // 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); + } + else + { + form.insert(fieldName, arg.getValue()); + } + } + } + return new JobId(service.getName(), service.getName(), form.submit()); + } + @Override public final void updateStatus(WsJob job) { @@ -73,43 +132,52 @@ public abstract class SlivkaWSInstance extends ServiceWithParameters public final boolean updateJobProgress(WsJob job) throws IOException { List files = client.getJobResults(job.getJobId()); - Optional logFile = files.stream() - .filter(f -> f.getLabel().equals("log")).findFirst(); + RemoteFile logFile=null; + for (RemoteFile f : files) + { + if (f.getLabel().equals("log")) + { + logFile = f; break; + } + } + boolean newContent = false; - if (logFile.isPresent()) + if (logFile!=null) { - InputStream stream = logFile.get().getContent(); - long nextChunk = stream.skip(job.getNextChunk()); - int len = appendJobStatus(job, stream); - job.setnextChunk(nextChunk + len); - newContent |= len > 0; + ByteArrayOutputStream output = new ByteArrayOutputStream(); + logFile.writeTo(output); + if (output.size() > job.getNextChunk()) + { + newContent = true; + job.setStatus(output.toString("UTF-8")); + job.setnextChunk(output.size()); + } } if (failedStates.contains(job.getJobState())) { - Optional errLogFile = files.stream() - .filter(f -> f.getLabel().equals("error-log")).findFirst(); - if (errLogFile.isPresent()) + + RemoteFile errLogFile = null; + for (RemoteFile f : files) { - newContent |= appendJobStatus(job, errLogFile.get().getContent()) > 0; + if (f.getLabel().equals("error-log")) + { + errLogFile = f; + break; + } } - } - return newContent; - } - private int appendJobStatus(WsJob job, InputStream stream) throws IOException - { - StringBuilder builder = new StringBuilder(job.getStatus()); - InputStreamReader reader = new InputStreamReader(stream); - char[] buffer = new char[4096]; - int chunkLen = 0; - int len = 0; - while ((len = reader.read(buffer)) != -1) - { - chunkLen += len; - builder.append(buffer, 0, len); + if (errLogFile!=null) + { + ByteArrayOutputStream output = new ByteArrayOutputStream(); + errLogFile.writeTo(output); + if (output.size() > 0) + { + newContent = true; + job.setStatus(job.getStatus() + "\n" + output.toString("UTF-8")); + } + } } - job.setStatus(builder.toString()); - return chunkLen; + return newContent; } @Override @@ -179,5 +247,19 @@ public abstract class SlivkaWSInstance extends ServiceWithParameters } return store; } + + public static AlignmentI readAlignment(RemoteFile f) throws IOException + { + final var mimetype = f.getMimeType(); + FileFormat format; + if (mimetype.equals("application/clustal")) + format = FileFormat.Clustal; + else if (mimetype.equals("application/fasta")) + format = FileFormat.Fasta; + else + return null; + return new FormatAdapter().readFile(f.getURL().toString(), + DataSourceType.URL, format); + } }