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