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/25 17:40:41 UTC
svn commit: r1475828 - in
/commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer:
FilesystemPrivilizer.java Privilizer.java PrivilizerWeaver.java
Author: mbenson
Date: Thu Apr 25 15:40:41 2013
New Revision: 1475828
URL: http://svn.apache.org/r1475828
Log:
refactor away the FilesystemPrivilizer
Removed:
commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/FilesystemPrivilizer.java
Modified:
commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/Privilizer.java
commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/PrivilizerWeaver.java
Modified: commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/Privilizer.java
URL: http://svn.apache.org/viewvc/commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/Privilizer.java?rev=1475828&r1=1475827&r2=1475828&view=diff
==============================================================================
--- commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/Privilizer.java (original)
+++ commons/sandbox/weaver/trunk/modules/privilizer/weaver/src/main/java/org/apache/commons/weaver/privilizer/Privilizer.java Thu Apr 25 15:40:41 2013
@@ -564,10 +564,6 @@ public abstract class Privilizer {
return AccessLevel.PRIVATE;
}
- protected boolean permitMethodWeaving(AccessLevel accessLevel) {
- return true;
- }
-
private CtClass createAction(CtClass type, CtMethod impl, Class<?> iface) throws NotFoundException,
CannotCompileException, IOException {
final boolean exc = impl.getExceptionTypes().length > 0;
@@ -664,7 +660,7 @@ public abstract class Privilizer {
private boolean weave(CtClass type, CtMethod method) throws ClassNotFoundException, CannotCompileException,
NotFoundException, IOException, IllegalAccessException {
final AccessLevel accessLevel = AccessLevel.of(method.getModifiers());
- if (!permitMethodWeaving(accessLevel)) {
+ if (getTargetAccessLevel().compareTo(accessLevel) > 0) {
throw new IllegalAccessException("Method " + type.getName() + "#" + toString(method)
+ " must have maximum access level '" + getTargetAccessLevel() + "' but is defined wider ('"
+ accessLevel + "')");
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=1475828&r1=1475827&r2=1475828&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 Thu Apr 25 15:40:41 2013
@@ -16,15 +16,25 @@
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;
+import javassist.CtClass;
+import javassist.LoaderClassPath;
+import javassist.NotFoundException;
+
+import org.apache.commons.lang3.StringUtils;
+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.WeavableClass;
import org.apache.commons.weaver.model.WeaveInterest;
+import org.apache.commons.weaver.privilizer.Privilizer.ModifiedClassWriter;
import org.apache.commons.weaver.spi.Weaver;
import org.apache.commons.weaver.utils.URLArray;
@@ -38,37 +48,69 @@ public class PrivilizerWeaver implements
public static final String CONFIG_ACCESS_LEVEL = CONFIG_WEAVER + "accessLevel";
public static final String CONFIG_POLICY = CONFIG_WEAVER + "policy";
+ private static ClassPool createClassPool(ClassLoader classpath, File target) {
+ final ClassPool result = new ClassPool();
+ try {
+ result.appendClassPath(validTarget(target).getAbsolutePath());
+ result.appendClassPath(new LoaderClassPath(classpath));
+ result.appendPathList(System.getProperty("java.class.path"));
+ } catch (final NotFoundException e) {
+ throw new RuntimeException(e);
+ }
+ return result;
+ }
+
+ private static File validTarget(File target) {
+ Validate.notNull(target, "target");
+ Validate.isTrue(target.isDirectory(), "not a directory");
+ return target;
+ }
+
private Privilizer privilizer;
private Privilizer.Policy policy;
private AccessLevel targetAccessLevel;
@Override
- public void configure(List<String> classPath, File target, Properties config) {
- String accessLevel = config.getProperty(CONFIG_ACCESS_LEVEL);
- if (accessLevel == null || accessLevel.length() == 0) {
- throw new IllegalArgumentException(CONFIG_ACCESS_LEVEL + " property is missing!");
- }
- targetAccessLevel = AccessLevel.valueOf(accessLevel);
+ public void configure(final List<String> classPath, final File target, final Properties config) {
+ final URLClassLoader urlClassLoader = new URLClassLoader(URLArray.fromPaths(classPath));
- String policyConfig = config.getProperty(CONFIG_POLICY);
- if (policyConfig == null || policyConfig.length() == 0) {
- throw new IllegalArgumentException(CONFIG_POLICY + " property is missing!");
+ final String accessLevel = config.getProperty(CONFIG_ACCESS_LEVEL);
+ if (StringUtils.isNotEmpty(accessLevel)) {
+ targetAccessLevel = AccessLevel.valueOf(accessLevel);
}
- policy = Privilizer.Policy.valueOf(policyConfig);
- final URLClassLoader urlClassLoader = new URLClassLoader(URLArray.fromPaths(classPath));
- privilizer = new FilesystemPrivilizer(policy, urlClassLoader, target) {
- @Override
- protected boolean permitMethodWeaving(final AccessLevel accessLevel) {
- return targetAccessLevel.compareTo(accessLevel) <= 0;
+ class ConfiguredPrivilizer extends Privilizer {
+
+ ConfiguredPrivilizer(ClassPool classPool, ModifiedClassWriter modifiedClassWriter, Policy policy) {
+ super(classPool, modifiedClassWriter, policy);
+ }
+
+ ConfiguredPrivilizer(ClassPool classPool, ModifiedClassWriter modifiedClassWriter) {
+ super(classPool, modifiedClassWriter);
}
@Override
protected AccessLevel getTargetAccessLevel() {
- return targetAccessLevel;
+ return targetAccessLevel == null ? super.getTargetAccessLevel() : targetAccessLevel;
+ }
+ }
+ final ClassPool classPool = createClassPool(urlClassLoader, target);
+ final ModifiedClassWriter modifiedClassWriter = new ModifiedClassWriter() {
+
+ @Override
+ public void write(CtClass type) throws CannotCompileException, IOException {
+ type.writeFile(target.getAbsolutePath());
}
};
+ final String policyConfig = config.getProperty(CONFIG_POLICY);
+
+ if (StringUtils.isNotEmpty(policyConfig)) {
+ policy = Privilizer.Policy.valueOf(policyConfig);
+ privilizer = new ConfiguredPrivilizer(classPool, modifiedClassWriter, policy);
+ } else {
+ privilizer = new ConfiguredPrivilizer(classPool, modifiedClassWriter);
+ }
}
@Override