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