diff options
author | Roman Kennke <roman@kennke.org> | 2005-09-28 19:51:31 +0000 |
---|---|---|
committer | Roman Kennke <roman@kennke.org> | 2005-09-28 19:51:31 +0000 |
commit | af102a8ea6471207092a1105ebf67b58f0eb52db (patch) | |
tree | 26ac823412ba92b24b3d1d9534b242c445ede690 /java/rmi | |
parent | 6084c393cd5e909ddd56b5d4b53c071017779dc2 (diff) | |
download | classpath-af102a8ea6471207092a1105ebf67b58f0eb52db.tar.gz |
2005-09-28 Roman Kennke <kennke@aicas.com>
* java/rmi/server/RMIClassLoader.java:
Moved all implementation code to
gnu.java.rmi.server.RMIClassLoaderImpl.
(getProviderInstance): New helper method to find a provider.
(getDefaultProviderInstance): New helper method to find a provider.
(loadClass(String, String, Class)): New method.
* gnu/java/rmi/server/RMIClassLoaderImpl.java:
New class. The implementation is moved from
java.rmi.server.RMIClassLoader.
Diffstat (limited to 'java/rmi')
-rw-r--r-- | java/rmi/server/RMIClassLoader.java | 289 |
1 files changed, 50 insertions, 239 deletions
diff --git a/java/rmi/server/RMIClassLoader.java b/java/rmi/server/RMIClassLoader.java index a7a7cb84a..2838ab3d0 100644 --- a/java/rmi/server/RMIClassLoader.java +++ b/java/rmi/server/RMIClassLoader.java @@ -38,14 +38,9 @@ exception statement from your version. */ package java.rmi.server; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLClassLoader; -import java.util.ArrayList; -import java.util.Hashtable; -import java.util.Map; -import java.util.StringTokenizer; +import gnu.java.rmi.server.RMIClassLoaderImpl; +import java.net.MalformedURLException; /** * This class provides a set of public static utility methods for supporting @@ -60,221 +55,51 @@ public class RMIClassLoader */ private RMIClassLoader() {} - private static class MyClassLoader extends URLClassLoader - { - // Package-private to avoid a trampoline constructor. - MyClassLoader (URL[] urls, ClassLoader parent, String annotation) - { - super (urls, parent); - this.annotation = annotation; - } - - private MyClassLoader (URL[] urls, ClassLoader parent) - { - super (urls, parent); - this.annotation = urlToAnnotation (urls); - } - - public static String urlToAnnotation (URL[] urls) - { - if (urls.length == 0) - return null; - - StringBuffer annotation = new StringBuffer (64 * urls.length); - - for (int i = 0; i < urls.length; i++) - { - annotation.append (urls [i].toExternalForm()); - annotation.append (' '); - } - - return annotation.toString(); - } - - public final String getClassAnnotation() - { - return annotation; - } - - private final String annotation; - } - - /** - * This class is used to identify a cached classloader by its codebase and - * the context classloader that is its parent. - */ - private static class CacheKey - { - private String mCodeBase; - private ClassLoader mContextClassLoader; - - public CacheKey (String theCodebase, ClassLoader theContextClassLoader) - { - mCodeBase = theCodebase; - mContextClassLoader = theContextClassLoader; - } - - /** - * @return true if the codebase and the context classloader are equal - */ - public boolean equals (Object theOther) - { - if (theOther instanceof CacheKey) - { - CacheKey key = (CacheKey) theOther; - - return (equals (this.mCodeBase,key.mCodeBase) - && equals (this.mContextClassLoader, key.mContextClassLoader)); - } - return false; - } - - /** - * Test if the two objects are equal or both null. - * @param theOne - * @param theOther - * @return - */ - private boolean equals (Object theOne, Object theOther) - { - return theOne != null ? theOne.equals (theOther) : theOther == null; - } - - /** - * @return hashCode - */ - public int hashCode() - { - return ((mCodeBase != null ? mCodeBase.hashCode() : 0) - ^(mContextClassLoader != null ? mContextClassLoader.hashCode() : -1)); - } - - public String toString() - { - return "[" + mCodeBase + "," + mContextClassLoader + "]"; - } - - } - - private static Map cacheLoaders; //map annotations to loaders - private static Map cacheAnnotations; //map loaders to annotations - - //defaultAnnotation is got from system property - // "java.rmi.server.defaultAnnotation" - private static String defaultAnnotation; - - //URL object for defaultAnnotation - private static URL defaultCodebase; - - //class loader for defaultAnnotation - private static MyClassLoader defaultLoader; - - static - { - // 89 is a nice prime number for Hashtable initial capacity - cacheLoaders = new Hashtable (89); - cacheAnnotations = new Hashtable (89); - - defaultAnnotation = System.getProperty ("java.rmi.server.defaultAnnotation"); - - try - { - if (defaultAnnotation != null) - defaultCodebase = new URL (defaultAnnotation); - } - catch (Exception _) - { - defaultCodebase = null; - } - - if (defaultCodebase != null) - { - defaultLoader = new MyClassLoader (new URL[] { defaultCodebase }, null, - defaultAnnotation); - cacheLoaders.put (new CacheKey (defaultAnnotation, - Thread.currentThread().getContextClassLoader()), - defaultLoader); - } - } - /** * @deprecated */ - public static Class loadClass (String name) + public static Class loadClass(String name) throws MalformedURLException, ClassNotFoundException { - return loadClass ("", name); + return loadClass("", name); } - public static Class loadClass (String codebases, String name) + public static Class loadClass(String codebase, String name) throws MalformedURLException, ClassNotFoundException { - ClassLoader loader = Thread.currentThread().getContextClassLoader(); - - //try context class loader first - try - { - return Class.forName(name, false, loader); - } - catch (ClassNotFoundException e) - { - // class not found in the local classpath - } - - if (codebases.length() == 0) //=="" - { - loader = defaultLoader; - } - else - { - loader = getClassLoader(codebases); - } + RMIClassLoaderSpi spi = getProviderInstance(); + if (spi == null) + spi = getDefaultProviderInstance(); + return spi.loadClass(codebase, name, null); + } - if (loader == null) - { - //do not throw NullPointerException - throw new ClassNotFoundException ("Could not find class (" + name + - ") at codebase (" + codebases + ")"); - } - - return Class.forName(name, false, loader); + public static Class loadClass(String codebase, String name, + ClassLoader defaultLoader) + throws MalformedURLException, ClassNotFoundException + { + RMIClassLoaderSpi spi = getProviderInstance(); + if (spi == null) + spi = getDefaultProviderInstance(); + return spi.loadClass(codebase, name, defaultLoader); } /** * Gets a classloader for the given codebase and with the current * context classloader as parent. * - * @param codebases + * @param codebase * * @return a classloader for the given codebase * * @throws MalformedURLException if the codebase contains a malformed URL */ - public static ClassLoader getClassLoader (String codebases) + public static ClassLoader getClassLoader(String codebase) throws MalformedURLException { - ClassLoader loader; - CacheKey loaderKey = new CacheKey - (codebases, Thread.currentThread().getContextClassLoader()); - loader = (ClassLoader) cacheLoaders.get (loaderKey); - - if (loader == null) - { - //create an entry in cacheLoaders mapping a loader to codebases. - // codebases are separated by " " - StringTokenizer tok = new StringTokenizer (codebases, " "); - ArrayList urls = new ArrayList(); - - while (tok.hasMoreTokens()) - urls.add (new URL (tok.nextToken())); - - loader = new MyClassLoader ((URL[]) urls.toArray (new URL [urls.size()]), - Thread.currentThread().getContextClassLoader(), - codebases); - cacheLoaders.put (loaderKey, loader); - } - - return loader; + RMIClassLoaderSpi spi = getProviderInstance(); + if (spi == null) + spi = getDefaultProviderInstance(); + return spi.getClassLoader(codebase); } /** @@ -286,47 +111,12 @@ public class RMIClassLoader * @return a space seperated list of URLs where the class-definition * of cl may be found */ - public static String getClassAnnotation (Class cl) + public static String getClassAnnotation(Class cl) { - ClassLoader loader = cl.getClassLoader(); - - if (loader == null - || loader == ClassLoader.getSystemClassLoader()) - { - return System.getProperty ("java.rmi.server.codebase"); - } - - if (loader instanceof MyClassLoader) - { - return ((MyClassLoader) loader).getClassAnnotation(); - } - - String s = (String) cacheAnnotations.get (loader); - - if (s != null) - return s; - - if (loader instanceof URLClassLoader) - { - URL[] urls = ((URLClassLoader) loader).getURLs(); - - if (urls.length == 0) - return null; - - StringBuffer annotation = new StringBuffer (64 * urls.length); - - for (int i = 0; i < urls.length; i++) - { - annotation.append (urls [i].toExternalForm()); - annotation.append (' '); - } - - s = annotation.toString(); - cacheAnnotations.put (loader, s); - return s; - } - - return System.getProperty ("java.rmi.server.codebase"); + RMIClassLoaderSpi spi = getProviderInstance(); + if (spi == null) + spi = getDefaultProviderInstance(); + return spi.getClassAnnotation(cl); } /** @@ -336,4 +126,25 @@ public class RMIClassLoader { throw new Error ("Not implemented"); } + + /** + * Returns the default service provider for <code>RMIClassLoader</code>. + * + * @return the default provider for <code>RMIClassLoader</code> + */ + public static RMIClassLoaderSpi getDefaultProviderInstance() + { + return RMIClassLoaderImpl.getInstance(); + } + + /** + * Chooses, instantiates and returns a service provider. + * + * @return a service provider + */ + private static RMIClassLoaderSpi getProviderInstance() + { + // TODO: Do something more useful here. + return null; + } } |