1 package jalview.ws.slivkaws;
3 import jalview.gui.WebserviceInfo;
4 import jalview.ws.api.JalviewServiceEndpointProviderI;
5 import jalview.ws.api.JalviewWebServiceI;
6 import jalview.ws.api.ServiceWithParameters;
7 import jalview.ws.gui.WsJob;
8 import jalview.ws.params.ParamDatastoreI;
9 import jalview.ws.params.ParamManager;
11 import java.io.IOError;
12 import java.io.IOException;
13 import java.io.InputStream;
14 import java.io.InputStreamReader;
15 import java.util.Arrays;
16 import java.util.EnumMap;
17 import java.util.HashSet;
18 import java.util.List;
19 import java.util.Optional;
22 import uk.ac.dundee.compbio.slivkaclient.FormValidationException;
23 import uk.ac.dundee.compbio.slivkaclient.JobState;
24 import uk.ac.dundee.compbio.slivkaclient.RemoteFile;
25 import uk.ac.dundee.compbio.slivkaclient.SlivkaClient;
26 import uk.ac.dundee.compbio.slivkaclient.SlivkaService;
27 import uk.ac.dundee.compbio.slivkaclient.ValidationException;
29 public abstract class SlivkaWSInstance extends ServiceWithParameters
30 implements JalviewServiceEndpointProviderI, JalviewWebServiceI
32 protected final SlivkaClient client;
34 protected final SlivkaService service;
36 protected SlivkaDatastore store = null;
38 protected static final EnumMap<JobState, WsJob.JobState> stateMap = new EnumMap<>(JobState.class);
40 stateMap.put(JobState.PENDING, WsJob.JobState.QUEUED);
41 stateMap.put(JobState.QUEUED, WsJob.JobState.QUEUED);
42 stateMap.put(JobState.RUNNING, WsJob.JobState.RUNNING);
43 stateMap.put(JobState.COMPLETED, WsJob.JobState.FINISHED);
44 stateMap.put(JobState.FAILED, WsJob.JobState.FAILED);
45 stateMap.put(JobState.ERROR, WsJob.JobState.SERVERERROR);
46 stateMap.put(JobState.UNKNOWN, WsJob.JobState.UNKNOWN);
48 protected final Set<WsJob.JobState> failedStates = new HashSet<>(Arrays.asList(
49 WsJob.JobState.INVALID, WsJob.JobState.BROKEN, WsJob.JobState.FAILED,
50 WsJob.JobState.SERVERERROR, WsJob.JobState.CANCELLED
53 public SlivkaWSInstance(SlivkaClient client, SlivkaService service, String action)
55 super(service.getName(), action, service.getLabel(), "Slivka", client.getUrl().toString());
57 this.service = service;
61 public final void updateStatus(WsJob job)
65 job.setState(stateMap.get(client.getJobState(job.getJobId())));
66 } catch (IOException e)
73 public final boolean updateJobProgress(WsJob job) throws IOException
75 List<RemoteFile> files = client.getJobResults(job.getJobId());
76 Optional<RemoteFile> logFile = files.stream()
77 .filter(f -> f.getLabel().equals("log")).findFirst();
78 boolean newContent = false;
79 if (logFile.isPresent())
81 InputStream stream = logFile.get().getContent();
82 long nextChunk = stream.skip(job.getNextChunk());
83 int len = appendJobStatus(job, stream);
84 job.setnextChunk(nextChunk + len);
85 newContent |= len > 0;
87 if (failedStates.contains(job.getJobState()))
89 Optional<RemoteFile> errLogFile = files.stream()
90 .filter(f -> f.getLabel().equals("error-log")).findFirst();
91 if (errLogFile.isPresent())
93 newContent |= appendJobStatus(job, errLogFile.get().getContent()) > 0;
99 private int appendJobStatus(WsJob job, InputStream stream) throws IOException
101 StringBuilder builder = new StringBuilder(job.getStatus());
102 InputStreamReader reader = new InputStreamReader(stream);
103 char[] buffer = new char[4096];
106 while ((len = reader.read(buffer)) != -1)
109 builder.append(buffer, 0, len);
111 job.setStatus(builder.toString());
116 public final boolean handleSubmitError(Throwable _lex, WsJob j, WebserviceInfo wsInfo)
118 if (_lex instanceof FormValidationException)
120 FormValidationException formError = (FormValidationException) _lex;
121 String[] messages = new String[formError.getErrors().size()];
123 for (ValidationException e : formError.getErrors())
125 messages[i++] = String.format("%s: %s,", e.getField().getName(), e.getMessage());
127 j.setState(WsJob.JobState.INVALID);
128 j.setStatus(String.join(", ", messages));
135 public final boolean handleCollectionException(Exception e, WsJob msjob, WebserviceInfo wsInfo)
141 final SlivkaService getService()
147 public final Object getEndpoint()
153 public final void initParamStore(ParamManager userParameterStore)
159 store = new SlivkaDatastore(service);
160 } catch (IOException e)
162 throw new IOError(e);
168 public boolean hasParameters()
174 public final ParamDatastoreI getParamStore()
178 initParamStore(null);