[webbeans-commits] Webbeans SVN: r1159 - in ri/trunk: webbeans-ri/src/main/java/org/jboss/webbeans/bean and 5 other directories.
webbeans-commits at lists.jboss.org
webbeans-commits at lists.jboss.org
Thu Jan 22 04:42:17 EST 2009
Author: nickarls
Date: 2009-01-22 04:42:17 -0500 (Thu, 22 Jan 2009)
New Revision: 1159
Added:
ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/context/ContextualInstance.java
ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/context/DependentInstancesStore.java
Removed:
ri/trunk/webbeans-api/src/main/java/javax/webbeans/Destructor.java
Modified:
ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/AbstractClassBean.java
ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/EnterpriseBean.java
ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/ProducerMethodBean.java
ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/SimpleBean.java
ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/context/DependentContext.java
ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/el/WebBeansELResolver.java
ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/event/ObserverImpl.java
ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/injection/InjectionPointProvider.java
ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/test/unit/bootstrap/Elephant.java
Log:
Remove @Destructor and checks
Proto for depedent objects destruction infrastructure
Deleted: ri/trunk/webbeans-api/src/main/java/javax/webbeans/Destructor.java
===================================================================
--- ri/trunk/webbeans-api/src/main/java/javax/webbeans/Destructor.java 2009-01-22 09:25:46 UTC (rev 1158)
+++ ri/trunk/webbeans-api/src/main/java/javax/webbeans/Destructor.java 2009-01-22 09:42:17 UTC (rev 1159)
@@ -1,37 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2008, Red Hat Middleware LLC, and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package javax.webbeans;
-
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-/**
- * Specifies that a method of a Web Bean implementation class is a Web Beans
- * remove method.
- *
- * @author Gavin King
- *
- */
- at Retention(RUNTIME)
- at Target(METHOD)
-public @interface Destructor
-{
-}
Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/AbstractClassBean.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/AbstractClassBean.java 2009-01-22 09:25:46 UTC (rev 1158)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/AbstractClassBean.java 2009-01-22 09:42:17 UTC (rev 1159)
@@ -25,7 +25,6 @@
import javax.webbeans.DefinitionException;
import javax.webbeans.Dependent;
import javax.webbeans.DeploymentType;
-import javax.webbeans.Destructor;
import javax.webbeans.Disposes;
import javax.webbeans.Initializer;
import javax.webbeans.Observes;
@@ -34,6 +33,7 @@
import javax.webbeans.ScopeType;
import org.jboss.webbeans.ManagerImpl;
+import org.jboss.webbeans.context.DependentInstancesStore;
import org.jboss.webbeans.injection.InjectionPointProvider;
import org.jboss.webbeans.introspector.AnnotatedClass;
import org.jboss.webbeans.introspector.AnnotatedField;
@@ -61,6 +61,7 @@
private Set<AnnotatedField<?>> injectableFields;
// The initializer methods
private Set<AnnotatedMethod<?>> initializerMethods;
+ protected DependentInstancesStore dependentInstancesStore;
/**
* Constructor
@@ -72,6 +73,7 @@
{
super(manager);
this.annotatedItem = type;
+ dependentInstancesStore = new DependentInstancesStore();
}
/**
@@ -86,7 +88,7 @@
// TODO Interceptors
initInitializerMethods();
}
-
+
/**
* Injects bound fields
*
@@ -158,10 +160,6 @@
{
throw new DefinitionException("Initializer method " + annotatedMethod.toString() + " cannot be annotated @Produces");
}
- else if (annotatedMethod.getAnnotation(Destructor.class) != null)
- {
- throw new DefinitionException("Initializer method " + annotatedMethod.toString() + " cannot be annotated @Destructor");
- }
else if (annotatedMethod.getAnnotatedParameters(Disposes.class).size() > 0)
{
throw new DefinitionException("Initializer method " + annotatedMethod.toString() + " cannot have parameters annotated @Disposes");
@@ -176,7 +174,7 @@
}
}
}
-
+
@Override
protected void initScopeType()
{
@@ -198,19 +196,19 @@
throw new DefinitionException("At most one scope may be specified");
}
}
-
+
if (this.scopeType == null)
{
initScopeTypeFromStereotype();
}
-
+
if (this.scopeType == null)
{
this.scopeType = Dependent.class;
log.trace("Using default @Dependent scope");
}
}
-
+
@Override
protected void initDeploymentType()
{
@@ -338,4 +336,9 @@
return Production.class;
}
+ public DependentInstancesStore getDependentInstancesStore()
+ {
+ return dependentInstancesStore;
+ }
+
}
Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/EnterpriseBean.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/EnterpriseBean.java 2009-01-22 09:25:46 UTC (rev 1158)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/EnterpriseBean.java 2009-01-22 09:42:17 UTC (rev 1159)
@@ -17,10 +17,8 @@
package org.jboss.webbeans.bean;
-import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.HashSet;
-import java.util.Set;
import javassist.util.proxy.ProxyFactory;
import javassist.util.proxy.ProxyObject;
@@ -30,12 +28,7 @@
import javax.webbeans.Decorator;
import javax.webbeans.DefinitionException;
import javax.webbeans.Dependent;
-import javax.webbeans.Destructor;
-import javax.webbeans.Disposes;
-import javax.webbeans.Initializer;
import javax.webbeans.Interceptor;
-import javax.webbeans.Observes;
-import javax.webbeans.Produces;
import javax.webbeans.Specializes;
import org.jboss.webbeans.ManagerImpl;
@@ -45,7 +38,6 @@
import org.jboss.webbeans.ejb.spi.BusinessInterfaceDescriptor;
import org.jboss.webbeans.introspector.AnnotatedClass;
import org.jboss.webbeans.introspector.AnnotatedMethod;
-import org.jboss.webbeans.introspector.AnnotatedParameter;
import org.jboss.webbeans.introspector.jlr.AnnotatedClassImpl;
import org.jboss.webbeans.log.LogProvider;
import org.jboss.webbeans.log.Logging;
Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/ProducerMethodBean.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/ProducerMethodBean.java 2009-01-22 09:25:46 UTC (rev 1158)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/ProducerMethodBean.java 2009-01-22 09:42:17 UTC (rev 1159)
@@ -22,7 +22,6 @@
import java.util.Set;
import javax.webbeans.DefinitionException;
-import javax.webbeans.Destructor;
import javax.webbeans.Disposes;
import javax.webbeans.Observes;
@@ -119,12 +118,8 @@
*/
protected void checkProducerMethod()
{
- if (getAnnotatedItem().isAnnotationPresent(Destructor.class))
+ if (getAnnotatedItem().getAnnotatedParameters(Observes.class).size() > 0)
{
- throw new DefinitionException("Producer method cannot be annotated @Destructor");
- }
- else if (getAnnotatedItem().getAnnotatedParameters(Observes.class).size() > 0)
- {
throw new DefinitionException("Producer method cannot have parameter annotated @Observes");
}
else if (getAnnotatedItem().getAnnotatedParameters(Disposes.class).size() > 0)
Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/SimpleBean.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/SimpleBean.java 2009-01-22 09:25:46 UTC (rev 1158)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/SimpleBean.java 2009-01-22 09:42:17 UTC (rev 1159)
@@ -122,6 +122,7 @@
try
{
instance = constructor.newInstance(manager);
+ injectionPointProvider.setCurrentInjectionInstance(instance);
bindDecorators();
bindInterceptors();
injectEjbAndCommonFields(instance);
@@ -131,6 +132,7 @@
}
finally
{
+ injectionPointProvider.clearCurrentInjectionInstance(instance);
injectionPointProvider.popBean();
}
return instance;
@@ -153,6 +155,7 @@
{
DependentContext.INSTANCE.setActive(true);
callPreDestroy(instance);
+ dependentInstancesStore.destroyDependentInstances(instance);
}
catch (Exception e)
{
Added: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/context/ContextualInstance.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/context/ContextualInstance.java (rev 0)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/context/ContextualInstance.java 2009-01-22 09:42:17 UTC (rev 1159)
@@ -0,0 +1,37 @@
+package org.jboss.webbeans.context;
+
+import javax.webbeans.Dependent;
+import javax.webbeans.manager.Bean;
+import javax.webbeans.manager.Contextual;
+
+public class ContextualInstance<T>
+{
+ private Contextual<T> contextual;
+ private T instance;
+
+ protected ContextualInstance(Contextual<T> contextual, T instance)
+ {
+ this.contextual = contextual;
+ this.instance = instance;
+ }
+
+ public static <T> ContextualInstance<T> of(Contextual<T> contextual, T instance)
+ {
+ return new ContextualInstance<T>(contextual, instance);
+ }
+
+ public void destroy()
+ {
+ contextual.destroy(instance);
+ }
+
+ public boolean isDependent()
+ {
+ return contextual instanceof Bean && Dependent.class.equals(((Bean<T>)contextual).getScopeType());
+ }
+
+ public Object getInstance()
+ {
+ return instance;
+ }
+}
Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/context/DependentContext.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/context/DependentContext.java 2009-01-22 09:25:46 UTC (rev 1158)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/context/DependentContext.java 2009-01-22 09:42:17 UTC (rev 1159)
@@ -23,6 +23,10 @@
import javax.webbeans.Dependent;
import javax.webbeans.manager.Contextual;
+import org.jboss.webbeans.CurrentManager;
+import org.jboss.webbeans.bean.AbstractClassBean;
+import org.jboss.webbeans.injection.InjectionPointProvider;
+
/**
* The dependent context
*
@@ -32,9 +36,9 @@
{
public static DependentContext INSTANCE = new DependentContext();
-
+
private ThreadLocal<AtomicInteger> reentrantActiveCount;
-
+
/**
* Constructor
*/
@@ -55,8 +59,8 @@
/**
* Overridden method always creating a new instance
*
- * @param bean The bean to create
- * @param create Should a new one be created
+ * @param bean The bean to create
+ * @param create Should a new one be created
*/
public <T> T get(Contextual<T> bean, boolean create)
{
@@ -64,7 +68,14 @@
{
throw new ContextNotActiveException();
}
- return create == false ? null : bean.create();
+ T instance = create == false ? null : bean.create();
+ InjectionPointProvider injectionPointProvider = CurrentManager.rootManager().getInjectionPointProvider();
+ if (bean instanceof AbstractClassBean && injectionPointProvider.isInjecting())
+ {
+ DependentInstancesStore dependentInstancesStore = ((AbstractClassBean<?>) bean).getDependentInstancesStore();
+ dependentInstancesStore.addDependentInstance(injectionPointProvider.getCurrentInjectionInstance(), ContextualInstance.of(bean, instance));
+ }
+ return instance;
}
@Override
@@ -73,7 +84,7 @@
String active = isActive() ? "Active " : "Inactive ";
return active + "dependent context";
}
-
+
@Override
public void setActive(boolean active)
{
@@ -92,5 +103,5 @@
}
}
}
-
+
}
Added: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/context/DependentInstancesStore.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/context/DependentInstancesStore.java (rev 0)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/context/DependentInstancesStore.java 2009-01-22 09:42:17 UTC (rev 1159)
@@ -0,0 +1,40 @@
+package org.jboss.webbeans.context;
+
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+public class DependentInstancesStore
+{
+ private Map<Object, List<ContextualInstance<?>>> dependentInstances;
+
+ public DependentInstancesStore()
+ {
+ dependentInstances = new ConcurrentHashMap<Object, List<ContextualInstance<?>>>();
+ }
+
+ public <T> void addDependentInstance(Object parent, ContextualInstance<T> contextualInstance)
+ {
+ List<ContextualInstance<?>> instances = dependentInstances.get(parent);
+ if (instances == null)
+ {
+ instances = new CopyOnWriteArrayList<ContextualInstance<?>>();
+ dependentInstances.put(parent, instances);
+ }
+ instances.add(contextualInstance);
+ }
+
+ public void destroyDependentInstances(Object parent)
+ {
+ if (!dependentInstances.containsKey(parent))
+ {
+ return;
+ }
+ for (ContextualInstance<?> injectedInstance : dependentInstances.get(parent))
+ {
+ injectedInstance.destroy();
+ }
+ dependentInstances.remove(parent);
+ }
+}
Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/el/WebBeansELResolver.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/el/WebBeansELResolver.java 2009-01-22 09:25:46 UTC (rev 1158)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/el/WebBeansELResolver.java 2009-01-22 09:42:17 UTC (rev 1159)
@@ -25,6 +25,7 @@
import org.jboss.webbeans.CurrentManager;
import org.jboss.webbeans.context.DependentContext;
+import org.jboss.webbeans.injection.InjectionPointProvider;
public class WebBeansELResolver extends ELResolver
{
@@ -64,9 +65,13 @@
{
if (base == null && property != null)
{
+ // TODO Any other way than creating a dummy parent to collect the created dependent objects under?
+ Object dependentsCollector = new Object();
+ InjectionPointProvider injectionPointProvider = CurrentManager.rootManager().getInjectionPointProvider();
try
{
DependentContext.INSTANCE.setActive(true);
+ injectionPointProvider.setCurrentInjectionInstance(dependentsCollector);
Object value = CurrentManager.rootManager().getInstanceByName(property.toString());
if (value != null)
{
@@ -76,6 +81,7 @@
}
finally
{
+ injectionPointProvider.clearCurrentInjectionInstance(dependentsCollector);
DependentContext.INSTANCE.setActive(false);
}
}
Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/event/ObserverImpl.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/event/ObserverImpl.java 2009-01-22 09:25:46 UTC (rev 1158)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/event/ObserverImpl.java 2009-01-22 09:42:17 UTC (rev 1159)
@@ -29,7 +29,6 @@
import javax.webbeans.AfterTransactionSuccess;
import javax.webbeans.BeforeTransactionCompletion;
import javax.webbeans.DefinitionException;
-import javax.webbeans.Destructor;
import javax.webbeans.Disposes;
import javax.webbeans.ExecutionException;
import javax.webbeans.IfExists;
@@ -184,10 +183,6 @@
{
throw new DefinitionException(this + " cannot be annotated with @Initializer");
}
- if ( this.observerMethod.isAnnotationPresent(Destructor.class) )
- {
- throw new DefinitionException(this + " cannot be annotated with @Destructor");
- }
}
public void notify(final T event)
Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/injection/InjectionPointProvider.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/injection/InjectionPointProvider.java 2009-01-22 09:25:46 UTC (rev 1158)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/injection/InjectionPointProvider.java 2009-01-22 09:42:17 UTC (rev 1159)
@@ -36,7 +36,29 @@
private final Stack<Bean<?>> beans = new Stack<Bean<?>>();
// The stack of injection points
private final Stack<InjectionPoint> injectionPoints = new Stack<InjectionPoint>();
+ private Object currentInjectionInstance;
+ public void setCurrentInjectionInstance(Object currentInjectionInstance)
+ {
+ if (this.currentInjectionInstance == null)
+ {
+ this.currentInjectionInstance = currentInjectionInstance;
+ }
+ }
+
+ public void clearCurrentInjectionInstance(Object instance)
+ {
+ if (this.currentInjectionInstance == instance)
+ {
+ this.currentInjectionInstance = null;
+ }
+ }
+
+ public Object getCurrentInjectionInstance()
+ {
+ return currentInjectionInstance;
+ }
+
/**
* Pushes a bean to the stack
*
@@ -131,4 +153,9 @@
return "InjectionPointProvider: Bean stack = " + beans.toString() + " InjectionPoint stack = " + injectionPoints.toString();
}
+ public boolean isInjecting()
+ {
+ return currentInjectionInstance != null;
+ }
+
}
Modified: ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/test/unit/bootstrap/Elephant.java
===================================================================
--- ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/test/unit/bootstrap/Elephant.java 2009-01-22 09:25:46 UTC (rev 1158)
+++ ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/test/unit/bootstrap/Elephant.java 2009-01-22 09:42:17 UTC (rev 1159)
@@ -2,7 +2,6 @@
import javax.ejb.Remove;
import javax.ejb.Stateful;
-import javax.webbeans.Destructor;
import javax.webbeans.Production;
@Production
@@ -16,7 +15,7 @@
}
- @Remove @Destructor
+ @Remove
public void remove2()
{
More information about the weld-commits
mailing list