[weld-commits] Weld SVN: r4725 - in core/trunk: impl/src/main/java/org/jboss/weld/bean and 11 other directories.
weld-commits at lists.jboss.org
weld-commits at lists.jboss.org
Sat Nov 7 01:58:29 EST 2009
Author: marius.bogoevici
Date: 2009-11-07 01:58:28 -0500 (Sat, 07 Nov 2009)
New Revision: 4725
Added:
core/trunk/impl/src/main/java/org/jboss/weld/bean/AnnotatedItemProvidingDecoratorWrapper.java
core/trunk/tests/src/test/java/org/jboss/weld/tests/decorators/custom/
core/trunk/tests/src/test/java/org/jboss/weld/tests/decorators/custom/AfterBeanDiscoveryObserver.java
core/trunk/tests/src/test/java/org/jboss/weld/tests/decorators/custom/CustomDecorator.java
core/trunk/tests/src/test/java/org/jboss/weld/tests/decorators/custom/CustomDecoratorTest.java
core/trunk/tests/src/test/java/org/jboss/weld/tests/decorators/custom/CustomFrame.java
core/trunk/tests/src/test/java/org/jboss/weld/tests/decorators/custom/InnerFrame.java
core/trunk/tests/src/test/java/org/jboss/weld/tests/decorators/custom/OuterFrame.java
core/trunk/tests/src/test/java/org/jboss/weld/tests/decorators/custom/Window.java
core/trunk/tests/src/test/resources/org/jboss/weld/tests/decorators/custom/
core/trunk/tests/src/test/resources/org/jboss/weld/tests/decorators/custom/beans-custom-only.xml
core/trunk/tests/src/test/resources/org/jboss/weld/tests/decorators/custom/beans.xml
core/trunk/tests/src/test/resources/org/jboss/weld/tests/decorators/custom/javax.enterprise.inject.spi.Extension
Modified:
core/trunk/impl/src/main/java/org/jboss/weld/BeanManagerImpl.java
core/trunk/impl/src/main/java/org/jboss/weld/Validator.java
core/trunk/impl/src/main/java/org/jboss/weld/bean/AbstractBean.java
core/trunk/impl/src/main/java/org/jboss/weld/bean/AbstractClassBean.java
core/trunk/impl/src/main/java/org/jboss/weld/bean/DecoratorImpl.java
core/trunk/impl/src/main/java/org/jboss/weld/bean/ManagedBean.java
core/trunk/impl/src/main/java/org/jboss/weld/bean/RIBean.java
core/trunk/impl/src/main/java/org/jboss/weld/bean/proxy/DecoratorProxyMethodHandler.java
core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/BeanDeployment.java
core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/WeldBootstrap.java
core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/events/AfterBeanDiscoveryImpl.java
core/trunk/impl/src/main/java/org/jboss/weld/logging/messages/BeanMessage.java
core/trunk/impl/src/main/java/org/jboss/weld/resolution/TypeSafeDecoratorResolver.java
core/trunk/impl/src/main/java/org/jboss/weld/util/Beans.java
core/trunk/impl/src/main/resources/org/jboss/weld/messages/bean_en.properties
Log:
WELD-253, WELD-254: Adding support for custom decorators.
- Creating an initializeAfterBeanDiscovery method that RIBeans can implement to perform initialization after all beans have been deployed (in this particular case this is necessary as decorators for a bean may be deployed *after* the decorated bean has been deployed).
- Creating a wrapper class to enhance custom Decorator beans with WeldClass data at deployment time (thus avoiding evaluation of such data at runtime)
Modified: core/trunk/impl/src/main/java/org/jboss/weld/BeanManagerImpl.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/BeanManagerImpl.java 2009-11-07 06:54:43 UTC (rev 4724)
+++ core/trunk/impl/src/main/java/org/jboss/weld/BeanManagerImpl.java 2009-11-07 06:58:28 UTC (rev 4725)
@@ -254,7 +254,7 @@
* archives
*/
private transient final TypeSafeBeanResolver<Bean<?>> beanResolver;
- private transient final TypeSafeResolver<? extends Resolvable, DecoratorImpl<?>> decoratorResolver;
+ private transient final TypeSafeResolver<? extends Resolvable, Decorator<?>> decoratorResolver;
private transient final TypeSafeResolver<? extends Resolvable, Interceptor<?>> interceptorResolver;
private transient final TypeSafeResolver<? extends Resolvable, ObserverMethod<?>> observerResolver;
private transient final NameBasedResolver nameBasedResolver;
@@ -272,7 +272,7 @@
*/
private transient final List<Bean<?>> beans;
private transient final List<Bean<?>> transitiveBeans;
- private transient final List<DecoratorImpl<?>> decorators;
+ private transient final List<Decorator<?>> decorators;
private transient final List<Interceptor<?>> interceptors;
private transient final List<String> namespaces;
private transient final List<ObserverMethod<?>> observers;
@@ -326,7 +326,7 @@
serviceRegistry,
new CopyOnWriteArrayList<Bean<?>>(),
new CopyOnWriteArrayList<Bean<?>>(),
- new CopyOnWriteArrayList<DecoratorImpl<?>>(),
+ new CopyOnWriteArrayList<Decorator<?>>(),
new CopyOnWriteArrayList<Interceptor<?>>(),
new CopyOnWriteArrayList<ObserverMethod<?>>(),
new CopyOnWriteArrayList<String>(),
@@ -355,7 +355,7 @@
services,
new CopyOnWriteArrayList<Bean<?>>(),
new CopyOnWriteArrayList<Bean<?>>(),
- new CopyOnWriteArrayList<DecoratorImpl<?>>(),
+ new CopyOnWriteArrayList<Decorator<?>>(),
new CopyOnWriteArrayList<Interceptor<?>>(),
new CopyOnWriteArrayList<ObserverMethod<?>>(),
new CopyOnWriteArrayList<String>(),
@@ -421,7 +421,7 @@
ServiceRegistry serviceRegistry,
List<Bean<?>> beans,
List<Bean<?>> transitiveBeans,
- List<DecoratorImpl<?>> decorators,
+ List<Decorator<?>> decorators,
List<Interceptor<?>> interceptors,
List<ObserverMethod<?>> observers,
List<String> namespaces,
@@ -555,10 +555,10 @@
};
- public static Transform<DecoratorImpl<?>> DECORATOR_BEAN = new Transform<DecoratorImpl<?>>()
+ public static Transform<Decorator<?>> DECORATOR_BEAN = new Transform<Decorator<?>>()
{
- public Iterable<DecoratorImpl<?>> transform(BeanManagerImpl beanManager)
+ public Iterable<Decorator<?>> transform(BeanManagerImpl beanManager)
{
return beanManager.getDecorators();
}
@@ -634,7 +634,7 @@
beanResolver.clear();
}
- public void addDecorator(DecoratorImpl<?> bean)
+ public void addDecorator(Decorator<?> bean)
{
decorators.add(bean);
getServices().get(ContextualStore.class).putIfAbsent(bean);
@@ -841,7 +841,7 @@
return Collections.unmodifiableList(transitiveBeans);
}
- public List<DecoratorImpl<?>> getDecorators()
+ public List<Decorator<?>> getDecorators()
{
return Collections.unmodifiableList(decorators);
}
@@ -1033,12 +1033,12 @@
}
}
-
+
public Object getInjectableReference(InjectionPoint injectionPoint, CreationalContext<?> creationalContext)
{
- WeldAnnotated<?, ?> element = ResolvableWeldClass.of(injectionPoint.getType(), injectionPoint.getQualifiers().toArray(new Annotation[0]), this);
- Bean<?> resolvedBean = getBean(element, element.getBindingsAsArray());
- return getReference(injectionPoint, resolvedBean, creationalContext);
+ WeldAnnotated<?, ?> element = ResolvableWeldClass.of(injectionPoint.getType(), injectionPoint.getQualifiers().toArray(new Annotation[0]), this);
+ Bean<?> resolvedBean = getBean(element, element.getBindingsAsArray());
+ return getReference(injectionPoint, resolvedBean, creationalContext);
}
/**
Modified: core/trunk/impl/src/main/java/org/jboss/weld/Validator.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/Validator.java 2009-11-07 06:54:43 UTC (rev 4724)
+++ core/trunk/impl/src/main/java/org/jboss/weld/Validator.java 2009-11-07 06:58:28 UTC (rev 4725)
@@ -353,9 +353,9 @@
{
// TODO Move building this list to the boot or sth
Set<Class<?>> decoratorBeanClasses = new HashSet<Class<?>>();
- for (DecoratorImpl<?> bean : beanManager.getDecorators())
+ for (Decorator<?> bean : beanManager.getDecorators())
{
- decoratorBeanClasses.add(bean.getType());
+ decoratorBeanClasses.add(bean.getBeanClass());
}
for (Class<?> clazz : beanManager.getEnabledDecoratorClasses())
{
Modified: core/trunk/impl/src/main/java/org/jboss/weld/bean/AbstractBean.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/AbstractBean.java 2009-11-07 06:54:43 UTC (rev 4724)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/AbstractBean.java 2009-11-07 06:58:28 UTC (rev 4725)
@@ -373,8 +373,8 @@
}
/**
- * Returns the annotated time the bean represents
- *
+ * Returns the annotated item the bean represents
+ *
* @return The annotated item
*/
public abstract WeldAnnotated<T, S> getAnnotatedItem();
Modified: core/trunk/impl/src/main/java/org/jboss/weld/bean/AbstractClassBean.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/AbstractClassBean.java 2009-11-07 06:54:43 UTC (rev 4724)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/AbstractClassBean.java 2009-11-07 06:58:28 UTC (rev 4725)
@@ -88,11 +88,11 @@
private List<Set<FieldInjectionPoint<?, ?>>> injectableFields;
// The initializer methods of each type in the type hierarchy, with the actual type at the bottom
private List<Set<MethodInjectionPoint<?, ?>>> initializerMethods;
-
+
private List<Decorator<?>> decorators;
-
+
private Class<T> proxyClassForDecorators;
-
+
private final ThreadLocal<Integer> decoratorStackPosition;
private final ThreadLocal<T> decoratedActualInstance = new ThreadLocal<T>();
@@ -138,47 +138,54 @@
checkBeanImplementation();
initDecorators();
checkType();
- initProxyClassForDecoratedBean();
if (isInterceptionCandidate())
{
initCdiBoundInterceptors();
initDirectlyDefinedInterceptors();
}
}
-
+
+ @Override
+ public void initializeAfterBeanDiscovery()
+ {
+ super.initializeAfterBeanDiscovery();
+ initDecorators();
+ if (hasDecorators())
+ {
+ initProxyClassForDecoratedBean();
+ }
+ }
+
protected void checkType()
{
}
-
- protected void initDecorators()
+
+ public void initDecorators()
{
this.decorators = getManager().resolveDecorators(getTypes(), getQualifiers());
}
-
+
public boolean hasDecorators()
{
return this.decorators != null && this.decorators.size() > 0;
}
-
+
protected void initProxyClassForDecoratedBean()
{
- if (hasDecorators())
- {
- Set<Type> types = new LinkedHashSet<Type>(getTypes());
- types.add(TargetInstanceProxy.class);
- ProxyFactory proxyFactory = Proxies.getProxyFactory(types);
-
- @SuppressWarnings("unchecked")
- Class<T> proxyClass = proxyFactory.createClass();
-
- this.proxyClassForDecorators = proxyClass;
- }
+ Set<Type> types = new LinkedHashSet<Type>(getTypes());
+ types.add(TargetInstanceProxy.class);
+ ProxyFactory proxyFactory = Proxies.getProxyFactory(types);
+
+ @SuppressWarnings("unchecked")
+ Class<T> proxyClass = proxyFactory.createClass();
+
+ this.proxyClassForDecorators = proxyClass;
}
-
+
protected T applyDecorators(T instance, CreationalContext<T> creationalContext, InjectionPoint originalInjectionPoint)
{
- List<SerializableContextualInstance<DecoratorImpl<Object>, Object>> decoratorInstances = new ArrayList<SerializableContextualInstance<DecoratorImpl<Object>,Object>>();
+ List<SerializableContextualInstance<Decorator<Object>, Object>> decoratorInstances = new ArrayList<SerializableContextualInstance<Decorator<Object>,Object>>();
InjectionPoint ip = originalInjectionPoint;
boolean outside = decoratorStackPosition.get().intValue() == 0;
if (outside)
@@ -192,18 +199,13 @@
while (i < decorators.size())
{
Decorator<?> decorator = decorators.get(i);
- if (decorator instanceof DecoratorImpl<?>)
- {
decoratorStackPosition.set(++i);
-
- @SuppressWarnings("unchecked")
- DecoratorImpl<Object> decoratorBean = (DecoratorImpl<Object>) decorator;
-
- Object decoratorInstance = getManager().getReference(ip, decorator, creationalContext);
- decoratorInstances.add(new SerializableContextualInstanceImpl<DecoratorImpl<Object>, Object>(decoratorBean, decoratorInstance, null));
- ip = decoratorBean.getDelegateInjectionPoint();
- }
- else
+
+ Object decoratorInstance = getManager().getReference(ip, decorator, creationalContext);
+ decoratorInstances.add(new SerializableContextualInstanceImpl<Decorator<Object>, Object>((Decorator<Object>) decorator, decoratorInstance, null));
+
+ ip = Beans.getDelegateInjectionPoint(decorator);
+ if (ip == null)
{
throw new IllegalStateException("Cannot operate on non container provided decorator " + decorator);
}
Added: core/trunk/impl/src/main/java/org/jboss/weld/bean/AnnotatedItemProvidingDecoratorWrapper.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/AnnotatedItemProvidingDecoratorWrapper.java (rev 0)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/AnnotatedItemProvidingDecoratorWrapper.java 2009-11-07 06:58:28 UTC (rev 4725)
@@ -0,0 +1,60 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright <Year>, Red Hat, Inc. and/or its affiliates, and individual
+ * contributors by the @authors tag. See the copyright.txt in the
+ * distribution for a full listing of individual contributors.
+ *
+ * Licensed 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.jboss.weld.bean;
+
+import javax.enterprise.inject.spi.Decorator;
+
+import org.jboss.weld.BeanManagerImpl;
+import org.jboss.weld.introspector.WeldClass;
+import org.jboss.weld.resources.ClassTransformer;
+
+/**
+ * A wrapper for a decorated instance. Allows to enhance custom decorators with metadata
+ * about the WeldClass at deployment time.
+ *
+ * @author Marius Bogoevici
+ */
+public class AnnotatedItemProvidingDecoratorWrapper extends ForwardingDecorator<Object>
+{
+ private Decorator<Object> delegate;
+ private WeldClass<?> annotatedItem;
+
+ public static AnnotatedItemProvidingDecoratorWrapper of(Decorator<?> delegate, BeanManagerImpl beanManager)
+ {
+ return new AnnotatedItemProvidingDecoratorWrapper((Decorator<Object>) delegate, beanManager);
+ }
+
+ private AnnotatedItemProvidingDecoratorWrapper(Decorator<Object> delegate, BeanManagerImpl beanManager)
+ {
+ this.delegate = delegate;
+ ClassTransformer transformer = beanManager.getServices().get(ClassTransformer.class);
+ Class<?> beanClass = delegate.getBeanClass();
+ this.annotatedItem = transformer.loadClass(beanClass);
+ }
+
+ @Override
+ protected Decorator<Object> delegate()
+ {
+ return delegate;
+ }
+
+ public WeldClass<?> getAnnotatedItem()
+ {
+ return annotatedItem;
+ }
+}
Modified: core/trunk/impl/src/main/java/org/jboss/weld/bean/DecoratorImpl.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/DecoratorImpl.java 2009-11-07 06:54:43 UTC (rev 4724)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/DecoratorImpl.java 2009-11-07 06:58:28 UTC (rev 4725)
@@ -37,7 +37,7 @@
public class DecoratorImpl<T> extends ManagedBean<T> implements Decorator<T>
{
- public static <T> Decorator<T> wrapForResolver(final Decorator<T> decorator)
+ public static <T> Decorator<T> wrap(final Decorator<T> decorator)
{
return new ForwardingDecorator<T>()
{
@@ -201,19 +201,9 @@
{
return delegateInjectionPoint;
}
-
- /**
- * The type closure of the delegate type
- *
- * @return the delegateTypes
- */
- public Set<Type> getDelegateTypes()
- {
- return delegateTypes;
- }
@Override
- protected void initDecorators()
+ public void initDecorators()
{
// No-op, decorators can't have decorators
}
Modified: core/trunk/impl/src/main/java/org/jboss/weld/bean/ManagedBean.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/ManagedBean.java 2009-11-07 06:54:43 UTC (rev 4724)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/ManagedBean.java 2009-11-07 06:58:28 UTC (rev 4725)
@@ -19,7 +19,7 @@
import static org.jboss.weld.logging.Category.BEAN;
import static org.jboss.weld.logging.LoggerFactory.loggerFactory;
import static org.jboss.weld.logging.messages.BeanMessage.ERROR_DESTROYING;
-import static org.jboss.weld.logging.messages.BeanMessage.USER_DEFINED_DECORATOR_DISALLOWED;
+import static org.jboss.weld.logging.messages.BeanMessage.DELEGATE_INJECTION_POINT_NOT_FOUND;
import java.util.ArrayList;
import java.util.List;
@@ -140,15 +140,11 @@
protected InjectionPoint attachCorrectInjectionPoint()
{
Decorator<?> decorator = getDecorators().get(getDecorators().size() - 1);
- if (decorator instanceof DecoratorImpl<?>)
- {
- DecoratorImpl<?> decoratorBean = (DecoratorImpl<?>) decorator;
- InjectionPoint outerDelegateInjectionPoint = decoratorBean.getDelegateInjectionPoint();
- return getManager().replaceOrPushCurrentInjectionPoint(outerDelegateInjectionPoint);
- } else
- {
- throw new IllegalStateException(messageConveyer.getMessage(USER_DEFINED_DECORATOR_DISALLOWED, decorator));
+ InjectionPoint outerDelegateInjectionPoint = Beans.getDelegateInjectionPoint(decorator);
+ if (outerDelegateInjectionPoint == null)
+{ throw new IllegalStateException(messageConveyer.getMessage(DELEGATE_INJECTION_POINT_NOT_FOUND, decorator));
}
+ return getManager().replaceOrPushCurrentInjectionPoint(outerDelegateInjectionPoint);
}
/**
Modified: core/trunk/impl/src/main/java/org/jboss/weld/bean/RIBean.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/RIBean.java 2009-11-07 06:54:43 UTC (rev 4724)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/RIBean.java 2009-11-07 06:58:28 UTC (rev 4725)
@@ -25,6 +25,7 @@
import org.jboss.weld.BeanManagerImpl;
import org.jboss.weld.bootstrap.BeanDeployerEnvironment;
+import org.jboss.weld.bootstrap.api.Environment;
import org.jboss.weld.injection.WeldInjectionPoint;
/**
@@ -63,6 +64,19 @@
public abstract void initialize(BeanDeployerEnvironment environment);
+ /**
+ * In particular cases, the deployer must perform some initialization operations
+ * only after all beans have been deployed (e.g. for initializing decorators
+ * taking into account the possibility of having custom decorators which are
+ * deployed through portable extensions)
+ *
+ * @param environment
+ */
+ public void initializeAfterBeanDiscovery()
+ {
+ // no-op by default
+ }
+
public abstract boolean isSpecializing();
public boolean isDependent()
@@ -120,6 +134,6 @@
}
public abstract String getDescription();
-
+
}
Modified: core/trunk/impl/src/main/java/org/jboss/weld/bean/proxy/DecoratorProxyMethodHandler.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/proxy/DecoratorProxyMethodHandler.java 2009-11-07 06:54:43 UTC (rev 4724)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/proxy/DecoratorProxyMethodHandler.java 2009-11-07 06:58:28 UTC (rev 4725)
@@ -21,7 +21,10 @@
import java.lang.reflect.Method;
import java.util.List;
+import javax.enterprise.inject.spi.Decorator;
+
import org.jboss.interceptor.util.proxy.TargetInstanceProxyMethodHandler;
+import org.jboss.weld.bean.AnnotatedItemProvidingDecoratorWrapper;
import org.jboss.weld.bean.DecoratorImpl;
import org.jboss.weld.introspector.MethodSignature;
import org.jboss.weld.introspector.WeldMethod;
@@ -38,7 +41,7 @@
{
private static final long serialVersionUID = 4577632640130385060L;
- private final List<SerializableContextualInstance<DecoratorImpl<Object>, Object>> decoratorInstances;
+ private final List<SerializableContextualInstance<Decorator<Object>, Object>> decoratorInstances;
/**
* Constructor
@@ -47,7 +50,7 @@
*
* @param proxy The generic proxy
*/
- public DecoratorProxyMethodHandler(List<SerializableContextualInstance<DecoratorImpl<Object>, Object>> decoratorInstances, Object instance)
+ public DecoratorProxyMethodHandler(List<SerializableContextualInstance<Decorator<Object>, Object>> decoratorInstances, Object instance)
{
super (instance, instance.getClass());
this.decoratorInstances = decoratorInstances;
@@ -73,9 +76,21 @@
protected Object doInvoke(Object self, Method method, Method proceed, Object[] args) throws Throwable
{
MethodSignature methodSignature = new MethodSignatureImpl(method);
- for (SerializableContextualInstance<DecoratorImpl<Object>, Object> beanInstance : decoratorInstances)
+ for (SerializableContextualInstance<Decorator<Object>, Object> beanInstance : decoratorInstances)
{
- WeldMethod<?, ?> decoratorMethod = beanInstance.getContextual().get().getAnnotatedItem().getWBMethod(methodSignature);
+ WeldMethod<?, ?> decoratorMethod;
+ if (beanInstance.getContextual().get() instanceof DecoratorImpl)
+ {
+ decoratorMethod = ((DecoratorImpl)beanInstance.getContextual().get()).getAnnotatedItem().getWBMethod(methodSignature);
+ }
+ else if (beanInstance.getContextual().get() instanceof AnnotatedItemProvidingDecoratorWrapper)
+ {
+ decoratorMethod = ((AnnotatedItemProvidingDecoratorWrapper)beanInstance.getContextual().get()).getAnnotatedItem().getWBMethod(methodSignature);
+ }
+ else
+ {
+ throw new IllegalStateException("Unexpected unwrapped custom decorator instance: " + beanInstance.getContextual().get());
+ }
if (decoratorMethod != null)
{
return decoratorMethod.invokeOnInstance(beanInstance.getInstance(), args);
Modified: core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/BeanDeployment.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/BeanDeployment.java 2009-11-07 06:54:43 UTC (rev 4724)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/BeanDeployment.java 2009-11-07 06:58:28 UTC (rev 4725)
@@ -22,7 +22,12 @@
import static org.jboss.weld.logging.messages.BootstrapMessage.ENABLED_INTERCEPTORS;
import static org.jboss.weld.logging.messages.BootstrapMessage.ENABLED_POLICIES;
+import java.util.List;
+
+import javax.enterprise.inject.spi.Bean;
+
import org.jboss.weld.BeanManagerImpl;
+import org.jboss.weld.bean.RIBean;
import org.jboss.weld.bean.builtin.InjectionPointBean;
import org.jboss.weld.bean.builtin.ManagerBean;
import org.jboss.weld.bean.builtin.facade.EventBean;
@@ -146,4 +151,21 @@
beanDeployer.createBeans().deploy();
}
+ public void afterBeanDiscovery(Environment environment)
+ {
+ doAfterBeanDiscovery(beanManager.getBeans());
+ doAfterBeanDiscovery(beanManager.getDecorators());
+ doAfterBeanDiscovery(beanManager.getInterceptors());
+ }
+
+ private void doAfterBeanDiscovery(List<? extends Bean> beanList)
+ {
+ for (Bean<?> bean : beanList)
+ {
+ if (bean instanceof RIBean)
+ {
+ ((RIBean) bean).initializeAfterBeanDiscovery();
+ }
+ }
+ }
}
Modified: core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/WeldBootstrap.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/WeldBootstrap.java 2009-11-07 06:54:43 UTC (rev 4724)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/WeldBootstrap.java 2009-11-07 06:58:28 UTC (rev 4725)
@@ -367,6 +367,10 @@
entry.getValue().deployBeans(environment);
}
AfterBeanDiscoveryImpl.fire(deploymentManager, deployment, beanDeployments);
+ for (Entry<BeanDeploymentArchive, BeanDeployment> entry : beanDeployments.entrySet())
+ {
+ entry.getValue().afterBeanDiscovery(environment);
+ }
// Re-read the deployment structure, this will be the physical structure, extensions, classes, and any beans added using addBean outside the physical structure
beanDeployments = deploymentVisitor.visit();
Container.instance().putBeanDeployments(beanDeployments);
Modified: core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/events/AfterBeanDiscoveryImpl.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/events/AfterBeanDiscoveryImpl.java 2009-11-07 06:54:43 UTC (rev 4724)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/events/AfterBeanDiscoveryImpl.java 2009-11-07 06:58:28 UTC (rev 4725)
@@ -23,10 +23,12 @@
import javax.enterprise.context.spi.Context;
import javax.enterprise.inject.spi.AfterBeanDiscovery;
import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.ObserverMethod;
import javax.enterprise.inject.spi.Interceptor;
-import javax.enterprise.inject.spi.ObserverMethod;
+import javax.enterprise.inject.spi.Decorator;
import org.jboss.weld.BeanManagerImpl;
+import org.jboss.weld.bean.AnnotatedItemProvidingDecoratorWrapper;
import org.jboss.weld.bootstrap.BeanDeployment;
import org.jboss.weld.bootstrap.spi.BeanDeploymentArchive;
import org.jboss.weld.bootstrap.spi.Deployment;
@@ -61,6 +63,10 @@
{
beanManager.addInterceptor((Interceptor<?>) bean);
}
+ else if (bean instanceof Decorator)
+ {
+ beanManager.addDecorator(AnnotatedItemProvidingDecoratorWrapper.of((Decorator<?>)bean, beanManager));
+ }
else
{
beanManager.addBean(bean);
Modified: core/trunk/impl/src/main/java/org/jboss/weld/logging/messages/BeanMessage.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/logging/messages/BeanMessage.java 2009-11-07 06:54:43 UTC (rev 4724)
+++ core/trunk/impl/src/main/java/org/jboss/weld/logging/messages/BeanMessage.java 2009-11-07 06:58:28 UTC (rev 4725)
@@ -38,6 +38,6 @@
@MessageId("000017") USING_DEFAULT_SCOPE,
@MessageId("000018") CIRCULAR_CALL,
@MessageId("000019") ERROR_DESTROYING,
- @MessageId("000020") USER_DEFINED_DECORATOR_DISALLOWED
+ @MessageId("000020") DELEGATE_INJECTION_POINT_NOT_FOUND
}
Modified: core/trunk/impl/src/main/java/org/jboss/weld/resolution/TypeSafeDecoratorResolver.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/resolution/TypeSafeDecoratorResolver.java 2009-11-07 06:54:43 UTC (rev 4724)
+++ core/trunk/impl/src/main/java/org/jboss/weld/resolution/TypeSafeDecoratorResolver.java 2009-11-07 06:58:28 UTC (rev 4725)
@@ -20,7 +20,10 @@
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
+import java.util.Collections;
+import javax.enterprise.inject.spi.Decorator;
+
import org.jboss.weld.BeanManagerImpl;
import org.jboss.weld.bean.DecoratorImpl;
import org.jboss.weld.util.Beans;
@@ -30,31 +33,31 @@
* @author pmuir
*
*/
-public class TypeSafeDecoratorResolver extends TypeSafeBeanResolver<DecoratorImpl<?>>
+public class TypeSafeDecoratorResolver extends TypeSafeBeanResolver<Decorator<?>>
{
- public TypeSafeDecoratorResolver(BeanManagerImpl manager, Iterable<DecoratorImpl<?>> decorators)
+ public TypeSafeDecoratorResolver(BeanManagerImpl manager, Iterable<Decorator<?>> decorators)
{
super(manager, decorators);
}
@Override
- protected boolean matches(Resolvable resolvable, DecoratorImpl<?> bean)
+ protected boolean matches(Resolvable resolvable, Decorator<?> bean)
{
- return Reflections.matches(bean.getDelegateTypes(), resolvable.getTypeClosure()) && Beans.containsAllBindings(bean.getDelegateQualifiers(), resolvable.getQualifiers(), getManager()) && getManager().getEnabledDecoratorClasses().contains(bean.getType());
+ return Reflections.matches(Collections.singleton(bean.getDelegateType()), resolvable.getTypeClosure()) && Beans.containsAllBindings(bean.getDelegateQualifiers(), resolvable.getQualifiers(), getManager()) && getManager().getEnabledDecoratorClasses().contains(bean.getBeanClass());
}
@Override
- protected Set<DecoratorImpl<?>> sortResult(Set<DecoratorImpl<?>> matchedDecorators)
+ protected Set<Decorator<?>> sortResult(Set<Decorator<?>> matchedDecorators)
{
- Set<DecoratorImpl<?>> sortedBeans = new TreeSet<DecoratorImpl<?>>(new Comparator<DecoratorImpl<?>>()
+ Set<Decorator<?>> sortedBeans = new TreeSet<Decorator<?>>(new Comparator<Decorator<?>>()
{
- public int compare(DecoratorImpl<?> o1, DecoratorImpl<?> o2)
+ public int compare(Decorator<?> o1, Decorator<?> o2)
{
List<Class<?>> enabledDecorators = getManager().getEnabledDecoratorClasses();
- int p1 = enabledDecorators.indexOf(((DecoratorImpl<?>) o1).getType());
- int p2 = enabledDecorators.indexOf(((DecoratorImpl<?>) o2).getType());
+ int p1 = enabledDecorators.indexOf(((Decorator<?>) o1).getBeanClass());
+ int p2 = enabledDecorators.indexOf(((Decorator<?>) o2).getBeanClass());
return p1 - p2;
}
Modified: core/trunk/impl/src/main/java/org/jboss/weld/util/Beans.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/util/Beans.java 2009-11-07 06:54:43 UTC (rev 4724)
+++ core/trunk/impl/src/main/java/org/jboss/weld/util/Beans.java 2009-11-07 06:58:28 UTC (rev 4725)
@@ -47,6 +47,7 @@
import javax.enterprise.inject.Disposes;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.InjectionPoint;
import javax.inject.Inject;
import org.jboss.interceptor.model.InterceptionType;
@@ -56,6 +57,7 @@
import org.jboss.weld.bean.AbstractProducerBean;
import org.jboss.weld.bean.RIBean;
import org.jboss.weld.bean.SessionBean;
+import org.jboss.weld.bean.DecoratorImpl;
import org.jboss.weld.ejb.EJBApiAbstraction;
import org.jboss.weld.injection.ConstructorInjectionPoint;
import org.jboss.weld.injection.FieldInjectionPoint;
@@ -87,6 +89,7 @@
*
* @author Pete Muir
* @author David Allen
+ * @author Marius Bogoevici
*
*/
public class Beans
@@ -749,4 +752,20 @@
return annotatedItem.isAnnotationPresent(Decorator.class);
}
+ public static InjectionPoint getDelegateInjectionPoint(javax.enterprise.inject.spi.Decorator<?> decorator)
+ {
+ if (decorator instanceof DecoratorImpl<?>)
+ {
+ return ((DecoratorImpl<?>)decorator).getDelegateInjectionPoint();
+ }
+ else
+ {
+ for (InjectionPoint injectionPoint: decorator.getInjectionPoints())
+ {
+ if (injectionPoint.isDelegate())
+ return injectionPoint;
+ }
+ }
+ return null;
+ }
}
Modified: core/trunk/impl/src/main/resources/org/jboss/weld/messages/bean_en.properties
===================================================================
--- core/trunk/impl/src/main/resources/org/jboss/weld/messages/bean_en.properties 2009-11-07 06:54:43 UTC (rev 4724)
+++ core/trunk/impl/src/main/resources/org/jboss/weld/messages/bean_en.properties 2009-11-07 06:58:28 UTC (rev 4725)
@@ -18,4 +18,4 @@
USING_DEFAULT_SCOPE=Using default @Dependent scope for {0}
CIRCULAR_CALL=Executing producer field or method {0} on incomplete declaring bean {1} due to circular injection
ERROR_DESTROYING=Error destroying an instance {0} of {1}
-USER_DEFINED_DECORATOR_DISALLOWED=Weld does not currently support user defined decorators. Decorator: {0}
+DELEGATE_INJECTION_POINT_NOT_FOUND=Delegate injection point not found on decorator {0}
Added: core/trunk/tests/src/test/java/org/jboss/weld/tests/decorators/custom/AfterBeanDiscoveryObserver.java
===================================================================
--- core/trunk/tests/src/test/java/org/jboss/weld/tests/decorators/custom/AfterBeanDiscoveryObserver.java (rev 0)
+++ core/trunk/tests/src/test/java/org/jboss/weld/tests/decorators/custom/AfterBeanDiscoveryObserver.java 2009-11-07 06:58:28 UTC (rev 4725)
@@ -0,0 +1,32 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright <Year>, Red Hat, Inc. and/or its affiliates, and individual
+ * contributors by the @authors tag. See the copyright.txt in the
+ * distribution for a full listing of individual contributors.
+ *
+ * Licensed 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.jboss.weld.tests.decorators.custom;
+
+import javax.enterprise.event.Observes;
+import javax.enterprise.inject.spi.AfterBeanDiscovery;
+import javax.enterprise.inject.spi.BeanManager;
+import javax.enterprise.inject.spi.Extension;
+
+
+public class AfterBeanDiscoveryObserver implements Extension
+{
+ public void addDecorators(@Observes AfterBeanDiscovery event, BeanManager beanManager)
+ {
+ event.addBean(new CustomDecorator(beanManager));
+ }
+}
Added: core/trunk/tests/src/test/java/org/jboss/weld/tests/decorators/custom/CustomDecorator.java
===================================================================
--- core/trunk/tests/src/test/java/org/jboss/weld/tests/decorators/custom/CustomDecorator.java (rev 0)
+++ core/trunk/tests/src/test/java/org/jboss/weld/tests/decorators/custom/CustomDecorator.java 2009-11-07 06:58:28 UTC (rev 4725)
@@ -0,0 +1,176 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright <Year>, Red Hat, Inc. and/or its affiliates, and individual
+ * contributors by the @authors tag. See the copyright.txt in the
+ * distribution for a full listing of individual contributors.
+ *
+ * Licensed 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.jboss.weld.tests.decorators.custom;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+import java.lang.reflect.Member;
+import java.util.Collections;
+import java.util.Set;
+
+import javax.enterprise.context.Dependent;
+import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.inject.spi.BeanManager;
+import javax.enterprise.inject.spi.Decorator;
+import javax.enterprise.inject.spi.InjectionPoint;
+import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.Annotated;
+import javax.enterprise.inject.spi.AnnotatedField;
+
+import org.jboss.weld.introspector.WeldField;
+import org.jboss.weld.introspector.WeldClass;
+import org.jboss.weld.introspector.jlr.WeldClassImpl;
+import org.jboss.weld.resources.ClassTransformer;
+import org.jboss.weld.metadata.TypeStore;
+import org.jboss.weld.literal.DefaultLiteral;
+
+/**
+ * @author Marius Bogoevici
+ */
+public class CustomDecorator implements Decorator<Object>
+{
+ private final Set<InjectionPoint> injectionPoints;
+ private BeanManager beanManager;
+
+ public CustomDecorator(BeanManager beanManager)
+ {
+ this.beanManager = beanManager;
+ injectionPoints = Collections.singleton((InjectionPoint)new CustomInjectionPoint());
+ }
+
+ public Type getDelegateType()
+ {
+ return Window.class;
+ }
+
+ public Set<Annotation> getDelegateQualifiers()
+ {
+ return Collections.emptySet();
+ }
+
+ public Set<Type> getDecoratedTypes()
+ {
+ return Collections.singleton((Type) Window.class);
+ }
+
+ public Set<Type> getTypes()
+ {
+ return Collections.<Type>singleton(Window.class);
+ }
+
+ public Set<Annotation> getQualifiers()
+ {
+ return Collections.emptySet();
+ }
+
+ public Class<? extends Annotation> getScope()
+ {
+ return Dependent.class;
+ }
+
+ public String getName()
+ {
+ return null;
+ }
+
+ public Set<Class<? extends Annotation>> getStereotypes()
+ {
+ return Collections.emptySet();
+
+ }
+
+ public Class<?> getBeanClass()
+ {
+ return CustomFrame.class;
+ }
+
+ public boolean isAlternative()
+ {
+ return false;
+ }
+
+ public boolean isNullable()
+ {
+ return false;
+ }
+
+ public Set<InjectionPoint> getInjectionPoints()
+ {
+ return injectionPoints;
+ }
+
+ public Object create(CreationalContext<Object> creationalContext)
+ {
+ CustomFrame customFrame = new CustomFrame();
+ customFrame.window = (Window) beanManager.getInjectableReference(injectionPoints.iterator().next(), creationalContext);
+ return customFrame;
+ }
+
+ public void destroy(Object instance, CreationalContext<Object> creationalContext)
+ {
+ creationalContext.release();
+ }
+
+ class CustomInjectionPoint implements InjectionPoint
+ {
+ private final WeldClass<?> targetClass;
+ private final WeldField<CustomFrame,?> windowField;
+
+ public CustomInjectionPoint()
+ {
+ ClassTransformer transformer = new ClassTransformer(new TypeStore());
+ targetClass = WeldClassImpl.of(CustomFrame.class, transformer);
+ windowField = targetClass.getDeclaredWeldField("window", WeldClassImpl.of(CustomFrame.class, transformer));
+ }
+
+ public Type getType()
+ {
+ return Window.class;
+ }
+
+ public Set<Annotation> getQualifiers()
+ {
+ return Collections.<Annotation>singleton(new DefaultLiteral());
+ }
+
+ public Bean<?> getBean()
+ {
+ return CustomDecorator.this;
+ }
+
+ public Member getMember()
+ {
+ return ((AnnotatedField<?>)windowField).getJavaMember();
+ }
+
+ public Annotated getAnnotated()
+ {
+ return windowField;
+ }
+
+ public boolean isDelegate()
+ {
+ return true;
+ }
+
+ public boolean isTransient()
+ {
+ return false;
+ }
+ }
+}
Added: core/trunk/tests/src/test/java/org/jboss/weld/tests/decorators/custom/CustomDecoratorTest.java
===================================================================
--- core/trunk/tests/src/test/java/org/jboss/weld/tests/decorators/custom/CustomDecoratorTest.java (rev 0)
+++ core/trunk/tests/src/test/java/org/jboss/weld/tests/decorators/custom/CustomDecoratorTest.java 2009-11-07 06:58:28 UTC (rev 4725)
@@ -0,0 +1,88 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright <Year>, Red Hat, Inc. and/or its affiliates, and individual
+ * contributors by the @authors tag. See the copyright.txt in the
+ * distribution for a full listing of individual contributors.
+ *
+ * Licensed 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.jboss.weld.tests.decorators.custom;
+
+import java.util.Arrays;
+
+import javax.enterprise.inject.spi.Extension;
+import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.context.spi.CreationalContext;
+
+import org.jboss.weld.mock.TestContainer;
+import org.jboss.weld.mock.MockServletLifecycle;
+import org.jboss.weld.mock.MockBeanDeploymentArchive;
+import org.jboss.weld.mock.MockDeployment;
+import org.jboss.weld.util.serviceProvider.ServiceLoaderFactory;
+import org.jboss.weld.util.serviceProvider.PackageServiceLoaderFactory;
+import org.jboss.weld.BeanManagerImpl;
+
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.Test;
+
+/**
+ * @author Marius Bogoevici
+ */
+public class CustomDecoratorTest
+{
+
+ @Test
+ public void testCustomDecoratorAppliedByItself()
+ {
+ MockBeanDeploymentArchive beanDeploymentArchive = new MockBeanDeploymentArchive("1", Window.class, CustomFrame.class, InnerFrame.class, OuterFrame.class );
+ beanDeploymentArchive.setBeansXmlFiles(Arrays.asList(CustomDecoratorTest.class.getResource("beans-custom-only.xml")));
+ TestContainer testContainer = new TestContainer(new MockServletLifecycle(new MockDeployment(beanDeploymentArchive), beanDeploymentArchive));
+ testContainer.getLifecycle().initialize();
+ testContainer.getDeployment().getServices().add(ServiceLoaderFactory.class, new PackageServiceLoaderFactory(CustomDecoratorTest.class.getPackage(), Extension.class));
+ testContainer.getLifecycle().beginApplication();
+
+ BeanManagerImpl beanManager = testContainer.getBeanManager();
+ Bean<Object> windowBean = (Bean<Object>) beanManager.getBeans(Window.class).iterator().next();
+ CreationalContext<Object> creationalContext = beanManager.createCreationalContext(windowBean);
+ Window window = (Window) windowBean.create(creationalContext);
+ window.draw();
+
+ assert window.isDrawn();
+ assert CustomFrame.drawn;
+ testContainer.stopContainer();
+ }
+
+ @Test
+ public void testCustomDecoratorAppliedWithWeldDecorators()
+ {
+ MockBeanDeploymentArchive beanDeploymentArchive = new MockBeanDeploymentArchive("1", Window.class, CustomFrame.class, InnerFrame.class, OuterFrame.class );
+ beanDeploymentArchive.setBeansXmlFiles(Arrays.asList(CustomDecoratorTest.class.getResource("beans.xml")));
+ TestContainer testContainer = new TestContainer(new MockServletLifecycle(new MockDeployment(beanDeploymentArchive), beanDeploymentArchive));
+ testContainer.getLifecycle().initialize();
+ testContainer.getDeployment().getServices().add(ServiceLoaderFactory.class, new PackageServiceLoaderFactory(CustomDecoratorTest.class.getPackage(), Extension.class));
+ testContainer.getLifecycle().beginApplication();
+
+ BeanManagerImpl beanManager = testContainer.getBeanManager();
+ Bean<Object> windowBean = (Bean<Object>) beanManager.getBeans(Window.class).iterator().next();
+ CreationalContext<Object> creationalContext = beanManager.createCreationalContext(windowBean);
+ Window window = (Window) windowBean.create(creationalContext);
+ window.draw();
+
+ assert window.isDrawn();
+ assert OuterFrame.drawn;
+ assert InnerFrame.drawn;
+ assert CustomFrame.drawn;
+
+ testContainer.stopContainer();
+ }
+
+}
Added: core/trunk/tests/src/test/java/org/jboss/weld/tests/decorators/custom/CustomFrame.java
===================================================================
--- core/trunk/tests/src/test/java/org/jboss/weld/tests/decorators/custom/CustomFrame.java (rev 0)
+++ core/trunk/tests/src/test/java/org/jboss/weld/tests/decorators/custom/CustomFrame.java 2009-11-07 06:58:28 UTC (rev 4725)
@@ -0,0 +1,17 @@
+package org.jboss.weld.tests.decorators.custom;
+
+/**
+ * @author Marius Bogoevici
+ */
+public class CustomFrame
+{
+ public static boolean drawn;
+
+ Window window;
+
+ public void draw()
+ {
+ window.draw();
+ drawn = true;
+ }
+}
Added: core/trunk/tests/src/test/java/org/jboss/weld/tests/decorators/custom/InnerFrame.java
===================================================================
--- core/trunk/tests/src/test/java/org/jboss/weld/tests/decorators/custom/InnerFrame.java (rev 0)
+++ core/trunk/tests/src/test/java/org/jboss/weld/tests/decorators/custom/InnerFrame.java 2009-11-07 06:58:28 UTC (rev 4725)
@@ -0,0 +1,40 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright <Year>, Red Hat, Inc. and/or its affiliates, and individual
+ * contributors by the @authors tag. See the copyright.txt in the
+ * distribution for a full listing of individual contributors.
+ *
+ * Licensed 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.jboss.weld.tests.decorators.custom;
+
+import javax.decorator.Decorator;
+import javax.decorator.Delegate;
+import javax.inject.Inject;
+
+/**
+ * @author Marius Bogoevici
+ */
+ at Decorator
+public class InnerFrame
+{
+ static boolean drawn = false;
+
+ @Inject @Delegate Window window;
+
+ void draw()
+ {
+ window.draw();
+ drawn = true;
+ }
+
+}
Added: core/trunk/tests/src/test/java/org/jboss/weld/tests/decorators/custom/OuterFrame.java
===================================================================
--- core/trunk/tests/src/test/java/org/jboss/weld/tests/decorators/custom/OuterFrame.java (rev 0)
+++ core/trunk/tests/src/test/java/org/jboss/weld/tests/decorators/custom/OuterFrame.java 2009-11-07 06:58:28 UTC (rev 4725)
@@ -0,0 +1,40 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright <Year>, Red Hat, Inc. and/or its affiliates, and individual
+ * contributors by the @authors tag. See the copyright.txt in the
+ * distribution for a full listing of individual contributors.
+ *
+ * Licensed 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.jboss.weld.tests.decorators.custom;
+
+import javax.decorator.Decorator;
+import javax.decorator.Delegate;
+import javax.inject.Inject;
+
+/**
+ * @author Marius Bogoevici
+ */
+ at Decorator
+public class OuterFrame
+{
+ static boolean drawn = false;
+
+ @Inject @Delegate Window window;
+
+ void draw()
+ {
+ window.draw();
+ drawn = true;
+ }
+
+}
Added: core/trunk/tests/src/test/java/org/jboss/weld/tests/decorators/custom/Window.java
===================================================================
--- core/trunk/tests/src/test/java/org/jboss/weld/tests/decorators/custom/Window.java (rev 0)
+++ core/trunk/tests/src/test/java/org/jboss/weld/tests/decorators/custom/Window.java 2009-11-07 06:58:28 UTC (rev 4725)
@@ -0,0 +1,36 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright <Year>, Red Hat, Inc. and/or its affiliates, and individual
+ * contributors by the @authors tag. See the copyright.txt in the
+ * distribution for a full listing of individual contributors.
+ *
+ * Licensed 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.jboss.weld.tests.decorators.custom;
+
+/**
+ * @author Marius Bogoevici
+ */
+public class Window
+{
+ public boolean drawn = false;
+
+ void draw()
+ {
+ drawn = true;
+ }
+
+ public boolean isDrawn()
+ {
+ return drawn;
+ }
+}
Added: core/trunk/tests/src/test/resources/org/jboss/weld/tests/decorators/custom/beans-custom-only.xml
===================================================================
--- core/trunk/tests/src/test/resources/org/jboss/weld/tests/decorators/custom/beans-custom-only.xml (rev 0)
+++ core/trunk/tests/src/test/resources/org/jboss/weld/tests/decorators/custom/beans-custom-only.xml 2009-11-07 06:58:28 UTC (rev 4725)
@@ -0,0 +1,22 @@
+<!--
+ ~ JBoss, Home of Professional Open Source
+ ~ Copyright <Year>, Red Hat, Inc. and/or its affiliates, and individual
+ ~ contributors by the @authors tag. See the copyright.txt in the
+ ~ distribution for a full listing of individual contributors.
+ ~
+ ~ Licensed 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.
+ -->
+
+<beans>
+ <decorators>
+ <decorator>org.jboss.weld.tests.decorators.custom.CustomFrame</decorator>
+ </decorators>
+</beans>
Added: core/trunk/tests/src/test/resources/org/jboss/weld/tests/decorators/custom/beans.xml
===================================================================
--- core/trunk/tests/src/test/resources/org/jboss/weld/tests/decorators/custom/beans.xml (rev 0)
+++ core/trunk/tests/src/test/resources/org/jboss/weld/tests/decorators/custom/beans.xml 2009-11-07 06:58:28 UTC (rev 4725)
@@ -0,0 +1,24 @@
+<!--
+ ~ JBoss, Home of Professional Open Source
+ ~ Copyright <Year>, Red Hat, Inc. and/or its affiliates, and individual
+ ~ contributors by the @authors tag. See the copyright.txt in the
+ ~ distribution for a full listing of individual contributors.
+ ~
+ ~ Licensed 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.
+ -->
+
+<beans>
+ <decorators>
+ <decorator>org.jboss.weld.tests.decorators.custom.OuterFrame</decorator>
+ <decorator>org.jboss.weld.tests.decorators.custom.CustomFrame</decorator>
+ <decorator>org.jboss.weld.tests.decorators.custom.InnerFrame</decorator>
+ </decorators>
+</beans>
Added: core/trunk/tests/src/test/resources/org/jboss/weld/tests/decorators/custom/javax.enterprise.inject.spi.Extension
===================================================================
--- core/trunk/tests/src/test/resources/org/jboss/weld/tests/decorators/custom/javax.enterprise.inject.spi.Extension (rev 0)
+++ core/trunk/tests/src/test/resources/org/jboss/weld/tests/decorators/custom/javax.enterprise.inject.spi.Extension 2009-11-07 06:58:28 UTC (rev 4725)
@@ -0,0 +1 @@
+org.jboss.weld.tests.decorators.custom.AfterBeanDiscoveryObserver
More information about the weld-commits
mailing list