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