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