package jalview.ws.slivkaws; import jalview.api.FeatureColourI; import jalview.datamodel.Alignment; import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.SequenceI; import jalview.datamodel.features.FeatureMatcherSetI; import jalview.io.AnnotationFile; import jalview.io.DataSourceType; import jalview.io.FeaturesFile; import jalview.util.MessageManager; import jalview.ws.api.JobId; import jalview.ws.api.SequenceAnnotationServiceI; import jalview.ws.params.ArgumentI; import jalview.ws.params.WsParamSetI; import jalview.ws.uimodel.AlignAnalysisUIText; import java.io.BufferedReader; 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.HashMap; import java.util.List; import java.util.Map; 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 SlivkaAnnotationServiceInstance extends SlivkaWSInstance implements SequenceAnnotationServiceI { public SlivkaAnnotationServiceInstance(SlivkaClient client, SlivkaService service, boolean conservation) { super(client, service, !conservation ? "Annotations disorder" : "Alignment Conservation"); if (conservation) { setAlignAnalysisUI(new AlignAnalysisUIText(service.getName(), SlivkaAnnotationServiceInstance.class, "Slivka.AACons", false, true, true, true, true, 2, MessageManager.getString("label.aacon_calculations"), MessageManager.getString("tooltip.aacon_calculations"), MessageManager.getString("label.aacon_settings"), MessageManager.getString("tooltip.aacon_settings"))); } style = ServiceClient.SEQUENCEANNOTATIONWSCLIENT; } @Override public JobId submitToService(List seqs, WsParamSetI preset, List paramset) throws Throwable { StringBuilder builder = new StringBuilder(); for (SequenceI seq : seqs) { 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<>(paramset != null ? paramset.size() : 0); if (paramset != null) { for (ArgumentI arg : paramset) { 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 List getAnnotationResult(JobId job, List seqs, Map featureColours, Map featureFilters) throws Throwable { RemoteFile annotFile = null; RemoteFile featFile = null; try { List files = client.getJobResults(job.getJobId()); for (RemoteFile f : files) { if (f.getMimeType().equals("application/jalview-annotations")) { annotFile = f; } else if (f.getMimeType().equals("application/jalview-features")) { featFile = f; } } } catch (IOException e) { throw new IOError(e); } Alignment aln = new Alignment(seqs.toArray(new SequenceI[0])); BufferedReader readerIn = new BufferedReader(new InputStreamReader(annotFile.getContent())); new AnnotationFile().parseAnnotationFrom(aln, null, readerIn); if (featFile != null) { new FeaturesFile(featFile.getURL().toString(), DataSourceType.URL).parse(aln, featureColours, true); } return Arrays.asList(aln.getAlignmentAnnotation()); } }