73d5654b1efc38daf39fd763df5a27b86e591d09
[jalview.git] / src / jalview / ws / jws2 / JabaWsServerQuery.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8)
3  * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle
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 of the License, or (at your option) any later version.
10  *  
11  * Jalview is distributed in the hope that it will be useful, but 
12  * WITHOUT ANY WARRANTY; without even the implied warranty 
13  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
14  * PURPOSE.  See the GNU General Public License for more details.
15  * 
16  * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
17  */
18 /**
19  * 
20  */
21 package jalview.ws.jws2;
22
23 import jalview.bin.Cache;
24 import jalview.ws.jws2.jabaws2.Jws2Instance;
25
26 import java.util.HashSet;
27 import java.util.Set;
28
29 import compbio.data.msa.Category;
30 import compbio.data.msa.JABAService;
31 import compbio.ws.client.Jws2Client;
32 import compbio.ws.client.Services;
33
34 /**
35  * @author JimP
36  * 
37  */
38 public class JabaWsServerQuery implements Runnable
39 {
40
41   Jws2Discoverer jws2Discoverer = null;
42
43   String jwsservers = null;
44
45   boolean quit = false, running = false;
46
47   /**
48    * @return the running
49    */
50   public boolean isRunning()
51   {
52     return running;
53   }
54
55   /**
56    * @param quit
57    *          the quit to set
58    */
59   public void setQuit(boolean quit)
60   {
61     this.quit = quit;
62   }
63
64   public JabaWsServerQuery(Jws2Discoverer jws2Discoverer, String jwsservers)
65   {
66     this.jws2Discoverer = jws2Discoverer;
67     this.jwsservers = jwsservers;
68   }
69
70   Services[] JABAWS1SERVERS = new Services[]
71   { Services.ClustalWS, Services.MuscleWS, Services.MafftWS,
72       Services.ProbconsWS, Services.TcoffeeWS };
73
74   Services[] JABAWS2SERVERS = new Services[]
75   { Services.ClustalWS, Services.MuscleWS, Services.MafftWS,
76       Services.ProbconsWS, Services.TcoffeeWS, Services.AAConWS,
77       Services.DisemblWS, Services.GlobPlotWS, Services.IUPredWS,
78       Services.JronnWS };
79
80   /*
81    * (non-Javadoc)
82    * 
83    * @see java.lang.Runnable#run()
84    */
85   @Override
86   public void run()
87   {
88     running = true;
89     try
90     {
91       if (Jws2Client.validURL(jwsservers))
92       {
93         compbio.data.msa.RegistryWS registry = null;
94         Set svccategories = null;
95         boolean noservices = true;
96         // look for services
97         boolean jabasws2 = false;
98         // If we are dealing with a JABAWS2 service, then just go and ask the
99         // JABAWS 2 service registry
100         Set<Services> srv_set = new HashSet<Services>();
101
102         Set<Category> categories = Category.getCategories();
103         String svc_cat;
104
105         try
106         {
107           // JBPNote: why is RegistryWS in compbio.data.msa ?
108           registry = Jws2Client.connectToRegistry(jwsservers);
109           if (registry != null)
110           {
111             // System.err.println("Test Services Output\n"
112             // + registry.testAllServices());
113             // TODO: enumerate services and test those that haven't been tested
114             // in the last n-days/hours/etc.
115
116             jabasws2 = true;
117             srv_set = registry.getSupportedServices();
118             svccategories = registry.getServiceCategories();
119
120           }
121         } catch (Exception ex)
122         {
123           System.err.println("Exception whilst trying to get at registry:");
124           ex.printStackTrace();
125           // if that failed, then we are probably working with a JABAWS1 server.
126           // in that case, look for each service endpoint
127           System.err.println("JWS2 Discoverer: " + jwsservers
128                   + " is a JABAWS1 server. Using hardwired list.");
129           for (Services srv : JABAWS1SERVERS)
130           {
131             srv_set.add(srv);
132           }
133         }
134         for (Category cat : categories)
135         {
136           for (Services srv : cat.getServices())
137           {
138             if (quit)
139             {
140               running = false;
141               return;
142             }
143             if (!srv_set.contains(srv))
144             {
145               continue;
146             }
147             JABAService service = null;
148             try
149             {
150               service = Jws2Client.connect(jwsservers, srv);
151             } catch (Exception e)
152             {
153               System.err.println("Jws2 Discoverer: Problem on "
154                       + jwsservers + " with service " + srv + ":\n"
155                       + e.getMessage());
156               if (!(e instanceof javax.xml.ws.WebServiceException))
157               {
158                 e.printStackTrace();
159               }
160               // For moment, report service as a problem.
161               jws2Discoverer.addInvalidServiceUrl(jwsservers);
162             }
163             ;
164             if (service != null)
165             {
166               noservices = false;
167               Jws2Instance svc = null;
168               if (registry != null)
169               {
170
171                 String description = registry.getServiceDescription(srv);
172
173                 svc = new Jws2Instance(jwsservers, srv.toString(),
174                         cat.name, description, service);
175               }
176               if (svc == null)
177               {
178                 svc = new Jws2Instance(jwsservers, srv.toString(),
179                         cat.name, "JABAWS 1 Alignment Service", service);
180               }
181               jws2Discoverer.addService(jwsservers, svc);
182             }
183
184           }
185         }
186
187         if (noservices)
188         {
189           jws2Discoverer.addUrlwithnoservices(jwsservers);
190         }
191       }
192       else
193       {
194         jws2Discoverer.addInvalidServiceUrl(jwsservers);
195         Cache.log.info("Ignoring invalid Jws2 service url " + jwsservers);
196       }
197     } catch (Exception e)
198     {
199       e.printStackTrace();
200       Cache.log.warn("Exception when discovering Jws2 services.", e);
201       jws2Discoverer.addInvalidServiceUrl(jwsservers);
202     } catch (Error e)
203     {
204       Cache.log.error("Exception when discovering Jws2 services.", e);
205       jws2Discoverer.addInvalidServiceUrl(jwsservers);
206     }
207     running = false;
208   }
209
210 }