00001
00026 package org.objectweb.jonas.server;
00027
00028 import java.lang.reflect.Method;
00029 import java.net.MalformedURLException;
00030 import java.net.URLClassLoader;
00031 import java.rmi.server.RMIClassLoaderSpi;
00032
00033
00040 public class RemoteClassLoaderSpi extends RMIClassLoaderSpi {
00041
00042
00043 private static boolean carolIsInitialized = false;
00044 private static boolean carolIsOptimized = false;
00045
00046
00047 private RMIClassLoaderSpi defRMISpi;
00048
00049 public RemoteClassLoaderSpi() {
00050 try {
00051 Class cl = Class.forName("java.rmi.server.RMIClassLoader");
00052 Method meth = cl.getMethod("getDefaultProviderInstance", new Class [0]);
00053 this.defRMISpi = (RMIClassLoaderSpi) meth.invoke(cl, new Object[0]);
00054 } catch (Exception e) {
00055
00056 }
00057 }
00058
00059 public Class loadClass(String codebase,
00060 String name,
00061 ClassLoader defaultLoader) throws MalformedURLException,
00062 ClassNotFoundException {
00063 return defRMISpi.loadClass(codebase, name, defaultLoader);
00064 }
00065
00066 public Class loadProxyClass(String codebase,
00067 String[] interfaces,
00068 ClassLoader defaultLoader) throws MalformedURLException,
00069 ClassNotFoundException {
00070 return defRMISpi.loadProxyClass(codebase, interfaces, defaultLoader);
00071 }
00072
00073 public ClassLoader getClassLoader(String codebase) throws MalformedURLException {
00074 return defRMISpi.getClassLoader(codebase);
00075 }
00076
00077
00078 public String getClassAnnotation(Class cl) {
00079 ClassLoader loader = cl.getClassLoader();
00080
00081 if (!carolIsInitialized) {
00082
00083 String sValue = System.getProperty("rmi.local.call", "init");
00084 if (!sValue.equals("init")) {
00085 carolIsOptimized = new Boolean(sValue).booleanValue();
00086 carolIsInitialized = true;
00087 }
00088
00089 }
00090
00091 if (loader instanceof JClassLoader) {
00092 return null;
00093 } else if ((loader instanceof URLClassLoader)&&(carolIsOptimized)){
00094 return null;
00095 } else {
00096 return defRMISpi.getClassAnnotation(cl);
00097 }
00098 }
00099 }