package jalview.ws.slivkaws; import jalview.datamodel.AlignmentI; import jalview.datamodel.SequenceI; import jalview.io.DataSourceType; import jalview.io.FileFormat; import jalview.io.FormatAdapter; import jalview.ws.api.JobId; import jalview.ws.api.MultipleSequenceAlignmentI; import jalview.ws.params.ArgumentI; import jalview.ws.params.InvalidArgumentException; import jalview.ws.params.WsParamSetI; import java.io.ByteArrayInputStream; import java.io.IOError; import java.io.IOException; import java.io.InputStream; import java.rmi.ServerError; import java.util.List; import java.util.Optional; import uk.ac.dundee.compbio.slivkaclient.FieldType; import uk.ac.dundee.compbio.slivkaclient.FormField; 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; public class SlivkaMsaServiceInstance extends SlivkaWSInstance implements MultipleSequenceAlignmentI { SlivkaMsaServiceInstance(SlivkaClient client, SlivkaService service) { super(client, service, "Alignment"); style = ServiceClient.MSAWSCLIENT; } @Override public JobId align(List toalign, WsParamSetI parameters, List list) throws Throwable { StringBuilder builder = new StringBuilder(); for (SequenceI seq : toalign) { builder.append(">").append(seq.getName()).append("\n"); builder.append(seq.getSequence()).append("\n"); } InputStream stream = new ByteArrayInputStream(builder.toString().getBytes()); RemoteFile file = client.uploadFile(stream, "input.fasta", "application/fasta"); SlivkaForm form = service.getForm(); Optional inputField = form.getFields().stream() .filter(f -> f.getType() == FieldType.FILE).findFirst(); if (inputField.isPresent()) { form.insert(inputField.get().getName(), file); } if (list != null) { for (ArgumentI arg : list) { FormField field = form.getField(arg.getName()); if (field.getType() == FieldType.BOOLEAN) { form.insert(arg.getName(), (arg.getValue() != null && !arg.getValue().isBlank()) ? true : false); } else { form.insert(arg.getName(), field.valueOf(arg.getValue())); } } } return new JobId(service.getName(), service.getName(), form.submit()); } @Override public AlignmentI getAlignmentFor(JobId jobId) throws InvalidArgumentException, ServerError, IOError { List files; try { files = client.getJobResults(jobId.getJobId()); for (RemoteFile f : files) { if (f.getMimeType().equals("application/clustal")) { return new FormatAdapter().readFile(f.getURL().toString(), DataSourceType.URL, FileFormat.Clustal); } else if (f.getMimeType().equals("application/fasta")) { return new FormatAdapter().readFile(f.getURL().toString(), DataSourceType.URL, FileFormat.Fasta); } } } catch (IOException e) { throw new IOError(e); } return null; } }