You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mb...@apache.org on 2013/04/28 04:37:36 UTC

svn commit: r1476708 - in /commons/sandbox/weaver/trunk: modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/ processor/src/main/java/org/apache/commons/weaver/ processor/src/main/java/org/apache/commons/weaver/model/ processor...

Author: mbenson
Date: Sun Apr 28 02:37:36 2013
New Revision: 1476708

URL: http://svn.apache.org/r1476708
Log:
refactor Weaver and Cleaner APIs to remote statefulness, which would be A Bad Thing to do with (seemingly cached) service impls

Added:
    commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/model/Scanner.java
    commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeaveEnvironment.java
Modified:
    commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/PrivilizerCleaner.java
    commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/PrivilizerWeaver.java
    commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/CleanProcessor.java
    commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/Finder.java
    commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/WeaveProcessor.java
    commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/spi/Cleaner.java
    commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/spi/Weaver.java
    commons/sandbox/weaver/trunk/processor/src/test/java/org/apache/commons/weaver/test/weaver/TestCleaner.java
    commons/sandbox/weaver/trunk/processor/src/test/java/org/apache/commons/weaver/test/weaver/TestWeaver.java

Modified: commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/PrivilizerCleaner.java
URL: http://svn.apache.org/viewvc/commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/PrivilizerCleaner.java?rev=1476708&r1=1476707&r2=1476708&view=diff
==============================================================================
--- commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/PrivilizerCleaner.java (original)
+++ commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/PrivilizerCleaner.java Sun Apr 28 02:37:36 2013
@@ -20,14 +20,14 @@ import java.lang.annotation.ElementType;
 import java.net.URLClassLoader;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Properties;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.weaver.model.ScanRequest;
-import org.apache.commons.weaver.model.ScanResult;
+import org.apache.commons.weaver.model.Scanner;
 import org.apache.commons.weaver.model.WeavableClass;
+import org.apache.commons.weaver.model.WeaveEnvironment;
 import org.apache.commons.weaver.model.WeaveInterest;
 import org.apache.commons.weaver.privilizer.Privilizer.Policy;
 import org.apache.commons.weaver.privilizer.Privilizer.Privilized;
@@ -48,33 +48,21 @@ public class PrivilizerCleaner implement
     private static final int ASM_FLAGS = ClassReader.SKIP_CODE + ClassReader.SKIP_DEBUG + ClassReader.SKIP_FRAMES;
     private static final Logger LOG = Logger.getLogger(PrivilizerCleaner.class.getName());
 
-    private File target;
-    private Privilizer.Policy policy;
-    private FileArchive fileArchive;
-
     @Override
-    public void configure(List<String> classpath, File target, Properties config) {
-        final ClassLoader classLoader = new URLClassLoader(URLArray.fromPaths(classpath));
-        fileArchive = new FileArchive(classLoader, target);
+    public boolean clean(WeaveEnvironment environment, Scanner scanner) {
+        final ClassLoader classLoader = new URLClassLoader(URLArray.fromPaths(environment.classpath));
+        final FileArchive fileArchive = new FileArchive(classLoader, environment.target);
 
-        final String policyConfig = config.getProperty(PrivilizerWeaver.CONFIG_POLICY);
-        policy =
+        final String policyConfig = environment.config.getProperty(PrivilizerWeaver.CONFIG_POLICY);
+        final Privilizer.Policy policy =
             StringUtils.isEmpty(policyConfig) ? Privilizer.Policy.defaultValue() : Privilizer.Policy
                 .valueOf(policyConfig);
-        this.target = target;
-    }
-
-    @Override
-    public ScanRequest getScanRequest() {
-        return new ScanRequest().add(WeaveInterest.of(Privilized.class, ElementType.TYPE));
-    }
-
-    @Override
-    public boolean clean(ScanResult scanResult) {
         final List<String> toDelete = new ArrayList<String>();
 
+        final ScanRequest scanRequest = new ScanRequest().add(WeaveInterest.of(Privilized.class, ElementType.TYPE));
+
         LOG.log(Level.FINE, "Cleaning classes privilized with policy other than {0}", policy);
-        for (WeavableClass<?> weavableClass : scanResult.getClasses().with(Privilized.class)) {
+        for (WeavableClass<?> weavableClass : scanner.scan(scanRequest).getClasses().with(Privilized.class)) {
             final Policy privilizedPolicy = weavableClass.getAnnotation(Privilized.class).value();
             if (privilizedPolicy == policy) {
                 continue;
@@ -105,7 +93,7 @@ public class PrivilizerCleaner implement
         }
         boolean result = false;
         for (String className : toDelete) {
-            final File classfile = new File(target, toResourcePath(className));
+            final File classfile = new File(environment.target, toResourcePath(className));
             final boolean success = classfile.delete();
             LOG.log(Level.FINE, "Deletion of {0} was {1}.", new Object[] { classfile,
                 success ? "successful" : "unsuccessful" });
@@ -117,4 +105,5 @@ public class PrivilizerCleaner implement
     private static String toResourcePath(String className) {
         return className.replace('.', '/') + ".class";
     }
+
 }

Modified: commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/PrivilizerWeaver.java
URL: http://svn.apache.org/viewvc/commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/PrivilizerWeaver.java?rev=1476708&r1=1476707&r2=1476708&view=diff
==============================================================================
--- commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/PrivilizerWeaver.java (original)
+++ commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/PrivilizerWeaver.java Sun Apr 28 02:37:36 2013
@@ -15,12 +15,9 @@
  */
 package org.apache.commons.weaver.privilizer;
 
-import java.io.File;
 import java.io.IOException;
 import java.lang.annotation.ElementType;
 import java.net.URLClassLoader;
-import java.util.List;
-import java.util.Properties;
 
 import javassist.CannotCompileException;
 import javassist.ClassPool;
@@ -28,8 +25,9 @@ import javassist.CtClass;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.weaver.model.ScanRequest;
-import org.apache.commons.weaver.model.ScanResult;
+import org.apache.commons.weaver.model.Scanner;
 import org.apache.commons.weaver.model.WeavableClass;
+import org.apache.commons.weaver.model.WeaveEnvironment;
 import org.apache.commons.weaver.model.WeaveInterest;
 import org.apache.commons.weaver.privilizer.Privilizer.ModifiedClassWriter;
 import org.apache.commons.weaver.spi.Weaver;
@@ -46,54 +44,52 @@ public class PrivilizerWeaver implements
     public static final String CONFIG_ACCESS_LEVEL = CONFIG_WEAVER + "accessLevel";
     public static final String CONFIG_POLICY = CONFIG_WEAVER + "policy";
 
-    private Privilizer privilizer;
-
     @Override
-    public void configure(final List<String> classPath, final File target, final Properties config) {
-        final URLClassLoader urlClassLoader = new URLClassLoader(URLArray.fromPaths(classPath));
-        final ClassPool classPool = Assistant.createClassPool(urlClassLoader, target);
+    public boolean process(WeaveEnvironment environment, Scanner scanner) {
+        boolean result = false;
+        final Privilizer privilizer = buildPrivilizer(environment);
+
+        final ScanRequest scanRequest =
+            new ScanRequest().add(WeaveInterest.of(Privileged.class, ElementType.METHOD)).add(
+                WeaveInterest.of(Privilizing.class, ElementType.TYPE));
+
+        for (WeavableClass<?> weavableClass : scanner.scan(scanRequest).getClasses()) {
+            try {
+                result =
+                    privilizer.weaveClass(weavableClass.getTarget(), weavableClass.getAnnotation(Privilizing.class))
+                        | result;
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        }
+        return result;
+    }
+
+    private Privilizer buildPrivilizer(final WeaveEnvironment env) {
+        final URLClassLoader urlClassLoader = new URLClassLoader(URLArray.fromPaths(env.classpath));
+        final ClassPool classPool = Assistant.createClassPool(urlClassLoader, env.target);
         final ModifiedClassWriter modifiedClassWriter = new ModifiedClassWriter() {
 
             @Override
             public void write(CtClass type) throws CannotCompileException, IOException {
-                type.writeFile(target.getAbsolutePath());
+                type.writeFile(env.target.getAbsolutePath());
             }
         };
 
         final Privilizer.Builder builder = new Privilizer.Builder(classPool, modifiedClassWriter);
 
-        final String accessLevel = config.getProperty(CONFIG_ACCESS_LEVEL);
+        final String accessLevel = env.config.getProperty(CONFIG_ACCESS_LEVEL);
         if (StringUtils.isNotEmpty(accessLevel)) {
             builder.withTargetAccessLevel(AccessLevel.valueOf(accessLevel));
         }
 
-        final String policyConfig = config.getProperty(CONFIG_POLICY);
+        final String policyConfig = env.config.getProperty(CONFIG_POLICY);
 
         if (StringUtils.isNotEmpty(policyConfig)) {
             builder.withPolicy(Privilizer.Policy.valueOf(policyConfig));
         }
 
-        privilizer = builder.build();
+        return builder.build();
     }
 
-    @Override
-    public ScanRequest getScanRequest() {
-        return new ScanRequest().add(WeaveInterest.of(Privileged.class, ElementType.METHOD)).add(
-            WeaveInterest.of(Privilizing.class, ElementType.TYPE));
-    }
-
-    @Override
-    public boolean process(ScanResult scanResult) {
-        boolean result = false;
-        for (WeavableClass<?> weavableClass : scanResult.getClasses()) {
-            try {
-                result =
-                    privilizer.weaveClass(weavableClass.getTarget(), weavableClass.getAnnotation(Privilizing.class))
-                        | result;
-            } catch (Exception e) {
-                throw new RuntimeException(e);
-            }
-        }
-        return result;
-    }
-}
+}
\ No newline at end of file

Modified: commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/CleanProcessor.java
URL: http://svn.apache.org/viewvc/commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/CleanProcessor.java?rev=1476708&r1=1476707&r2=1476708&view=diff
==============================================================================
--- commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/CleanProcessor.java (original)
+++ commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/CleanProcessor.java Sun Apr 28 02:37:36 2013
@@ -19,9 +19,6 @@
 package org.apache.commons.weaver;
 
 import java.io.File;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
 import java.net.URLClassLoader;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -30,12 +27,9 @@ import java.util.Properties;
 import java.util.ServiceLoader;
 
 import org.apache.commons.lang3.Validate;
-import org.apache.commons.weaver.model.ScanResult;
-import org.apache.commons.weaver.model.WeaveInterest;
+import org.apache.commons.weaver.model.WeaveEnvironment;
 import org.apache.commons.weaver.spi.Cleaner;
 import org.apache.commons.weaver.utils.URLArray;
-import org.apache.xbean.finder.Annotated;
-import org.apache.xbean.finder.Parameter;
 import org.apache.xbean.finder.archive.FileArchive;
 
 /**
@@ -71,9 +65,12 @@ public class CleanProcessor {
     /**
      * Create a new {@link CleanProcessor} instance.
      * 
-     * @param classpath not {@code null}
-     * @param target not {@code null}
-     * @param configuration not {@code null}
+     * @param classpath
+     *            not {@code null}
+     * @param target
+     *            not {@code null}
+     * @param configuration
+     *            not {@code null}
      */
     public CleanProcessor(List<String> classpath, File target, Properties configuration) {
         super();
@@ -88,64 +85,9 @@ public class CleanProcessor {
     public void clean() {
         final ClassLoader classLoader = new URLClassLoader(URLArray.fromPaths(classpath));
         final Finder finder = new Finder(new FileArchive(classLoader, target));
-        for (Cleaner weaver : CLEANERS) {
-            clean(finder, weaver);
+        final WeaveEnvironment env = new WeaveEnvironment(classpath, target, configuration);
+        for (Cleaner cleaner : CLEANERS) {
+            cleaner.clean(env, finder);
         }
     }
-
-    private void clean(final Finder finder, final Cleaner cleaner) {
-        cleaner.configure(classpath, target, configuration);
-        final ScanResult result = new ScanResult();
-
-        for (WeaveInterest interest : cleaner.getScanRequest().getInterests()) {
-            switch (interest.target) {
-                case PACKAGE:
-                    for (Annotated<Package> pkg : finder.withAnnotations().findAnnotatedPackages(
-                        interest.annotationType)) {
-                        result.getWeavable(pkg.get()).addAnnotations(pkg.getAnnotation(interest.annotationType));
-                    }
-                case TYPE:
-                    for (Annotated<Class<?>> type : finder.withAnnotations().findAnnotatedClasses(
-                        interest.annotationType)) {
-                        result.getWeavable(type.get()).addAnnotations(type.getAnnotation(interest.annotationType));
-                    }
-                    break;
-                case METHOD:
-                    for (Annotated<Method> method : finder.withAnnotations().findAnnotatedMethods(
-                        interest.annotationType)) {
-                        result.getWeavable(method.get()).addAnnotations(method.getAnnotation(interest.annotationType));
-                    }
-                    break;
-                case CONSTRUCTOR:
-                    for (Annotated<Constructor<?>> cs : finder.withAnnotations().findAnnotatedConstructors(
-                        interest.annotationType)) {
-                        result.getWeavable(cs.get()).addAnnotations(cs.getAnnotation(interest.annotationType));
-                    }
-                    break;
-                case FIELD:
-                    for (Annotated<Field> fld : finder.withAnnotations().findAnnotatedFields(interest.annotationType)) {
-                        result.getWeavable(fld.get()).addAnnotations(fld.getAnnotation(interest.annotationType));
-                    }
-                    break;
-                case PARAMETER:
-                    for (Annotated<Parameter<Method>> parameter : finder.withAnnotations()
-                        .findAnnotatedMethodParameters(interest.annotationType)) {
-                        result.getWeavable(parameter.get().getDeclaringExecutable())
-                            .getWeavableParameter(parameter.get().getIndex())
-                            .addAnnotations(parameter.getAnnotation(interest.annotationType));
-                    }
-                    for (Annotated<Parameter<Constructor<?>>> parameter : finder.withAnnotations()
-                        .findAnnotatedConstructorParameters(interest.annotationType)) {
-                        result.getWeavable(parameter.get().getDeclaringExecutable())
-                            .getWeavableParameter(parameter.get().getIndex())
-                            .addAnnotations(parameter.getAnnotation(interest.annotationType));
-                    }
-                    break;
-                default:
-                    // should we log something?
-                    break;
-            }
-        }
-        cleaner.clean(result);
-    }
 }

Modified: commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/Finder.java
URL: http://svn.apache.org/viewvc/commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/Finder.java?rev=1476708&r1=1476707&r2=1476708&view=diff
==============================================================================
--- commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/Finder.java (original)
+++ commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/Finder.java Sun Apr 28 02:37:36 2013
@@ -16,6 +16,10 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.commons.lang3.Validate;
+import org.apache.commons.weaver.model.ScanRequest;
+import org.apache.commons.weaver.model.ScanResult;
+import org.apache.commons.weaver.model.Scanner;
+import org.apache.commons.weaver.model.WeaveInterest;
 import org.apache.commons.weaver.utils.Annotations;
 import org.apache.xbean.asm.AnnotationVisitor;
 import org.apache.xbean.asm.Attribute;
@@ -29,7 +33,10 @@ import org.apache.xbean.finder.Annotatio
 import org.apache.xbean.finder.Parameter;
 import org.apache.xbean.finder.archive.Archive;
 
-class Finder extends AnnotationFinder {
+/**
+ * Scanner implementation.
+ */
+class Finder extends AnnotationFinder implements Scanner {
 
     private abstract class AnnotationInflater extends AnnotationCapturer {
         final Class<? extends Annotation> annotationType;
@@ -270,6 +277,9 @@ class Finder extends AnnotationFinder {
 
     }
 
+    /**
+     * Helper class for finding elements with annotations (including those with classfile-level retention).
+     */
     public class WithAnnotations {
         private WithAnnotations() {
         }
@@ -486,7 +496,12 @@ class Finder extends AnnotationFinder {
     }
 
     private final Map<Info, List<Annotation>> classfileAnnotations;
+    private final WithAnnotations withAnnotations = new WithAnnotations();
 
+    /**
+     * Create a new {@link Finder} instance.
+     * @param archive
+     */
     public Finder(Archive archive) {
         super(archive, false);
         classfileAnnotations = CLASSFILE_ANNOTATIONS.get();
@@ -494,7 +509,7 @@ class Finder extends AnnotationFinder {
     }
 
     public WithAnnotations withAnnotations() {
-        return new WithAnnotations();
+        return withAnnotations;
     }
 
     protected void readClassDef(InputStream in) throws IOException {
@@ -520,4 +535,58 @@ class Finder extends AnnotationFinder {
     public AnnotationFinder select(String... clazz) {
         throw new UnsupportedOperationException();
     }
+
+    @Override
+    public ScanResult scan(ScanRequest request) {
+        final ScanResult result = new ScanResult();
+
+        for (WeaveInterest interest : request.getInterests()) {
+            switch (interest.target) {
+            case PACKAGE:
+                for (Annotated<Package> pkg : this.withAnnotations().findAnnotatedPackages(interest.annotationType)) {
+                    result.getWeavable(pkg.get()).addAnnotations(pkg.getAnnotation(interest.annotationType));
+                }
+            case TYPE:
+                for (Annotated<Class<?>> type : this.withAnnotations().findAnnotatedClasses(interest.annotationType)) {
+                    result.getWeavable(type.get()).addAnnotations(type.getAnnotation(interest.annotationType));
+                }
+                break;
+            case METHOD:
+                for (Annotated<Method> method : this.withAnnotations().findAnnotatedMethods(interest.annotationType)) {
+                    result.getWeavable(method.get()).addAnnotations(method.getAnnotation(interest.annotationType));
+                }
+                break;
+            case CONSTRUCTOR:
+                for (Annotated<Constructor<?>> cs : this.withAnnotations().findAnnotatedConstructors(
+                    interest.annotationType)) {
+                    result.getWeavable(cs.get()).addAnnotations(cs.getAnnotation(interest.annotationType));
+                }
+                break;
+            case FIELD:
+                for (Annotated<Field> fld : this.withAnnotations().findAnnotatedFields(interest.annotationType)) {
+                    result.getWeavable(fld.get()).addAnnotations(fld.getAnnotation(interest.annotationType));
+                }
+                break;
+            case PARAMETER:
+                for (Annotated<Parameter<Method>> parameter : this.withAnnotations().findAnnotatedMethodParameters(
+                    interest.annotationType)) {
+                    result.getWeavable(parameter.get().getDeclaringExecutable())
+                        .getWeavableParameter(parameter.get().getIndex())
+                        .addAnnotations(parameter.getAnnotation(interest.annotationType));
+                }
+                for (Annotated<Parameter<Constructor<?>>> parameter : this.withAnnotations()
+                    .findAnnotatedConstructorParameters(interest.annotationType)) {
+                    result.getWeavable(parameter.get().getDeclaringExecutable())
+                        .getWeavableParameter(parameter.get().getIndex())
+                        .addAnnotations(parameter.getAnnotation(interest.annotationType));
+                }
+                break;
+            default:
+                // should we log something?
+                break;
+            }
+        }
+        return result;
+    }
+
 }

Modified: commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/WeaveProcessor.java
URL: http://svn.apache.org/viewvc/commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/WeaveProcessor.java?rev=1476708&r1=1476707&r2=1476708&view=diff
==============================================================================
--- commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/WeaveProcessor.java (original)
+++ commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/WeaveProcessor.java Sun Apr 28 02:37:36 2013
@@ -19,9 +19,6 @@
 package org.apache.commons.weaver;
 
 import java.io.File;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
 import java.net.URLClassLoader;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -30,12 +27,9 @@ import java.util.Properties;
 import java.util.ServiceLoader;
 
 import org.apache.commons.lang3.Validate;
-import org.apache.commons.weaver.model.ScanResult;
-import org.apache.commons.weaver.model.WeaveInterest;
+import org.apache.commons.weaver.model.WeaveEnvironment;
 import org.apache.commons.weaver.spi.Weaver;
 import org.apache.commons.weaver.utils.URLArray;
-import org.apache.xbean.finder.Annotated;
-import org.apache.xbean.finder.Parameter;
 import org.apache.xbean.finder.archive.FileArchive;
 
 /**
@@ -72,9 +66,12 @@ public class WeaveProcessor {
     /**
      * Create a new {@link WeaveProcessor} instance.
      * 
-     * @param classpath not {@code null}
-     * @param target not {@code null}
-     * @param configuration not {@code null}
+     * @param classpath
+     *            not {@code null}
+     * @param target
+     *            not {@code null}
+     * @param configuration
+     *            not {@code null}
      */
     public WeaveProcessor(List<String> classpath, File target, Properties configuration) {
         super();
@@ -89,64 +86,9 @@ public class WeaveProcessor {
     public void weave() {
         final ClassLoader classLoader = new URLClassLoader(URLArray.fromPaths(classpath));
         final Finder finder = new Finder(new FileArchive(classLoader, target));
+        final WeaveEnvironment env = new WeaveEnvironment(classpath, target, configuration);
         for (Weaver weaver : WEAVERS) {
-            weave(finder, weaver);
+            weaver.process(env, finder);
         }
     }
-
-    private void weave(final Finder finder, final Weaver weaver) {
-        weaver.configure(classpath, target, configuration);
-        final ScanResult result = new ScanResult();
-
-        for (WeaveInterest interest : weaver.getScanRequest().getInterests()) {
-            switch (interest.target) {
-                case PACKAGE:
-                    for (Annotated<Package> pkg : finder.withAnnotations().findAnnotatedPackages(
-                        interest.annotationType)) {
-                        result.getWeavable(pkg.get()).addAnnotations(pkg.getAnnotation(interest.annotationType));
-                    }
-                case TYPE:
-                    for (Annotated<Class<?>> type : finder.withAnnotations().findAnnotatedClasses(
-                        interest.annotationType)) {
-                        result.getWeavable(type.get()).addAnnotations(type.getAnnotation(interest.annotationType));
-                    }
-                    break;
-                case METHOD:
-                    for (Annotated<Method> method : finder.withAnnotations().findAnnotatedMethods(
-                        interest.annotationType)) {
-                        result.getWeavable(method.get()).addAnnotations(method.getAnnotation(interest.annotationType));
-                    }
-                    break;
-                case CONSTRUCTOR:
-                    for (Annotated<Constructor<?>> cs : finder.withAnnotations().findAnnotatedConstructors(
-                        interest.annotationType)) {
-                        result.getWeavable(cs.get()).addAnnotations(cs.getAnnotation(interest.annotationType));
-                    }
-                    break;
-                case FIELD:
-                    for (Annotated<Field> fld : finder.withAnnotations().findAnnotatedFields(interest.annotationType)) {
-                        result.getWeavable(fld.get()).addAnnotations(fld.getAnnotation(interest.annotationType));
-                    }
-                    break;
-                case PARAMETER:
-                    for (Annotated<Parameter<Method>> parameter : finder.withAnnotations()
-                        .findAnnotatedMethodParameters(interest.annotationType)) {
-                        result.getWeavable(parameter.get().getDeclaringExecutable())
-                            .getWeavableParameter(parameter.get().getIndex())
-                            .addAnnotations(parameter.getAnnotation(interest.annotationType));
-                    }
-                    for (Annotated<Parameter<Constructor<?>>> parameter : finder.withAnnotations()
-                        .findAnnotatedConstructorParameters(interest.annotationType)) {
-                        result.getWeavable(parameter.get().getDeclaringExecutable())
-                            .getWeavableParameter(parameter.get().getIndex())
-                            .addAnnotations(parameter.getAnnotation(interest.annotationType));
-                    }
-                    break;
-                default:
-                    // should we log something?
-                    break;
-            }
-        }
-        weaver.process(result);
-    }
 }

Added: commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/model/Scanner.java
URL: http://svn.apache.org/viewvc/commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/model/Scanner.java?rev=1476708&view=auto
==============================================================================
--- commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/model/Scanner.java (added)
+++ commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/model/Scanner.java Sun Apr 28 02:37:36 2013
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.commons.weaver.model;
+
+/**
+ * Scanner interface.
+ */
+public interface Scanner {
+
+    /**
+     * Perform the requested scan.
+     * 
+     * @param request
+     * @return ScanResult
+     */
+    ScanResult scan(ScanRequest request);
+}

Added: commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeaveEnvironment.java
URL: http://svn.apache.org/viewvc/commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeaveEnvironment.java?rev=1476708&view=auto
==============================================================================
--- commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeaveEnvironment.java (added)
+++ commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/model/WeaveEnvironment.java Sun Apr 28 02:37:36 2013
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.commons.weaver.model;
+
+import java.io.File;
+import java.util.Collections;
+import java.util.List;
+import java.util.Properties;
+
+import org.apache.commons.lang3.Validate;
+import org.apache.commons.weaver.spi.Cleaner;
+import org.apache.commons.weaver.spi.Weaver;
+
+/**
+ * Encapsulates the environment in which a {@link Weaver} or {@link Cleaner} must operate.
+ */
+public class WeaveEnvironment {
+    /**
+     * Classpath.
+     */
+    public final List<String> classpath;
+
+    /**
+     * Target where scannable/weavable classes reside.
+     */
+    public final File target;
+
+    /**
+     * Configuration properties. By convention, any configuration property should start with its name, e.g.
+     * "privilizer".
+     */
+    public final Properties config;
+
+    /**
+     * Create a new {@link WeaveEnvironment}.
+     * 
+     * @param classpath
+     * @param target
+     * @param config
+     */
+    public WeaveEnvironment(List<String> classpath, File target, Properties config) {
+        super();
+        this.classpath = Collections.unmodifiableList(Validate.notNull(classpath, "classpath"));
+        this.target = Validate.notNull(target, "target");
+        this.config = (Properties) Validate.notNull(config, "config").clone();
+    }
+
+}

Modified: commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/spi/Cleaner.java
URL: http://svn.apache.org/viewvc/commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/spi/Cleaner.java?rev=1476708&r1=1476707&r2=1476708&view=diff
==============================================================================
--- commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/spi/Cleaner.java (original)
+++ commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/spi/Cleaner.java Sun Apr 28 02:37:36 2013
@@ -18,36 +18,20 @@
  */
 package org.apache.commons.weaver.spi;
 
-import java.io.File;
-import java.util.List;
-import java.util.Properties;
-
-import org.apache.commons.weaver.model.ScanRequest;
-import org.apache.commons.weaver.model.ScanResult;
+import org.apache.commons.weaver.model.Scanner;
+import org.apache.commons.weaver.model.WeaveEnvironment;
 
 /**
  * SPI to provide a means for a weaver module to remove woven classes during incremental builds, if necessary.
  */
 public interface Cleaner {
     /**
-     * @see Weaver#configure(List, File, Properties)
+     * Using the supplied {@link Scanner}, clean a {@link WeaveEnvironment}.
      * 
-     * @param classpath the classpath to look up cross-references in during weaving
-     * @param target the File path where the classes to weave reside
-     * @param config additional configuration for all plugins.
-     */
-    void configure(List<String> classpath, File target, Properties config);
-
-    /**
-     * Get the scan request of this {@link Cleaner}.
-     */
-    ScanRequest getScanRequest();
-
-    /**
-     * Process the scanning results.
-     * 
-     * @param scanResult
+     * @param environment
+     * @param scanner
      * @return whether any work was done.
      */
-    boolean clean(ScanResult scanResult);
+    boolean clean(WeaveEnvironment environment, Scanner scanner);
+
 }

Modified: commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/spi/Weaver.java
URL: http://svn.apache.org/viewvc/commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/spi/Weaver.java?rev=1476708&r1=1476707&r2=1476708&view=diff
==============================================================================
--- commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/spi/Weaver.java (original)
+++ commons/sandbox/weaver/trunk/processor/src/main/java/org/apache/commons/weaver/spi/Weaver.java Sun Apr 28 02:37:36 2013
@@ -18,37 +18,20 @@
  */
 package org.apache.commons.weaver.spi;
 
-import java.io.File;
-import java.util.List;
-import java.util.Properties;
-
-import org.apache.commons.weaver.model.ScanRequest;
-import org.apache.commons.weaver.model.ScanResult;
+import org.apache.commons.weaver.model.Scanner;
+import org.apache.commons.weaver.model.WeaveEnvironment;
 
 /**
  * A {@link Weaver} implementation performs the byte code enhancement in the classes.
  */
 public interface Weaver {
     /**
-     * This is for now a simple way to configure a {@link Weaver}. By convention, any configuration property should
-     * start with its name, e.g. "privilizer".
+     * Using the supplied {@link Scanner}, process a {@link WeaveEnvironment}.
      * 
-     * @param classpath the classpath to look up cross-references in during weaving
-     * @param target the File path where the classes to weave reside
-     * @param config additional configuration for all plugins.
-     */
-    void configure(List<String> classpath, File target, Properties config);
-
-    /**
-     * Get the scan request.
-     */
-    ScanRequest getScanRequest();
-
-    /**
-     * Process the scanning results.
-     * 
-     * @param scanResult to process
+     * @param environment
+     * @param scanner
      * @return whether any work was done.
      */
-    boolean process(ScanResult scanResult);
+    boolean process(WeaveEnvironment environment, Scanner scanner);
+
 }

Modified: commons/sandbox/weaver/trunk/processor/src/test/java/org/apache/commons/weaver/test/weaver/TestCleaner.java
URL: http://svn.apache.org/viewvc/commons/sandbox/weaver/trunk/processor/src/test/java/org/apache/commons/weaver/test/weaver/TestCleaner.java?rev=1476708&r1=1476707&r2=1476708&view=diff
==============================================================================
--- commons/sandbox/weaver/trunk/processor/src/test/java/org/apache/commons/weaver/test/weaver/TestCleaner.java (original)
+++ commons/sandbox/weaver/trunk/processor/src/test/java/org/apache/commons/weaver/test/weaver/TestCleaner.java Sun Apr 28 02:37:36 2013
@@ -20,47 +20,32 @@ package org.apache.commons.weaver.test.w
 
 import java.io.File;
 import java.lang.annotation.ElementType;
-import java.util.List;
-import java.util.Properties;
 
 import org.apache.commons.weaver.model.ScanRequest;
-import org.apache.commons.weaver.model.ScanResult;
+import org.apache.commons.weaver.model.Scanner;
 import org.apache.commons.weaver.model.WeavableClass;
+import org.apache.commons.weaver.model.WeaveEnvironment;
 import org.apache.commons.weaver.model.WeaveInterest;
 import org.apache.commons.weaver.spi.Cleaner;
 import org.apache.commons.weaver.test.beans.TestAnnotation;
-import org.junit.Assert;
 
 /**
  */
 public class TestCleaner implements Cleaner {
-    private File target;
 
     @Override
-    public void configure(List<String> classpath, File target, Properties config) {
-        Assert.assertNotNull(config);
-        Assert.assertEquals(1, config.size());
-
-        String configValue = (String) config.get("configKey");
-        Assert.assertEquals("configValue", configValue);
-
-        Assert.assertNotNull(target);
-        this.target = target;
-    }
+    public boolean clean(WeaveEnvironment environment, Scanner scanner) {
+        boolean result = false;
 
-    @Override
-    public ScanRequest getScanRequest() {
-        return new ScanRequest().add(WeaveInterest.of(TestAnnotation.class, ElementType.TYPE)).add(
-            WeaveInterest.of(TestAnnotation.class, ElementType.METHOD));
-    }
+        final ScanRequest scanRequest =
+            new ScanRequest().add(WeaveInterest.of(TestAnnotation.class, ElementType.TYPE)).add(
+                WeaveInterest.of(TestAnnotation.class, ElementType.METHOD));
 
-    @Override
-    public boolean clean(ScanResult scanResult) {
-        boolean result = false;
-        for (WeavableClass<?> weavableClass : scanResult.getClasses()) {
+        for (WeavableClass<?> weavableClass : scanner.scan(scanRequest).getClasses()) {
 
             final File classFile =
-                new File(target, weavableClass.getTarget().getName().replace('.', File.separatorChar) + ".class");
+                new File(environment.target, weavableClass.getTarget().getName().replace('.', File.separatorChar)
+                    + ".class");
             if (classFile.delete()) {
                 result = true;
             } else {

Modified: commons/sandbox/weaver/trunk/processor/src/test/java/org/apache/commons/weaver/test/weaver/TestWeaver.java
URL: http://svn.apache.org/viewvc/commons/sandbox/weaver/trunk/processor/src/test/java/org/apache/commons/weaver/test/weaver/TestWeaver.java?rev=1476708&r1=1476707&r2=1476708&view=diff
==============================================================================
--- commons/sandbox/weaver/trunk/processor/src/test/java/org/apache/commons/weaver/test/weaver/TestWeaver.java (original)
+++ commons/sandbox/weaver/trunk/processor/src/test/java/org/apache/commons/weaver/test/weaver/TestWeaver.java Sun Apr 28 02:37:36 2013
@@ -18,17 +18,17 @@
  */
 package org.apache.commons.weaver.test.weaver;
 
-import java.io.File;
 import java.lang.annotation.ElementType;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Properties;
 
 import org.apache.commons.weaver.model.ScanRequest;
 import org.apache.commons.weaver.model.ScanResult;
+import org.apache.commons.weaver.model.Scanner;
 import org.apache.commons.weaver.model.WeavableClass;
 import org.apache.commons.weaver.model.WeavableMethod;
+import org.apache.commons.weaver.model.WeaveEnvironment;
 import org.apache.commons.weaver.model.WeaveInterest;
 import org.apache.commons.weaver.spi.Weaver;
 import org.apache.commons.weaver.test.beans.TestAnnotation;
@@ -41,23 +41,21 @@ public class TestWeaver implements Weave
     public static List<Class<?>> wovenClasses = new ArrayList<Class<?>>();
 
     @Override
-    public void configure(List<String> classPath, File target, Properties config) {
-        Assert.assertNotNull(config);
-        Assert.assertEquals(1, config.size());
+    public boolean process(WeaveEnvironment environment, Scanner scanner) {
+        Assert.assertNotNull(environment.config);
+        Assert.assertEquals(1, environment.config.size());
+
+        String configValue = environment.config.getProperty("configKey");
 
-        String configValue = (String) config.get("configKey");
         Assert.assertEquals("configValue", configValue);
-    }
+        boolean result = false;
 
-    @Override
-    public ScanRequest getScanRequest() {
-        return new ScanRequest().add(WeaveInterest.of(TestAnnotation.class, ElementType.TYPE)).add(
-            WeaveInterest.of(TestAnnotation.class, ElementType.METHOD));
-    }
+        final ScanRequest scanRequest =
+            new ScanRequest().add(WeaveInterest.of(TestAnnotation.class, ElementType.TYPE)).add(
+                WeaveInterest.of(TestAnnotation.class, ElementType.METHOD));
+
+        final ScanResult scanResult = scanner.scan(scanRequest);
 
-    @Override
-    public boolean process(ScanResult scanResult) {
-        boolean result = false;
         for (WeavableClass<?> weavableClass : scanResult.getClasses().with(TestAnnotation.class)) {
             if (wovenClasses.add(weavableClass.getTarget())) {
                 result = true;