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 14:57:54 UTC
svn commit: r1545656 - in /incubator/sirona/trunk:
agent/javaagent/src/main/java/org/apache/sirona/javaagent/
agent/javaagent/src/main/java/org/apache/sirona/javaagent/listener/
agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/ core/src/m...
Author: rmannibucau
Date: Tue Nov 26 13:57:54 2013
New Revision: 1545656
URL: http://svn.apache.org/r1545656
Log:
SIRONA-12 SIRONA-13 allowing to use @AutoSet with InvocationListeners + config for CounterListener
Added:
incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/CounterListenerConfigTest.java
incubator/sirona/trunk/core/src/test/java/org/apache/sirona/configuration/IoCsTest.java
Modified:
incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/AgentContext.java
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/listener/CounterListener.java
incubator/sirona/trunk/core/src/main/java/org/apache/sirona/configuration/ioc/IoCs.java
incubator/sirona/trunk/core/src/main/java/org/apache/sirona/configuration/predicate/PredicateEvaluator.java
incubator/sirona/trunk/core/src/test/resources/sirona.properties
Modified: incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/AgentContext.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/AgentContext.java?rev=1545656&r1=1545655&r2=1545656&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/AgentContext.java (original)
+++ incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/AgentContext.java Tue Nov 26 13:57:54 2013
@@ -17,6 +17,7 @@
package org.apache.sirona.javaagent;
import org.apache.sirona.Role;
+import org.apache.sirona.configuration.ioc.IoCs;
import org.apache.sirona.counters.Counter;
import org.apache.sirona.javaagent.spi.InvocationListener;
import org.apache.sirona.javaagent.spi.Order;
@@ -51,7 +52,13 @@ public class AgentContext {
private static InvocationListener[] loadAllListeners() {
final Collection<InvocationListener> listeners = new LinkedList<InvocationListener>();
for (final InvocationListener listener : SPI.INSTANCE.find(InvocationListener.class, AgentContext.class.getClassLoader())) {
- listeners.add(listener);
+ InvocationListener autoset;
+ try {
+ autoset = IoCs.autoSet(listener);
+ } catch (final Exception e) {
+ autoset = listener;
+ }
+ listeners.add(autoset);
}
return listeners.toArray(new InvocationListener[listeners.size()]);
}
@@ -129,7 +136,7 @@ public class AgentContext {
}
}
- public static void touch() {
+ static void touch() {
// no-op
}
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=1545656&r1=1545655&r2=1545656&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 13:57:54 2013
@@ -50,7 +50,7 @@ public class SironaAgent {
private final PredicateEvaluator excludeEvaluator;
private SironaTransformer(final String agentArgs) {
- includeEvaluator = createEvaluator(agentArgs, "includes=", new PredicateEvaluator("regex:.*", ","));
+ includeEvaluator = createEvaluator(agentArgs, "includes=", new PredicateEvaluator("true:true", ","));
excludeEvaluator = createEvaluator(agentArgs, "excludes=", new PredicateEvaluator(null, null)); // no matching
}
Modified: incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/listener/CounterListener.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/listener/CounterListener.java?rev=1545656&r1=1545655&r2=1545656&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/listener/CounterListener.java (original)
+++ incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/listener/CounterListener.java Tue Nov 26 13:57:54 2013
@@ -17,18 +17,35 @@
package org.apache.sirona.javaagent.listener;
import org.apache.sirona.aop.AbstractPerformanceInterceptor;
+import org.apache.sirona.configuration.ioc.AutoSet;
+import org.apache.sirona.configuration.predicate.PredicateEvaluator;
import org.apache.sirona.counters.Counter;
import org.apache.sirona.javaagent.AgentContext;
import org.apache.sirona.javaagent.spi.InvocationListener;
import org.apache.sirona.javaagent.spi.Order;
@Order(0)
+@AutoSet
public class CounterListener extends AbstractPerformanceInterceptor<Counter.Key> implements InvocationListener {
private static final int KEY = 0;
- @Override // TODO: add config here?
+ private PredicateEvaluator includes = new PredicateEvaluator("true:true", ",");
+ private PredicateEvaluator excludes = new PredicateEvaluator(null, null);
+
+ @Override
public boolean accept(final Counter.Key key, final Object instance) {
- return true;
+ final String name = key.getName();
+ return includes.matches(name) && !excludes.matches(name);
+ }
+
+ // @AutoSet
+ public void setIncludes(final String includes) {
+ this.includes = new PredicateEvaluator(includes, ",");
+ }
+
+ // @AutoSet
+ public void setExcludes(final String excludes) {
+ this.excludes = new PredicateEvaluator(excludes, ",");
}
@Override
Added: incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/CounterListenerConfigTest.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/CounterListenerConfigTest.java?rev=1545656&view=auto
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/CounterListenerConfigTest.java (added)
+++ incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/CounterListenerConfigTest.java Tue Nov 26 13:57:54 2013
@@ -0,0 +1,70 @@
+/*
+ * 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.Role;
+import org.apache.sirona.counters.Counter;
+import org.apache.sirona.javaagent.listener.CounterListener;
+import org.apache.sirona.repositories.Repository;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class CounterListenerConfigTest {
+ private static final Counter.Key KEY = new Counter.Key(Role.PERFORMANCES, "org.apache.test.sirona.javaagent.CounterListenerConfigTest$Foo.fake");
+
+ private CounterListener listener;
+
+ @Before
+ public void before() {
+ listener = new CounterListener();
+ Repository.INSTANCE.clearCounters();
+ }
+
+ @AfterClass
+ public static void clear() {
+ Repository.INSTANCE.clearCounters();
+ }
+
+ @Test
+ public void include() {
+ listener.setExcludes(null);
+ listener.setIncludes("prefix:" + KEY.getName());
+ assertTrue(listener.accept(KEY, null));
+ }
+
+ @Test
+ public void exclude() {
+ listener.setExcludes("prefix:" + KEY.getName());
+ listener.setIncludes(null);
+ assertFalse(listener.accept(KEY, null));
+ }
+
+ @Test
+ public void includeExclude() {
+ listener.setExcludes("prefix:" + KEY.getName());
+ listener.setIncludes("prefix:" + KEY.getName());
+ assertFalse(listener.accept(KEY, null));
+
+ listener.setExcludes("prefix:" + KEY.getName() + "_");
+ listener.setIncludes("prefix:" + KEY.getName());
+ assertTrue(listener.accept(KEY, null));
+ }
+}
Modified: incubator/sirona/trunk/core/src/main/java/org/apache/sirona/configuration/ioc/IoCs.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/main/java/org/apache/sirona/configuration/ioc/IoCs.java?rev=1545656&r1=1545655&r2=1545656&view=diff
==============================================================================
--- incubator/sirona/trunk/core/src/main/java/org/apache/sirona/configuration/ioc/IoCs.java (original)
+++ incubator/sirona/trunk/core/src/main/java/org/apache/sirona/configuration/ioc/IoCs.java Tue Nov 26 13:57:54 2013
@@ -20,13 +20,14 @@ import org.apache.sirona.SironaException
import org.apache.sirona.configuration.Configuration;
import org.apache.sirona.util.ClassLoaders;
+import java.beans.Introspector;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.LinkedList;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@@ -34,6 +35,7 @@ import java.util.concurrent.ConcurrentHa
public final class IoCs {
private static final Map<Class<?>, Object> SINGLETONS = new ConcurrentHashMap<Class<?>, Object>();
private static final Collection<ToDestroy> INSTANCES = new ArrayList<ToDestroy>();
+ public static final String SETTER_PREFIX = "set";
private static Thread shutdownHook = null;
public static <T> T[] newInstances(final Class<T> api) {
@@ -81,7 +83,7 @@ public final class IoCs {
}
}
- private static <T> T newInstance(final Class<T> clazz, final String config) throws InstantiationException, IllegalAccessException, InvocationTargetException {
+ private static <T> T newInstance(final Class<T> clazz, final String config) throws Exception {
Class<?> loadedClass;
try {
loadedClass = ClassLoaders.current().loadClass(config);
@@ -99,7 +101,7 @@ public final class IoCs {
}
}
- private static <T> T internalProcessInstance(final T instance) throws IllegalAccessException, InvocationTargetException {
+ private static <T> T internalProcessInstance(final T instance) throws Exception {
final Class<?> loadedClass = instance.getClass();
// autoset before invoking @Created
@@ -133,16 +135,49 @@ public final class IoCs {
return instance;
}
- public static <T> void autoSet(final T instance, final Class<?> loadedClass) throws IllegalAccessException {
+ public static <T> T autoSet(final T instance) throws Exception {
+ return autoSet(instance, instance.getClass());
+ }
+
+ public static <T> T autoSet(final T instance, final Class<?> loadedClass) throws Exception {
Class<?> current = loadedClass;
while (current != null && !current.isInterface() && !Object.class.equals(current)) {
+ final Collection<String> done = new LinkedList<String>();
+ for (final Method method : loadedClass.getDeclaredMethods()) {
+ if (!(Void.TYPE.equals(method.getReturnType())
+ && method.getName().startsWith(SETTER_PREFIX)
+ && method.getParameterTypes().length == 1
+ && !Modifier.isStatic(method.getModifiers()))) {
+ continue;
+ }
+
+ final String name = Introspector.decapitalize(method.getName().substring(3));
+ final String value = Configuration.getProperty(loadedClass.getName() + "." + name, null);
+ if (value != null) {
+ done.add(name);
+
+ final boolean acc = method.isAccessible();
+ if (!acc) {
+ method.setAccessible(true);
+ }
+ try {
+ method.invoke(instance, convertTo(method.getParameterTypes()[0], value));
+ } finally {
+ if (!acc) {
+ method.setAccessible(false);
+ }
+ }
+ }
+ }
for (final Field field : loadedClass.getDeclaredFields()) {
- if (Modifier.isFinal(field.getModifiers())) {
+ if (Modifier.isFinal(field.getModifiers()) || done.contains(field.getName())) {
continue;
}
final String value = Configuration.getProperty(loadedClass.getName() + "." + field.getName(), null);
if (value != null) {
+ done.add(field.getName());
+
final boolean acc = field.isAccessible();
if (!acc) {
field.setAccessible(true);
@@ -158,6 +193,7 @@ public final class IoCs {
}
current = current.getSuperclass();
}
+ return instance;
}
public static void setSingletonInstance(final Class<?> clazz, final Object instance) {
Modified: incubator/sirona/trunk/core/src/main/java/org/apache/sirona/configuration/predicate/PredicateEvaluator.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/main/java/org/apache/sirona/configuration/predicate/PredicateEvaluator.java?rev=1545656&r1=1545655&r2=1545656&view=diff
==============================================================================
--- incubator/sirona/trunk/core/src/main/java/org/apache/sirona/configuration/predicate/PredicateEvaluator.java (original)
+++ incubator/sirona/trunk/core/src/main/java/org/apache/sirona/configuration/predicate/PredicateEvaluator.java Tue Nov 26 13:57:54 2013
@@ -19,6 +19,7 @@ package org.apache.sirona.configuration.
import org.apache.sirona.spi.SPI;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.Map;
import java.util.regex.Pattern;
@@ -27,6 +28,7 @@ public final class PredicateEvaluator {
private static final char SEPARATOR = ':';
private final Map<String, Predicate> predicates = new HashMap<String, Predicate>();
+ private final boolean truePredicate;
public PredicateEvaluator(final String configuration, final String sep) {
if (configuration != null && !configuration.isEmpty()) {
@@ -38,6 +40,7 @@ public final class PredicateEvaluator {
predicates.put(prefixPredicate.prefix(), prefixPredicate);
predicates.put(suffixPredicate.prefix(), suffixPredicate);
predicates.put(regexPredicate.prefix(), regexPredicate);
+ predicates.put(TruePredicate.INSTANCE.prefix(), TruePredicate.INSTANCE);
// SPI
for (final Predicate predicate : SPI.INSTANCE.find(Predicate.class, PredicateEvaluator.class.getClassLoader())) {
@@ -61,6 +64,11 @@ public final class PredicateEvaluator {
throw new IllegalArgumentException("Can't find prefix '" + prefix + "'");
}
+ if (predicate == TruePredicate.INSTANCE) {
+ truePredicate = true;
+ predicates.clear(); // no need to keep it in mem since we'll always return true
+ return;
+ }
final String value = trim.substring(separator + 1);
if (!value.startsWith(NOT)) {
@@ -69,10 +77,18 @@ public final class PredicateEvaluator {
predicate.addConfiguration(value.substring(1), false);
}
}
+ truePredicate = false;
+ } else {
+ truePredicate = false;
}
+ predicates.remove(TruePredicate.INSTANCE.prefix()); // no need to keep it in mem
}
public boolean matches(final String value) {
+ if (truePredicate) {
+ return true;
+ }
+
for (final Predicate predicate : predicates.values()) {
if (predicate.matches(value)) {
return true;
@@ -81,6 +97,29 @@ public final class PredicateEvaluator {
return false;
}
+ private static class TruePredicate implements Predicate {
+ private static final TruePredicate INSTANCE = new TruePredicate();
+
+ private TruePredicate() {
+ // no-op
+ }
+
+ @Override
+ public String prefix() {
+ return "true";
+ }
+
+ @Override
+ public boolean matches(final String value) {
+ return true;
+ }
+
+ @Override
+ public void addConfiguration(final String value, final boolean negative) {
+ // no-op
+ }
+ }
+
private static class SuffixPredicate implements Predicate {
private final Map<String, Boolean> suffixes = new HashMap<String, Boolean>();
Added: incubator/sirona/trunk/core/src/test/java/org/apache/sirona/configuration/IoCsTest.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/test/java/org/apache/sirona/configuration/IoCsTest.java?rev=1545656&view=auto
==============================================================================
--- incubator/sirona/trunk/core/src/test/java/org/apache/sirona/configuration/IoCsTest.java (added)
+++ incubator/sirona/trunk/core/src/test/java/org/apache/sirona/configuration/IoCsTest.java Tue Nov 26 13:57:54 2013
@@ -0,0 +1,60 @@
+/*
+ * 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.sirona.configuration;
+
+import org.apache.sirona.configuration.ioc.IoCs;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class IoCsTest {
+ @Test
+ public void field() throws Exception {
+ assertEquals("field-value", IoCs.autoSet(new Field()).field);
+ }
+
+ @Test
+ public void method() throws Exception {
+ assertEquals("method-value", IoCs.autoSet(new Method()).value);
+ }
+
+ @Test
+ public void methodPreventField() throws Exception {
+ assertEquals("method-value-again", IoCs.autoSet(new MethodNotField()).methodNotField.value);
+ }
+
+ public static class Field {
+ private String field;
+ }
+
+ public static class Method {
+ private String value;
+
+ public void setMethod(final String v) {
+ value = v;
+ }
+ }
+
+ public static class MethodNotField {
+ private Method methodNotField = null;
+
+ public void setMethodNotField(final String v) {
+ methodNotField = new Method();
+ methodNotField.setMethod(v);
+ }
+ }
+}
Modified: incubator/sirona/trunk/core/src/test/resources/sirona.properties
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/test/resources/sirona.properties?rev=1545656&r1=1545655&r2=1545656&view=diff
==============================================================================
--- incubator/sirona/trunk/core/src/test/resources/sirona.properties (original)
+++ incubator/sirona/trunk/core/src/test/resources/sirona.properties Tue Nov 26 13:57:54 2013
@@ -19,3 +19,7 @@ org.apache.sirona.spi.SPI = org.apache.s
org.apache.sirona.ehcache.methods=foo;bar;beer
org.apache.sirona.goodbeer=true
+
+org.apache.sirona.configuration.IoCsTest$Field.field = field-value
+org.apache.sirona.configuration.IoCsTest$Method.method = method-value
+org.apache.sirona.configuration.IoCsTest$MethodNotField.methodNotField = method-value-again