You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@deltaspike.apache.org by gp...@apache.org on 2014/11/16 01:24:22 UTC
deltaspike git commit: DELTASPIKE-769 enable deltaspike interceptors
globally per default
Repository: deltaspike
Updated Branches:
refs/heads/master e3ce1da69 -> 444d3e7a9
DELTASPIKE-769 enable deltaspike interceptors globally per default
Project: http://git-wip-us.apache.org/repos/asf/deltaspike/repo
Commit: http://git-wip-us.apache.org/repos/asf/deltaspike/commit/444d3e7a
Tree: http://git-wip-us.apache.org/repos/asf/deltaspike/tree/444d3e7a
Diff: http://git-wip-us.apache.org/repos/asf/deltaspike/diff/444d3e7a
Branch: refs/heads/master
Commit: 444d3e7a9c20bd5a57bd8d64e199267879415fae
Parents: e3ce1da
Author: gpetracek <gp...@apache.org>
Authored: Sun Nov 16 01:21:49 2014 +0100
Committer: gpetracek <gp...@apache.org>
Committed: Sun Nov 16 01:21:49 2014 +0100
----------------------------------------------------------------------
.../interceptor/GlobalInterceptorExtension.java | 94 ++++++++++++++++
.../interceptor/GlobalInterceptorWrapper.java | 106 +++++++++++++++++++
.../javax.enterprise.inject.spi.Extension | 1 +
3 files changed, 201 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/444d3e7a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/interceptor/GlobalInterceptorExtension.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/interceptor/GlobalInterceptorExtension.java b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/interceptor/GlobalInterceptorExtension.java
new file mode 100644
index 0000000..1e4e2eb
--- /dev/null
+++ b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/interceptor/GlobalInterceptorExtension.java
@@ -0,0 +1,94 @@
+/*
+ * 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.deltaspike.core.impl.interceptor;
+
+import org.apache.deltaspike.core.spi.activation.Deactivatable;
+import org.apache.deltaspike.core.util.ClassDeactivationUtils;
+import org.apache.deltaspike.core.util.ClassUtils;
+import org.apache.deltaspike.core.util.metadata.AnnotationInstanceProvider;
+
+import javax.enterprise.event.Observes;
+import javax.enterprise.inject.spi.BeanManager;
+import javax.enterprise.inject.spi.BeforeBeanDiscovery;
+import javax.enterprise.inject.spi.Extension;
+import javax.enterprise.inject.spi.ProcessAnnotatedType;
+import javax.interceptor.Interceptor;
+import java.lang.annotation.Annotation;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Logger;
+
+//promotes deltaspike interceptors to global interceptors in case of cdi 1.1+
+public class GlobalInterceptorExtension implements Deactivatable, Extension
+{
+ private static final Logger LOG = Logger.getLogger(GlobalInterceptorExtension.class.getName());
+ private static final String DS_PACKAGE_NAME = "org.apache.deltaspike.";
+ private Annotation priorityAnnotationInstance;
+
+ @SuppressWarnings("UnusedDeclaration")
+ protected void init(@Observes BeforeBeanDiscovery beforeBeanDiscovery, BeanManager beanManager)
+ {
+ if (!ClassDeactivationUtils.isActivated(getClass()))
+ {
+ return;
+ }
+
+ Class<? extends Annotation> priorityAnnotationClass =
+ ClassUtils.tryToLoadClassForName("javax.annotation.Priority");
+
+ //check for @Priority and CDI v1.1+
+ if (priorityAnnotationClass != null &&
+ ClassUtils.tryToLoadClassForName("javax.enterprise.inject.spi.AfterTypeDiscovery") != null)
+ {
+ Map<String, Object> defaultValueMap = new HashMap<String, Object>();
+ defaultValueMap.put("value", 0);
+ priorityAnnotationInstance = AnnotationInstanceProvider.of(priorityAnnotationClass, defaultValueMap);
+ }
+ }
+
+ protected void promoteInterceptors(@Observes ProcessAnnotatedType pat, BeanManager beanManager)
+ {
+ if (priorityAnnotationInstance == null) //not CDI 1.1 or the extension is deactivated
+ {
+ return;
+ }
+
+ String beanClassName = pat.getAnnotatedType().getJavaClass().getName();
+ if (beanClassName.startsWith(DS_PACKAGE_NAME))
+ {
+ if (pat.getAnnotatedType().isAnnotationPresent(Interceptor.class))
+ {
+ //noinspection unchecked
+ pat.setAnnotatedType(new GlobalInterceptorWrapper(pat.getAnnotatedType(), priorityAnnotationInstance));
+ }
+ //currently not needed, because we don't use our interceptors internally -> check for the future
+ else if (!beanClassName.contains(".test."))
+ {
+ for (Annotation annotation : pat.getAnnotatedType().getAnnotations())
+ {
+ if (beanManager.isInterceptorBinding(annotation.annotationType()))
+ {
+ //once we see this warning we need to introduce double-call prevention logic due to WELD-1780
+ LOG.warning(beanClassName + " is an bean from DeltaSpike which is intercepted.");
+ }
+ }
+ }
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/444d3e7a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/interceptor/GlobalInterceptorWrapper.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/interceptor/GlobalInterceptorWrapper.java b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/interceptor/GlobalInterceptorWrapper.java
new file mode 100644
index 0000000..17c59c9
--- /dev/null
+++ b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/interceptor/GlobalInterceptorWrapper.java
@@ -0,0 +1,106 @@
+/*
+ * 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.deltaspike.core.impl.interceptor;
+
+import javax.enterprise.inject.spi.AnnotatedType;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+class GlobalInterceptorWrapper implements AnnotatedType<Object>
+{
+ private final AnnotatedType wrapped;
+ private Map<Class<? extends Annotation>, Annotation> annotations;
+ private Set<Annotation> annotationSet;
+
+ GlobalInterceptorWrapper(AnnotatedType wrapped,
+ Annotation priorityAnnotation)
+ {
+ this.wrapped = wrapped;
+ Set<Annotation> originalAnnotationSet = wrapped.getAnnotations();
+ this.annotations = new HashMap<Class<? extends Annotation>, Annotation>(originalAnnotationSet.size());
+
+ for (Annotation originalAnnotation : originalAnnotationSet)
+ {
+ this.annotations.put(originalAnnotation.annotationType(), originalAnnotation);
+ }
+
+ this.annotations.put(priorityAnnotation.annotationType(), priorityAnnotation);
+
+ this.annotationSet = new HashSet<Annotation>(this.annotations.size());
+ this.annotationSet.addAll(this.annotations.values());
+ }
+
+ @Override
+ public Class getJavaClass()
+ {
+ return wrapped.getJavaClass();
+ }
+
+ @Override
+ public Set getConstructors()
+ {
+ return wrapped.getConstructors();
+ }
+
+ @Override
+ public Set getMethods()
+ {
+ return wrapped.getMethods();
+ }
+
+ @Override
+ public Set getFields()
+ {
+ return wrapped.getFields();
+ }
+
+ @Override
+ public Type getBaseType()
+ {
+ return wrapped.getBaseType();
+ }
+
+ @Override
+ public Set<Type> getTypeClosure()
+ {
+ return wrapped.getTypeClosure();
+ }
+
+ @Override
+ public <T extends Annotation> T getAnnotation(Class<T> targetClass)
+ {
+ return (T) this.annotations.get(targetClass);
+ }
+
+ @Override
+ public Set<Annotation> getAnnotations()
+ {
+ return this.annotationSet;
+ }
+
+ @Override
+ public boolean isAnnotationPresent(Class<? extends Annotation> targetClass)
+ {
+ return this.annotations.containsKey(targetClass);
+ }
+}
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/444d3e7a/deltaspike/core/impl/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension
----------------------------------------------------------------------
diff --git a/deltaspike/core/impl/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension b/deltaspike/core/impl/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension
index a943098..1c2c7df 100644
--- a/deltaspike/core/impl/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension
+++ b/deltaspike/core/impl/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension
@@ -23,3 +23,4 @@ org.apache.deltaspike.core.impl.exception.control.extension.ExceptionControlExte
org.apache.deltaspike.core.impl.config.ConfigurationExtension
org.apache.deltaspike.core.impl.jmx.MBeanExtension
org.apache.deltaspike.core.impl.scope.DeltaSpikeContextExtension
+org.apache.deltaspike.core.impl.interceptor.GlobalInterceptorExtension
\ No newline at end of file