On Wed, Feb 23, 2005 at 02:40:53PM -0700, Art Gramlich wrote:
> On Tue, Feb 22, 2005 at 08:08:01PM -0500, WHIRLYCOTT wrote:
> > Torsten Curdt wrote:
> > 
> > >While I did some work with ASM I found it
> > >very nice to work with ...and so I wanted
> > >get rid of a direct BCEL dependency. Which
> > 
> > Fyi, I'm working on porting the current BCEL ClassTransformer over to ASM.
> > 
> > >...but for now I think rewriting on the
> > >package name is quite a useable alternative
> > >that probably will fit the real world
> > >requirements.
> > 
> > You have mentioned this before, but I don't understand how you envision 
> > this working.  Does this mean that a class originally in package 
> > com.foo.abc would be rewritten to rewritten.package.name by the 
> > transformer?  I'm fairly sure that I am not interpreting your idea 
> > correctly because this will almost certainly cause problems for 
> > instances of that class if they need to access package protected methods 
> > and fields in other classes.  If you could go into a bit of detail on 
> > this, it would be super.
> 
> Sorry if I butt in.  What we were talking about is how to decide is a class
> should be transformed.  Right now, the ContinuationClassLoader is checking if
> the package name starts with "org.apache.commons.javaflow.testcode" and 
> transforms
> it. Just for giggles, I just did a little patch to make that configurable 
> (and a set).
> Any opinions?
> 
> Art Gramlich
> 
> 

Sorry, that last bit of code was wrong since it didn't check child packages...

It should be


Index: java/org/apache/commons/javaflow/ContinuationClassLoader.java
===================================================================
--- src/java/org/apache/commons/javaflow/ContinuationClassLoader.java   
(revision 155031)
+++ src/java/org/apache/commons/javaflow/ContinuationClassLoader.java   
(working copy)
@@ -17,6 +17,8 @@
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.Set;
+import java.util.TreeSet;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.javaflow.bytecode.ClassTransformer;
@@ -33,66 +35,101 @@
     private final static Log log = 
LogFactory.getLog(ContinuationCompilingClassLoader.class);
     
     private ClassTransformer transformer = new BcelClassTransformer();
+    private Set packagesToTransform,packageRootsToTransform;
     
+    /*
     public ContinuationClassLoader(ClassLoader parent) {
+        this(parent, new HashSet());
+    }
+    */
+    
+    public ContinuationClassLoader(ClassLoader parent, Set 
packageRootsToTransform) {
         super(parent);
         //Repository.setRepository(new ClassLoaderRepository(parent));
+        this.packageRootsToTransform = packageRootsToTransform;
+        packagesToTransform = new TreeSet(packageRootsToTransform);
+    }
+    
+    protected boolean inPackageListOrSubPackage(String name) {
+           int index = name.lastIndexOf('.');
+           String packageName;
+           if (index == -1) {
+                       // If the class is in the default package, give the 
package name a single '.'
+                       packageName = ".";
+           } else {
+                       packageName = name.substring(0,index);
+           }
+           boolean shouldTransform = packagesToTransform.contains(packageName);
+           //log.debug("Checking if we should transform 
"+packageName+":"+shouldTransform);
+           if (shouldTransform || packageName.equals(".")) {
+                       return shouldTransform;
+           } else {
+                       return inPackageListOrSubPackage(packageName);
+           }
+    }
+    
+    protected boolean shouldTransform(String name) {
+           boolean should = inPackageListOrSubPackage(name);
+           if (should || !packagesToTransform.contains(name)) {
+               packagesToTransform.add(name);  
+           }
+           return should;
     }
 
     protected synchronized Class loadClass(String name, boolean resolve)
-            throws ClassNotFoundException {
-        
-        Class c = findLoadedClass(name);
-
-        if (c == null) {
-            if (!name.startsWith("java.") &&
-                !name.startsWith("javax.") &&
-                !name.startsWith("sun.") &&
-                !name.startsWith("org.xml.") &&
-                !name.startsWith("org.w3c.") &&
-                !name.startsWith("org.apache.commons.logging.")
-                ) {
-
-                final InputStream is = 
super.getResourceAsStream(name.replace('.','/') + ".class");
-                
-                if (is != null) {
-                    
-                    if 
(name.startsWith("org.apache.commons.javaflow.testcode")) {
-                        //log.debug("transforming " + name);
-                        
-                        final byte data[] = transformer.transform(is);
-                        return defineClass(name, data, 0, data.length);
-                    }
-
-                    try {
-                        final byte data[] = IOUtils.toByteArray(is);
-                        
-                        //log.debug("loading "+ name);
-                        
-                        return defineClass(name, data, 0, data.length);        
    
-                    } catch (final IOException e) {
-                        throw new ClassNotFoundException("could not read 
class", e);
-                    }                    
-                } else {
-                    log.debug("could not find " + name);
-                }
-            }
-            
-            final ClassLoader parent = getParent();
-            if (parent != null) {
-                //log.debug("parent loading " + name);
-                c = parent.loadClass(name);
-            } else {
-                throw new ClassNotFoundException(name);
-            }
-
-        } else {
-            log.debug("already loaded " + name);
-        }
-        
-        if (resolve) {
-            resolveClass(c);
-        }
-        return c;
+               throws ClassNotFoundException {
+           
+           Class c = findLoadedClass(name);
+       
+           if (c == null) {
+               if (!name.startsWith("java.") &&
+                   !name.startsWith("javax.") &&
+                   !name.startsWith("sun.") &&
+                   !name.startsWith("org.xml.") &&
+                   !name.startsWith("org.w3c.") &&
+                   !name.startsWith("org.apache.commons.logging.")
+                   ) {
+       
+                   final InputStream is = 
super.getResourceAsStream(name.replace('.','/') + ".class");
+                   
+                   if (is != null) {
+                       
+                       if (shouldTransform(name)) {
+                           //log.debug("transforming " + name);
+                           
+                           final byte data[] = transformer.transform(is);
+                           return defineClass(name, data, 0, data.length);
+                       }
+       
+                       try {
+                           final byte data[] = IOUtils.toByteArray(is);
+                           
+                           //log.debug("loading "+ name);
+                           
+                           return defineClass(name, data, 0, data.length);     
       
+                       } catch (final IOException e) {
+                           throw new ClassNotFoundException("could not read 
class", e);
+                       }                    
+                   } else {
+                       log.debug("could not find " + name);
+                   }
+               }
+               
+               final ClassLoader parent = getParent();
+               if (parent != null) {
+                   //log.debug("parent loading " + name);
+                   c = parent.loadClass(name);
+               } else {
+                   throw new ClassNotFoundException(name);
+               }
+       
+           } else {
+               log.debug("already loaded " + name);
+           }
+           
+           if (resolve) {
+               resolveClass(c);
+           }
+           return c;
+       }
     }
-}
Index: test/org/apache/commons/javaflow/AbstractClassLoaderTestCase.java
===================================================================
--- src/test/org/apache/commons/javaflow/AbstractClassLoaderTestCase.java       
(revision 155031)
+++ src/test/org/apache/commons/javaflow/AbstractClassLoaderTestCase.java       
(working copy)
@@ -16,7 +16,9 @@
 package org.apache.commons.javaflow;
 
 import java.lang.reflect.Method;
+import java.util.HashSet;
 import java.util.Map;
+import java.util.Set;
 
 import junit.framework.TestCase;
 
@@ -35,7 +37,9 @@
     }
           
     protected void call(final String methodName) throws Exception {
-        final ClassLoader cl = new 
ContinuationClassLoader(getClass().getClassLoader());
+        Set packages = new HashSet();
+        packages.add("org.apache.commons.javaflow.testcode");
+           final ClassLoader cl = new 
ContinuationClassLoader(getClass().getClassLoader(), packages);
         final Class clazz = cl.loadClass(clazzName);
         final Object instance = clazz.newInstance();
         assertNotNull(clazz);


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to