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.HashMap; import java.util.List; 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"); } @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(); HashMap values = new HashMap<>(list != null ? list.size() : 0); if (list != null) { for (ArgumentI arg : list) { values.put(arg.getName(), arg.getValue()); } } for (FormField field : form.getFields()) { switch (field.getType()) { case FILE: form.insert(field.getName(), file); break; case BOOLEAN: String value = values.get(field.getName()); form.insert(field.getName(), (value != null && !value.isBlank()) ? true : false); break; default: form.insert(field.getName(), field.valueOf(values.get(field.getName()))); } } 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; } }