djencks     2005/03/17 03:23:46

  Modified:    modules/core/src/java/org/openejb/corba/util
                        OpenORBStubClassLoader.java
  Log:

  GERONIMO-612.  Track classes by name and TCCL
  
  Revision  Changes    Path
  1.3       +41 -29    
openejb/modules/core/src/java/org/openejb/corba/util/OpenORBStubClassLoader.java
  
  Index: OpenORBStubClassLoader.java
  ===================================================================
  RCS file: 
/home/projects/openejb/scm/openejb/modules/core/src/java/org/openejb/corba/util/OpenORBStubClassLoader.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- OpenORBStubClassLoader.java       12 Mar 2005 17:01:24 -0000      1.2
  +++ OpenORBStubClassLoader.java       17 Mar 2005 08:23:46 -0000      1.3
  @@ -49,19 +49,17 @@
   import java.net.URL;
   import java.net.URLClassLoader;
   import java.util.Collections;
  -import java.util.Hashtable;
  +import java.util.HashMap;
   import java.util.Map;
   
   import org.apache.commons.logging.Log;
   import org.apache.commons.logging.LogFactory;
  -
   import org.apache.geronimo.deployment.util.DeploymentUtil;
   import org.apache.geronimo.gbean.GBeanInfo;
   import org.apache.geronimo.gbean.GBeanInfoBuilder;
   import org.apache.geronimo.gbean.GBeanLifecycle;
   import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
   import org.apache.geronimo.system.serverinfo.ServerInfo;
  -
   import org.openejb.corba.compiler.CompilerException;
   import org.openejb.corba.compiler.StubGenerator;
   
  @@ -78,7 +76,8 @@
       private int state;
       private final StubGenerator stubGenerator;
       private final File cacheDir;
  -    private final Map loaders = new Hashtable();
  +    private final Map parentToNameToLoaderMap = new HashMap();
  +    private final Map nameToClassMap = new HashMap();
       private static long jarId = 0;
   
       public OpenORBStubClassLoader(ServerInfo serverInfo, StubGenerator 
stubGenerator, String cacheDir) {
  @@ -89,7 +88,9 @@
   
       public synchronized Class loadClass(String name) throws 
ClassNotFoundException {
   
  -        if (state == STOPPED) return null;
  +        if (state == STOPPED) {
  +            throw new ClassNotFoundException("OpenORBStubClassLoader is 
stopped");
  +        }
   
           if (log.isDebugEnabled()) log.debug("Load class " + name);
   
  @@ -97,33 +98,43 @@
           Class result = null;
           try {
               result = classLoader.loadClass(name);
  +            return result;
           } catch (ClassNotFoundException e) {
               if (log.isDebugEnabled()) log.debug("Unable to load class from 
the context class loader");
           }
   
  -        if (result != null) return result;
  -
  -        if (result == null && name.endsWith("_Stub")) {
  +        if (name.endsWith("_Stub")) {
               int begin = name.lastIndexOf('.') + 1;
               if (name.charAt(begin) == '_') {
  -                String iPackage = name.substring(0, begin);
  -                String iName = iPackage + name.substring(begin + 1, 
name.length() - 5);
  -                ClassLoader loader = (ClassLoader) loaders.get(name);
  +                Map nameToLoaderMap = (Map) 
parentToNameToLoaderMap.get(classLoader);
  +                ClassLoader loader = null;
  +                if (nameToLoaderMap == null) {
  +                    nameToLoaderMap = new HashMap();
  +                    parentToNameToLoaderMap.put(classLoader, 
nameToLoaderMap);
  +                } else {
  +                    loader = (ClassLoader) nameToLoaderMap.get(name);
  +                }
   
                   if (loader == null) {
  -                    File file = null;
  -                    try {
  -                        file = new File(cacheDir, "STUB_" + (jarId++) + 
".jar");
  -
  -                        if (log.isDebugEnabled()) log.debug("Generating 
stubs in " + file.toString());
  -
  -                        
stubGenerator.generateStubs(Collections.singleton(iName), file, classLoader);
  -                        loader = new URLClassLoader(new URL[]{file.toURL()}, 
classLoader);
  -                        loaders.put(name, loader);
  -                    } catch (IOException e) {
  -                        throw new ClassNotFoundException("Unable to generate 
stub", e);
  -                    } catch (CompilerException e) {
  -                        throw new ClassNotFoundException("Unable to generate 
stub", e);
  +                    URL url = (URL) nameToClassMap.get(name);
  +                    if (url == null) {
  +                        try {
  +
  +                            File file = new File(cacheDir, "STUB_" + 
(jarId++) + ".jar");
  +
  +                            if (log.isDebugEnabled()) log.debug("Generating 
stubs in " + file.toString());
  +
  +                            String iPackage = name.substring(0, begin);
  +                            String iName = iPackage + name.substring(begin + 
1, name.length() - 5);
  +                            
stubGenerator.generateStubs(Collections.singleton(iName), file, classLoader);
  +                            url = file.toURL();
  +                        } catch (IOException e) {
  +                            throw new ClassNotFoundException("Unable to 
generate stub", e);
  +                        } catch (CompilerException e) {
  +                            throw new ClassNotFoundException("Unable to 
generate stub", e);
  +                        }
  +                        loader = new URLClassLoader(new URL[]{url}, 
classLoader);
  +                        nameToLoaderMap.put(name, loader);
                       }
                   } else {
                       if (log.isDebugEnabled()) log.debug("Found cached 
loader");
  @@ -132,10 +143,10 @@
                   result = loader.loadClass(name);
   
                   if (log.isDebugEnabled()) log.debug("result: " + (result == 
null ? "NULL" : result.getName()));
  +                return result;
               }
           }
  -
  -        return result;
  +        throw new ClassNotFoundException("Could not load class: " + name);
       }
   
       public synchronized void doStart() throws Exception {
  @@ -151,7 +162,8 @@
   
       public synchronized void doStop() throws Exception {
           this.state = STOPPED;
  -        loaders.clear();
  +        parentToNameToLoaderMap.clear();
  +        nameToClassMap.clear();
           DeploymentUtil.recursiveDelete(cacheDir);
   
           log.info("Stopped");
  
  
  

Reply via email to