From 06eca7433e037f1d8ae07172528bc751dc9a0320 Mon Sep 17 00:00:00 2001 From: jprocter Date: Wed, 17 Aug 2005 15:31:32 +0000 Subject: [PATCH] Maintain list of webservices and query any Service Discovery services. --- src/jalview/ws/Discoverer.java | 274 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 274 insertions(+) create mode 100755 src/jalview/ws/Discoverer.java diff --git a/src/jalview/ws/Discoverer.java b/src/jalview/ws/Discoverer.java new file mode 100755 index 0000000..bc2f613 --- /dev/null +++ b/src/jalview/ws/Discoverer.java @@ -0,0 +1,274 @@ +package jalview.ws; + +/** + *

Title:

+ * + *

Description:

+ * + *

Copyright: Copyright (c) 2004

+ * + *

Company: Dundee University

+ * + * @author not attributable + * @version 1.0 + */ +import ext.vamsas.*; +import java.util.Vector; +import java.util.Hashtable; +import java.util.ArrayList; + +public class Discoverer + extends Thread implements Runnable +{ + ext.vamsas.IRegistry registry; // the root registry service. + private java.beans.PropertyChangeSupport changeSupport = new java.beans. + PropertyChangeSupport(this); + + /** + * change listeners are notified of "services" property changes + * + * @param listener to be added that consumes new services Hashtable object. + */ + public void addPropertyChangeListener( + java.beans.PropertyChangeListener listener) + { + changeSupport.addPropertyChangeListener(listener); + } + + /** + * + * + * @param listener to be removed + */ + public void removePropertyChangeListener( + java.beans.PropertyChangeListener listener) + { + changeSupport.removePropertyChangeListener(listener); + } + + /** + * Property change listener firing routine + * + * @param prop services + * @param oldvalue old services hash + * @param newvalue new services hash + */ + public void firePropertyChange(String prop, Object oldvalue, Object newvalue) + { + changeSupport.firePropertyChange(prop, oldvalue, newvalue); + } + + /** + * Initializes the server field with a valid service implementation. + * + * @return true if service was located. + */ + private IRegistry locateWebService(java.net.URL WsURL) + { + IRegistryServiceLocator loc = new IRegistryServiceLocator(); // Default + IRegistry server = null; + try + { + server = loc.getRegistryService(WsURL); + ( (RegistryServiceSoapBindingStub) server).setTimeout(60000); // One minute timeout + } + catch (Exception ex) + { + jalview.bin.Jalview.log.error( + "Serious! Service location failed\nfor URL :" + WsURL + + "\n", ex); + + return null; + } + + loc.getEngine().setOption("axis", "1"); + + return server; + } + + static private java.net.URL RootServiceURL = null; + static public Vector ServiceURLList = null; + static private boolean reallyDiscoverServices = true; + + public static java.util.Hashtable services = null; // vectors of services stored by abstractServiceType string + public static java.util.Vector serviceList = null; // flat list of services + + static + { + + try + { + reallyDiscoverServices = jalview.bin.Cache.getDefault("DISCOVER_SERVICES", false); + if (reallyDiscoverServices) + { + RootServiceURL = new java.net.URL( + "http://webservices.compbio.dundee.ac.uk:8080/jalTestWS/services/ServiceRegistry"); + if (ServiceURLList == null) + { + ServiceURLList = new Vector(); + } + if (!ServiceURLList.contains(RootServiceURL)) + { + ServiceURLList.add(RootServiceURL); + } + } + else + { + jalview.bin.Jalview.log.debug("Setting default services"); + services = new Hashtable(); + // Muscle, Clustal and JPred. + ServiceHandle[] defServices = { + new ServiceHandle( + "MsaWS", + "Edgar, Robert C. (2004), MUSCLE: multiple sequence alignment " + + "with high accuracy and high throughput, Nucleic Acids Research 32(5), 1792-97.", + "http://www.compbio.dundee.ac.uk/JalviewWS/services/MuscleWS", + "Muscle Multiple Protein Sequence Alignment" +), + new ServiceHandle( + "MsaWS", + "Thompson, J.D., Higgins, D.G. and Gibson, T.J. (1994) CLUSTAL W: improving the sensitivity of progressive multiple" + + " sequence alignment through sequence weighting, position specific gap penalties and weight matrix choice." + + " Nucleic Acids Research, 22 4673-4680", + "http://www.compbio.dundee.ac.uk/JalviewWS/services/ClustalWS", + "ClustalW Multiple Sequence Alignment"), + new ServiceHandle( + "SecStrPred", + "Cuff J. A and Barton G.J (1999) Application of enhanced " + + "multiple sequence alignment profiles to improve protein secondary structure prediction, " + + "Proteins 40:502-511", + "http://www.compbio.dundee.ac.uk/JalviewWS/services/jpred","JPred Secondary Structure Prediction" + )}; + services = new Hashtable(); + serviceList = new Vector(); + buildServiceLists(defServices, serviceList, services); + } + + } + catch (Exception e) + { + System.err.println( + "jalview.rootRegistry is not a proper url!\nWas set to " + + RootServiceURL + "\n" + e); + } + + } + // TODO: JBPNote : make this discover more services based on list of + // discovery service urls, break cyclic references to the same url and + // duplicate service entries (same endpoint *and* same interface) + private ServiceHandle[] getServices(java.net.URL location) + { + ServiceHandles shs = null; + try + { + jalview.bin.Jalview.log.debug("Discovering services using " + location); + shs = locateWebService(location).getServices(); + } + catch (Exception e) + { + System.err.println("failed to locate Services through URL : " + + location + "\n"); + e.printStackTrace(); + + } + if ( (shs != null) && shs.getServices().length > 0) + { + return shs.getServices(); + } + return null; + } + + /** + * Adds a list of services to the service catalog and categorised catalog + * returns true if ServiceURLList was modified with a new DiscoveryService URL + * @param sh ServiceHandle[] + * @param cat Vector + * @param sscat Hashtable + * @return boolean + */ + static private boolean buildServiceLists(ServiceHandle[] sh, Vector cat, + Hashtable sscat) + { + boolean seenNewDiscovery = false; + for (int i = 0, j = sh.length; i < j; i++) + { + if (!cat.contains(sh[i])) + { + jalview.bin.Jalview.log.debug("A " + sh[i].getAbstractName() + + " service called " + + sh[i].getName() + " exists at " + + sh[i].getEndpointURL() + "\n"); + if (!sscat.containsKey(sh[i].getAbstractName())) + { + sscat.put(sh[i].getAbstractName(), cat = new Vector()); + } + else + { + cat = (Vector) sscat.get(sh[i].getAbstractName()); + } + cat.add(sh[i]); + if (sh[i].getAbstractName().equals("Registry")) + { + for (int s = 0, sUrls = ServiceURLList.size(); s < sUrls; s++) + { + java.net.URL disc_serv = null; + try + { + disc_serv = new java.net.URL(sh[i].getEndpointURL()); + if (!ServiceURLList.contains(disc_serv)) + { + jalview.bin.Jalview.log.debug( + "Adding new discovery service at " + disc_serv); + ServiceURLList.add(disc_serv); + seenNewDiscovery = true; + } + } + catch (Exception e) + { + jalview.bin.Jalview.log.debug( + "Ignoring bad discovery service URL " + sh[i].getEndpointURL(), + e); + } + } + } + } + } + return seenNewDiscovery; + } + + public void discoverServices() + { + Hashtable sscat = new Hashtable(); + Vector cat = new Vector(); + ServiceHandle sh[] = null; + int s_url = 0; + if (ServiceURLList==null) + { + jalview.bin.Jalview.log.debug("No service endpoints to use for service discovery."); + return; + } + while (s_url < ServiceURLList.size()) + { + if ( (sh = getServices( (java.net.URL) ServiceURLList.get(s_url))) != null) + { + + buildServiceLists(sh, cat, sscat); + } + s_url++; + } + // TODO: decide on correct semantics for services list - PropertyChange + // provides a way of passing the new object around + // so no need to access original discovery thread. + // Curent decision is to change properties then notify listeners with old and new values. + Hashtable oldServices = services; + Vector oldServicelist = serviceList; + services = sscat; + serviceList = cat; + firePropertyChange("services", oldServices, services); + } + + public void run() + { + discoverServices(); + } +} -- 1.7.10.2