You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by rm...@apache.org on 2013/10/15 09:50:20 UTC

svn commit: r1532236 - in /commons/sandbox/monitoring/trunk/cdi/src: main/java/org/apache/commons/monitoring/cdi/internal/ main/resources/META-INF/services/ test/java/org/apache/commons/monitoring/cdi/ test/resources/

Author: rmannibucau
Date: Tue Oct 15 07:50:19 2013
New Revision: 1532236

URL: http://svn.apache.org/r1532236
Log:
allowing to configure cdi monitoring through properties file

Added:
    commons/sandbox/monitoring/trunk/cdi/src/main/java/org/apache/commons/monitoring/cdi/internal/
    commons/sandbox/monitoring/trunk/cdi/src/main/java/org/apache/commons/monitoring/cdi/internal/CommonsMonitoringPerformanceExtension.java
    commons/sandbox/monitoring/trunk/cdi/src/main/java/org/apache/commons/monitoring/cdi/internal/WrappedAnnotatedType.java
    commons/sandbox/monitoring/trunk/cdi/src/main/resources/META-INF/services/
    commons/sandbox/monitoring/trunk/cdi/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension
    commons/sandbox/monitoring/trunk/cdi/src/test/java/org/apache/commons/monitoring/cdi/CommonsMonitoringExtensionTest.java
      - copied, changed from r1532191, commons/sandbox/monitoring/trunk/cdi/src/test/java/org/apache/commons/monitoring/cdi/CommonsMonitoringInterceptorTest.java
    commons/sandbox/monitoring/trunk/cdi/src/test/java/org/apache/commons/monitoring/cdi/CommonsMonitoringExtensionTestBase.java
    commons/sandbox/monitoring/trunk/cdi/src/test/resources/commons-monitoring.properties
Modified:
    commons/sandbox/monitoring/trunk/cdi/src/test/java/org/apache/commons/monitoring/cdi/CommonsMonitoringInterceptorTest.java

Added: commons/sandbox/monitoring/trunk/cdi/src/main/java/org/apache/commons/monitoring/cdi/internal/CommonsMonitoringPerformanceExtension.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/cdi/src/main/java/org/apache/commons/monitoring/cdi/internal/CommonsMonitoringPerformanceExtension.java?rev=1532236&view=auto
==============================================================================
--- commons/sandbox/monitoring/trunk/cdi/src/main/java/org/apache/commons/monitoring/cdi/internal/CommonsMonitoringPerformanceExtension.java (added)
+++ commons/sandbox/monitoring/trunk/cdi/src/main/java/org/apache/commons/monitoring/cdi/internal/CommonsMonitoringPerformanceExtension.java Tue Oct 15 07:50:19 2013
@@ -0,0 +1,155 @@
+/*
+ * 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.commons.monitoring.cdi.internal;
+
+import org.apache.commons.monitoring.cdi.Monitored;
+import org.apache.commons.monitoring.configuration.Configuration;
+import org.apache.commons.monitoring.util.ClassLoaders;
+
+import javax.enterprise.event.Observes;
+import javax.enterprise.inject.spi.Extension;
+import javax.enterprise.inject.spi.ProcessAnnotatedType;
+import java.io.Serializable;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+public class CommonsMonitoringPerformanceExtension implements Extension {
+    private static final Logger LOGGER = Logger.getLogger(CommonsMonitoringPerformanceExtension.class.getName());
+
+    private static final String PERFORMANCE_MARKER = "performance";
+
+    private final boolean enabled = Configuration.is(Configuration.COMMONS_MONITORING_PREFIX + "cdi.enabled", true);
+    private final Monitored binding = newAnnotation(Monitored.class);
+    private final Map<Class<? extends Annotation>, Annotation> otherBindings = new HashMap<Class<? extends Annotation>, Annotation>();
+
+    <A> void processAnnotatedType(final @Observes ProcessAnnotatedType<A> pat) {
+        if (!enabled) {
+            return;
+        }
+
+        final String beanClassName = pat.getAnnotatedType().getJavaClass().getName();
+        final String configuration = findConfiguration(beanClassName);
+        if (configuration == null) {
+            return;
+        }
+
+        final Collection<String> configForThisBean = Arrays.asList(configuration.split(","));
+        if (!configForThisBean.isEmpty()) {
+            final WrappedAnnotatedType<A> wrapper = new WrappedAnnotatedType<A>(pat.getAnnotatedType());
+            for (final String rawConfig : configForThisBean) {
+                final String config = rawConfig.trim();
+
+                if (PERFORMANCE_MARKER.equals(config)) {
+                    wrapper.getAnnotations().add(binding);
+                } else { // convention is from <name> the binding is org.apache.commons.monitoring.<lowercase(name)>.<uppercase(name)>Monitored, ex: jta
+                    final String deducedName = "org.apache.commons.monitoring." + config.toLowerCase(Locale.ENGLISH) + "." + config.toUpperCase(Locale.ENGLISH) + "Monitored";
+                    try {
+                        final Class<? extends Annotation> annotationType = Class.class.cast(ClassLoaders.current().loadClass(deducedName));
+                        Annotation instance = otherBindings.get(annotationType);
+                        if (instance == null) {
+                            instance = newAnnotation(annotationType);
+                            otherBindings.put(annotationType, instance);
+                        }
+                        wrapper.getAnnotations().add(instance);
+                    } catch (final ClassNotFoundException e) {
+                        LOGGER.log(Level.SEVERE, e.getMessage(), e);
+                    }
+                }
+            }
+            pat.setAnnotatedType(wrapper);
+        }
+    }
+
+    private static String findConfiguration(final String name) {
+        String current = name;
+        String property;
+        do {
+            property = Configuration.getProperty(current + ".cdi", null);
+
+            final int endIndex = current.lastIndexOf('.');
+            if (endIndex > 0) {
+                current = current.substring(0, endIndex);
+            } else {
+                current = null;
+            }
+        } while (property == null && current != null);
+        return property;
+    }
+
+    private static <T extends Annotation> T newAnnotation(final Class<T> clazz) {
+        return clazz.cast(
+                Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
+                new Class<?>[]{ Annotation.class, clazz },
+                new AnnotationHandler(clazz)));
+    }
+
+    // Note: for annotations without any members
+    private static class AnnotationHandler implements InvocationHandler, Annotation, Serializable {
+        private final Class<? extends Annotation> annotationClass;
+
+        private AnnotationHandler(final Class<? extends Annotation> annotationClass) {
+            this.annotationClass = annotationClass;
+        }
+
+        @Override
+        public Object invoke(final Object proxy, final Method method, final Object[] args) throws Exception {
+            if ("hashCode".equals(method.getName())) {
+                return hashCode();
+            } else if ("equals".equals(method.getName())) {
+                if (Proxy.isProxyClass(args[0].getClass()) && AnnotationHandler.class.isInstance(Proxy.getInvocationHandler(args[0]))) {
+                    return equals(Proxy.getInvocationHandler(args[0]));
+                }
+                return equals(args[0]);
+            } else if ("annotationType".equals(method.getName())) {
+                return annotationType();
+            } else if ("toString".equals(method.getName())) {
+                return toString();
+            }
+            return method.getDefaultValue();
+        }
+
+        @Override
+        public Class<? extends Annotation> annotationType() {
+            return annotationClass;
+        }
+
+        @Override
+        public String toString() {
+            return "@" + annotationClass.getName();
+        }
+
+        @Override
+        public boolean equals(final Object o) {
+            return this == o
+                || Annotation.class.isInstance(o) && Annotation.class.cast(o).annotationType().equals(annotationClass);
+        }
+
+        @Override
+        public int hashCode() {
+            return 0;
+        }
+    }
+}

Added: commons/sandbox/monitoring/trunk/cdi/src/main/java/org/apache/commons/monitoring/cdi/internal/WrappedAnnotatedType.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/cdi/src/main/java/org/apache/commons/monitoring/cdi/internal/WrappedAnnotatedType.java?rev=1532236&view=auto
==============================================================================
--- commons/sandbox/monitoring/trunk/cdi/src/main/java/org/apache/commons/monitoring/cdi/internal/WrappedAnnotatedType.java (added)
+++ commons/sandbox/monitoring/trunk/cdi/src/main/java/org/apache/commons/monitoring/cdi/internal/WrappedAnnotatedType.java Tue Oct 15 07:50:19 2013
@@ -0,0 +1,88 @@
+/*
+ * 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.commons.monitoring.cdi.internal;
+
+import javax.enterprise.inject.spi.AnnotatedConstructor;
+import javax.enterprise.inject.spi.AnnotatedField;
+import javax.enterprise.inject.spi.AnnotatedMethod;
+import javax.enterprise.inject.spi.AnnotatedType;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+import java.util.HashSet;
+import java.util.Set;
+
+public class WrappedAnnotatedType<A> implements AnnotatedType<A> {
+    private final AnnotatedType<A> delegate;
+    private final Set<Annotation> annotations;
+
+    public WrappedAnnotatedType(final AnnotatedType<A> at) {
+        this.delegate = at;
+
+        this.annotations = new HashSet<Annotation>(at.getAnnotations().size());
+        this.annotations.addAll(at.getAnnotations());
+    }
+
+    @Override
+    public Set<Annotation> getAnnotations() {
+        return annotations;
+    }
+
+    @Override
+    public <T extends Annotation> T getAnnotation(final Class<T> annotationType) {
+        for (final Annotation ann : annotations) {
+            if (ann.annotationType().equals(annotationType)) {
+                return annotationType.cast(ann);
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public boolean isAnnotationPresent(final Class<? extends Annotation> annotationType) {
+        return getAnnotation(annotationType) != null;
+    }
+
+    @Override
+    public Class<A> getJavaClass() {
+        return delegate.getJavaClass();
+    }
+
+    @Override
+    public Set<AnnotatedConstructor<A>> getConstructors() {
+        return delegate.getConstructors();
+    }
+
+    @Override
+    public Set<AnnotatedMethod<? super A>> getMethods() {
+        return delegate.getMethods();
+    }
+
+    @Override
+    public Set<AnnotatedField<? super A>> getFields() {
+        return delegate.getFields();
+    }
+
+    @Override
+    public Type getBaseType() {
+        return delegate.getBaseType();
+    }
+
+    @Override
+    public Set<Type> getTypeClosure() {
+        return delegate.getTypeClosure();
+    }
+}

Added: commons/sandbox/monitoring/trunk/cdi/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/cdi/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension?rev=1532236&view=auto
==============================================================================
--- commons/sandbox/monitoring/trunk/cdi/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension (added)
+++ commons/sandbox/monitoring/trunk/cdi/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension Tue Oct 15 07:50:19 2013
@@ -0,0 +1 @@
+org.apache.commons.monitoring.cdi.internal.CommonsMonitoringPerformanceExtension

Copied: commons/sandbox/monitoring/trunk/cdi/src/test/java/org/apache/commons/monitoring/cdi/CommonsMonitoringExtensionTest.java (from r1532191, commons/sandbox/monitoring/trunk/cdi/src/test/java/org/apache/commons/monitoring/cdi/CommonsMonitoringInterceptorTest.java)
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/cdi/src/test/java/org/apache/commons/monitoring/cdi/CommonsMonitoringExtensionTest.java?p2=commons/sandbox/monitoring/trunk/cdi/src/test/java/org/apache/commons/monitoring/cdi/CommonsMonitoringExtensionTest.java&p1=commons/sandbox/monitoring/trunk/cdi/src/test/java/org/apache/commons/monitoring/cdi/CommonsMonitoringInterceptorTest.java&r1=1532191&r2=1532236&rev=1532236&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/cdi/src/test/java/org/apache/commons/monitoring/cdi/CommonsMonitoringInterceptorTest.java (original)
+++ commons/sandbox/monitoring/trunk/cdi/src/test/java/org/apache/commons/monitoring/cdi/CommonsMonitoringExtensionTest.java Tue Oct 15 07:50:19 2013
@@ -16,43 +16,16 @@
  */
 package org.apache.commons.monitoring.cdi;
 
-import org.apache.commons.monitoring.Role;
-import org.apache.commons.monitoring.counters.Counter;
-import org.apache.commons.monitoring.repositories.Repository;
-import org.apache.webbeans.cditest.CdiTestContainer;
-import org.apache.webbeans.cditest.CdiTestContainerLoader;
-import org.junit.Test;
-
 import javax.enterprise.context.ApplicationScoped;
-import javax.enterprise.inject.spi.BeanManager;
-import java.util.concurrent.TimeUnit;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
-public class CommonsMonitoringInterceptorTest {
-    @Test
-    public void checkMeasures() throws Exception {
-        final CdiTestContainer container = CdiTestContainerLoader.getCdiContainer();
-        container.bootContainer();
-        container.startApplicationScope();
-
-        final BeanManager beanManager = container.getBeanManager();
-        final MonitoredBean bean = MonitoredBean.class.cast(beanManager.getReference(beanManager.resolve(beanManager.getBeans(MonitoredBean.class)), MonitoredBean.class, null));
-
-        bean.twoSeconds();
-
-        container.stopApplicationScope();
-        container.shutdownContainer();
 
-        final Counter perf = Repository.INSTANCE.getCounter(new Counter.Key(Role.PERFORMANCES, MonitoredBean.class.getName() + ".twoSeconds"));
-        assertNotNull(perf);
-        assertEquals(2000, TimeUnit.NANOSECONDS.toMillis((int) perf.getMax()), 200);
+public class CommonsMonitoringExtensionTest extends CommonsMonitoringExtensionTestBase {
+    @Override
+    protected Class<? extends TwoSeconds> type() {
+        return AutoMonitoredBean.class;
     }
 
-    @Monitored
     @ApplicationScoped
-    public static class MonitoredBean {
+    public static class AutoMonitoredBean implements TwoSeconds {
         public void twoSeconds() {
             try {
                 Thread.sleep(2000);

Added: commons/sandbox/monitoring/trunk/cdi/src/test/java/org/apache/commons/monitoring/cdi/CommonsMonitoringExtensionTestBase.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/cdi/src/test/java/org/apache/commons/monitoring/cdi/CommonsMonitoringExtensionTestBase.java?rev=1532236&view=auto
==============================================================================
--- commons/sandbox/monitoring/trunk/cdi/src/test/java/org/apache/commons/monitoring/cdi/CommonsMonitoringExtensionTestBase.java (added)
+++ commons/sandbox/monitoring/trunk/cdi/src/test/java/org/apache/commons/monitoring/cdi/CommonsMonitoringExtensionTestBase.java Tue Oct 15 07:50:19 2013
@@ -0,0 +1,58 @@
+/*
+ * 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.commons.monitoring.cdi;
+
+import org.apache.commons.monitoring.Role;
+import org.apache.commons.monitoring.counters.Counter;
+import org.apache.commons.monitoring.repositories.Repository;
+import org.apache.webbeans.cditest.CdiTestContainer;
+import org.apache.webbeans.cditest.CdiTestContainerLoader;
+import org.junit.Test;
+
+import javax.enterprise.inject.spi.BeanManager;
+import java.util.concurrent.TimeUnit;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+public abstract class CommonsMonitoringExtensionTestBase {
+    @Test
+    public void checkMeasures() throws Exception {
+        final CdiTestContainer container = CdiTestContainerLoader.getCdiContainer();
+        container.bootContainer();
+        container.startApplicationScope();
+
+        final BeanManager beanManager = container.getBeanManager();
+        final Class<?> type = type();
+        final TwoSeconds bean = TwoSeconds.class.cast(beanManager.getReference(beanManager.resolve(beanManager.getBeans(type)), type, null));
+
+        bean.twoSeconds();
+
+        container.stopApplicationScope();
+        container.shutdownContainer();
+
+        final Counter perf = Repository.INSTANCE.getCounter(new Counter.Key(Role.PERFORMANCES, type.getName() + ".twoSeconds"));
+        assertNotNull(perf);
+        assertEquals(2000, TimeUnit.NANOSECONDS.toMillis((int) perf.getMax()), 200);
+    }
+
+    protected abstract Class<? extends TwoSeconds> type();
+
+    protected static interface TwoSeconds {
+        void twoSeconds();
+    }
+}

Modified: commons/sandbox/monitoring/trunk/cdi/src/test/java/org/apache/commons/monitoring/cdi/CommonsMonitoringInterceptorTest.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/cdi/src/test/java/org/apache/commons/monitoring/cdi/CommonsMonitoringInterceptorTest.java?rev=1532236&r1=1532235&r2=1532236&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/cdi/src/test/java/org/apache/commons/monitoring/cdi/CommonsMonitoringInterceptorTest.java (original)
+++ commons/sandbox/monitoring/trunk/cdi/src/test/java/org/apache/commons/monitoring/cdi/CommonsMonitoringInterceptorTest.java Tue Oct 15 07:50:19 2013
@@ -16,43 +16,17 @@
  */
 package org.apache.commons.monitoring.cdi;
 
-import org.apache.commons.monitoring.Role;
-import org.apache.commons.monitoring.counters.Counter;
-import org.apache.commons.monitoring.repositories.Repository;
-import org.apache.webbeans.cditest.CdiTestContainer;
-import org.apache.webbeans.cditest.CdiTestContainerLoader;
-import org.junit.Test;
-
 import javax.enterprise.context.ApplicationScoped;
-import javax.enterprise.inject.spi.BeanManager;
-import java.util.concurrent.TimeUnit;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
-public class CommonsMonitoringInterceptorTest {
-    @Test
-    public void checkMeasures() throws Exception {
-        final CdiTestContainer container = CdiTestContainerLoader.getCdiContainer();
-        container.bootContainer();
-        container.startApplicationScope();
-
-        final BeanManager beanManager = container.getBeanManager();
-        final MonitoredBean bean = MonitoredBean.class.cast(beanManager.getReference(beanManager.resolve(beanManager.getBeans(MonitoredBean.class)), MonitoredBean.class, null));
-
-        bean.twoSeconds();
-
-        container.stopApplicationScope();
-        container.shutdownContainer();
 
-        final Counter perf = Repository.INSTANCE.getCounter(new Counter.Key(Role.PERFORMANCES, MonitoredBean.class.getName() + ".twoSeconds"));
-        assertNotNull(perf);
-        assertEquals(2000, TimeUnit.NANOSECONDS.toMillis((int) perf.getMax()), 200);
+public class CommonsMonitoringInterceptorTest extends CommonsMonitoringExtensionTestBase {
+    @Override
+    protected Class<? extends TwoSeconds> type() {
+        return MonitoredBean.class;
     }
 
     @Monitored
     @ApplicationScoped
-    public static class MonitoredBean {
+    public static class MonitoredBean implements TwoSeconds {
         public void twoSeconds() {
             try {
                 Thread.sleep(2000);

Added: commons/sandbox/monitoring/trunk/cdi/src/test/resources/commons-monitoring.properties
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/cdi/src/test/resources/commons-monitoring.properties?rev=1532236&view=auto
==============================================================================
--- commons/sandbox/monitoring/trunk/cdi/src/test/resources/commons-monitoring.properties (added)
+++ commons/sandbox/monitoring/trunk/cdi/src/test/resources/commons-monitoring.properties Tue Oct 15 07:50:19 2013
@@ -0,0 +1,17 @@
+# 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.
+org.apache.commons.monitoring.cdi.CommonsMonitoringExtensionTest$AutoMonitoredBean.cdi = performance