(JAL-978) discover JABA1 and JABA2 services and generate GUI elements for each servic...
[jalview.git] / src / jalview / ws / jws2 / JabaWsServerQuery.java
1 /*******************************************************************************
2  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7)
3  * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, 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   /*
71    * (non-Javadoc)
72    * 
73    * @see java.lang.Runnable#run()
74    */
75   @Override
76   public void run()
77   {
78     running = true;
79     try
80     {
81       if (Jws2Client.validURL(jwsservers))
82       {
83         compbio.data.msa.RegistryWS registry = null;
84         Set svccategories = null;
85         boolean noservices = true;
86         // look for services
87         boolean jabasws2 = false;
88         // If we are dealing with a JABAWS2 service, then just go and ask the
89         // JABAWS 2 service registry
90         Set<Services> srv_set = new HashSet<Services>();
91
92         Set<Category> categories = Category.getCategories();
93         String svc_cat;
94
95         try
96         {
97           // JBPNote: why is RegistryWS in compbio.data.msa ?
98           registry = Jws2Client.connectToRegistry(jwsservers);
99           if (registry != null)
100           {
101             // System.err.println("Test Services Output\n"
102             // + registry.testAllServices());
103             // TODO: enumerate services and test those that haven't been tested
104             // in the last n-days/hours/etc.
105
106             jabasws2 = true;
107             srv_set = registry.getSupportedServices();
108             svccategories = registry.getServiceCategories();
109
110           }
111         } catch (Exception ex)
112         {
113           System.err.println("Exception whilst trying to get at registry:");
114           ex.printStackTrace();
115           // if that failed, then we are probably working with a JABAWS1 server.
116           // in that case, look for each service endpoint
117           System.err.println("JWS2 Discoverer: " + jwsservers
118                   + " is a JABAWS1 server. Using hardwired list.");
119           for (Services srv : new Services[]
120           { Services.ClustalWS, Services.MuscleWS, Services.MafftWS,
121               Services.ProbconsWS, Services.TcoffeeWS })
122           {
123             srv_set.add(srv);
124           }
125         }
126         for (Category cat : categories)
127         {
128           for (Services srv : cat.getServices())
129           {
130             if (quit)
131             {
132               running = false;
133               return;
134             }
135             if (!srv_set.contains(srv))
136             {
137               continue;
138             }
139             JABAService service = null;
140             try
141             {
142               service = Jws2Client.connect(jwsservers, srv);
143             } catch (Exception e)
144             {
145               System.err.println("Jws2 Discoverer: Problem on "
146                       + jwsservers + " with service " + srv + ":\n"
147                       + e.getMessage());
148               if (!(e instanceof javax.xml.ws.WebServiceException))
149               {
150                 e.printStackTrace();
151               }
152               // For moment, report service as a problem.
153               jws2Discoverer.addInvalidServiceUrl(jwsservers);
154             }
155             ;
156             if (service != null)
157             {
158               noservices = false;
159               Jws2Instance svc = null;
160               if (registry != null)
161               {
162
163                 String description = registry.getServiceDescription(srv);
164
165                 svc = new Jws2Instance(jwsservers, srv.toString(),
166                         cat.name, description, service);
167               }
168               if (svc == null)
169               {
170                 svc = new Jws2Instance(jwsservers, srv.toString(), cat.name,
171                         "JABAWS 1 Alignment Service", service);
172               }
173               jws2Discoverer.addService(jwsservers, svc);
174             }
175
176           }
177         }
178
179         if (noservices)
180         {
181           jws2Discoverer.addUrlwithnoservices(jwsservers);
182         }
183       }
184       else
185       {
186         jws2Discoverer.addInvalidServiceUrl(jwsservers);
187         Cache.log.info("Ignoring invalid Jws2 service url " + jwsservers);
188       }
189     } catch (Exception e)
190     {
191       e.printStackTrace();
192       Cache.log.warn("Exception when discovering Jws2 services.", e);
193       jws2Discoverer.addInvalidServiceUrl(jwsservers);
194     } catch (Error e)
195     {
196       Cache.log.error("Exception when discovering Jws2 services.", e);
197       jws2Discoverer.addInvalidServiceUrl(jwsservers);
198     }
199     running = false;
200   }
201
202 }