1 package jalview.ws.jws2;
3 import java.awt.event.ActionEvent;
4 import java.awt.event.ActionListener;
5 import java.beans.PropertyChangeEvent;
6 import java.beans.PropertyChangeListener;
7 import java.net.ConnectException;
8 import java.util.HashSet;
9 import java.util.Vector;
11 import javax.swing.JMenu;
12 import javax.swing.JMenuItem;
14 import org.apache.log4j.Level;
16 import jalview.bin.Cache;
17 import jalview.datamodel.AlignmentView;
18 import jalview.gui.AlignFrame;
19 import jalview.ws.WSMenuEntryProviderI;
20 import compbio.data.msa.MsaWS;
21 import compbio.metadata.Preset;
22 import compbio.metadata.PresetManager;
23 import compbio.ws.client.Jws2Base;
24 import compbio.ws.client.Jws2Base.Services;
27 * discoverer for jws2 services. Follows the lightweight service discoverer
28 * pattern (archetyped by EnfinEnvision2OneWay)
33 public class Jws2Discoverer implements Runnable, WSMenuEntryProviderI
35 private java.beans.PropertyChangeSupport changeSupport = new java.beans.PropertyChangeSupport(
39 * change listeners are notified of "services" property changes
42 * to be added that consumes new services Hashtable object.
44 public void addPropertyChangeListener(
45 java.beans.PropertyChangeListener listener)
47 changeSupport.addPropertyChangeListener(listener);
56 public void removePropertyChangeListener(
57 java.beans.PropertyChangeListener listener)
59 changeSupport.removePropertyChangeListener(listener);
62 boolean running = false;
74 Class foo = getClass().getClassLoader().loadClass(
75 "compbio.ws.client.Jws2Base");
76 } catch (ClassNotFoundException e)
79 .println("Not enabling Jalview Webservices version 2: client jar is not available."
80 +"\nPlease check that your webstart JNLP file is up to date!");
84 // Cache.initLogger();
85 // Cache.log.setLevel(Level.DEBUG);
86 // TODO: Document and PACK JWS2
87 String jwsservers = Cache.getDefault("JWS2HOSTURLS",
88 "http://webservices.compbio.dundee.ac.uk:8084/jws2");
91 if (Jws2Base.validURL(jwsservers))
94 for (Services srv : Jws2Base.Services.values())
99 service = Jws2Base.connect(jwsservers, srv);
100 } catch (Exception e)
102 System.err.println("Jws2 Discoverer: Problem with "
103 + jwsservers + " with service " + srv + ":\n"
105 if (!(e instanceof javax.xml.ws.WebServiceException))
113 addService(jwsservers, srv, service);
120 Cache.log.info("Ignoring invalid Jws2 service url " + jwsservers);
122 } catch (Exception e)
125 Cache.log.warn("Exception when discovering Jws2 services.", e);
128 Cache.log.error("Exception when discovering Jws2 services.", e);
131 changeSupport.firePropertyChange("services", new Vector(), services);
135 * record this service endpoint so we can use it
141 private void addService(String jwsservers, Services srv, MsaWS service2)
143 if (services == null)
145 services = new Vector<Jws2Instance>();
147 System.out.println("Discovered service: " + jwsservers + " "
149 services.add(new Jws2Instance(jwsservers, "Align with "
150 + srv.toString(), service2));
153 public class Jws2Instance
161 public Jws2Instance(String hosturl, String serviceType, MsaWS service)
164 this.hosturl = hosturl;
165 this.serviceType = serviceType;
166 this.service = service;
169 PresetManager presets = null;
172 * non thread safe - gets the presets for this service (blocks whilst it
173 * calls the service to get the preset set)
175 * @return service presets or null if exceptions were raised.
177 public PresetManager getPresets()
183 presets = service.getPresets();
184 } catch (Exception ex)
187 .println("Exception when retrieving presets for service "
188 + serviceType + " at " + hosturl);
196 * holds list of services.
198 Vector<Jws2Instance> services;
201 public void attachWSMenuEntry(JMenu wsmenu, final AlignFrame alignFrame)
203 if (running || services == null || services.size() == 0)
208 * eventually, JWS2 services will appear under the same align/etc submenus.
209 * for moment we keep them separate.
211 JMenu jws2 = new JMenu("JWS2 Alignment");
212 MsaWSClient msacl = new MsaWSClient();
213 for (final Jws2Instance service : services)
215 msacl.attachWSMenuEntry(jws2, service, alignFrame);
217 * JMenuItem sitem = new JMenuItem(service.serviceType);
218 * sitem.setToolTipText("Hosted at " + service.hosturl);
219 * sitem.addActionListener(new ActionListener() {
221 * @Override public void actionPerformed(ActionEvent e) { AlignmentView
222 * msa = alignFrame.gatherSequencesForAlignment(); MsaWSClient client =
223 * new MsaWSClient(service, "JWS2 Alignment of " + alignFrame.getTitle(),
224 * msa, false, true, alignFrame.getViewport().getAlignment().getDataset(),
228 if (services.size() > 0)
235 public static void main(String[] args)
237 Thread runner = new Thread(getDiscoverer());
238 getDiscoverer().addPropertyChangeListener(new PropertyChangeListener()
242 public void propertyChange(PropertyChangeEvent evt)
244 System.out.println("Changesupport: There are now "
245 + getDiscoverer().services.size() + " services");
249 while (runner.isAlive())
254 } catch (InterruptedException e)
261 private static Jws2Discoverer discoverer;
263 public static Jws2Discoverer getDiscoverer()
265 if (discoverer == null)
267 discoverer = new Jws2Discoverer();
272 public boolean hasServices()
274 // TODO Auto-generated method stub
275 return !running && services != null && services.size() > 0;
278 public boolean isRunning()