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 2013/11/26 12:18:09 UTC

svn commit: r1545618 - in /incubator/sirona/trunk/agent/javaagent/src: main/java/org/apache/sirona/javaagent/SironaAgent.java test/java/org/apache/test/sirona/javaagent/IncludeExcludeTest.java

Author: rmannibucau
Date: Tue Nov 26 11:18:09 2013
New Revision: 1545618

URL: http://svn.apache.org/r1545618
Log:
adding excludes to javaagent config

Added:
    incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/IncludeExcludeTest.java
Modified:
    incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaAgent.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=1545618&r1=1545617&r2=1545618&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 Tue Nov 26 11:18:09 2013
@@ -35,7 +35,7 @@ public class SironaAgent {
         AgentContext.touch(); // important otherwise we can get NoClassDefFound if initialized lazily
         Configuration.is("", true); // a touch to force eager init
 
-        instrumentation.addTransformer(new SironaTransformer(agentArgs));
+        instrumentation.addTransformer(new SironaTransformer(agentArgs), true);
     }
 
 
@@ -57,7 +57,14 @@ public class SironaAgent {
         private PredicateEvaluator createEvaluator(final String agentArgs, final String str, final PredicateEvaluator defaultEvaluator) {
             if (agentArgs != null && agentArgs.contains(str)) {
                 final int start = agentArgs.indexOf(str) + str.length();
-                return new PredicateEvaluator(agentArgs.substring(start, Math.max(agentArgs.length(), agentArgs.indexOf('|', start))), ",");
+                final int separator = agentArgs.indexOf('|', start);
+                final int endIdx;
+                if (separator > 0) {
+                    endIdx = separator;
+                } else {
+                    endIdx = agentArgs.length();
+                }
+                return new PredicateEvaluator(agentArgs.substring(start, endIdx), ",");
             }
             return defaultEvaluator;
         }

Added: incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/IncludeExcludeTest.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/IncludeExcludeTest.java?rev=1545618&view=auto
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/IncludeExcludeTest.java (added)
+++ incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/IncludeExcludeTest.java Tue Nov 26 11:18:09 2013
@@ -0,0 +1,189 @@
+/*
+ * 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.test.sirona.javaagent;
+
+import org.apache.sirona.javaagent.SironaAgent;
+import org.junit.Test;
+
+import java.lang.instrument.ClassDefinition;
+import java.lang.instrument.ClassFileTransformer;
+import java.lang.instrument.IllegalClassFormatException;
+import java.lang.instrument.Instrumentation;
+import java.lang.instrument.UnmodifiableClassException;
+import java.util.jar.JarFile;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.fail;
+
+public class IncludeExcludeTest {
+    @Test
+    public void include() throws IllegalClassFormatException {
+        final InstrumentationForTestPurpose instrumentation = new InstrumentationForTestPurpose();
+        SironaAgent.agentmain("includes=prefix:org.foo", instrumentation);
+        final ClassFileTransformer transformer = instrumentation.getTransformer();
+        assertNotNull(transformer);
+
+        try {
+            transformer.transform(getClass().getClassLoader(), "org/foo", null, null, null);
+            fail("should fail since we retransform org/foo");
+        } catch (final NullPointerException npe) {
+            // ok
+        }
+        transformer.transform(getClass().getClassLoader(), "org/bar", null, null, null); // not included
+    }
+
+    @Test
+    public void exclude() throws IllegalClassFormatException {
+        final InstrumentationForTestPurpose instrumentation = new InstrumentationForTestPurpose();
+        SironaAgent.agentmain("excludes=prefix:org.foo", instrumentation);
+        final ClassFileTransformer transformer = instrumentation.getTransformer();
+        assertNotNull(transformer);
+
+        try {
+            transformer.transform(getClass().getClassLoader(), "org/bar", null, null, null);
+            fail("should fail since we transform org/bar");
+        } catch (final NullPointerException npe) {
+            // ok
+        }
+        transformer.transform(getClass().getClassLoader(), "org/foo", null, null, null);
+    }
+
+    @Test
+    public void includeExclude() throws IllegalClassFormatException {
+        final InstrumentationForTestPurpose instrumentation = new InstrumentationForTestPurpose();
+        SironaAgent.agentmain("includes=prefix:org.foo|excludes=prefix:org.foo.bar", instrumentation);
+        final ClassFileTransformer transformer = instrumentation.getTransformer();
+        assertNotNull(transformer);
+
+        try {
+            transformer.transform(getClass().getClassLoader(), "org/foo", null, null, null);
+            fail("should fail since we transform org/bar");
+        } catch (final NullPointerException npe) {
+            // ok
+        }
+        transformer.transform(getClass().getClassLoader(), "org/foo/bar/dummy", null, null, null);
+    }
+
+    @Test // include all what is possible
+    public void defaultConfig() throws IllegalClassFormatException {
+        final InstrumentationForTestPurpose instrumentation = new InstrumentationForTestPurpose();
+        SironaAgent.agentmain(null, instrumentation);
+        final ClassFileTransformer transformer = instrumentation.getTransformer();
+        assertNotNull(transformer);
+        try {
+            transformer.transform(getClass().getClassLoader(), "org/foo", null, null, null);
+            fail("should fail since we transform org/bar");
+        } catch (final NullPointerException npe) {
+            // ok
+        }
+        try {
+            transformer.transform(getClass().getClassLoader(), "org/bar", null, null, null);
+            fail("should fail since we transform org/bar");
+        } catch (final NullPointerException npe) {
+            // ok
+        }
+        try {
+            transformer.transform(getClass().getClassLoader(), "com/sun/dumy", null, null, null);
+            fail("should fail since we transform org/bar");
+        } catch (final NullPointerException npe) {
+            // ok
+        }
+    }
+
+    public static class InstrumentationForTestPurpose implements Instrumentation {
+        private ClassFileTransformer transformer;
+
+        public ClassFileTransformer getTransformer() {
+            return transformer;
+        }
+
+        @Override
+        public void addTransformer(final ClassFileTransformer transformer, final boolean canRetransform) {
+            addTransformer(transformer);
+        }
+
+        @Override
+        public void addTransformer(final ClassFileTransformer transformer) {
+            this.transformer = transformer;
+        }
+
+        @Override
+        public boolean removeTransformer(final ClassFileTransformer transformer) {
+            return false;
+        }
+
+        @Override
+        public boolean isRetransformClassesSupported() {
+            return false;
+        }
+
+        @Override
+        public void retransformClasses(final Class<?>... classes) throws UnmodifiableClassException {
+            // no-op
+        }
+
+        @Override
+        public boolean isRedefineClassesSupported() {
+            return false;
+        }
+
+        @Override
+        public void redefineClasses(final ClassDefinition... definitions) throws ClassNotFoundException, UnmodifiableClassException {
+            // no-op
+        }
+
+        @Override
+        public boolean isModifiableClass(final Class<?> theClass) {
+            return false;
+        }
+
+        @Override
+        public Class[] getAllLoadedClasses() {
+            return new Class[0];
+        }
+
+        @Override
+        public Class[] getInitiatedClasses(final ClassLoader loader) {
+            return new Class[0];
+        }
+
+        @Override
+        public long getObjectSize(final Object objectToSize) {
+            return 0;
+        }
+
+        @Override
+        public void appendToBootstrapClassLoaderSearch(final JarFile jarfile) {
+            // no-op
+        }
+
+        @Override
+        public void appendToSystemClassLoaderSearch(final JarFile jarfile) {
+            // no-op
+        }
+
+        @Override
+        public boolean isNativeMethodPrefixSupported() {
+            return false;
+        }
+
+        @Override
+        public void setNativeMethodPrefix(final ClassFileTransformer transformer, final String prefix) {
+            // no-op
+        }
+    }
+}