JAL-3066 change service type naming to avoid menu entry duplication.
[jalview.git] / src / jalview / ws / slivkaws / SlivkaMsaServiceInstance.java
1 package jalview.ws.slivkaws;
2
3 import jalview.datamodel.AlignmentI;
4 import jalview.datamodel.SequenceI;
5 import jalview.io.DataSourceType;
6 import jalview.io.FileFormat;
7 import jalview.io.FormatAdapter;
8 import jalview.ws.api.JobId;
9 import jalview.ws.api.MultipleSequenceAlignmentI;
10 import jalview.ws.params.ArgumentI;
11 import jalview.ws.params.InvalidArgumentException;
12 import jalview.ws.params.WsParamSetI;
13
14 import java.io.ByteArrayInputStream;
15 import java.io.IOError;
16 import java.io.IOException;
17 import java.io.InputStream;
18 import java.rmi.ServerError;
19 import java.util.List;
20 import java.util.Optional;
21
22 import uk.ac.dundee.compbio.slivkaclient.FieldType;
23 import uk.ac.dundee.compbio.slivkaclient.FormField;
24 import uk.ac.dundee.compbio.slivkaclient.RemoteFile;
25 import uk.ac.dundee.compbio.slivkaclient.SlivkaClient;
26 import uk.ac.dundee.compbio.slivkaclient.SlivkaForm;
27 import uk.ac.dundee.compbio.slivkaclient.SlivkaService;
28
29 public class SlivkaMsaServiceInstance extends SlivkaWSInstance implements MultipleSequenceAlignmentI
30 {
31   SlivkaMsaServiceInstance(SlivkaClient client, SlivkaService service) {
32     super(client, service, "Sequence Alignment");
33     style = ServiceClient.MSAWSCLIENT;
34   }
35
36   @Override
37   public JobId align(List<SequenceI> toalign, WsParamSetI parameters, List<ArgumentI> list) throws Throwable
38   {
39     StringBuilder builder = new StringBuilder();
40     for (SequenceI seq : toalign)
41     {
42       builder.append(">").append(seq.getName()).append("\n");
43       builder.append(seq.getSequence()).append("\n");
44     }
45     InputStream stream = new ByteArrayInputStream(builder.toString().getBytes());
46     RemoteFile file = client.uploadFile(stream, "input.fasta", "application/fasta");
47     SlivkaForm form = service.getForm();
48     Optional<FormField> inputField = form.getFields().stream()
49         .filter(f -> f.getType() == FieldType.FILE).findFirst();
50     if (inputField.isPresent())
51     {
52       form.insert(inputField.get().getName(), file);
53     }
54     if (list != null)
55     {
56       for (ArgumentI arg : list)
57       {
58         FormField field = form.getField(arg.getName());
59         if (field.getType() == FieldType.BOOLEAN)
60         {
61           form.insert(arg.getName(), (arg.getValue() != null && !arg.getValue().isBlank()) ? true : false);
62         }
63         else
64         {
65           form.insert(arg.getName(), field.valueOf(arg.getValue()));
66         }
67       }
68     }
69     return new JobId(service.getName(), service.getName(), form.submit());
70   }
71
72   @Override
73   public AlignmentI getAlignmentFor(JobId jobId) throws InvalidArgumentException, ServerError, IOError
74   {
75     List<RemoteFile> files;
76     try
77     {
78       files = client.getJobResults(jobId.getJobId());
79       for (RemoteFile f : files)
80       {
81         if (f.getMimeType().equals("application/clustal"))
82         {
83           return new FormatAdapter().readFile(f.getURL().toString(), DataSourceType.URL, FileFormat.Clustal);
84         }
85         else if (f.getMimeType().equals("application/fasta"))
86         {
87           return new FormatAdapter().readFile(f.getURL().toString(), DataSourceType.URL, FileFormat.Fasta);
88         }
89       }
90     } catch (IOException e)
91     {
92       throw new IOError(e);
93     }
94     return null;
95   }
96 }