You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sirona.apache.org by rm...@apache.org on 2015/03/19 14:30:33 UTC

svn commit: r1667741 - in /incubator/sirona/trunk: agent/javaagent/src/main/java/org/apache/sirona/javaagent/ agent/javaagent/src/test/java/org/apache/sirona/javaagent/ agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/ api/src/main/java/o...

Author: rmannibucau
Date: Thu Mar 19 13:30:32 2015
New Revision: 1667741

URL: http://svn.apache.org/r1667741
Log:
adding boolean as alias for true predicate + some exclusions (configurable) of classloader in javaagent - mainly temp classloader used for instrumentation/scanning

Modified:
    incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaAgent.java
    incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaTransformer.java
    incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/InJvmTransformerRunner.java
    incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/EnsureInstrumationDoesntFailTest.java
    incubator/sirona/trunk/api/src/main/java/org/apache/sirona/configuration/predicate/PredicateEvaluator.java

Modified: incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaAgent.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaAgent.java?rev=1667741&r1=1667740&r2=1667741&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaAgent.java (original)
+++ incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaAgent.java Thu Mar 19 13:30:32 2015
@@ -71,6 +71,7 @@ public class SironaAgent {
         }
 
         final boolean debug = "true".equalsIgnoreCase(extractConfig(agentArgs, "debug="));
+        final String tempClassLoaders = extractConfig(agentArgs, "tempClassLoaders=");
         final boolean envrtDebug = debug || "true".equalsIgnoreCase(extractConfig(agentArgs, "environment-debug="));
 
         final StringBuilder out = new StringBuilder();
@@ -122,7 +123,7 @@ public class SironaAgent {
                 System.out.println("Sirona debugging activated, find instrumented classes in /tmp/sirona-dump/");
             }
 
-            final SironaTransformer transformer = new SironaTransformer(debug);
+            final SironaTransformer transformer = new SironaTransformer(debug, tempClassLoaders);
             final boolean reloadable = instrumentation.isRetransformClassesSupported() && FORCE_RELOAD;
             instrumentation.addTransformer(transformer, reloadable);
 

Modified: incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaTransformer.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaTransformer.java?rev=1667741&r1=1667740&r2=1667741&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaTransformer.java (original)
+++ incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaTransformer.java Thu Mar 19 13:30:32 2015
@@ -30,20 +30,42 @@ public class SironaTransformer implement
     private static final String DELEGATING_CLASS_LOADER = "sun.reflect.DelegatingClassLoader";
 
     private final boolean debug;
+    private final String[] autoClassLoaderExcludes;
 
-    public SironaTransformer(final boolean debug) {
+    public SironaTransformer(final boolean debug, final String tempClassLoaders) {
         this.debug = debug || Boolean.getBoolean("sirona.javaagent.debug");
+
+        final String excludes = System.getProperty(
+                "sirona.javaagent.dontAutoClassLoaderExclude",
+                tempClassLoaders != null ?
+                        tempClassLoaders :
+                        "org.apache.openjpa.lib.util.TemporaryClassLoader,org.apache.openejb.core.TempClassLoader");
+        this.autoClassLoaderExcludes = excludes.split(" *, *");
     }
 
     @Override
     public byte[] transform(final ClassLoader loader, final String className, final Class<?> classBeingRedefined,
                             final ProtectionDomain protectionDomain, final byte[] classfileBuffer) throws IllegalClassFormatException {
-        if (shouldTransform(className, loader)) {
+        if (shouldTransform(className, loader) && !isExcludedLoader(loader)) {
             return doTransform(className, classfileBuffer);
         }
         return classfileBuffer;
     }
 
+    private boolean isExcludedLoader(final ClassLoader loader) {
+        if (loader == null) {
+            return false;
+        }
+
+        final String name = loader.getClass().getName();
+        for (int i = 0; i < autoClassLoaderExcludes.length; i++) {
+            if (autoClassLoaderExcludes[i].equals(name)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     protected byte[] doTransform(final String className, final byte[] classfileBuffer) {
         try {
             final ClassReader reader = new ClassReader(classfileBuffer);

Modified: incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/InJvmTransformerRunner.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/InJvmTransformerRunner.java?rev=1667741&r1=1667740&r2=1667741&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/InJvmTransformerRunner.java (original)
+++ incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/InJvmTransformerRunner.java Thu Mar 19 13:30:32 2015
@@ -148,7 +148,7 @@ public class InJvmTransformerRunner exte
                 byte[] buffer = IOUtils.toByteArray(is);
                 for (final Class<?> t : transformers) {
                     if (SironaTransformer.class.equals(t)) {
-                        final SironaTransformer transformer = new SironaTransformer(false);
+                        final SironaTransformer transformer = new SironaTransformer(false, null);
                         buffer = transformer.transform(this, className, null, null, buffer);
                     } else if (PCClassFileTransformer.class.equals(t)) {
                         if (name.endsWith("Entity")) {

Modified: incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/EnsureInstrumationDoesntFailTest.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/EnsureInstrumationDoesntFailTest.java?rev=1667741&r1=1667740&r2=1667741&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/EnsureInstrumationDoesntFailTest.java (original)
+++ incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/EnsureInstrumationDoesntFailTest.java Thu Mar 19 13:30:32 2015
@@ -26,7 +26,7 @@ import java.net.URLClassLoader;
 public class EnsureInstrumationDoesntFailTest {
     @Test // just check it doesn't throw an exception, mainly a debug test
     public void run() throws IllegalClassFormatException {
-        new SironaTransformer(true)
+        new SironaTransformer(true, null)
                 .transform(
                         new URLClassLoader(new URL[0]), App.class.getName().replace('.', '/'),
                         App.class, App.class.getProtectionDomain(), new byte[]{

Modified: incubator/sirona/trunk/api/src/main/java/org/apache/sirona/configuration/predicate/PredicateEvaluator.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/api/src/main/java/org/apache/sirona/configuration/predicate/PredicateEvaluator.java?rev=1667741&r1=1667740&r2=1667741&view=diff
==============================================================================
--- incubator/sirona/trunk/api/src/main/java/org/apache/sirona/configuration/predicate/PredicateEvaluator.java (original)
+++ incubator/sirona/trunk/api/src/main/java/org/apache/sirona/configuration/predicate/PredicateEvaluator.java Thu Mar 19 13:30:32 2015
@@ -45,6 +45,7 @@ public final class PredicateEvaluator {
             predicates.put(regexPredicate.prefix(), regexPredicate);
             predicates.put(containersPredicate.prefix(), containersPredicate);
             predicates.put(TruePredicate.INSTANCE.prefix(), TruePredicate.INSTANCE);
+            predicates.put("boolean", TruePredicate.INSTANCE); // just an alias for true since we can set false now
 
             // SPI
             for (final Predicate predicate : SPI.INSTANCE.find(Predicate.class, PredicateEvaluator.class.getClassLoader())) {
@@ -88,7 +89,10 @@ public final class PredicateEvaluator {
             trueValue = false;
             truePredicate = false;
         }
-        predicates.remove(TruePredicate.INSTANCE.prefix()); // no need to keep it in mem
+
+        // no need to keep it in mem
+        predicates.remove(TruePredicate.INSTANCE.prefix());
+        predicates.remove("boolean");
     }
 
     public boolean matches(final String value) {