owenb 2002/11/19 09:50:32 Modified: java/src/org/apache/wsif/util WSIFPluggableProviders.java Log: Fix - if the same provider class name is found multiple times, only add the provider once. Trace - added extra event, entry, exit tracing and corrected the tracing of an ignored exception Revision Changes Path 1.6 +156 -139 xml-axis-wsif/java/src/org/apache/wsif/util/WSIFPluggableProviders.java Index: WSIFPluggableProviders.java =================================================================== RCS file: /home/cvs/xml-axis-wsif/java/src/org/apache/wsif/util/WSIFPluggableProviders.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- WSIFPluggableProviders.java 18 Sep 2002 15:38:19 -0000 1.5 +++ WSIFPluggableProviders.java 19 Nov 2002 17:50:31 -0000 1.6 @@ -107,23 +107,23 @@ * @author Ant Elder <[EMAIL PROTECTED]> */ public class WSIFPluggableProviders { - - // defines if providers will be loaded automatically - private static boolean autoLoadProviders = true; + + // defines if providers will be loaded automatically + private static boolean autoLoadProviders = true; // all the providers found in all the SPI files from // all the jar files in the classpath, in the order // they were found with the 1st in the ArrayList // being higher in the classpath. private static ArrayList providersFromSPIFiles; - + // a mapping of providers chosen to be supporting // a binding namespace. The mapping key is the // namespace URI, the value is the provider private static HashMap defaultNSProviders; - private static final String PLUGABLE_PROVIDER_FILENAME = - "META-INF/services/org.apache.wsif.spi.WSIFProvider"; + private static final String PLUGABLE_PROVIDER_FILENAME = + "META-INF/services/org.apache.wsif.spi.WSIFProvider"; /** * Gets a WSIFProvider for a particular bindng namespace URI. @@ -154,7 +154,7 @@ return null; } if (providers.size() == 1) { - provider = (WSIFProvider)providers.get(0); + provider = (WSIFProvider) providers.get(0); } else { provider = chooseProvider(providers, namespaceURI); } @@ -187,9 +187,10 @@ } if (provider == null) { - WSIFProvider p = (WSIFProvider) defaultNSProviders.get(providerNamespaceURI); - if ( defaultNSProviders != null ) { - defaultNSProviders.remove(providerNamespaceURI); + WSIFProvider p = + (WSIFProvider) defaultNSProviders.get(providerNamespaceURI); + if (defaultNSProviders != null) { + defaultNSProviders.remove(providerNamespaceURI); } } else { defaultNSProviders.put(providerNamespaceURI, provider); @@ -206,9 +207,9 @@ * binding namespace, otherwise false. */ public static boolean isProviderAvailable(String ns1) { - return isProviderAvailable( ns1, ns1 ); + return isProviderAvailable(ns1, ns1); } - + /** * Tests if a provider is available for the given namespaces. * @param ns1 the WSDL binding namespace URI @@ -217,22 +218,22 @@ * namespaces, otherwise false. */ public static boolean isProviderAvailable(String ns1, String ns2) { - boolean supported = false; - ArrayList ps = getSupportingProviders( ns1, false ); - if ( ps.size() > 0 ) { - if ( ns2 == null || ns2.length() < 1 || ns2.equals( ns1 ) ) { - supported = true; - } else { - String[] supportedNS; - for (int i=0; i<ps.size() && !supported; i++) { + boolean supported = false; + ArrayList ps = getSupportingProviders(ns1, false); + if (ps.size() > 0) { + if (ns2 == null || ns2.length() < 1 || ns2.equals(ns1)) { + supported = true; + } else { + String[] supportedNS; + for (int i = 0; i < ps.size() && !supported; i++) { supportedNS = ((WSIFProvider)ps.get(i)).getAddressNamespaceURIs(); for (int j=0; j<supportedNS.length && !supported; j++) { - if ( ns2.equals( supportedNS[j] )) { - supported = true; + if (ns2.equals(supportedNS[j])) { + supported = true; + } } - } - } - } + } + } } return supported; } @@ -249,10 +250,10 @@ */ public static void setAutoLoadProviders(boolean b) { Trc.entry(null, b); - if ( autoLoadProviders != b ) { - providersFromSPIFiles = null; - defaultNSProviders = null; - autoLoadProviders = b; + if (autoLoadProviders != b) { + providersFromSPIFiles = null; + defaultNSProviders = null; + autoLoadProviders = b; } Trc.exit(); } @@ -280,31 +281,43 @@ private static ArrayList getSupportingProviders( String namespaceURI, boolean issueMessage) { + + Trc.entry(null, namespaceURI, new Boolean(issueMessage)); if (providersFromSPIFiles == null) { providersFromSPIFiles = getAllDynamicWSIFProviders(); } ArrayList supportingProviders = new ArrayList(); String[] uris; WSIFProvider p; - for (Iterator i = providersFromSPIFiles.iterator(); i.hasNext(); ) { - p = (WSIFProvider) i.next(); + for (Iterator i = providersFromSPIFiles.iterator(); i.hasNext();) { + p = (WSIFProvider) i.next(); uris = p.getBindingNamespaceURIs(); for (int j = 0; j < uris.length; j++) { - if (namespaceURI != null && namespaceURI.equals(uris[j])) { - supportingProviders.add( p ); + if (namespaceURI != null && namespaceURI.equals(uris[j])) { + Trc.event( + null, + "Adding provider " + p + " for namespace " + uris[j]); + supportingProviders.add(p); } } } if (defaultNSProviders != null) { if (defaultNSProviders.get(namespaceURI) != null) { + Trc.event( + null, + "Adding default provider " + + defaultNSProviders.get(namespaceURI) + + " for namespace " + + namespaceURI); supportingProviders.add(defaultNSProviders.get(namespaceURI)); } - } + } if (supportingProviders.size() > 1 && issueMessage) { issueMultipleProvidersMsg(namespaceURI, supportingProviders); } - + + Trc.exit(supportingProviders); return supportingProviders; } @@ -315,111 +328,111 @@ * @return an array of WSIFProvider. */ private static ArrayList getAllDynamicWSIFProviders() { - if (!autoLoadProviders) { - return new ArrayList(); - } - - ArrayList al = (ArrayList) AccessController.doPrivileged( - new PrivilegedAction() { - public Object run() { + Trc.entry(null); + if (!autoLoadProviders) { + return new ArrayList(); + } + + ArrayList al = + (ArrayList) AccessController.doPrivileged(new PrivilegedAction() { + public Object run() { return findPlugableProviders(); - } - } ); - - return al; + } + }); + Trc.exit(al); + return al; } private static ArrayList findPlugableProviders() { - Object o; - ArrayList classNames = new ArrayList(); - ArrayList providers = new ArrayList(); - - // find all the class names mentioned in all the META-INF files - ClassLoader loader = Thread.currentThread().getContextClassLoader(); - try { - for(Enumeration e = loader.getResources( PLUGABLE_PROVIDER_FILENAME ); e.hasMoreElements(); ) { - classNames.addAll( readMETAINFClassNames( (URL) e.nextElement() ) ); - } - } catch (Exception ex) { - Trc.exception( ex ); - MessageLogger.log( - "WSIF.0003W", - ex.getMessage() ); - return providers; - } - - // instantiate a provider for each of the named classes - for (Iterator i=classNames.iterator(); i.hasNext(); ) { - try { - o = Class.forName( (String) i.next(), true, loader ).newInstance(); - if (o instanceof org.apache.wsif.spi.WSIFProvider) { - WSIFProvider p = (org.apache.wsif.spi.WSIFProvider) o; - if ( p.getBindingNamespaceURIs().length > 0 ) { - providers.add( p ); - } else { - WSIFException ex = new WSIFException( - "ignoring disabled WSIFProvider:" + - p.getClass().getName() ); - Trc.exception( ex ); - } - } else { - MessageLogger.log( - "WSIF.0003W", - "The provider class specified," + - ( (o == null) ? null : o.getClass().getName() ) + - ", does not implement org.apache.wsif.spi.WSIFProvider" ); - } - } catch (ClassNotFoundException ex) { - Trc.exception( ex ); - MessageLogger.log( - "WSIF.0003W", - ex.getMessage() ); - } catch (Exception ex) { - Trc.exception( ex ); - MessageLogger.log( - "WSIF.0003W", - ex.getMessage() ); - } - } + Object o; + ArrayList classNames = new ArrayList(); + ArrayList providers = new ArrayList(); + + // find all the class names mentioned in all the META-INF files + ClassLoader loader = Thread.currentThread().getContextClassLoader(); - return providers; + try { + for (Enumeration e = loader.getResources(PLUGABLE_PROVIDER_FILENAME); e.hasMoreElements();) { + readMETAINFClassNames((URL) e.nextElement(), classNames); + } + } catch (Exception ex) { + Trc.exception(ex); + MessageLogger.log("WSIF.0003W", ex.getMessage()); + return providers; + } + + // instantiate a provider for each of the named classes + for (Iterator i = classNames.iterator(); i.hasNext();) { + try { + o = Class.forName((String) i.next(), true, loader).newInstance(); + if (o instanceof org.apache.wsif.spi.WSIFProvider) { + WSIFProvider p = (org.apache.wsif.spi.WSIFProvider) o; + if (p.getBindingNamespaceURIs().length > 0) { + Trc.event(null, "Registering provider: " + p); + providers.add(p); + } else { + WSIFException ex = + new WSIFException( + "Disabled WSIFProvider found:" + + p.getClass().getName()); + Trc.ignoredException(ex); + } + } else { + MessageLogger.log( + "WSIF.0003W", + "The provider class specified," + + ((o == null) ? null : o.getClass().getName()) + + ", does not implement org.apache.wsif.spi.WSIFProvider"); + } + } catch (ClassNotFoundException ex) { + Trc.exception(ex); + MessageLogger.log("WSIF.0003W", ex.getMessage()); + } catch (Exception ex) { + Trc.exception(ex); + MessageLogger.log("WSIF.0003W", ex.getMessage()); + } + } + + return providers; } - private static ArrayList readMETAINFClassNames(URL u) { - ArrayList classNames = new ArrayList(); - BufferedReader in = null; + private static void readMETAINFClassNames(URL u, ArrayList classNames) { + Trc.entry(null, u); + Trc.event( + null, + "Reading provider class names from URL: " + u.toString()); + BufferedReader in = null; String inputLine; int i; - try { - in = new BufferedReader( new InputStreamReader( u.openStream() ) ); - while ((inputLine = in.readLine()) != null) { - i = inputLine.indexOf('#'); - if(i >= 0) { - inputLine = inputLine.substring(0, i); - } - inputLine = inputLine.trim(); - if (inputLine.length() > 0 ) { - classNames.add( inputLine ); - } - } - } catch (IOException ex) { - Trc.exception( ex ); - MessageLogger.log( - "WSIF.0003W", - ex.getMessage() ); - } finally { - if ( in != null ) { - try { - in.close(); - } catch (IOException ex) { - Trc.exception( ex ); - MessageLogger.log( - "WSIF.0003W", - ex.getMessage() ); - } - } - } - return classNames; + try { + in = new BufferedReader(new InputStreamReader(u.openStream())); + while ((inputLine = in.readLine()) != null) { + i = inputLine.indexOf('#'); + if (i >= 0) { + inputLine = inputLine.substring(0, i); + } + inputLine = inputLine.trim(); + if (inputLine.length() > 0) { + Trc.event(null, "Found provider class name: " + inputLine); + if (!classNames.contains(inputLine)) { + classNames.add(inputLine); + } + } + } + } catch (IOException ex) { + Trc.exception(ex); + MessageLogger.log("WSIF.0003W", ex.getMessage()); + } finally { + if (in != null) { + try { + in.close(); + } catch (IOException ex) { + Trc.exception(ex); + MessageLogger.log("WSIF.0003W", ex.getMessage()); + } + } + } + Trc.exit(); } /** @@ -437,15 +450,16 @@ if (providers == null || providers.size() < 1) { return null; } else if (providers.size() == 1) { - return (WSIFProvider)providers.get(0); + return (WSIFProvider) providers.get(0); } int i = providers.size() - 1; - while (i > 0 && !isDefaultProvider((WSIFProvider)providers.get(i), uri)) { + while (i > 0 + && !isDefaultProvider((WSIFProvider) providers.get(i), uri)) { i--; } WSIFProvider p = (WSIFProvider) providers.get(i); - issueChosenProviderMsg( uri, p ); + issueChosenProviderMsg(uri, p); return p; } @@ -458,21 +472,24 @@ * @return true if className is defined as the default WSIFprovider, * otherwise false. */ - private static boolean isDefaultProvider(WSIFProvider provider, String uri) { + private static boolean isDefaultProvider( + WSIFProvider provider, + String uri) { String className = provider.getClass().getName(); String defaultURI; try { String key = WSIFConstants.WSIF_PROP_PROVIDER_PFX1 + className; int n = Integer.parseInt(WSIFProperties.getProperty(key)); for (int i = 1; i <= n; i++) { - key = WSIFConstants.WSIF_PROP_PROVIDER_PFX2 + i + "." + className; + key = + WSIFConstants.WSIF_PROP_PROVIDER_PFX2 + i + "." + className; defaultURI = WSIFProperties.getProperty(key); - if (uri != null && uri.equals(defaultURI)) { + if (uri != null && uri.equals(defaultURI)) { return true; } } } catch (NumberFormatException e) { // ignore any error - Trc.ignoredException(e); + Trc.ignoredException(e); } // ignore any error return false; } @@ -490,7 +507,7 @@ for (int i = 1; i < providers.size(); i++) { providerNames += ", " + providers.get(i).getClass().getName(); } - MessageLogger.log("WSIF.0006W",uri, providerNames); + MessageLogger.log("WSIF.0006W", uri, providerNames); } /**