mx4j/src/core/mx4j/remote ProviderFactory.java,1.4,1.5

Simone Bordet <[email protected]> Wed, 16 Feb 2005 15:29:59 +0000
Newsgroups gmane.comp.java.mx4j.cvs
Message-ID <[email protected]>
Update of /cvsroot/mx4j/mx4j/src/core/mx4j/remote
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21347/src/core/mx4j/remote

Modified Files:
	ProviderFactory.java 
Log Message:
Added support for reading service providers from META-INF/services

Index: ProviderFactory.java
===================================================================
RCS file: /cvsroot/mx4j/mx4j/src/core/mx4j/remote/ProviderFactory.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** ProviderFactory.java	13 Nov 2004 16:38:20 -0000	1.4
--- ProviderFactory.java	16 Feb 2005 15:29:57 -0000	1.5
***************
*** 9,16 ****
--- 9,28 ----
  package mx4j.remote;
  
+ import java.io.BufferedReader;
  import java.io.IOException;
+ import java.io.InputStream;
+ import java.io.InputStreamReader;
+ import java.lang.reflect.Array;
  import java.net.MalformedURLException;
+ import java.net.URL;
+ import java.security.AccessController;
+ import java.security.PrivilegedActionException;
+ import java.security.PrivilegedExceptionAction;
+ import java.util.ArrayList;
+ import java.util.Enumeration;
+ import java.util.List;
  import java.util.Map;
  import java.util.StringTokenizer;
+ 
  import javax.management.remote.JMXConnectorFactory;
  import javax.management.remote.JMXConnectorProvider;
***************
*** 33,37 ****
        String providerPackages = findProviderPackageList(env, JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES);
        ClassLoader classLoader = findProviderClassLoader(env, JMXConnectorFactory.PROTOCOL_PROVIDER_CLASS_LOADER);
!       JMXConnectorProvider provider = (JMXConnectorProvider)loadProvider(providerPackages, protocol, MX4JRemoteConstants.CLIENT_PROVIDER_CLASS, classLoader);
        return provider;
     }
--- 45,49 ----
        String providerPackages = findProviderPackageList(env, JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES);
        ClassLoader classLoader = findProviderClassLoader(env, JMXConnectorFactory.PROTOCOL_PROVIDER_CLASS_LOADER);
!       JMXConnectorProvider provider = (JMXConnectorProvider)loadProvider(JMXConnectorProvider.class, providerPackages, protocol, MX4JRemoteConstants.CLIENT_PROVIDER_CLASS, classLoader);
        return provider;
     }
***************
*** 43,47 ****
        String providerPackages = findProviderPackageList(env, JMXConnectorServerFactory.PROTOCOL_PROVIDER_PACKAGES);
        ClassLoader classLoader = findProviderClassLoader(env, JMXConnectorServerFactory.PROTOCOL_PROVIDER_CLASS_LOADER);
!       JMXConnectorServerProvider provider = (JMXConnectorServerProvider)loadProvider(providerPackages, protocol, MX4JRemoteConstants.SERVER_PROVIDER_CLASS, classLoader);
        return provider;
     }
--- 55,59 ----
        String providerPackages = findProviderPackageList(env, JMXConnectorServerFactory.PROTOCOL_PROVIDER_PACKAGES);
        ClassLoader classLoader = findProviderClassLoader(env, JMXConnectorServerFactory.PROTOCOL_PROVIDER_CLASS_LOADER);
!       JMXConnectorServerProvider provider = (JMXConnectorServerProvider)loadProvider(JMXConnectorServerProvider.class, providerPackages, protocol, MX4JRemoteConstants.SERVER_PROVIDER_CLASS, classLoader);
        return provider;
     }
***************
*** 113,117 ****
     }
  
!    private static Object loadProvider(String packages, String protocol, String className, ClassLoader loader) throws JMXProviderException, MalformedURLException
     {
        Logger logger = getLogger();
--- 125,129 ----
     }
  
!    private static Object loadProvider(Class providerType, String packages, String protocol, String className, ClassLoader loader) throws JMXProviderException, MalformedURLException
     {
        Logger logger = getLogger();
***************
*** 155,161 ****
--- 167,255 ----
        }
  
+       try
+       {
+          Object[] serviceProviders = fromServiceProviders(providerType, loader);
+          // For now, return the first instance; later we may add some way to prefer one instance or the other
+          if (serviceProviders.length > 0) return serviceProviders[0];
+       }
+       catch (IOException x)
+       {
+          if (logger.isEnabledFor(Logger.DEBUG)) logger.debug("Error retrieving service providers", x);
+       }
+ 
        // Nothing found
        if (logger.isEnabledFor(Logger.DEBUG)) logger.debug("Could not find provider for protocol " + protocol + " in package list '" + packages + "'");
        throw new MalformedURLException("Could not find provider for protocol " + protocol + " in package list '" + packages + "'");
     }
+ 
+    public static Object[] fromServiceProviders(Class providerType, ClassLoader loader) throws IOException
+    {
+       String services = "META-INF/services/";
+ 
+       Logger logger = getLogger();
+       if (logger.isEnabledFor(Logger.DEBUG)) logger.debug("Loading providers from " + services);
+ 
+       if (loader == null) loader = Thread.currentThread().getContextClassLoader();
+       if (loader == null) loader = ClassLoader.getSystemClassLoader();
+       Enumeration providerURLs = loader.getResources(services + providerType.getName());
+       List providers = new ArrayList();
+       while (providerURLs.hasMoreElements())
+       {
+          final URL providerURL = (URL)providerURLs.nextElement();
+ 
+          InputStream stream = null;
+          try
+          {
+             stream = (InputStream)AccessController.doPrivileged(new PrivilegedExceptionAction()
+             {
+                public Object run() throws Exception
+                {
+                   return providerURL.openStream();
+                }
+             });
+          }
+          catch (PrivilegedActionException x)
+          {
+             Exception xx = x.getException();
+             if (xx instanceof IOException) throw (IOException)xx;
+             throw new IOException(xx.toString());
+          }
+ 
+          BufferedReader reader = null;
+          try
+          {
+             if (logger.isEnabledFor(Logger.DEBUG)) logger.debug("Reading provider from " + providerURL);
+             reader = new BufferedReader(new InputStreamReader(stream, "UTF-8"));
+             String line = null;
+             while ((line = reader.readLine()) != null)
+             {
+                int comment = line.indexOf('#');
+                if (comment >= 0) line = line.substring(0, comment);
+                line = line.trim();
+                if (line.length() == 0) continue;
+                try
+                {
+                   if (logger.isEnabledFor(Logger.DEBUG)) logger.debug("Found provider '" + line + "' in " + providerURL);
+                   Class providerClass = loader.loadClass(line);
+                   if (providerType.isAssignableFrom(providerClass))
+                   {
+                      Object providerInstance = providerClass.newInstance();
+                      providers.add(providerInstance);
+                   }
+                }
+                catch (Exception ignored)
+                {
+                   // Skip this line and continue
+                }
+             }
+          }
+          finally
+          {
+             if (reader != null) reader.close();
+          }
+       }
+ 
+       if (logger.isEnabledFor(Logger.DEBUG)) logger.debug("Providers found: " + providers);
+       return providers.toArray((Object[])Array.newInstance(providerType, 0));
+    }
  }



-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now.
http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click