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;