You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by ar...@apache.org on 2013/01/17 22:20:10 UTC

svn commit: r1434919 [2/2] - in /openwebbeans/trunk: webbeans-ee-common/src/main/java/org/apache/webbeans/ee/common/beans/ webbeans-ee/src/main/java/org/apache/webbeans/ee/beans/ webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/util/ webbeans-...

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/ObserverMethodImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/ObserverMethodImpl.java?rev=1434919&r1=1434918&r2=1434919&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/ObserverMethodImpl.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/ObserverMethodImpl.java Thu Jan 17 21:20:09 2013
@@ -59,6 +59,8 @@ import org.apache.webbeans.exception.Web
 import org.apache.webbeans.inject.impl.InjectionPointFactory;
 import org.apache.webbeans.logger.WebBeansLoggerFacade;
 import org.apache.webbeans.portable.AnnotatedElementFactory;
+import org.apache.webbeans.portable.EventProducer;
+import org.apache.webbeans.portable.InjectionPointProducer;
 import org.apache.webbeans.util.AnnotationUtil;
 import org.apache.webbeans.util.ClassUtil;
 import org.apache.webbeans.util.WebBeansUtil;
@@ -395,20 +397,20 @@ public class ObserverMethodImpl<T> imple
                     {
                         if(!InjectionPoint.class.isAssignableFrom(ClassUtil.getClass(point.getType())))
                         {
-                            injectionPointBeanLocalSetOnStack = InjectionPointBean.setThreadLocal(point);
+                            injectionPointBeanLocalSetOnStack = InjectionPointProducer.setThreadLocal(point);
                         }
                     }
                     
                     if (isEventProviderInjection(point))
                     {
-                        EventBean.local.set(point);
+                        EventProducer.local.set(point);
                     }
                     
                     CreationalContext<Object> creational = manager.createCreationalContext(injectedBean);
                     Object instance = manager.getReference(injectedBean, null, creational);
                     if (injectionPointBeanLocalSetOnStack)
                     {
-                        InjectionPointBean.unsetThreadLocal();
+                        InjectionPointProducer.unsetThreadLocal();
                     }
 
                     param = new ObserverParams();
@@ -468,13 +470,13 @@ public class ObserverMethodImpl<T> imple
                 {
                     if(!InjectionPoint.class.isAssignableFrom(ClassUtil.getClass(point.getType())))
                     {
-                        injectionPointBeanLocalSetOnStack = InjectionPointBean.setThreadLocal(point);
+                        injectionPointBeanLocalSetOnStack = InjectionPointProducer.setThreadLocal(point);
                     }
                 }                    
 
                 if (isEventProviderInjection(point))
                 {
-                    EventBean.local.set(point);
+                    EventProducer.local.set(point);
                 }
                 
                 CreationalContext<Object> creational = manager.createCreationalContext(injectedBean);
@@ -482,7 +484,7 @@ public class ObserverMethodImpl<T> imple
                 
                 if (injectionPointBeanLocalSetOnStack)
                 {
-                    InjectionPointBean.unsetThreadLocal();
+                    InjectionPointProducer.unsetThreadLocal();
                 }
                                     
                 param = new ObserverParams();

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/AbstractInjectable.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/AbstractInjectable.java?rev=1434919&r1=1434918&r2=1434919&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/AbstractInjectable.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/AbstractInjectable.java Thu Jan 17 21:20:09 2013
@@ -42,6 +42,9 @@ import org.apache.webbeans.config.WebBea
 import org.apache.webbeans.container.BeanManagerImpl;
 import org.apache.webbeans.container.InjectionResolver;
 import org.apache.webbeans.context.creational.CreationalContextImpl;
+import org.apache.webbeans.portable.EventProducer;
+import org.apache.webbeans.portable.InjectionPointProducer;
+import org.apache.webbeans.portable.InstanceProducer;
 import org.apache.webbeans.util.ClassUtil;
 import org.apache.webbeans.util.WebBeansUtil;
 
@@ -90,12 +93,12 @@ public abstract class AbstractInjectable
         Bean<?> injectedBean = instance.getInjectionPointBean(injectionPoint);
         if(isInstanceProviderInjection(injectionPoint))
         {
-            InstanceBean.local.set(injectionPoint);
+            InstanceProducer.local.set(injectionPoint);
         }
         
         else if(isEventProviderInjection(injectionPoint))
         {
-            EventBean.local.set(injectionPoint);
+            EventProducer.local.set(injectionPoint);
         }        
         
         boolean injectionPointBeanLocalSetOnStack = false;
@@ -107,7 +110,7 @@ public abstract class AbstractInjectable
             {
                 if(!InjectionPoint.class.isAssignableFrom(ClassUtil.getClass(injectionPoint.getType())))
                 {
-                    injectionPointBeanLocalSetOnStack = InjectionPointBean.setThreadLocal(injectionPoint);
+                    injectionPointBeanLocalSetOnStack = InjectionPointProducer.setThreadLocal(injectionPoint);
                 }
 
                 if(!injectionPoint.isTransient())
@@ -148,7 +151,7 @@ public abstract class AbstractInjectable
         {
             if (injectionPointBeanLocalSetOnStack)
             {
-                InjectionPointBean.unsetThreadLocal();
+                InjectionPointProducer.unsetThreadLocal();
             }
         }
         

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/instance/InstanceImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/instance/InstanceImpl.java?rev=1434919&r1=1434918&r2=1434919&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/instance/InstanceImpl.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/instance/InstanceImpl.java Thu Jan 17 21:20:09 2013
@@ -39,6 +39,7 @@ import org.apache.webbeans.config.WebBea
 import org.apache.webbeans.container.BeanManagerImpl;
 import org.apache.webbeans.container.InjectionResolver;
 import org.apache.webbeans.context.creational.CreationalContextImpl;
+import org.apache.webbeans.portable.InjectionPointProducer;
 import org.apache.webbeans.util.ClassUtil;
 import org.apache.webbeans.util.InjectionExceptionUtil;
 import org.apache.webbeans.util.OwbCustomObjectInputStream;
@@ -49,7 +50,7 @@ import org.apache.webbeans.util.WebBeans
  * 
  * @param <T> specific instance type
  */
-class InstanceImpl<T> implements Instance<T>, Serializable
+public class InstanceImpl<T> implements Instance<T>, Serializable
 {
     private static final long serialVersionUID = -8401944412490389024L;
 
@@ -80,7 +81,7 @@ class InstanceImpl<T> implements Instanc
      * @param ownerInstance the object the current Instance got injected into
      * @param annotations qualifier annotations
      */
-    InstanceImpl(Type injectionClazz, InjectionPoint injectionPoint, WebBeansContext webBeansContext,
+    public InstanceImpl(Type injectionClazz, InjectionPoint injectionPoint, WebBeansContext webBeansContext,
                  CreationalContext<?> creationalContext, Object ownerInstance, Annotation... annotations)
     {
         this.injectionClazz = injectionClazz;
@@ -105,7 +106,7 @@ class InstanceImpl<T> implements Instanc
     {
         T instance;
 
-        InjectionPointBean.setThreadLocal(injectionPoint);
+        InjectionPointProducer.setThreadLocal(injectionPoint);
         try
         {
             Annotation[] anns = new Annotation[qualifierAnnotations.size()];
@@ -142,7 +143,7 @@ class InstanceImpl<T> implements Instanc
         }
         finally
         {
-            InjectionPointBean.removeThreadLocal();
+            InjectionPointProducer.removeThreadLocal();
         }
 
         return instance;
@@ -273,7 +274,7 @@ class InstanceImpl<T> implements Instanc
     {
         Set<Bean<?>> beans = resolveBeans();
         Set<T> instances = new HashSet<T>();
-        InjectionPointBean.setThreadLocal(injectionPoint);
+        InjectionPointProducer.setThreadLocal(injectionPoint);
         try
         {
             for(Bean<?> bean : beans)
@@ -284,7 +285,7 @@ class InstanceImpl<T> implements Instanc
         }
         finally
         {
-            InjectionPointBean.removeThreadLocal();
+            InjectionPointProducer.removeThreadLocal();
         }
         
         return instances.iterator();

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/WebBeansInterceptorConfig.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/WebBeansInterceptorConfig.java?rev=1434919&r1=1434918&r2=1434919&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/WebBeansInterceptorConfig.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/WebBeansInterceptorConfig.java Thu Jan 17 21:20:09 2013
@@ -76,7 +76,7 @@ public final class WebBeansInterceptorCo
      */
     public void defineBeanInterceptorStack(InjectionTargetBean<?> bean)
     {
-        if (bean instanceof InterceptedMarker)
+        if (bean instanceof InterceptedMarker && bean.getInjectionTarget() instanceof InjectionTargetImpl)
         {
             InjectionTargetImpl<?> injectionTarget = (InjectionTargetImpl<?>) bean.getInjectionTarget();
             BeanInterceptorInfo interceptorInfo = webBeansContext.getInterceptorResolutionService().

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AbstractProducer.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AbstractProducer.java?rev=1434919&r1=1434918&r2=1434919&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AbstractProducer.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AbstractProducer.java Thu Jan 17 21:20:09 2013
@@ -18,8 +18,10 @@
  */
 package org.apache.webbeans.portable;
 
+import java.util.Collections;
 import java.util.Set;
 
+import javax.enterprise.inject.Instance;
 import javax.enterprise.inject.spi.InjectionPoint;
 import javax.enterprise.inject.spi.Producer;
 
@@ -28,6 +30,11 @@ public abstract class AbstractProducer<T
 
     private Set<InjectionPoint> injectionPoints;
 
+    public AbstractProducer()
+    {
+        this(Collections.<InjectionPoint>emptySet());
+    }
+
     public AbstractProducer(Set<InjectionPoint> points)
     {
         // this shares the InjectionPoints with the owning component for now
@@ -39,4 +46,8 @@ public abstract class AbstractProducer<T
     {
         return injectionPoints;
     }
+
+    @Override
+    public void dispose(T instance) {
+    }
 }

Added: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/BeanManagerProducer.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/BeanManagerProducer.java?rev=1434919&view=auto
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/BeanManagerProducer.java (added)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/BeanManagerProducer.java Thu Jan 17 21:20:09 2013
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.webbeans.portable;
+
+import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.inject.spi.BeanManager;
+
+import org.apache.webbeans.config.WebBeansContext;
+import org.apache.webbeans.container.InjectableBeanManager;
+
+public class BeanManagerProducer extends AbstractProducer<BeanManager> {
+
+    private WebBeansContext context;
+    private BeanManager manager;
+    
+    public BeanManagerProducer(WebBeansContext webBeansContext)
+    {
+        context = webBeansContext;
+    }
+
+    @Override
+    public BeanManager produce(CreationalContext<BeanManager> creationalContext) {
+        if (manager == null)
+        {
+            manager = new InjectableBeanManager(context.getBeanManagerImpl());
+        }
+
+        return manager;
+    }
+
+    @Override
+    public void dispose(BeanManager instance) {
+        manager = null;
+    }
+}

Added: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/EventProducer.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/EventProducer.java?rev=1434919&view=auto
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/EventProducer.java (added)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/EventProducer.java Thu Jan 17 21:20:09 2013
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.webbeans.portable;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+
+import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.event.Event;
+import javax.enterprise.inject.spi.InjectionPoint;
+
+import org.apache.webbeans.config.WebBeansContext;
+import org.apache.webbeans.event.EventImpl;
+import org.apache.webbeans.exception.WebBeansException;
+
+public class EventProducer<T> extends AbstractProducer<Event<T>> {
+
+    //X TODO refactor. public static variables are utterly ugly
+    public static ThreadLocal<InjectionPoint> local = new ThreadLocal<InjectionPoint>();
+    private WebBeansContext webBeansContext;
+    
+    public EventProducer(WebBeansContext webBeansContext)
+    {
+        this.webBeansContext = webBeansContext;
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Event<T> produce(CreationalContext<Event<T>> creationalContext) {
+        Event<T> instance = null;
+
+        InjectionPoint injectionPoint = local.get();
+        Type eventType;
+        
+        if(injectionPoint != null)
+        {
+            Type[] eventActualTypeArgs;
+            Type type = injectionPoint.getType();                        
+            ParameterizedType pt = (ParameterizedType) type;
+            eventActualTypeArgs = pt.getActualTypeArguments();
+
+            //First argument and sole argument is actual Event type
+            //Example : Event<MyEvent>
+            eventType = eventActualTypeArgs[0];
+            
+            //Event qualifiers
+            Annotation[] qualifiers = new Annotation[injectionPoint.getQualifiers().size()];
+            qualifiers = injectionPoint.getQualifiers().toArray(qualifiers);
+            
+            try
+            {
+                instance = new EventImpl<T>(qualifiers, eventType, injectionPoint, webBeansContext);
+            }
+            catch (Exception e)
+            {
+                throw new WebBeansException("Exception in creating Event implicit component for event type : "
+                                            + eventType);
+            }           
+            finally
+            {
+                local.set(null);
+                local.remove();
+            }
+            
+        }
+                        
+        return instance;
+    }
+}

Added: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionPointProducer.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionPointProducer.java?rev=1434919&view=auto
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionPointProducer.java (added)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionPointProducer.java Thu Jan 17 21:20:09 2013
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.webbeans.portable;
+
+import java.util.Stack;
+
+import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.inject.spi.InjectionPoint;
+
+public class InjectionPointProducer extends AbstractProducer<InjectionPoint> {
+
+    //X TODO refactor. public static variables are utterly ugly
+    private static ThreadLocal<Stack<InjectionPoint>> localThreadlocalStack = new ThreadLocal<Stack<InjectionPoint>>();
+    
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public InjectionPoint produce(CreationalContext<InjectionPoint> creationalContext) {
+        return getStackOfInjectionPoints().peek();
+    }
+
+    @Override
+    public void dispose(InjectionPoint ip) {
+        removeThreadLocal();
+    }
+
+    private static Stack<InjectionPoint> getStackOfInjectionPoints()
+    {
+        Stack<InjectionPoint> stackIP = localThreadlocalStack.get();
+        if (null == stackIP)
+        {
+            stackIP = new Stack<InjectionPoint>();
+        }
+        return stackIP;
+    }
+
+    public static boolean setThreadLocal(InjectionPoint ip)
+    {
+        Stack<InjectionPoint> stackIP = getStackOfInjectionPoints();
+        stackIP.push(ip);
+        localThreadlocalStack.set(stackIP);
+        return true;
+    }
+    
+    public static void unsetThreadLocal()
+    {
+        Stack<InjectionPoint> stackIP = getStackOfInjectionPoints();
+        stackIP.pop();
+    }
+    
+    /**
+     * Removes the ThreadLocal from the ThreadMap to prevent memory leaks.
+     */
+    public static void removeThreadLocal()
+    {
+        getStackOfInjectionPoints().clear();
+        localThreadlocalStack.remove();
+    }
+    
+    public static boolean isStackEmpty()
+    {
+        return getStackOfInjectionPoints().isEmpty();
+    }
+}

Added: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InstanceProducer.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InstanceProducer.java?rev=1434919&view=auto
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InstanceProducer.java (added)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InstanceProducer.java Thu Jan 17 21:20:09 2013
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.webbeans.portable;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.util.Collections;
+import java.util.Set;
+
+import javax.enterprise.context.Dependent;
+import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.inject.Instance;
+import javax.enterprise.inject.spi.InjectionPoint;
+import javax.enterprise.util.TypeLiteral;
+import javax.inject.Provider;
+
+import org.apache.webbeans.config.WebBeansContext;
+import org.apache.webbeans.inject.AbstractInjectable;
+import org.apache.webbeans.inject.instance.InstanceImpl;
+import org.apache.webbeans.util.AnnotationUtil;
+import org.apache.webbeans.util.CollectionUtil;
+
+public class InstanceProducer<T> extends AbstractProducer<Instance<T>>
+{
+    // TODO refactor. public static variables are uterly ugly
+    public static ThreadLocal<InjectionPoint> local = new ThreadLocal<InjectionPoint>();
+    private Class<Instance<T>> returnType;
+    private Set<Annotation> qualifiers;
+    private WebBeansContext webBeansContext;
+    
+    public InstanceProducer(Class<Instance<T>> returnType, Set<Annotation> qualifiers, WebBeansContext webBeansContext)
+    {
+        this.returnType = returnType;
+        this.qualifiers = qualifiers;
+        this.webBeansContext = webBeansContext;
+    }
+
+    @Override
+    public Instance<T> produce(CreationalContext<Instance<T>> creationalContext)
+    {
+        try
+        {
+            InjectionPoint injectionPoint = local.get();
+            Set<Annotation> qualifiers;
+            Type type;
+
+            if (injectionPoint != null)
+            {
+                ParameterizedType injectedType = (ParameterizedType)injectionPoint.getType();
+                qualifiers = injectionPoint.getQualifiers();
+                type = injectedType.getActualTypeArguments()[0];
+            }
+            else
+            {
+                qualifiers = this.qualifiers;
+                type = this.returnType;
+            }
+
+            Object ownerInstance = AbstractInjectable.instanceUnderInjection.get();
+
+            Instance<T> instance = new InstanceImpl<T>(type, injectionPoint, webBeansContext, creationalContext, ownerInstance, qualifiers.toArray(new Annotation[qualifiers.size()]));
+            
+            return instance;
+        }
+        finally
+        {
+            local.set(null);
+            local.remove();
+        }
+    }
+}

Added: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/ProducerFieldProducer.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/ProducerFieldProducer.java?rev=1434919&view=auto
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/ProducerFieldProducer.java (added)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/ProducerFieldProducer.java Thu Jan 17 21:20:09 2013
@@ -0,0 +1,117 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.webbeans.portable;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.util.Set;
+
+import javax.enterprise.context.Dependent;
+import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.inject.spi.AnnotatedField;
+import javax.enterprise.inject.spi.AnnotatedMethod;
+import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.InjectionPoint;
+
+import org.apache.webbeans.component.AbstractOwbBean;
+import org.apache.webbeans.component.OwbBean;
+import org.apache.webbeans.config.WebBeansContext;
+import org.apache.webbeans.context.creational.CreationalContextImpl;
+import org.apache.webbeans.exception.WebBeansException;
+import org.apache.webbeans.inject.InjectableMethod;
+import org.apache.webbeans.util.WebBeansUtil;
+
+public class ProducerFieldProducer<T, P> extends AbstractProducer<T> {
+
+    private Bean<P> owner;
+    private WebBeansContext webBeansContext;
+    private AnnotatedField<P> producerField;
+
+    public ProducerFieldProducer(OwbBean<P> owner, AnnotatedField<P> producerField, Set<InjectionPoint> points)
+    {
+        super(points);
+        this.owner = owner;
+        this.webBeansContext = owner.getWebBeansContext();
+        this.producerField = producerField;
+    }
+
+    @Override
+    public T produce(CreationalContext<T> creationalContext) {
+        T instance = null;
+        P parentInstance = null;
+        CreationalContext<P> parentCreational = null;
+        try
+        {
+            parentCreational = webBeansContext.getBeanManagerImpl().createCreationalContext(owner);
+            
+            Field field = producerField.getJavaMember();
+            if (!field.isAccessible())
+            {
+                webBeansContext.getSecurityService().doPrivilegedSetAccessible(field, true);
+            }
+
+            if (Modifier.isStatic(field.getModifiers()))
+            {
+                instance = (T) field.get(null);
+            }
+            else
+            { 
+                parentInstance = getParentInstanceFromContext(parentCreational);
+                
+                instance = (T) field.get(parentInstance);
+            }
+        }
+        catch(Exception e)
+        {
+            throw new WebBeansException(e);
+        }
+        finally
+        {
+            if (owner.getScope().equals(Dependent.class))
+            {
+                owner.destroy(parentInstance, parentCreational);
+            }
+        }
+
+        return instance;
+
+    }
+    
+    @SuppressWarnings("unchecked")
+    protected P getParentInstanceFromContext(CreationalContext<?> creationalContext)
+    {
+        P  parentInstance;
+
+        Bean<?> specialize = WebBeansUtil.getMostSpecializedBean(webBeansContext.getBeanManagerImpl(), (AbstractOwbBean<T>) owner);
+
+        if (specialize != null)
+        {
+            parentInstance = (P) webBeansContext.getBeanManagerImpl().getContext(specialize.getScope()).
+                    get((Bean<Object>)specialize,(CreationalContext<Object>) creationalContext);
+        }
+        else
+        {
+            parentInstance = (P) webBeansContext.getBeanManagerImpl().getContext(
+                    owner.getScope()).get((Bean<Object>)owner, (CreationalContext<Object>) creationalContext);
+        }
+
+        return parentInstance;
+
+    }
+}

Added: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/ProducerMethodProducer.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/ProducerMethodProducer.java?rev=1434919&view=auto
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/ProducerMethodProducer.java (added)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/ProducerMethodProducer.java Thu Jan 17 21:20:09 2013
@@ -0,0 +1,111 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.webbeans.portable;
+
+import java.lang.reflect.Modifier;
+import java.util.Map;
+import java.util.Set;
+
+import javax.enterprise.context.Dependent;
+import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.inject.spi.AnnotatedMethod;
+import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.InjectionPoint;
+import javax.enterprise.inject.spi.InjectionTarget;
+
+import org.apache.webbeans.component.OwbBean;
+import org.apache.webbeans.config.WebBeansContext;
+import org.apache.webbeans.context.creational.CreationalContextImpl;
+import org.apache.webbeans.inject.InjectableMethod;
+import org.apache.webbeans.util.Asserts;
+
+public class ProducerMethodProducer<T, P> extends AbstractProducer<T> {
+
+    private Bean<P> owner;
+    private WebBeansContext webBeansContext;
+    private AnnotatedMethod<P> producerMethod;
+    private AnnotatedMethod<P> disposalMethod;
+
+    public ProducerMethodProducer(OwbBean<P> owner, AnnotatedMethod<P> producerMethod, AnnotatedMethod<P> disposerMethod, Set<InjectionPoint> points)
+    {
+        super(points);
+        Asserts.assertNotNull(producerMethod);
+        this.owner = owner;
+        this.webBeansContext = owner.getWebBeansContext();
+        this.producerMethod = producerMethod;
+        this.disposalMethod = disposerMethod;
+    }
+    
+    public void setDisposalMethod(AnnotatedMethod<P> disposalMethod)
+    {
+        this.disposalMethod = disposalMethod;
+    }
+
+    @Override
+    public T produce(CreationalContext<T> creationalContext) {
+        CreationalContextImpl<T> context = (CreationalContextImpl<T>)creationalContext;
+        P ownerInstance = (P)webBeansContext.getBeanManagerImpl().getReference(owner, owner.getBeanClass(), creationalContext);
+        return new InjectableMethod<T>(producerMethod.getJavaMember(), ownerInstance, this, context).doInjection();
+    }
+
+    @Override
+    public void dispose(T instance) {
+        if (disposalMethod != null)
+        {
+            P parentInstance = null;
+            CreationalContext<P> parentCreational = null;
+            InjectableMethod<T> m = null;
+            try
+            {
+                parentCreational = webBeansContext.getBeanManagerImpl().createCreationalContext(owner);
+                
+                if (!Modifier.isStatic(disposalMethod.getJavaMember().getModifiers()))
+                {
+                    parentInstance = (P)webBeansContext.getBeanManagerImpl().getReference(owner, owner.getBeanClass(), parentCreational);
+                }
+
+                m = new InjectableMethod<T>(disposalMethod.getJavaMember(), parentInstance, this, (CreationalContextImpl<T>) parentCreational);
+                m.setDisposable(true);
+                m.setProducerMethodInstance(instance);
+
+                m.doInjection();
+
+            }
+            finally
+            {
+                if (owner.getScope().equals(Dependent.class))
+                {
+                    owner.destroy(parentInstance, parentCreational);
+                }
+
+                //Destroy dependent parameters
+                Map<Bean<?>, Object> dependents = m.getDependentBeanParameters();
+                if(dependents != null)
+                {
+                    Set<Bean<?>> beans = dependents.keySet();
+                    for(Bean<?> bean : beans)
+                    {
+                        Bean<Object> beanTt = (Bean<Object>)bean;
+                        beanTt.destroy(dependents.get(beanTt), (CreationalContext<Object>) parentCreational);
+                    }
+                }
+            }
+        }
+    }
+}

Added: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/ProviderBasedProxyProducer.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/ProviderBasedProxyProducer.java?rev=1434919&view=auto
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/ProviderBasedProxyProducer.java (added)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/ProviderBasedProxyProducer.java Thu Jan 17 21:20:09 2013
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.webbeans.portable;
+
+import javax.enterprise.context.spi.CreationalContext;
+import javax.inject.Provider;
+
+import org.apache.webbeans.config.WebBeansContext;
+import org.apache.webbeans.proxy.NormalScopeProxyFactory;
+
+public class ProviderBasedProxyProducer<T> extends AbstractProducer<T> {
+
+    private WebBeansContext webBeansContext;
+    private Class<T> returnType;
+    private Provider<T> provider;
+    private T proxyInstance;
+
+    public ProviderBasedProxyProducer(WebBeansContext webBeansContext, Class<T> returnType, Provider<T> provider)
+    {
+        this.webBeansContext = webBeansContext;
+        this.returnType = returnType;
+        this.provider = provider;
+    }
+
+    @Override
+    public T produce(CreationalContext<T> creationalContext) {
+        if (proxyInstance == null)
+        {
+            NormalScopeProxyFactory proxyFactory = webBeansContext.getNormalScopeProxyFactory();
+            Class<T> proxyClass = proxyFactory.createProxyClass(getClass().getClassLoader(), returnType);
+            proxyInstance = proxyFactory.createProxyInstance(proxyClass, provider);
+        }
+        return proxyInstance;
+    }
+}

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java?rev=1434919&r1=1434918&r2=1434919&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java Thu Jan 17 21:20:09 2013
@@ -125,7 +125,8 @@ import org.apache.webbeans.intercept.Int
 import org.apache.webbeans.logger.WebBeansLoggerFacade;
 import org.apache.webbeans.plugins.OpenWebBeansEjbLCAPlugin;
 import org.apache.webbeans.plugins.PluginLoader;
-import org.apache.webbeans.portable.creation.ProducerBeansProducerRemove;
+import org.apache.webbeans.portable.ProducerFieldProducer;
+import org.apache.webbeans.portable.ProducerMethodProducer;
 import org.apache.webbeans.portable.events.discovery.ErrorStack;
 import org.apache.webbeans.portable.events.generics.GProcessAnnotatedType;
 import org.apache.webbeans.portable.events.generics.GProcessBean;
@@ -1882,7 +1883,7 @@ public final class WebBeansUtil
 
     public GProcessProducer fireProcessProducerEventForMethod(ProducerMethodBean<?> producerMethod, AnnotatedMethod<?> method)
     {
-        GProcessProducer producerEvent = new GProcessProducer(new ProducerBeansProducerRemove(producerMethod),method);
+        GProcessProducer producerEvent = new GProcessProducer(new ProducerMethodProducer(producerMethod.getParent(), method, null, producerMethod.getInjectionPoints()),method);
 
         //Fires ProcessProducer for methods
         webBeansContext.getBeanManagerImpl().fireEvent(producerEvent, AnnotationUtil.EMPTY_ANNOTATION_ARRAY);
@@ -1892,7 +1893,7 @@ public final class WebBeansUtil
 
     public GProcessProducer fireProcessProducerEventForField(ProducerFieldBean<?> producerField, AnnotatedField<?> field)
     {
-        GProcessProducer producerEvent = new GProcessProducer(new ProducerBeansProducerRemove(producerField),field);
+        GProcessProducer producerEvent = new GProcessProducer(new ProducerFieldProducer(producerField.getParent(), field, producerField.getInjectionPoints()), field);
 
         //Fires ProcessProducer for fields
         webBeansContext.getBeanManagerImpl().fireEvent(producerEvent, AnnotationUtil.EMPTY_ANNOTATION_ARRAY);

Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/TestContext.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/TestContext.java?rev=1434919&r1=1434918&r2=1434919&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/TestContext.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/TestContext.java Thu Jan 17 21:20:09 2013
@@ -57,7 +57,8 @@ import org.apache.webbeans.exception.Web
 import org.apache.webbeans.logger.WebBeansLoggerFacade;
 import org.apache.webbeans.newtests.AbstractUnitTest;
 import org.apache.webbeans.portable.InjectionTargetImpl;
-import org.apache.webbeans.portable.creation.ProducerBeansProducerRemove;
+import org.apache.webbeans.portable.ProducerFieldProducer;
+import org.apache.webbeans.portable.ProducerMethodProducer;
 import org.apache.webbeans.portable.events.generics.GProcessAnnotatedType;
 import org.apache.webbeans.test.component.decorator.broken.DelegateAttributeIsnotInterface;
 import org.apache.webbeans.test.component.decorator.broken.DelegateAttributeMustImplementAllDecoratedTypes;
@@ -554,7 +555,6 @@ public abstract class TestContext implem
         {
             // add them one after the other to enable serialization handling et al
             manager.addBean(producerMethod);
-            producerMethod.setProducer(new ProducerBeansProducerRemove(producerMethod));
         }
 
         Set<ProducerFieldBean<?>> producerFields = managedBeanCreator.defineProducerFields(component);
@@ -562,7 +562,6 @@ public abstract class TestContext implem
         {
             // add them one after the other to enable serialization handling et al
             manager.addBean(producerField);
-            producerField.setProducer(new ProducerBeansProducerRemove(producerField));
         }
 
         managedBeanCreator.validateDisposalMethods(component);

Modified: openwebbeans/trunk/webbeans-jms/src/main/java/org/apache/webbeans/jms/component/JmsBean.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-jms/src/main/java/org/apache/webbeans/jms/component/JmsBean.java?rev=1434919&r1=1434918&r2=1434919&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-jms/src/main/java/org/apache/webbeans/jms/component/JmsBean.java (original)
+++ openwebbeans/trunk/webbeans-jms/src/main/java/org/apache/webbeans/jms/component/JmsBean.java Thu Jan 17 21:20:09 2013
@@ -49,12 +49,6 @@ public class JmsBean<T> extends Abstract
     }
 
     @Override
-    protected T createInstance(CreationalContext<T> creationalContext)
-    {
-        return null;
-    }
-
-    @Override
     protected void destroyInstance(T instance,CreationalContext<T> creationalContext)
     {        
         try

Modified: openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/servlet/WebBeansConfigurationFilter.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/servlet/WebBeansConfigurationFilter.java?rev=1434919&r1=1434918&r2=1434919&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/servlet/WebBeansConfigurationFilter.java (original)
+++ openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/servlet/WebBeansConfigurationFilter.java Thu Jan 17 21:20:09 2013
@@ -24,6 +24,7 @@ import org.apache.webbeans.config.OWBLog
 import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.el.ELContextStore;
 import org.apache.webbeans.logger.WebBeansLoggerFacade;
+import org.apache.webbeans.portable.InjectionPointProducer;
 import org.apache.webbeans.spi.ContainerLifecycle;
 import org.apache.webbeans.spi.FailOverService;
 import org.apache.webbeans.util.WebBeansUtil;
@@ -224,7 +225,7 @@ public class WebBeansConfigurationFilter
     {
         // TODO maybe there are more to cleanup
 
-        InjectionPointBean.removeThreadLocal();
+        InjectionPointProducer.removeThreadLocal();
         WebContextsService.removeThreadLocals();
     }
 }

Modified: openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/servlet/WebBeansConfigurationListener.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/servlet/WebBeansConfigurationListener.java?rev=1434919&r1=1434918&r2=1434919&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/servlet/WebBeansConfigurationListener.java (original)
+++ openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/servlet/WebBeansConfigurationListener.java Thu Jan 17 21:20:09 2013
@@ -24,6 +24,7 @@ import org.apache.webbeans.config.WebBea
 import org.apache.webbeans.conversation.ConversationManager;
 import org.apache.webbeans.el.ELContextStore;
 import org.apache.webbeans.logger.WebBeansLoggerFacade;
+import org.apache.webbeans.portable.InjectionPointProducer;
 import org.apache.webbeans.spi.ContainerLifecycle;
 import org.apache.webbeans.spi.FailOverService;
 import org.apache.webbeans.util.WebBeansUtil;
@@ -135,7 +136,7 @@ public class WebBeansConfigurationListen
      */
     private void cleanupRequestThreadLocals()
     {
-        InjectionPointBean.removeThreadLocal();
+        InjectionPointProducer.removeThreadLocal();
         WebContextsService.removeThreadLocals();
     }
 

Modified: openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/lifecycle/WebContainerLifecycle.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/lifecycle/WebContainerLifecycle.java?rev=1434919&r1=1434918&r2=1434919&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/lifecycle/WebContainerLifecycle.java (original)
+++ openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/lifecycle/WebContainerLifecycle.java Thu Jan 17 21:20:09 2013
@@ -25,6 +25,7 @@ import org.apache.webbeans.config.WebBea
 import org.apache.webbeans.exception.WebBeansException;
 import org.apache.webbeans.lifecycle.AbstractLifeCycle;
 import org.apache.webbeans.logger.WebBeansLoggerFacade;
+import org.apache.webbeans.portable.InjectionPointProducer;
 import org.apache.webbeans.spi.ResourceInjectionService;
 import org.apache.webbeans.spi.adaptor.ELAdaptor;
 import org.apache.webbeans.web.context.WebContextsService;
@@ -202,7 +203,7 @@ public final class WebContainerLifecycle
      */
     private void cleanupShutdownThreadLocals()
     {
-        InjectionPointBean.removeThreadLocal();
+        InjectionPointProducer.removeThreadLocal();
         WebContextsService.removeThreadLocals();
     }