You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by ge...@apache.org on 2010/04/21 18:14:58 UTC
svn commit: r936384 - in /openwebbeans/trunk/webbeans-impl/src:
main/java/org/apache/webbeans/context/
main/java/org/apache/webbeans/context/creational/
main/java/org/apache/webbeans/intercept/
test/java/org/apache/webbeans/newtests/interceptors/inheri...
Author: gerdogdu
Date: Wed Apr 21 16:14:57 2010
New Revision: 936384
URL: http://svn.apache.org/viewvc?rev=936384&view=rev
Log:
[OWB-351,OWB-359] Removing creational context from InterceptorHandler.
Added:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/creational/BeanInstanceBag.java (with props)
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/AbstractContext.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/ApplicationContext.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/ConversationContext.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/RequestContext.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/SessionContext.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/SingletonContext.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/WebBeansContext.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/ApplicationScopedBeanIntereptorHandler.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorDataImpl.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/NormalScopedBeanInterceptorHandler.java
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/inheritance/InheritedInterceptorTest.java
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/AbstractContext.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/AbstractContext.java?rev=936384&r1=936383&r2=936384&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/AbstractContext.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/AbstractContext.java Wed Apr 21 16:14:57 2010
@@ -18,7 +18,6 @@ import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
-import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import javax.enterprise.context.ApplicationScoped;
@@ -31,6 +30,7 @@ import javax.enterprise.context.spi.Cont
import javax.enterprise.context.spi.Contextual;
import javax.enterprise.context.spi.CreationalContext;
+import org.apache.webbeans.context.creational.BeanInstanceBag;
import org.apache.webbeans.context.type.ContextTypes;
import org.apache.webbeans.util.Asserts;
@@ -53,16 +53,11 @@ public abstract class AbstractContext im
protected ContextTypes type;
/**Context contextual instances*/
- protected Map<Contextual<?>, Object> componentInstanceMap = null;
+ protected Map<Contextual<?>, BeanInstanceBag<?>> componentInstanceMap = null;
/**Contextual Scope Type*/
protected Class<? extends Annotation> scopeType;
- /**Contextual to CreationalContext Map*/
- protected final ConcurrentMap<Contextual<?>, CreationalContext<?>> creationalContextMap =
- new ConcurrentHashMap<Contextual<?>, CreationalContext<?>>();
-
-
/**
* Creates a new context instance
*/
@@ -70,7 +65,33 @@ public abstract class AbstractContext im
{
}
+
+ public <T> void initContextualBag(Contextual<T> contextual, CreationalContext<T> creationalContext)
+ {
+ createContextualBag(contextual, creationalContext);
+ }
+
+ @SuppressWarnings("unchecked")
+ private <T> void createContextualBag(Contextual<T> contextual, CreationalContext<T> creationalContext)
+ {
+ BeanInstanceBag<T> bag = new BeanInstanceBag<T>(creationalContext);
+
+ if(this.componentInstanceMap instanceof ConcurrentMap)
+ {
+ T exist = (T) ((ConcurrentMap) this.componentInstanceMap).putIfAbsent(contextual, bag);
+ //no instance
+ if(exist == null)
+ {
+ this.componentInstanceMap.put(contextual, bag);
+ }
+ }
+ else
+ {
+ this.componentInstanceMap.put(contextual , bag);
+ }
+ }
+
/**
* Creates a new context with given scope type.
*
@@ -132,6 +153,8 @@ public abstract class AbstractContext im
}
}
+
+
/**
* {@inheritDoc}
@@ -141,28 +164,41 @@ public abstract class AbstractContext im
{
checkActive();
- return (T) componentInstanceMap.get(component);
+ if(componentInstanceMap.get(component) != null)
+ {
+ return (T) componentInstanceMap.get(component).getBeanInstance();
+ }
+
+ return null;
}
/**
* {@inheritDoc}
*/
- public <T> T get(Contextual<T> component, CreationalContext<T> creationalContext)
+ public <T> T get(Contextual<T> contextual, CreationalContext<T> creationalContext)
{
checkActive();
- return getInstance(component, creationalContext);
+ return getInstance(contextual, creationalContext);
}
/**
* {@inheritDoc}
*/
@SuppressWarnings("unchecked")
- protected <T> T getInstance(Contextual<T> component, CreationalContext<T> creationalContext)
+ protected <T> T getInstance(Contextual<T> contextual, CreationalContext<T> creationalContext)
{
- T instance = (T)componentInstanceMap.get(component);
-
+ T instance = null;
+ //Look for bag
+ BeanInstanceBag<T> bag = (BeanInstanceBag<T>)componentInstanceMap.get(contextual);
+ if(bag == null)
+ {
+ createContextualBag(contextual, creationalContext);
+ }
+
+ //Look for instance
+ instance = (T)componentInstanceMap.get(contextual).getBeanInstance();
if (instance != null)
{
return instance;
@@ -180,27 +216,14 @@ public abstract class AbstractContext im
//No instance
if(instance == null)
{
- instance = component.create(creationalContext);
+ instance = contextual.create(creationalContext);
}
-
+ //If succesfull creation
if (instance != null)
{
- if(this.componentInstanceMap instanceof ConcurrentMap)
- {
- T exist = (T) ((ConcurrentMap) this.componentInstanceMap).putIfAbsent(component, instance);
- //no instance
- if(exist == null)
- {
- this.componentInstanceMap.put(component, instance);
- }
- }
- else
- {
- this.componentInstanceMap.put(component, instance);
- }
-
- this.creationalContextMap.putIfAbsent(component, creationalContext);
+ bag = (BeanInstanceBag<T>)this.componentInstanceMap.get(contextual);
+ bag.setBeanInstance(instance);
}
}
@@ -216,9 +239,9 @@ public abstract class AbstractContext im
public <T> CreationalContext<T> getCreationalContext(Contextual<T> contextual)
{
Asserts.assertNotNull(contextual);
- if(this.creationalContextMap.containsKey(contextual))
+ if(this.componentInstanceMap.containsKey(contextual))
{
- return (CreationalContext<T>)this.creationalContextMap.get(contextual);
+ return (CreationalContext<T>)this.componentInstanceMap.get(contextual).getBeanCreationalContext();
}
return null;
@@ -243,27 +266,24 @@ public abstract class AbstractContext im
@SuppressWarnings("unchecked")
public void destroy()
{
- Set<Entry<Contextual<?>, Object>> entrySet = componentInstanceMap.entrySet();
- Iterator<Entry<Contextual<?>, Object>> it = entrySet.iterator();
+ Set<Entry<Contextual<?>, BeanInstanceBag<?>>> entrySet = componentInstanceMap.entrySet();
+ Iterator<Entry<Contextual<?>, BeanInstanceBag<?>>> it = entrySet.iterator();
- Contextual<?> component = null;
+ Contextual<?> contextual = null;
while (it.hasNext())
{
- component = it.next().getKey();
+ contextual = it.next().getKey();
- Object instance = componentInstanceMap.get(component);
+ BeanInstanceBag<?> instance = componentInstanceMap.get(contextual);
//Get creational context
- CreationalContext<Object> cc = (CreationalContext<Object>)this.creationalContextMap.get(component);
+ CreationalContext<Object> cc = (CreationalContext<Object>)instance.getBeanCreationalContext();
//Destroy instance
- destroyInstance((Contextual<Object>) component, instance, cc);
+ destroyInstance((Contextual<Object>) contextual, instance.getBeanInstance(), cc);
}
- //Clear cache
- this.componentInstanceMap.clear();
- //Clear creational context map
- this.creationalContextMap.clear();
-
+ //Clear context map
+ this.componentInstanceMap.clear();
}
/**
@@ -300,7 +320,7 @@ public abstract class AbstractContext im
/**
* {@inheritDoc}
*/
- public Map<Contextual<?>, Object> getComponentInstanceMap()
+ public Map<Contextual<?>, BeanInstanceBag<?>> getComponentInstanceMap()
{
return componentInstanceMap;
}
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/ApplicationContext.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/ApplicationContext.java?rev=936384&r1=936383&r2=936384&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/ApplicationContext.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/ApplicationContext.java Wed Apr 21 16:14:57 2010
@@ -17,6 +17,7 @@ import java.util.concurrent.ConcurrentHa
import javax.enterprise.context.spi.Contextual;
+import org.apache.webbeans.context.creational.BeanInstanceBag;
import org.apache.webbeans.context.type.ContextTypes;
/**
@@ -33,7 +34,7 @@ public class ApplicationContext extends
@Override
public void setComponentInstanceMap()
{
- this.componentInstanceMap = new ConcurrentHashMap<Contextual<?>, Object>();
+ this.componentInstanceMap = new ConcurrentHashMap<Contextual<?>, BeanInstanceBag<?>>();
}
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/ConversationContext.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/ConversationContext.java?rev=936384&r1=936383&r2=936384&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/ConversationContext.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/ConversationContext.java Wed Apr 21 16:14:57 2010
@@ -17,6 +17,7 @@ import java.util.concurrent.ConcurrentHa
import javax.enterprise.context.spi.Contextual;
+import org.apache.webbeans.context.creational.BeanInstanceBag;
import org.apache.webbeans.context.type.ContextTypes;
/**
@@ -35,7 +36,7 @@ public class ConversationContext extends
@Override
public void setComponentInstanceMap()
{
- this.componentInstanceMap = new ConcurrentHashMap<Contextual<?>, Object>();
+ this.componentInstanceMap = new ConcurrentHashMap<Contextual<?>, BeanInstanceBag<?>>();
}
}
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/RequestContext.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/RequestContext.java?rev=936384&r1=936383&r2=936384&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/RequestContext.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/RequestContext.java Wed Apr 21 16:14:57 2010
@@ -17,6 +17,7 @@ import java.util.concurrent.ConcurrentHa
import javax.enterprise.context.spi.Contextual;
+import org.apache.webbeans.context.creational.BeanInstanceBag;
import org.apache.webbeans.context.type.ContextTypes;
/**
@@ -38,7 +39,7 @@ public class RequestContext extends Abst
@Override
public void setComponentInstanceMap()
{
- this.componentInstanceMap = new ConcurrentHashMap<Contextual<?>, Object>();
+ this.componentInstanceMap = new ConcurrentHashMap<Contextual<?>, BeanInstanceBag<?>>();
}
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/SessionContext.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/SessionContext.java?rev=936384&r1=936383&r2=936384&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/SessionContext.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/SessionContext.java Wed Apr 21 16:14:57 2010
@@ -18,6 +18,7 @@ import java.util.concurrent.ConcurrentHa
import javax.enterprise.context.spi.Contextual;
+import org.apache.webbeans.context.creational.BeanInstanceBag;
import org.apache.webbeans.context.type.ContextTypes;
/**
@@ -35,7 +36,7 @@ public class SessionContext extends Abst
@Override
public void setComponentInstanceMap()
{
- this.componentInstanceMap = new ConcurrentHashMap<Contextual<?>, Object>();
+ this.componentInstanceMap = new ConcurrentHashMap<Contextual<?>, BeanInstanceBag<?>>();
}
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/SingletonContext.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/SingletonContext.java?rev=936384&r1=936383&r2=936384&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/SingletonContext.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/SingletonContext.java Wed Apr 21 16:14:57 2010
@@ -17,6 +17,7 @@ import java.util.concurrent.ConcurrentHa
import javax.enterprise.context.spi.Contextual;
+import org.apache.webbeans.context.creational.BeanInstanceBag;
import org.apache.webbeans.context.type.ContextTypes;
/**
@@ -33,6 +34,6 @@ public class SingletonContext extends Ab
@Override
public void setComponentInstanceMap()
{
- this.componentInstanceMap = new ConcurrentHashMap<Contextual<?>, Object>();
+ this.componentInstanceMap = new ConcurrentHashMap<Contextual<?>, BeanInstanceBag<?>>();
}
}
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/WebBeansContext.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/WebBeansContext.java?rev=936384&r1=936383&r2=936384&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/WebBeansContext.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/WebBeansContext.java Wed Apr 21 16:14:57 2010
@@ -16,7 +16,9 @@ package org.apache.webbeans.context;
import java.util.Map;
import javax.enterprise.context.spi.Contextual;
+import javax.enterprise.context.spi.CreationalContext;
+import org.apache.webbeans.context.creational.BeanInstanceBag;
import org.apache.webbeans.context.type.ContextTypes;
@@ -26,7 +28,20 @@ import org.apache.webbeans.context.type.
* @version $Rev$Â $Date$
*/
public interface WebBeansContext extends javax.enterprise.context.spi.Context
-{
+{
+ /**
+ * Initializes this contextual bag with
+ * given creational context.
+ * <p>
+ * Given creational context is used fot creating the
+ * bean instance.
+ * </p>
+ * @param <T> type
+ * @param contextual contextual bean
+ * @param creationalContext creational context
+ */
+ public <T> void initContextualBag(Contextual<T> contextual, CreationalContext<T> creationalContext);
+
/**
* Destroys the context.
*/
@@ -44,5 +59,13 @@ public interface WebBeansContext extends
*
* @return instance map
*/
- public Map<Contextual<?>, Object> getComponentInstanceMap();
+ public Map<Contextual<?>, BeanInstanceBag<?>> getComponentInstanceMap();
+
+ /**
+ * Gets creational context of the given bean.
+ * @param <T> type
+ * @param contextual contextual bean
+ * @return creational context of the given bean
+ */
+ public <T> CreationalContext<T> getCreationalContext(Contextual<T> contextual);
}
\ No newline at end of file
Added: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/creational/BeanInstanceBag.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/creational/BeanInstanceBag.java?rev=936384&view=auto
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/creational/BeanInstanceBag.java (added)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/creational/BeanInstanceBag.java Wed Apr 21 16:14:57 2010
@@ -0,0 +1,60 @@
+/*
+ * 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.context.creational;
+
+import javax.enterprise.context.spi.CreationalContext;
+
+public class BeanInstanceBag<T>
+{
+ private final CreationalContext<T> beanCreationalContext;
+
+ private volatile T beanInstance;
+
+ public BeanInstanceBag(CreationalContext<T> beanCreationalContext)
+ {
+ this.beanCreationalContext = beanCreationalContext;
+ }
+
+ /**
+ * @return the beanCreationalContext
+ */
+ public CreationalContext<T> getBeanCreationalContext()
+ {
+ return beanCreationalContext;
+ }
+
+
+
+ /**
+ * @param beanInstance the beanInstance to set
+ */
+ public void setBeanInstance(T beanInstance)
+ {
+ this.beanInstance = beanInstance;
+ }
+
+ /**
+ * @return the beanInstance
+ */
+ public T getBeanInstance()
+ {
+ return beanInstance;
+ }
+
+}
Propchange: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/creational/BeanInstanceBag.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/ApplicationScopedBeanIntereptorHandler.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/ApplicationScopedBeanIntereptorHandler.java?rev=936384&r1=936383&r2=936384&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/ApplicationScopedBeanIntereptorHandler.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/ApplicationScopedBeanIntereptorHandler.java Wed Apr 21 16:14:57 2010
@@ -56,7 +56,7 @@ public class ApplicationScopedBeanIntere
{
if (cachedInstance == null)
{
- cachedInstance = super.getContextualInstance(bean);
+ cachedInstance = super.getContextualInstance();
}
return cachedInstance;
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorDataImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorDataImpl.java?rev=936384&r1=936383&r2=936384&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorDataImpl.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorDataImpl.java Wed Apr 21 16:14:57 2010
@@ -305,6 +305,10 @@ public class InterceptorDataImpl impleme
return this.decoratorInterceptor;
}
+ if(ownerCreationalContext == null)
+ {
+ System.out.println("Null");
+ }
interceptor = ownerCreationalContext.getDependentInterceptor(ownerInstance,this.webBeansInterceptor);
//There is no define interceptor, define and add it into dependent
if(interceptor == null)
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java?rev=936384&r1=936383&r2=936384&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java Wed Apr 21 16:14:57 2010
@@ -147,9 +147,6 @@ public abstract class InterceptorHandler
/**Intercepted methods*/
protected transient Map<Method, List<InterceptorData>> interceptedMethodMap = new WeakHashMap<Method, List<InterceptorData>>();
- /**Delegate handler*/
- protected transient DelegateHandler delegateHandler;
-
/**
* Creates a new handler.
* @param bean proxied bean
@@ -188,7 +185,7 @@ public abstract class InterceptorHandler
else if (bean instanceof InjectionTargetBean<?>)
{
InjectionTargetBean<?> injectionTarget = (InjectionTargetBean<?>) this.bean;
-
+ DelegateHandler delegateHandler = null;
//Check method is business method
if (InterceptorUtil.isWebBeansBusinessMethod(method))
{
@@ -203,13 +200,13 @@ public abstract class InterceptorHandler
JavassistProxyFactory.getInterceptorProxyClasses().put(bean, proxyClass);
}
Object delegate = proxyClass.newInstance();
- this.delegateHandler = new DelegateHandler(this.bean);
- ((ProxyObject)delegate).setHandler(this.delegateHandler);
+ delegateHandler = new DelegateHandler(this.bean);
+ ((ProxyObject)delegate).setHandler(delegateHandler);
// Gets component decorator stack
decorators = WebBeansDecoratorConfig.getDecoratorStack(injectionTarget, instance, delegate, ownerCreationalContext);
//Sets decorator stack of delegate
- this.delegateHandler.setDecorators(decorators);
+ delegateHandler.setDecorators(decorators);
}
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/NormalScopedBeanInterceptorHandler.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/NormalScopedBeanInterceptorHandler.java?rev=936384&r1=936383&r2=936384&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/NormalScopedBeanInterceptorHandler.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/NormalScopedBeanInterceptorHandler.java Wed Apr 21 16:14:57 2010
@@ -18,7 +18,6 @@
*/
package org.apache.webbeans.intercept;
-import java.lang.ref.WeakReference;
import java.lang.reflect.Method;
import java.util.List;
@@ -43,9 +42,6 @@ public class NormalScopedBeanInterceptor
/**Serial id*/
private static final long serialVersionUID = 1L;
- /**Creational context*/
- private transient WeakReference<CreationalContext<?>> creationalContext = null;
-
/**
* Creates a new bean instance
* @param bean bean
@@ -53,8 +49,20 @@ public class NormalScopedBeanInterceptor
*/
public NormalScopedBeanInterceptorHandler(OwbBean<?> bean, CreationalContext<?> creationalContext)
{
- super(bean);
- this.creationalContext = new WeakReference<CreationalContext<?>>(creationalContext);
+ super(bean);
+
+ //Initiate bean for saving creational context instance
+ initiateBeanBag((OwbBean<Object>)bean, (CreationalContext<Object>)creationalContext);
+ }
+
+ private void initiateBeanBag(OwbBean<Object> bean, CreationalContext<Object> creationalContext)
+ {
+ Context webbeansContext = getBeanManager().getContext(bean.getScope());
+ if (webbeansContext instanceof AbstractContext)
+ {
+ AbstractContext owbContext = (AbstractContext)webbeansContext;
+ owbContext.initContextualBag(bean, creationalContext);
+ }
}
/**
@@ -64,10 +72,10 @@ public class NormalScopedBeanInterceptor
public Object invoke(Object instance, Method method, Method proceed, Object[] arguments) throws Exception
{
//Get instance from context
- Object webbeansInstance = getContextualInstance((OwbBean<Object>) this.bean);
+ Object webbeansInstance = getContextualInstance();
//Call super
- return super.invoke(webbeansInstance, method, proceed, arguments, (CreationalContextImpl<?>) this.creationalContext.get());
+ return super.invoke(webbeansInstance, method, proceed, arguments, (CreationalContextImpl<?>) getContextualCreationalContext());
}
/**
@@ -75,9 +83,9 @@ public class NormalScopedBeanInterceptor
*/
protected Object callAroundInvokes(Method proceed, Object[] arguments, List<InterceptorData> stack) throws Exception
{
- InvocationContextImpl impl = new InvocationContextImpl(this.bean, getContextualInstance((OwbBean<Object>) this.bean),
+ InvocationContextImpl impl = new InvocationContextImpl(this.bean, getContextualInstance(),
proceed, arguments, stack, InterceptorType.AROUND_INVOKE);
- impl.setCreationalContext(creationalContext.get());
+ impl.setCreationalContext(getContextualCreationalContext());
return impl.proceed();
@@ -89,38 +97,53 @@ public class NormalScopedBeanInterceptor
* @param bean bean instance
* @return the underlying contextual instance, either cached or resolved from the context
*/
- protected Object getContextualInstance(OwbBean<Object> bean)
+ protected Object getContextualInstance()
{
Object webbeansInstance = null;
-
+
//Context of the bean
- Context webbeansContext = getBeanManager().getContext(bean.getScope());
+ Context webbeansContext = getBeanManager().getContext(this.bean.getScope());
//Already saved in context?
- webbeansInstance=webbeansContext.get(bean);
+ webbeansInstance=webbeansContext.get(this.bean);
if (webbeansInstance != null)
{
// voila, we are finished if we found an existing contextual instance
return webbeansInstance;
}
+ else
+ {
+ // finally, we create a new contextual instance
+ webbeansInstance = webbeansContext.get((Contextual<Object>)this.bean, getContextualCreationalContext());
+ }
+
+ return webbeansInstance;
+ }
+
+ protected CreationalContext<Object> getContextualCreationalContext()
+ {
+ CreationalContext<Object> creationalContext = null;
+ OwbBean<Object> contextual = (OwbBean<Object>)this.bean;
+ //Context of the bean
+ Context webbeansContext = getBeanManager().getContext(bean.getScope());
if (webbeansContext instanceof AbstractContext)
{
- CreationalContext<?> cc = ((AbstractContext)webbeansContext).getCreationalContext(bean);
- if (cc != null)
+ AbstractContext owbContext = (AbstractContext)webbeansContext;
+ creationalContext = owbContext.getCreationalContext(contextual);
+
+ //No creational context means that no BeanInstanceBag
+ //Actually this can be occurs like scenarions
+ //@SessionScoped bean injected into @ApplicationScopedBean
+ //And session is destroyed and restarted but proxy still
+ //contained in @ApplicationScopedBean
+ if(creationalContext == null)
{
- creationalContext = new WeakReference<CreationalContext<?>>(cc);
- }
- }
- if ((creationalContext == null) || creationalContext.get() == null)
- {
- // if there was no CreationalContext set from external, we create a new one
- creationalContext = new WeakReference<CreationalContext<?>>(CreationalContextFactory.getInstance().getCreationalContext(bean));
+ creationalContext = CreationalContextFactory.getInstance().getCreationalContext(contextual);
+ owbContext.initContextualBag((OwbBean<Object>)this.bean, creationalContext);
+ }
}
-
- // finally, we create a new contextual instance
- webbeansInstance = webbeansContext.get((Contextual<Object>)this.bean, (CreationalContext<Object>) creationalContext.get());
-
- return webbeansInstance;
+
+ return creationalContext;
}
}
Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/inheritance/InheritedInterceptorTest.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/inheritance/InheritedInterceptorTest.java?rev=936384&r1=936383&r2=936384&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/inheritance/InheritedInterceptorTest.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/inheritance/InheritedInterceptorTest.java Wed Apr 21 16:14:57 2010
@@ -19,6 +19,7 @@ import java.util.Collection;
import java.util.List;
import java.util.Set;
+import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.spi.Bean;
import junit.framework.Assert;
@@ -71,6 +72,34 @@ public class InheritedInterceptorTest ex
public void tearDown() {
shutDownContainer();
}
+
+ @Test
+ public void testNormalScopeNoNewInstance()
+ {
+ do_testNormalScopeNoNewInstance();
+ }
+
+ @Test
+ public void testLoopNormalScopeNoNewInstance()
+ {
+ for (int i = 0; i<100; i++)
+ {
+ do_testNormalScopeNoNewInstance();
+ }
+ }
+
+ public void do_testNormalScopeNoNewInstance()
+ {
+ for (Bean<?> bean : beans)
+ {
+ CreationalContext<?> cc = getBeanManager().createCreationalContext(null);
+
+ DeckType d1 = (DeckType) getBeanManager().getReference(bean, DeckType.class, cc);
+ d1.shuffle();
+ // Can't reproduce in TC with this call
+ // cc.release();
+ }
+ }
@Test
public void testStereotype()