X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fws%2Fslivkaws%2FSlivkaWSInstance.java;h=952aab659c2da51b646ca5698f90f8514dfd162a;hb=c794c5033adeee182b03a5ea92c0a7495a29661f;hp=751637c1f446775d5f7445599c004f6de1743544;hpb=47b802c67970e1d0d90ad1b2200d905225bcb5c3;p=jalview.git diff --git a/src/jalview/ws/slivkaws/SlivkaWSInstance.java b/src/jalview/ws/slivkaws/SlivkaWSInstance.java index 751637c..952aab6 100644 --- a/src/jalview/ws/slivkaws/SlivkaWSInstance.java +++ b/src/jalview/ws/slivkaws/SlivkaWSInstance.java @@ -1,20 +1,36 @@ package jalview.ws.slivkaws; +import jalview.datamodel.SequenceI; import jalview.gui.WebserviceInfo; 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 java.io.ByteArrayInputStream; 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; +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.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; @@ -30,13 +46,21 @@ 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.INTERRUPED, 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); } + protected final Set failedStates = new HashSet<>(Arrays.asList( + WsJob.JobState.INVALID, WsJob.JobState.BROKEN, WsJob.JobState.FAILED, + WsJob.JobState.SERVERERROR, WsJob.JobState.CANCELLED + )); public SlivkaWSInstance(SlivkaClient client, SlivkaService service, String action) { @@ -45,6 +69,50 @@ public abstract class SlivkaWSInstance extends ServiceWithParameters 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, field.valueOf(arg.getValue())); + } + } + } + return new JobId(service.getName(), service.getName(), form.submit()); + } + @Override public final void updateStatus(WsJob job) { @@ -58,9 +126,46 @@ public abstract class SlivkaWSInstance extends ServiceWithParameters } @Override - public final boolean updateJobProgress(WsJob job) + public final boolean updateJobProgress(WsJob job) throws IOException { - return false; + List files = client.getJobResults(job.getJobId()); + Optional logFile = files.stream() + .filter(f -> f.getLabel().equals("log")).findFirst(); + boolean newContent = false; + if (logFile.isPresent()) + { + InputStream stream = logFile.get().getContent(); + long nextChunk = stream.skip(job.getNextChunk()); + int len = appendJobStatus(job, stream); + job.setnextChunk(nextChunk + len); + newContent |= len > 0; + } + if (failedStates.contains(job.getJobState())) + { + Optional errLogFile = files.stream() + .filter(f -> f.getLabel().equals("error-log")).findFirst(); + if (errLogFile.isPresent()) + { + newContent |= appendJobStatus(job, errLogFile.get().getContent()) > 0; + } + } + 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); + } + job.setStatus(builder.toString()); + return chunkLen; } @Override @@ -124,6 +229,10 @@ public abstract class SlivkaWSInstance extends ServiceWithParameters @Override public final ParamDatastoreI getParamStore() { + if (store == null) + { + initParamStore(null); + } return store; }