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