JAL-3066 Move common web service methods to abstract SlivkaWSInstance
[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.HashMap;
20 import java.util.List;
21
22 import uk.ac.dundee.compbio.slivkaclient.FormField;
23 import uk.ac.dundee.compbio.slivkaclient.RemoteFile;
24 import uk.ac.dundee.compbio.slivkaclient.SlivkaClient;
25 import uk.ac.dundee.compbio.slivkaclient.SlivkaForm;
26 import uk.ac.dundee.compbio.slivkaclient.SlivkaService;
27
28 public class SlivkaMsaServiceInstance extends SlivkaWSInstance implements MultipleSequenceAlignmentI
29 {
30   SlivkaMsaServiceInstance(SlivkaClient client, SlivkaService service) {
31     super(client, service, "Alignment");
32   }
33
34   @Override
35   public JobId align(List<SequenceI> toalign, WsParamSetI parameters, List<ArgumentI> list) throws Throwable
36   {
37     StringBuilder builder = new StringBuilder();
38     for (SequenceI seq : toalign)
39     {
40       builder.append(">").append(seq.getName()).append("\n");
41       builder.append(seq.getSequence()).append("\n");
42     }
43     InputStream stream = new ByteArrayInputStream(builder.toString().getBytes());
44     RemoteFile file = client.uploadFile(stream, "input.fasta", "application/fasta");
45     SlivkaForm form = service.getForm();
46     HashMap<String, String> values = new HashMap<>(list != null ? list.size() : 0);
47     if (list != null)
48     {
49       for (ArgumentI arg : list)
50       {
51         values.put(arg.getName(), arg.getValue());
52       }
53     }
54     for (FormField field : form.getFields())
55     {
56       switch (field.getType()) {
57       case FILE:
58         form.insert(field.getName(), file);
59         break;
60       case BOOLEAN:
61         String value = values.get(field.getName());
62         form.insert(field.getName(), (value != null && !value.isBlank()) ? true : false);
63         break;
64       default:
65         form.insert(field.getName(), field.valueOf(values.get(field.getName())));
66       }
67     }
68     return new JobId(service.getName(), service.getName(), form.submit());
69   }
70
71   @Override
72   public AlignmentI getAlignmentFor(JobId jobId) throws InvalidArgumentException, ServerError, IOError
73   {
74     List<RemoteFile> files;
75     try
76     {
77       files = client.getJobResults(jobId.getJobId());
78       for (RemoteFile f : files)
79       {
80         if (f.getMimeType().equals("application/clustal"))
81         {
82           return new FormatAdapter().readFile(f.getURL().toString(), DataSourceType.URL, FileFormat.Clustal);
83         }
84         else if (f.getMimeType().equals("application/fasta"))
85         {
86           return new FormatAdapter().readFile(f.getURL().toString(), DataSourceType.URL, FileFormat.Fasta);
87         }
88       }
89     } catch (IOException e)
90     {
91       throw new IOError(e);
92     }
93     return null;
94   }
95 }