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