JAL-3066 Automatically discoverable Protein sequence analysis services
[jalview.git] / src / jalview / ws / slivkaws / SlivkaAnnotationServiceInstance.java
1 package jalview.ws.slivkaws;
2
3 import jalview.api.FeatureColourI;
4 import jalview.datamodel.Alignment;
5 import jalview.datamodel.AlignmentAnnotation;
6 import jalview.datamodel.SequenceI;
7 import jalview.datamodel.features.FeatureMatcherSetI;
8 import jalview.io.AnnotationFile;
9 import jalview.ws.api.JobId;
10 import jalview.ws.api.SequenceAnnotationServiceI;
11 import jalview.ws.params.ArgumentI;
12 import jalview.ws.params.WsParamSetI;
13
14 import java.io.BufferedReader;
15 import java.io.ByteArrayInputStream;
16 import java.io.IOError;
17 import java.io.IOException;
18 import java.io.InputStream;
19 import java.io.InputStreamReader;
20 import java.util.Arrays;
21 import java.util.HashMap;
22 import java.util.List;
23 import java.util.Map;
24
25 import uk.ac.dundee.compbio.slivkaclient.FormField;
26 import uk.ac.dundee.compbio.slivkaclient.RemoteFile;
27 import uk.ac.dundee.compbio.slivkaclient.SlivkaClient;
28 import uk.ac.dundee.compbio.slivkaclient.SlivkaForm;
29 import uk.ac.dundee.compbio.slivkaclient.SlivkaService;
30
31 public class SlivkaAnnotationServiceInstance extends SlivkaWSInstance implements SequenceAnnotationServiceI
32 {
33   public SlivkaAnnotationServiceInstance(SlivkaClient client, SlivkaService service)
34   {
35     super(client, service, "Annotations disorder");
36   }
37
38   @Override
39   public JobId submitToService(List<SequenceI> seqs, WsParamSetI preset, List<ArgumentI> paramset) throws Throwable
40   {
41     StringBuilder builder = new StringBuilder();
42     for (SequenceI seq : seqs)
43     {
44       builder.append(">").append(seq.getName()).append("\n");
45       builder.append(seq.getSequence()).append("\n");
46     }
47     InputStream stream = new ByteArrayInputStream(builder.toString().getBytes());
48     RemoteFile file = client.uploadFile(stream, "input.fasta", "application/fasta");
49     SlivkaForm form = service.getForm();
50     HashMap<String, String> values = new HashMap<>(paramset != null ? paramset.size() : 0);
51     if (paramset != null)
52     {
53       for (ArgumentI arg : paramset)
54       {
55         values.put(arg.getName(), arg.getValue());
56       }
57     }
58     for (FormField field : form.getFields())
59     {
60       switch (field.getType())
61       {
62       case FILE:
63         form.insert(field.getName(), file);
64         break;
65       case BOOLEAN:
66         String value = values.get(field.getName());
67         form.insert(field.getName(), value != null && !value.isBlank() ? true : false);
68         break;
69       default:
70         form.insert(field.getName(), field.valueOf(values.get(field.getName())));
71       }
72     }
73     return new JobId(service.getName(), service.getName(), form.submit());
74   }
75
76   @Override
77   public List<AlignmentAnnotation> getAnnotationResult(JobId job,
78           List<SequenceI> seqs, Map<String, FeatureColourI> featureColours,
79           Map<String, FeatureMatcherSetI> featureFilters) throws Throwable
80   {
81     RemoteFile annotFile = null;
82     RemoteFile featFile = null;
83     try
84     {
85       List<RemoteFile> files = client.getJobResults(job.getJobId());
86       for (RemoteFile f : files)
87       {
88         if (f.getMimeType().equals("application/jalview-annotations"))
89         {
90           annotFile = f;
91         }
92         else if (f.getMimeType().equals("application/jalview-features"))
93         {
94           featFile = f;
95         }
96       }
97     } catch (IOException e)
98     {
99       throw new IOError(e);
100     }
101     Alignment aln = new Alignment(seqs.toArray(new SequenceI[0]));
102     BufferedReader in = new BufferedReader(new InputStreamReader(annotFile.getContent()));
103     AnnotationFile f = new AnnotationFile();
104     f.parseAnnotationFrom(aln, null, in);
105     return Arrays.asList(aln.getAlignmentAnnotation());
106   }
107 }