[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