[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