JAL-3954 Implement job dispatcher service discoverer
[jalview.git] / src / jalview / ws2 / client / ebi / JobDispatcherWSDiscoverer.java
1 package jalview.ws2.client.ebi;
2
3 import java.io.IOException;
4 import java.net.MalformedURLException;
5 import java.net.URISyntaxException;
6 import java.net.URL;
7 import java.util.List;
8
9 import jalview.bin.Console;
10 import jalview.ws.params.ParamManager;
11 import jalview.ws2.actions.NullAction;
12 import jalview.ws2.actions.api.ActionI;
13 import jalview.ws2.api.WebService;
14 import jalview.ws2.client.api.AbstractWebServiceDiscoverer;
15 import uk.ac.dundee.compbio.hmmerclient.PhmmerClient;
16
17 public final class JobDispatcherWSDiscoverer extends AbstractWebServiceDiscoverer
18 {
19
20   private static final URL DEFAULT_URL;
21   static
22   {
23     try
24     {
25       DEFAULT_URL = new URL("https://www.ebi.ac.uk/Tools/services/rest/hmmer3_phmmer/");
26     } catch (MalformedURLException e)
27     {
28       throw new ExceptionInInitializerError(e);
29     }
30   }
31   
32   private static JobDispatcherWSDiscoverer instance = null;
33   private static ParamManager paramManager = null;
34   
35   private JobDispatcherWSDiscoverer() {}
36   
37   public static JobDispatcherWSDiscoverer getInstance() {
38     if (instance == null)
39       instance = new JobDispatcherWSDiscoverer();
40     return instance;
41   }
42   
43   public static void setParamManager(ParamManager manager)
44   {
45     paramManager = manager;
46   }
47   
48   @Override
49   public int getStatusForUrl(URL url)
50   {
51     try
52     {
53       return new PhmmerClient(url).testEndpoint() ? STATUS_OK : STATUS_INVALID;
54     } catch (URISyntaxException e)
55     {
56       Console.error(e.getMessage());
57       return STATUS_INVALID;
58     } 
59   }
60
61   @Override
62   protected String getUrlsPropertyKey()
63   {
64     return null;
65   }
66
67   @Override
68   protected URL getDefaultUrl()
69   {
70     return DEFAULT_URL;
71   }
72
73   @Override
74   protected List<WebService<?>> fetchServices(URL url) throws IOException
75   {
76     PhmmerClient client;
77     try {
78       client = new PhmmerClient(url);
79     }
80     catch (URISyntaxException e) {
81       throw new MalformedURLException(e.getMessage());
82     }
83     if (!client.testEndpoint())
84       throw new IOException(
85               "unable to reach dispatcher server at " + url);
86     // TODO change once a concrete action is implemented
87     var wsBuilder = WebService.<NullAction> newBuilder();
88     wsBuilder.url(url);
89     wsBuilder.clientName("job dispatcher");
90     wsBuilder.category("Database search");
91     wsBuilder.name("pHMMER");
92     wsBuilder.description("Hmmer3 phmmer is used to search one or more query sequences against a sequence database.");
93     wsBuilder.interactive(false);
94     wsBuilder.paramDatastore(ParamStores.newPhmmerDatastore(url, paramManager));
95     wsBuilder.actionClass(NullAction.class);
96     var webService = wsBuilder.build(); 
97     
98     var actionBuilder = NullAction.newBuilder();
99     actionBuilder.webService(webService);
100     actionBuilder.name("");
101     webService.addAction(actionBuilder.build());
102     
103     return List.of(webService);
104   }
105
106 }