Merge branch 'releases/Release_2_11_3_Branch'
[jalview.git] / src / jalview / ws / jws2 / JabaWsServerQuery.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21 /**
22  * 
23  */
24 package jalview.ws.jws2;
25
26 import jalview.bin.Console;
27 import jalview.ws.jws2.jabaws2.Jws2Instance;
28 import jalview.ws.jws2.jabaws2.Jws2InstanceFactory;
29
30 import java.io.IOException;
31 import java.net.MalformedURLException;
32 import java.net.URL;
33 import java.util.HashSet;
34 import java.util.Set;
35
36 import compbio.data.msa.Category;
37 import compbio.data.msa.JABAService;
38 import compbio.ws.client.Jws2Client;
39 import compbio.ws.client.Services;
40
41 /**
42  * @author JimP
43  * 
44  */
45 public class JabaWsServerQuery implements Runnable
46 {
47
48   Jws2Discoverer jws2Discoverer = null;
49
50   String jwsserver = null;
51
52   boolean quit = false, running = false;
53
54   /**
55    * @return the running
56    */
57   public boolean isRunning()
58   {
59     return running;
60   }
61
62   /**
63    * @param quit
64    *          the quit to set
65    */
66   public void setQuit(boolean quit)
67   {
68     this.quit = quit;
69   }
70
71   public JabaWsServerQuery(Jws2Discoverer jws2Discoverer, String server)
72   {
73     this.jws2Discoverer = jws2Discoverer;
74     this.jwsserver = server;
75   }
76
77   Services[] JABAWS1SERVERS = new Services[] { Services.ClustalWS,
78       Services.MuscleWS, Services.MafftWS, Services.ProbconsWS,
79       Services.TcoffeeWS };
80
81   Services[] JABAWS2SERVERS = new Services[] { Services.ClustalWS,
82       Services.MuscleWS, Services.MafftWS, Services.ProbconsWS,
83       Services.TcoffeeWS, Services.AAConWS, Services.DisemblWS,
84       Services.GlobPlotWS, Services.IUPredWS, Services.JronnWS,
85       Services.RNAalifoldWS };
86
87   /*
88    * (non-Javadoc)
89    * 
90    * @see java.lang.Runnable#run()
91    */
92   @Override
93   public void run()
94   {
95     running = true;
96     try
97     {
98       // TODO this test doesn't seem to attempt a connection - should it?
99       // would save a lot of failed tries with UnknownHostException
100       if (isValidUrl(jwsserver))
101       {
102         compbio.data.msa.RegistryWS registry = null;
103         Set svccategories = null;
104         boolean noservices = true;
105         // look for services
106         boolean jabasws2 = false;
107         // If we are dealing with a JABAWS2 service, then just go and ask the
108         // JABAWS 2 service registry
109         Set<Services> srv_set = new HashSet<Services>();
110
111         Set<Category> categories = Category.getCategories();
112         String svc_cat;
113
114         try
115         {
116           // JBPNote: why is RegistryWS in compbio.data.msa ?
117           registry = Jws2Client.connectToRegistry(jwsserver);
118           if (registry != null)
119           {
120             // jalview.bin.Console.errPrintln("Test Services Output\n"
121             // + registry.testAllServices());
122             // TODO: enumerate services and test those that haven't been tested
123             // in the last n-days/hours/etc.
124
125             jabasws2 = true;
126             srv_set = registry.getSupportedServices();
127
128             // dan test
129             jalview.bin.Console.outPrintln(
130                     "registry.getSupportedServices: " + srv_set.toString());
131
132             svccategories = registry.getServiceCategories();
133
134             // dan test
135             // jalview.bin.Console.outPrintln("registry.getServiceCategories: "
136             // +
137             // svccategories.toString());
138
139           }
140         } catch (Exception ex)
141         {
142           jalview.bin.Console.errPrintln(
143                   "Exception whilst trying to get at registry:");
144           ex.printStackTrace();
145           // if that failed, then we are probably working with a JABAWS1 server.
146           // in that case, look for each service endpoint
147           jalview.bin.Console.errPrintln("JWS2 Discoverer: " + jwsserver
148                   + " is a JABAWS1 server. Using hardwired list.");
149           for (Services srv : JABAWS1SERVERS)
150           {
151             srv_set.add(srv);
152           }
153         }
154
155         for (Category cat : categories)
156         {
157           for (Services srv : cat.getServices())
158           {
159             if (quit)
160             {
161               running = false;
162               return;
163             }
164             if (!srv_set.contains(srv))
165             {
166               continue;
167             }
168             JABAService service = null;
169             try
170             {
171               service = Jws2Client.connect(jwsserver, srv);
172             } catch (Exception e)
173             {
174               jalview.bin.Console.errPrintln("Jws2 Discoverer: Problem on "
175                       + jwsserver + " with service " + srv + ":\n"
176                       + e.getMessage());
177               if (!(e instanceof javax.xml.ws.WebServiceException))
178               {
179                 e.printStackTrace();
180               }
181               // For moment, report service as a problem.
182               jws2Discoverer.addInvalidServiceUrl(jwsserver);
183             }
184             ;
185             if (service != null
186                     && !Jws2InstanceFactory.ignoreService(srv.toString()))
187             {
188               noservices = false;
189               Jws2Instance svc = null;
190               if (registry != null)
191               {
192
193                 String description = registry.getServiceDescription(srv);
194
195                 svc = Jws2InstanceFactory.newJws2Instance(jwsserver,
196                         srv.toString(), cat.name, description, service);
197               }
198               if (svc == null)
199               {
200                 svc = Jws2InstanceFactory.newJws2Instance(jwsserver,
201                         srv.toString(), cat.name,
202                         "JABAWS 1 Alignment Service", service);
203               }
204               jws2Discoverer.addService(jwsserver, svc);
205             }
206
207           }
208         }
209
210         if (noservices)
211         {
212           jws2Discoverer.addUrlwithnoservices(jwsserver);
213         }
214       }
215       else
216       {
217         jws2Discoverer.addInvalidServiceUrl(jwsserver);
218         Console.warn("Ignoring invalid Jws2 service url " + jwsserver);
219       }
220     } catch (Exception e)
221     {
222       e.printStackTrace();
223       Console.warn("Exception when discovering Jws2 services.", e);
224       jws2Discoverer.addInvalidServiceUrl(jwsserver);
225     } catch (Error e)
226     {
227       Console.error("Exception when discovering Jws2 services.", e);
228       jws2Discoverer.addInvalidServiceUrl(jwsserver);
229     }
230     running = false;
231   }
232
233   /**
234    * Check if the URL is valid and responding.
235    * 
236    * @return
237    */
238   private boolean isValidUrl(String server)
239   {
240     // return Jws2Client.validURL(jwsserver); // checks syntax only
241     boolean result = false;
242     if (server != null)
243     {
244       try
245       {
246         URL url = new URL(server);
247         url.openStream().close();
248         result = true;
249       } catch (MalformedURLException e)
250       {
251         jalview.bin.Console.errPrintln("Invalid server URL: " + server);
252         result = false;
253       } catch (IOException e)
254       {
255         jalview.bin.Console.errPrintln("Error connecting to server: "
256                 + server + ": " + e.toString());
257         result = false;
258       }
259     }
260     return result;
261   }
262
263 }