You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by st...@apache.org on 2011/03/07 21:36:15 UTC
svn commit: r1078930 - in /openwebbeans/trunk/webbeans-impl/src:
main/java/org/apache/webbeans/context/creational/
main/java/org/apache/webbeans/intercept/
test/java/org/apache/webbeans/newtests/interceptors/business/tests/
Author: struberg
Date: Mon Mar 7 20:36:14 2011
New Revision: 1078930
URL: http://svn.apache.org/viewvc?rev=1078930&view=rev
Log:
OWB-530 further interceptor cleanup
This also is the first part of the CreationalContextImpl cleanup
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/creational/CreationalContextImpl.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InvocationContextImpl.java
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/business/tests/DependingInterceptorTest.java
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/business/tests/InterceptorPerformanceTest.java
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/creational/CreationalContextImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/creational/CreationalContextImpl.java?rev=1078930&r1=1078929&r2=1078930&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/creational/CreationalContextImpl.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/creational/CreationalContextImpl.java Mon Mar 7 20:36:14 2011
@@ -39,11 +39,14 @@ public class CreationalContextImpl<T> im
//Default serial id
private static final long serialVersionUID = 1L;
- /**Contextual bean dependent instances*/
- //contextual instance --> dependents
- private Map<Object, List<DependentCreationalContext<?>>> dependentObjects =
- Collections.synchronizedMap(new WeakHashMap<Object, List<DependentCreationalContext<?>>>());
-
+ /**
+ * Contextual bean dependent instances
+ * key: contextual instance --> value: dependents
+ *
+ * <p><b>ATTENTION</b> This variable gets initiated lazily!</p>
+ */
+ private Map<Object, List<DependentCreationalContext<?>>> dependentObjects = null;
+
/**Contextual bean*/
private volatile Contextual<T> contextual = null;
@@ -152,32 +155,41 @@ public class CreationalContextImpl<T> im
if(instance != null)
{
- DependentCreationalContext<K> dependentCreational = new DependentCreationalContext<K>(dependent);
- if(dependent instanceof Interceptor)
- {
- dependentCreational.setDependentType(DependentType.INTERCEPTOR);
- }
- else if(dependent instanceof Decorator)
- {
- dependentCreational.setDependentType(DependentType.DECORATOR);
- }
- else
- {
- dependentCreational.setDependentType(DependentType.BEAN);
- }
-
- dependentCreational.setInstance(instance);
- List<DependentCreationalContext<?>> dependentList = this.dependentObjects.get(ownerInstance);
- if(dependentList == null)
- {
- dependentList = new ArrayList<DependentCreationalContext<?>>();
- this.dependentObjects.put(ownerInstance, dependentList);
- }
-
- dependentList.add(dependentCreational);
+ DependentCreationalContext<K> dependentCreational = new DependentCreationalContext<K>(dependent);
+ if(dependent instanceof Interceptor)
+ {
+ dependentCreational.setDependentType(DependentType.INTERCEPTOR);
+ }
+ else if(dependent instanceof Decorator)
+ {
+ dependentCreational.setDependentType(DependentType.DECORATOR);
+ }
+ else
+ {
+ dependentCreational.setDependentType(DependentType.BEAN);
+ }
+
+ dependentCreational.setInstance(instance);
+
+ synchronized(this)
+ {
+ if (dependentObjects == null)
+ {
+ dependentObjects = new HashMap<Object, List<DependentCreationalContext<?>>>();
+ }
+
+ List<DependentCreationalContext<?>> dependentList = dependentObjects.get(ownerInstance);
+ if(dependentList == null)
+ {
+ dependentList = new ArrayList<DependentCreationalContext<?>>();
+ this.dependentObjects.put(ownerInstance, dependentList);
+ }
+
+ dependentList.add(dependentCreational);
+ }
}
}
-
+
/**
* Gets bean interceptor instance.
* @param interceptor interceptor bean
@@ -187,78 +199,48 @@ public class CreationalContextImpl<T> im
{
Asserts.assertNotNull(interceptor,"Interceptor parameter can not be null");
- if(ownerInstance != null)
- {
- List<DependentCreationalContext<?>> dcs = getDependentInterceptors(ownerInstance);
- for(DependentCreationalContext<?> dc : dcs)
- {
- if(dc.getContextual().equals(interceptor))
- {
- return dc.getInstance();
- }
- }
- }
-
- return null;
- }
-
- /**
- * Gets bean decorator instance.
- * @param decorator decorator bean
- * @return bean decorator instance
- */
- public Object getDependentDecorator(Object ownerInstance, Contextual<?> decorator)
- {
- Asserts.assertNotNull(decorator, "Decorator parameter can not be null");
- List<DependentCreationalContext<?>> dcs = getDependentDecorators(ownerInstance);
- for(DependentCreationalContext<?> dc : dcs)
+ if(ownerInstance != null || dependentObjects == null)
{
- if(dc.getContextual().equals(decorator))
- {
- return dc.getInstance();
- }
+ return null;
}
-
- return null;
- }
-
- /**
- * Gets list of dependent interceptors context.
- * @return list of dependent interceptors context
- */
- private List<DependentCreationalContext<?>> getDependentInterceptors(Object ownerInstance)
- {
- List<DependentCreationalContext<?>> list = new ArrayList<DependentCreationalContext<?>>();
-
- if(ownerInstance != null)
+
+ synchronized(this)
{
List<DependentCreationalContext<?>> values = this.dependentObjects.get(ownerInstance);
- if(values != null && values.size() > 0)
+ if(values != null && !values.isEmpty())
{
Iterator<DependentCreationalContext<?>> it = values.iterator();
while(it.hasNext())
{
DependentCreationalContext<?> dc = it.next();
- if(dc.getDependentType().equals(DependentType.INTERCEPTOR))
+ if(dc.getDependentType().equals(DependentType.INTERCEPTOR) &&
+ dc.getContextual().equals(interceptor))
{
- list.add(dc);
+ return dc.getInstance();
}
+
}
- }
+ }
}
-
- return list;
+
+ return null;
}
-
+
/**
- * Gets list of dependent decorators context.
- * @return list of dependent decorators context
+ * Gets bean decorator instance.
+ * @param decorator decorator bean
+ * @return bean decorator instance
*/
- private List<DependentCreationalContext<?>> getDependentDecorators(Object ownerInstance)
+ public Object getDependentDecorator(Object ownerInstance, Contextual<?> decorator)
{
- List<DependentCreationalContext<?>> list = new ArrayList<DependentCreationalContext<?>>();
+ Asserts.assertNotNull(decorator, "Decorator parameter can not be null");
- if (ownerInstance != null)
+ if (ownerInstance == null || dependentObjects == null)
+ {
+ return null;
+ }
+
+ synchronized(this)
{
List<DependentCreationalContext<?>> values = this.dependentObjects.get(ownerInstance);
if (values != null && values.size() > 0)
@@ -267,16 +249,17 @@ public class CreationalContextImpl<T> im
while (it.hasNext())
{
DependentCreationalContext<?> dc = it.next();
- if (dc.getDependentType().equals(DependentType.DECORATOR))
+
+ if(dc.getDependentType().equals(DependentType.DECORATOR) &&
+ dc.getContextual().equals(decorator))
{
- list.add(dc);
+ return dc.getInstance();
}
}
}
}
-
- return list;
- }
+ return null;
+ }
/**
* Removes dependent objects.
@@ -284,23 +267,27 @@ public class CreationalContextImpl<T> im
@SuppressWarnings("unchecked")
public void removeDependents(Object ownerInstance)
{
- if(ownerInstance == null)
+ if(ownerInstance == null || dependentObjects == null)
{
return;
}
-
- List<DependentCreationalContext<?>> values = this.dependentObjects.get(ownerInstance);
- if(values != null)
+
+
+ synchronized(this)
{
- final CreationalContextFactory contextFactory = webBeansContext.getCreationalContextFactory();
- Iterator<?> iterator = values.iterator();
- while(iterator.hasNext())
+ List<DependentCreationalContext<?>> values = this.dependentObjects.get(ownerInstance);
+ if(values != null)
{
- DependentCreationalContext<T> dependent = (DependentCreationalContext<T>)iterator.next();
- dependent.getContextual().destroy((T)dependent.getInstance(), contextFactory.getCreationalContext(dependent.getContextual()));
- }
+ final CreationalContextFactory contextFactory = webBeansContext.getCreationalContextFactory();
+ Iterator<?> iterator = values.iterator();
+ while(iterator.hasNext())
+ {
+ DependentCreationalContext<T> dependent = (DependentCreationalContext<T>)iterator.next();
+ dependent.getContextual().destroy((T)dependent.getInstance(), contextFactory.getCreationalContext(dependent.getContextual()));
+ }
- this.dependentObjects.remove(ownerInstance);
+ this.dependentObjects.remove(ownerInstance);
+ }
}
if (this.ejbInterceptors != null)
@@ -321,26 +308,31 @@ public class CreationalContextImpl<T> im
@SuppressWarnings("unchecked")
public void removeAllDependents()
{
- Collection<List<DependentCreationalContext<?>>> values = this.dependentObjects.values();
- if(values != null)
+ if (dependentObjects == null)
{
- for(List<DependentCreationalContext<?>> value : values)
+ return;
+ }
+
+ synchronized(this)
+ {
+ Collection<List<DependentCreationalContext<?>>> values = this.dependentObjects.values();
+ if(values != null)
{
- if(values != null)
+ for(List<DependentCreationalContext<?>> value : values)
{
- Iterator<?> iterator = value.iterator();
+ Iterator<?> iterator = value.iterator();
while(iterator.hasNext())
{
DependentCreationalContext<T> dependent = (DependentCreationalContext<T>)iterator.next();
- final CreationalContextFactory contextFactory = webBeansContext.getCreationalContextFactory();
+ CreationalContextFactory contextFactory = webBeansContext.getCreationalContextFactory();
dependent.getContextual().destroy((T)dependent.getInstance(), contextFactory.getCreationalContext(dependent.getContextual()));
- }
- }
+ }
+ }
}
+
+ this.dependentObjects = null;
}
-
- this.dependentObjects.clear();
-
+
Collection<List<EjbInterceptorContext>> interceptorValues = null;
if (this.ejbInterceptors != null)
{
@@ -396,10 +388,7 @@ public class CreationalContextImpl<T> im
private synchronized void writeObject(ObjectOutputStream s)
throws IOException
{
- // we have to remap into a standard HashMap because WeakHashMap is not serializable
- HashMap<Object, List<DependentCreationalContext<?>>> depo
- = new HashMap<Object, List<DependentCreationalContext<?>>>(dependentObjects);
- s.writeObject(depo);
+ s.writeObject(dependentObjects);
String id = WebBeansUtil.isPassivationCapable(contextual);
if (contextual != null && id != null)
@@ -422,8 +411,7 @@ public class CreationalContextImpl<T> im
throws IOException, ClassNotFoundException
{
this.webBeansContext = WebBeansContext.currentInstance();
- HashMap<Object, List<DependentCreationalContext<?>>> depo = (HashMap<Object, List<DependentCreationalContext<?>>>)s.readObject();
- dependentObjects = new WeakHashMap<Object, List<DependentCreationalContext<?>>>(depo);
+ dependentObjects = (HashMap<Object, List<DependentCreationalContext<?>>>)s.readObject();
String id = (String) s.readObject();
if (id != null)
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InvocationContextImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InvocationContextImpl.java?rev=1078930&r1=1078929&r2=1078930&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InvocationContextImpl.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InvocationContextImpl.java Mon Mar 7 20:36:14 2011
@@ -219,7 +219,7 @@ public class InvocationContextImpl imple
Method aroundInvokeMethod = intc.getAroundInvoke();
boolean accessible = aroundInvokeMethod.isAccessible();
- if (!aroundInvokeMethod.isAccessible())
+ if (!accessible)
{
SecurityUtil.doPrivilegedSetAccessible(aroundInvokeMethod, true);
}
Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/business/tests/DependingInterceptorTest.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/business/tests/DependingInterceptorTest.java?rev=1078930&r1=1078929&r2=1078930&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/business/tests/DependingInterceptorTest.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/business/tests/DependingInterceptorTest.java Mon Mar 7 20:36:14 2011
@@ -130,12 +130,12 @@ public class DependingInterceptorTest ex
ApplicationScopedBean app = (ApplicationScopedBean) reference1;
app.getJ();
- Assert.assertTrue(TransactionInterceptor.interceptorCount == 1);
+ Assert.assertEquals(1, TransactionInterceptor.interceptorCount);
app.getJ();
- Assert.assertTrue(TransactionInterceptor.interceptorCount == 1);
+ Assert.assertEquals(2, TransactionInterceptor.interceptorCount);
app.getJ();
- Assert.assertTrue(TransactionInterceptor.interceptorCount == 1);
+ Assert.assertEquals(3, TransactionInterceptor.interceptorCount);
}
}
Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/business/tests/InterceptorPerformanceTest.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/business/tests/InterceptorPerformanceTest.java?rev=1078930&r1=1078929&r2=1078930&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/business/tests/InterceptorPerformanceTest.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/business/tests/InterceptorPerformanceTest.java Mon Mar 7 20:36:14 2011
@@ -42,8 +42,8 @@ public class InterceptorPerformanceTest
{
private static final String PACKAGE_NAME = DependingInterceptorTest.class.getPackage().getName();
- private static final int ITERATIONS = 2000;
- private static final int NUM_THREADS = 150;
+ private static final int ITERATIONS = 700;
+ private static final int NUM_THREADS = 50;
private static WebBeansLogger logger = WebBeansLogger.getLogger(InterceptorPerformanceTest.class);
@@ -86,7 +86,7 @@ public class InterceptorPerformanceTest
shutDownContainer();
- if ((end - start) / 1e6 > ITERATIONS*5)
+ if ((end - start) / 1e6 > ITERATIONS*10)
{
// if it takes longer than 1ms for each iteration, then this is really a performance blocker!
Assert.fail("Performance test took more than 20 times longer than it should");