[webbeans-commits] Webbeans SVN: r3638 - in ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans: bean/builder and 2 other directories.

webbeans-commits at lists.jboss.org webbeans-commits at lists.jboss.org
Thu Sep 3 07:45:04 EDT 2009


Author: kabir.khan at jboss.com
Date: 2009-09-03 07:45:03 -0400 (Thu, 03 Sep 2009)
New Revision: 3638

Added:
   ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bean/builder/
   ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bean/builder/BeanBuilderFactoryImpl.java
   ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bean/builder/BeanBuilderImpl.java
   ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bean/builder/InternalBeanBuilderFactory.java
   ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bean/builder/InternalObserverMethodBuilder.java
   ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bean/builder/spi/
   ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bean/builder/spi/BeanBuilderFactory.java
   ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bean/builder/spi/DecoratorBeanBuilder.java
   ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bean/builder/spi/EnterpriseBeanBuilder.java
   ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bean/builder/spi/SimpleBeanBuilder.java
Modified:
   ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bootstrap/AbstractBeanDeployer.java
   ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bootstrap/ExtensionBeanDeployer.java
Log:
Add initial work on builder

Added: ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bean/builder/BeanBuilderFactoryImpl.java
===================================================================
--- ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bean/builder/BeanBuilderFactoryImpl.java	                        (rev 0)
+++ ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bean/builder/BeanBuilderFactoryImpl.java	2009-09-03 11:45:03 UTC (rev 3638)
@@ -0,0 +1,132 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors. 
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/ 
+package org.jboss.webbeans.bean.builder;
+
+import java.lang.ref.WeakReference;
+import java.util.Map;
+import java.util.WeakHashMap;
+import java.util.concurrent.locks.ReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+
+import javax.enterprise.inject.spi.BeanManager;
+
+import org.jboss.webbeans.bean.builder.spi.DecoratorBeanBuilder;
+import org.jboss.webbeans.bean.builder.spi.EnterpriseBeanBuilder;
+import org.jboss.webbeans.bean.builder.spi.SimpleBeanBuilder;
+import org.jboss.webbeans.bootstrap.BeanDeployerEnvironment;
+
+/**
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class BeanBuilderFactoryImpl extends InternalBeanBuilderFactory
+{
+   private final Map<BeanManager, WeakReference<BeanDeployerEnvironment>> beanDeployerEnvironments = new WeakHashMap<BeanManager, WeakReference<BeanDeployerEnvironment>>();
+   
+   private final ReadWriteLock lock = new ReentrantReadWriteLock();
+
+   
+   public void registerBeanManager(BeanManager manager, BeanDeployerEnvironment environment)
+   {
+      try
+      {
+         lock.writeLock().lock();
+         beanDeployerEnvironments.put(manager, new WeakReference<BeanDeployerEnvironment>(environment));
+      }
+      finally
+      {
+         lock.writeLock().unlock();
+      }
+   }
+   
+   public void unregisterBeanManager(BeanManager manager)
+   {
+      try
+      {
+         lock.writeLock().lock();
+         beanDeployerEnvironments.remove(manager);
+      }
+      finally
+      {
+         lock.writeLock().unlock();
+      }
+   }
+   
+   public SimpleBeanBuilder getSimpleBeanBuilder(BeanManager beanManager)
+   {
+      return getBeanBuilderImpl(beanManager, false);
+   }
+
+   public EnterpriseBeanBuilder getEnterpriseBeanBuilder(BeanManager beanManager)
+   {
+      return getBeanBuilderImpl(beanManager, false);
+   }
+
+   public DecoratorBeanBuilder getDecoratorBeanBuilder(BeanManager beanManager)
+   {
+      return getBeanBuilderImpl(beanManager, false);
+   }
+
+   public SimpleBeanBuilder getInternalSimpleBeanBuilder(BeanManager beanManager)
+   {
+      return getBeanBuilderImpl(beanManager, true);
+   }
+
+   public EnterpriseBeanBuilder getInternalEnterpriseBeanBuilder(BeanManager beanManager)
+   {
+      return getBeanBuilderImpl(beanManager, true);
+   }
+
+   public DecoratorBeanBuilder getInternalDecoratorBeanBuilder(BeanManager beanManager)
+   {
+      return getBeanBuilderImpl(beanManager, true);
+   }
+
+   @Override
+   public InternalObserverMethodBuilder getInternalObserverMethodBuilder(BeanManager beanManager)
+   {
+      return getBeanBuilderImpl(beanManager, true);
+   }
+
+   private BeanBuilderImpl getBeanBuilderImpl(BeanManager beanManager, boolean delayInitialization)
+   {
+      lock.readLock().lock();
+      try
+      {
+         WeakReference<BeanDeployerEnvironment> ref = beanDeployerEnvironments.get(beanManager);
+         if (ref == null)
+            throw new IllegalStateException("BeanManager not registered " + beanManager);
+   
+         BeanDeployerEnvironment environment = ref.get();
+   
+         if (environment == null)
+            throw new IllegalStateException("BeanManager registered but no longer valid " + beanManager);
+         
+         return new BeanBuilderImpl(beanManager, environment, delayInitialization);
+      }
+      finally
+      {
+         lock.readLock().unlock();
+      }
+   }
+}

Added: ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bean/builder/BeanBuilderImpl.java
===================================================================
--- ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bean/builder/BeanBuilderImpl.java	                        (rev 0)
+++ ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bean/builder/BeanBuilderImpl.java	2009-09-03 11:45:03 UTC (rev 3638)
@@ -0,0 +1,261 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors. 
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/ 
+package org.jboss.webbeans.bean.builder;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.enterprise.event.Observes;
+import javax.enterprise.inject.Disposes;
+import javax.enterprise.inject.Produces;
+import javax.enterprise.inject.spi.AnnotatedMethod;
+import javax.enterprise.inject.spi.AnnotatedType;
+import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.BeanManager;
+import javax.enterprise.inject.spi.ObserverMethod;
+import javax.enterprise.inject.spi.ProcessObserverMethod;
+
+import org.jboss.webbeans.BeanManagerImpl;
+import org.jboss.webbeans.bean.AbstractClassBean;
+import org.jboss.webbeans.bean.DecoratorBean;
+import org.jboss.webbeans.bean.DisposalMethodBean;
+import org.jboss.webbeans.bean.EnterpriseBean;
+import org.jboss.webbeans.bean.NewEnterpriseBean;
+import org.jboss.webbeans.bean.NewSimpleBean;
+import org.jboss.webbeans.bean.ProducerFieldBean;
+import org.jboss.webbeans.bean.ProducerMethodBean;
+import org.jboss.webbeans.bean.RIBean;
+import org.jboss.webbeans.bean.SimpleBean;
+import org.jboss.webbeans.bean.builder.spi.DecoratorBeanBuilder;
+import org.jboss.webbeans.bean.builder.spi.EnterpriseBeanBuilder;
+import org.jboss.webbeans.bean.builder.spi.SimpleBeanBuilder;
+import org.jboss.webbeans.bootstrap.BeanDeployerEnvironment;
+import org.jboss.webbeans.bootstrap.ProcessObserverMethodImpl;
+import org.jboss.webbeans.ejb.InternalEjbDescriptor;
+import org.jboss.webbeans.ejb.spi.EjbDescriptor;
+import org.jboss.webbeans.event.ObserverFactory;
+import org.jboss.webbeans.event.ObserverMethodImpl;
+import org.jboss.webbeans.introspector.WBClass;
+import org.jboss.webbeans.introspector.WBField;
+import org.jboss.webbeans.introspector.WBMethod;
+import org.jboss.webbeans.resources.ClassTransformer;
+
+/**
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class BeanBuilderImpl implements SimpleBeanBuilder, EnterpriseBeanBuilder, DecoratorBeanBuilder, InternalObserverMethodBuilder
+{
+   private final BeanManagerImpl beanManager;
+   
+   private final BeanDeployerEnvironment beanDeployerEnvironment;
+   
+   private final List<Throwable> definitionErrors = new ArrayList<Throwable>();
+   
+   private final boolean delayInitialization;
+   
+   public BeanBuilderImpl(BeanManager beanManager, BeanDeployerEnvironment beanDeployerEnvironment, boolean delayInitialization)
+   {
+      if (beanManager != beanManager)
+         throw new IllegalStateException("beanManager is not an instance of " + BeanManagerImpl.class.getName());
+      this.beanManager = (BeanManagerImpl)beanManager;
+      
+      this.beanDeployerEnvironment = beanDeployerEnvironment;
+      this.delayInitialization = delayInitialization;
+   }
+   
+   public <T> Set<Bean<?>> createSimpleBeans(AnnotatedType<T> type)
+   {
+      return createSimpleBeans(getWBClass(type));
+   }
+   
+   public <T> Set<Bean<?>> createEnterpriseBeans(EjbDescriptor<T> descriptor)
+   {
+      return createEnterpriseBeans(getEjbDescriptor(descriptor));
+   }
+   
+   public <T> Set<Bean<?>> createDecorator(AnnotatedType<T> type)
+   {
+      return createDecorator(getWBClass(type));
+   }
+   
+   private <T> Set<Bean<?>> createSimpleBeans(WBClass<T> clazz)
+   {
+      Set<Bean<?>> beans = new HashSet<Bean<?>>();
+      SimpleBean<T> bean = SimpleBean.of(clazz, beanManager);
+      
+      beanDeployerEnvironment.addBean(bean);
+      beans.add(bean);
+      
+      if (!delayInitialization)
+         bean.initialize(beanDeployerEnvironment);
+      
+      createSubBeans(beans, bean);
+      
+      NewSimpleBean<T> newBean = NewSimpleBean.of(clazz, beanManager);
+      beanDeployerEnvironment.addBean(newBean);
+      beans.add(newBean);
+      if (!delayInitialization)
+         newBean.initialize(beanDeployerEnvironment);
+      
+      return beans;
+   }
+   
+   private <T> Set<Bean<?>> createEnterpriseBeans(InternalEjbDescriptor<T> ejbDescriptor)
+   {
+      Set<Bean<?>> beans = new HashSet<Bean<?>>();
+      EnterpriseBean<T> bean = EnterpriseBean.of(ejbDescriptor, beanManager);
+      beanDeployerEnvironment.addBean(bean);
+      beans.add(bean);
+      if (!delayInitialization)
+         bean.initialize(beanDeployerEnvironment);
+      
+      createSubBeans(beans, bean);
+      
+      NewEnterpriseBean<T> newBean = NewEnterpriseBean.of(ejbDescriptor, beanManager);
+      beanDeployerEnvironment.addBean(newBean);
+      beans.add(newBean);
+      if (!delayInitialization)
+         newBean.initialize(beanDeployerEnvironment);
+      
+      return beans;
+   }
+   
+   private <T> Set<Bean<?>> createDecorator(WBClass<T> annotatedClass)
+   {
+      DecoratorBean<?> bean = DecoratorBean.of(annotatedClass, beanManager);
+      beanDeployerEnvironment.addBean(bean);
+      if (!delayInitialization)
+         bean.initialize(beanDeployerEnvironment);
+      
+      HashSet<Bean<?>> beans = new HashSet<Bean<?>>();
+      beans.add(bean);
+      return beans;
+   }
+   
+   /**
+    * Creates the sub bean for an class (simple or enterprise) bean
+    * 
+    * @param bean
+    *           The class bean
+    * 
+    */
+   protected <T> void createSubBeans(Set<Bean<?>> beans, AbstractClassBean<T> bean)
+   {
+      createProducerMethods(beans, bean, bean.getAnnotatedItem());
+      createProducerFields(beans, bean, bean.getAnnotatedItem());
+      if (beanManager.isBeanEnabled(bean))
+      {
+         createObserverMethods(bean, bean.getAnnotatedItem());
+      }
+      createDisposalMethods(beans, bean, bean.getAnnotatedItem());
+   }
+
+   protected void createProducerMethods(Set<Bean<?>> beans, AbstractClassBean<?> declaringBean, WBClass<?> annotatedClass)
+   {
+      for (WBMethod<?, ?> method : annotatedClass.getDeclaredWBAnnotatedMethods(Produces.class))
+      {
+         createProducerMethod(beans, declaringBean, method);         
+      }
+   }
+   
+   protected void createDisposalMethods(Set<Bean<?>> beans, AbstractClassBean<?> declaringBean, WBClass<?> annotatedClass)
+   {
+      for (WBMethod<?, ?> method : annotatedClass.getWBDeclaredMethodsWithAnnotatedParameters(Disposes.class))
+      {
+         DisposalMethodBean<?> disposalBean = DisposalMethodBean.of(beanManager, method, declaringBean);
+         beanDeployerEnvironment.addBean(disposalBean);
+         //Do not delay initialization of decorator beans, they get initialized right away in the original impl
+         disposalBean.initialize(beanDeployerEnvironment);
+         beans.add(disposalBean);
+      }
+   }
+   
+   protected <T> void createProducerMethod(Set<Bean<?>> beans, AbstractClassBean<?> declaringBean, WBMethod<T, ?> annotatedMethod)
+   {
+      ProducerMethodBean<T> bean = ProducerMethodBean.of(annotatedMethod, declaringBean, beanManager);
+      beanDeployerEnvironment.addBean(bean);
+      beans.add(bean);
+      if (!delayInitialization)
+         bean.initialize(beanDeployerEnvironment);
+   }
+   
+   protected void createProducerFields(Set<Bean<?>> beans, AbstractClassBean<?> declaringBean, WBClass<?> annotatedClass)
+   {
+      for (WBField<?, ?> field : annotatedClass.getDeclaredAnnotatedWBFields(Produces.class))
+      {
+         createProducerField(beans, declaringBean, field);
+      }
+   }
+
+   protected <T> void createProducerField(Set<Bean<?>> beans, AbstractClassBean<?> declaringBean, WBField<T, ?> field)
+   {
+      ProducerFieldBean<T> bean = ProducerFieldBean.of(field, declaringBean, beanManager);
+      beanDeployerEnvironment.addBean(bean);
+      beans.add(bean);
+      if (!delayInitialization)
+         bean.initialize(beanDeployerEnvironment);
+   }
+      
+   public <X> void createObserverMethods(RIBean<X> declaringBean, WBClass<X> annotatedClass)
+   {
+      for (WBMethod<?, X> method : annotatedClass.getWBDeclaredMethodsWithAnnotatedParameters(Observes.class))
+      {
+         createObserverMethod(declaringBean, method);
+      }
+   }
+   
+   protected <X, T> void createObserverMethod(RIBean<X> declaringBean, WBMethod<T, X> method)
+   {
+      ObserverMethodImpl<X, T> observer = ObserverFactory.create(method, declaringBean, beanManager);
+      ProcessObserverMethod<?, ?> event = createProcessObserverMethodEvent(observer, method);
+      beanManager.fireEvent(event);
+      beanDeployerEnvironment.addObserver(observer);
+      if (!delayInitialization)
+         observer.initialize();
+   }
+   
+   private <X, T> ProcessObserverMethod<X, T> createProcessObserverMethodEvent(ObserverMethod<X, T> observer, AnnotatedMethod<X> method)
+   {
+      return new ProcessObserverMethodImpl<X, T>(method, observer, definitionErrors) {};
+   }
+
+
+   private <T> WBClass<T> getWBClass(AnnotatedType<T> type)
+   {
+      if (type instanceof WBClass)
+         return (WBClass<T>)type;
+
+      return beanManager.getServices().get(ClassTransformer.class).loadClass(type);
+   }
+   
+   private <T> InternalEjbDescriptor<T> getEjbDescriptor(EjbDescriptor<T> ejbDescriptor)
+   {
+      if (ejbDescriptor instanceof InternalEjbDescriptor)
+         return (InternalEjbDescriptor<T>)ejbDescriptor;
+      
+      return new InternalEjbDescriptor<T>(ejbDescriptor);
+   }
+}

Added: ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bean/builder/InternalBeanBuilderFactory.java
===================================================================
--- ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bean/builder/InternalBeanBuilderFactory.java	                        (rev 0)
+++ ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bean/builder/InternalBeanBuilderFactory.java	2009-09-03 11:45:03 UTC (rev 3638)
@@ -0,0 +1,57 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors. 
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/ 
+package org.jboss.webbeans.bean.builder;
+
+import javax.enterprise.inject.spi.BeanManager;
+
+import org.jboss.webbeans.bean.builder.spi.BeanBuilderFactory;
+import org.jboss.webbeans.bean.builder.spi.DecoratorBeanBuilder;
+import org.jboss.webbeans.bean.builder.spi.EnterpriseBeanBuilder;
+import org.jboss.webbeans.bean.builder.spi.SimpleBeanBuilder;
+import org.jboss.webbeans.bootstrap.BeanDeployerEnvironment;
+
+/**
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public abstract class InternalBeanBuilderFactory extends BeanBuilderFactory
+{
+
+   public static InternalBeanBuilderFactory getInstance()
+   {
+      return (InternalBeanBuilderFactory)BeanBuilderFactory.getInstance();
+   }
+
+   public abstract SimpleBeanBuilder getInternalSimpleBeanBuilder(BeanManager beanManager);
+   
+   public abstract EnterpriseBeanBuilder getInternalEnterpriseBeanBuilder(BeanManager beanManager);
+   
+   public abstract DecoratorBeanBuilder getInternalDecoratorBeanBuilder(BeanManager beanManager);
+   
+   public abstract InternalObserverMethodBuilder getInternalObserverMethodBuilder(BeanManager beanManager);
+
+   public abstract void registerBeanManager(BeanManager manager, BeanDeployerEnvironment environment);
+   
+   public abstract void unregisterBeanManager(BeanManager manager);
+   
+}

Added: ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bean/builder/InternalObserverMethodBuilder.java
===================================================================
--- ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bean/builder/InternalObserverMethodBuilder.java	                        (rev 0)
+++ ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bean/builder/InternalObserverMethodBuilder.java	2009-09-03 11:45:03 UTC (rev 3638)
@@ -0,0 +1,35 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors. 
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/ 
+package org.jboss.webbeans.bean.builder;
+
+import org.jboss.webbeans.bean.RIBean;
+import org.jboss.webbeans.introspector.WBClass;
+
+/**
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public interface InternalObserverMethodBuilder
+{
+   <X> void createObserverMethods(RIBean<X> declaringBean, WBClass<X> annotatedClass);
+}

Added: ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bean/builder/spi/BeanBuilderFactory.java
===================================================================
--- ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bean/builder/spi/BeanBuilderFactory.java	                        (rev 0)
+++ ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bean/builder/spi/BeanBuilderFactory.java	2009-09-03 11:45:03 UTC (rev 3638)
@@ -0,0 +1,59 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors. 
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/ 
+package org.jboss.webbeans.bean.builder.spi;
+
+import javax.enterprise.inject.spi.BeanManager;
+
+
+/**
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public abstract class BeanBuilderFactory
+{
+   private static final BeanBuilderFactory INSTANCE;
+   
+   static
+   {
+      try
+      {
+         //impl will be in another jar which depends on the one containing this jar
+         INSTANCE = (BeanBuilderFactory)Thread.currentThread().getContextClassLoader().loadClass("org.jboss.webbeans.bean.builder.BeanBuilderFactoryImpl").newInstance();
+      }
+      catch (Exception e)
+      {
+         throw new RuntimeException(e);
+      }
+   }
+   
+   public static BeanBuilderFactory getInstance()
+   {
+      return INSTANCE;
+   }
+   
+   public abstract SimpleBeanBuilder getSimpleBeanBuilder(BeanManager beanManager);
+   
+   public abstract EnterpriseBeanBuilder getEnterpriseBeanBuilder(BeanManager beanManager);
+   
+   public abstract DecoratorBeanBuilder getDecoratorBeanBuilder(BeanManager beanManager);
+}

Added: ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bean/builder/spi/DecoratorBeanBuilder.java
===================================================================
--- ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bean/builder/spi/DecoratorBeanBuilder.java	                        (rev 0)
+++ ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bean/builder/spi/DecoratorBeanBuilder.java	2009-09-03 11:45:03 UTC (rev 3638)
@@ -0,0 +1,37 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors. 
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/ 
+package org.jboss.webbeans.bean.builder.spi;
+
+import java.util.Set;
+
+import javax.enterprise.inject.spi.AnnotatedType;
+import javax.enterprise.inject.spi.Bean;
+
+/**
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public interface DecoratorBeanBuilder
+{
+   <T> Set<Bean<?>> createDecorator(AnnotatedType<T> type);
+}

Added: ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bean/builder/spi/EnterpriseBeanBuilder.java
===================================================================
--- ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bean/builder/spi/EnterpriseBeanBuilder.java	                        (rev 0)
+++ ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bean/builder/spi/EnterpriseBeanBuilder.java	2009-09-03 11:45:03 UTC (rev 3638)
@@ -0,0 +1,38 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors. 
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/ 
+package org.jboss.webbeans.bean.builder.spi;
+
+import java.util.Set;
+
+import javax.enterprise.inject.spi.Bean;
+
+import org.jboss.webbeans.ejb.spi.EjbDescriptor;
+
+/**
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public interface EnterpriseBeanBuilder
+{
+   <T> Set<Bean<?>> createEnterpriseBeans(EjbDescriptor<T> descriptor);
+}

Added: ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bean/builder/spi/SimpleBeanBuilder.java
===================================================================
--- ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bean/builder/spi/SimpleBeanBuilder.java	                        (rev 0)
+++ ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bean/builder/spi/SimpleBeanBuilder.java	2009-09-03 11:45:03 UTC (rev 3638)
@@ -0,0 +1,37 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors. 
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/ 
+package org.jboss.webbeans.bean.builder.spi;
+
+import java.util.Set;
+
+import javax.enterprise.inject.spi.AnnotatedType;
+import javax.enterprise.inject.spi.Bean;
+
+/**
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public interface SimpleBeanBuilder
+{
+   <T> Set<Bean<?>> createSimpleBeans(AnnotatedType<T> type);
+}

Modified: ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bootstrap/AbstractBeanDeployer.java
===================================================================
--- ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bootstrap/AbstractBeanDeployer.java	2009-09-03 11:42:50 UTC (rev 3637)
+++ ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bootstrap/AbstractBeanDeployer.java	2009-09-03 11:45:03 UTC (rev 3638)
@@ -20,32 +20,19 @@
 import java.util.List;
 import java.util.Set;
 
-import javax.enterprise.event.Observes;
-import javax.enterprise.inject.Disposes;
-import javax.enterprise.inject.Produces;
-import javax.enterprise.inject.spi.AnnotatedMethod;
-import javax.enterprise.inject.spi.ObserverMethod;
-import javax.enterprise.inject.spi.ProcessObserverMethod;
 import javax.inject.Inject;
 
 import org.jboss.webbeans.BeanManagerImpl;
-import org.jboss.webbeans.bean.AbstractClassBean;
 import org.jboss.webbeans.bean.DecoratorBean;
-import org.jboss.webbeans.bean.DisposalMethodBean;
-import org.jboss.webbeans.bean.EnterpriseBean;
-import org.jboss.webbeans.bean.NewEnterpriseBean;
-import org.jboss.webbeans.bean.NewSimpleBean;
-import org.jboss.webbeans.bean.ProducerFieldBean;
-import org.jboss.webbeans.bean.ProducerMethodBean;
 import org.jboss.webbeans.bean.RIBean;
-import org.jboss.webbeans.bean.SimpleBean;
+import org.jboss.webbeans.bean.builder.InternalBeanBuilderFactory;
+import org.jboss.webbeans.bean.builder.spi.DecoratorBeanBuilder;
+import org.jboss.webbeans.bean.builder.spi.EnterpriseBeanBuilder;
+import org.jboss.webbeans.bean.builder.spi.SimpleBeanBuilder;
 import org.jboss.webbeans.ejb.EJBApiAbstraction;
 import org.jboss.webbeans.ejb.InternalEjbDescriptor;
-import org.jboss.webbeans.event.ObserverFactory;
 import org.jboss.webbeans.event.ObserverMethodImpl;
 import org.jboss.webbeans.introspector.WBClass;
-import org.jboss.webbeans.introspector.WBField;
-import org.jboss.webbeans.introspector.WBMethod;
 import org.jboss.webbeans.jsf.JsfApiAbstraction;
 import org.jboss.webbeans.log.LogProvider;
 import org.jboss.webbeans.log.Logging;
@@ -61,10 +48,14 @@
    private final BeanDeployerEnvironment environment;
    private final List<Throwable> definitionErrors = new ArrayList<Throwable>();
    
+   private final InternalBeanBuilderFactory beanBuilderFactory;
+   
    public AbstractBeanDeployer(BeanManagerImpl manager, BeanDeployerEnvironment environment)
    {
       this.manager = manager;
       this.environment = environment;
+      beanBuilderFactory = InternalBeanBuilderFactory.getInstance();
+      beanBuilderFactory.registerBeanManager(manager, environment);
    }
    
    protected BeanManagerImpl getManager()
@@ -72,6 +63,11 @@
       return manager;
    }
    
+   protected InternalBeanBuilderFactory getBeanBuilderFactory()
+   {
+      return beanBuilderFactory;
+   }
+   
    public AbstractBeanDeployer deploy()
    {
       Set<RIBean<?>> beans = getEnvironment().getBeans();
@@ -102,105 +98,23 @@
       return this;
    }
 
-   /**
-    * Creates the sub bean for an class (simple or enterprise) bean
-    * 
-    * @param bean
-    *           The class bean
-    * 
-    */
-   protected <T> void createSubBeans(AbstractClassBean<T> bean)
-   {
-      createProducerMethods(bean, bean.getAnnotatedItem());
-      createProducerFields(bean, bean.getAnnotatedItem());
-      if (manager.isBeanEnabled(bean))
-      {
-         createObserverMethods(bean, bean.getAnnotatedItem());
-      }
-      createDisposalMethods(bean, bean.getAnnotatedItem());
-      
-   }
-   
-   protected void createProducerMethods(AbstractClassBean<?> declaringBean, WBClass<?> annotatedClass)
-   {
-      for (WBMethod<?, ?> method : annotatedClass.getDeclaredWBAnnotatedMethods(Produces.class))
-      {
-         createProducerMethod(declaringBean, method);         
-      }
-   }
-   
-   protected void createDisposalMethods(AbstractClassBean<?> declaringBean, WBClass<?> annotatedClass)
-   {
-      for (WBMethod<?, ?> method : annotatedClass.getWBDeclaredMethodsWithAnnotatedParameters(Disposes.class))
-      {
-         DisposalMethodBean<?> disposalBean = DisposalMethodBean.of(manager, method, declaringBean);
-         disposalBean.initialize(getEnvironment());
-         getEnvironment().addBean(disposalBean);
-      }
-   }
-   
-   protected <T> void createProducerMethod(AbstractClassBean<?> declaringBean, WBMethod<T, ?> annotatedMethod)
-   {
-      ProducerMethodBean<T> bean = ProducerMethodBean.of(annotatedMethod, declaringBean, manager);
-      getEnvironment().addBean(bean);
-   }
-   
-   protected <T> void createProducerField(AbstractClassBean<?> declaringBean, WBField<T, ?> field)
-   {
-      ProducerFieldBean<T> bean = ProducerFieldBean.of(field, declaringBean, manager);
-      getEnvironment().addBean(bean);
-   }
-   
-   protected void createProducerFields(AbstractClassBean<?> declaringBean, WBClass<?> annotatedClass)
-   {
-      for (WBField<?, ?> field : annotatedClass.getDeclaredAnnotatedWBFields(Produces.class))
-      {
-         createProducerField(declaringBean, field);
-      }
-   }
-   
-   protected <X> void createObserverMethods(RIBean<X> declaringBean, WBClass<X> annotatedClass)
-   {
-      for (WBMethod<?, X> method : annotatedClass.getWBDeclaredMethodsWithAnnotatedParameters(Observes.class))
-      {
-         createObserverMethod(declaringBean, method);
-      }
-   }
-   
-   protected <X, T> void createObserverMethod(RIBean<X> declaringBean, WBMethod<T, X> method)
-   {
-      ObserverMethodImpl<X, T> observer = ObserverFactory.create(method, declaringBean, manager);
-      ProcessObserverMethod<?, ?> event = createProcessObserverMethodEvent(observer, method);
-      manager.fireEvent(event);
-      getEnvironment().addObserver(observer);
-   }
-   
-   private <X, T> ProcessObserverMethod<X, T> createProcessObserverMethodEvent(ObserverMethod<X, T> observer, AnnotatedMethod<X> method)
-   {
-      return new ProcessObserverMethodImpl<X, T>(method, observer, definitionErrors) {};
-   }
-
    protected <T> void createSimpleBean(WBClass<T> annotatedClass)
    {
-      SimpleBean<T> bean = SimpleBean.of(annotatedClass, manager);
-      getEnvironment().addBean(bean);
-      createSubBeans(bean);
-      getEnvironment().addBean(NewSimpleBean.of(annotatedClass, manager));
+   	SimpleBeanBuilder builder = beanBuilderFactory.getInternalSimpleBeanBuilder(manager);
+      builder.createSimpleBeans(annotatedClass);
    }
    
    protected <T> void createDecorator(WBClass<T> annotatedClass)
    {
-      DecoratorBean<T> bean = DecoratorBean.of(annotatedClass, manager);
-      getEnvironment().addBean(bean);
+   	DecoratorBeanBuilder builder = beanBuilderFactory.getInternalDecoratorBeanBuilder(manager);
+      builder.createDecorator(annotatedClass);
    }
    
    protected <T> void createEnterpriseBean(InternalEjbDescriptor<T> ejbDescriptor)
    {
-      // TODO Don't create enterprise bean if it has no local interfaces!
-      EnterpriseBean<T> bean = EnterpriseBean.of(ejbDescriptor, manager);
-      getEnvironment().addBean(bean);
-      createSubBeans(bean);
-      getEnvironment().addBean(NewEnterpriseBean.of(ejbDescriptor, manager));
+     // TODO Don't create enterprise bean if it has no local interfaces!
+	   EnterpriseBeanBuilder builder = beanBuilderFactory.getInternalEnterpriseBeanBuilder(manager);
+   	builder.createEnterpriseBeans(ejbDescriptor);
    }
    
    /**

Modified: ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bootstrap/ExtensionBeanDeployer.java
===================================================================
--- ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bootstrap/ExtensionBeanDeployer.java	2009-09-03 11:42:50 UTC (rev 3637)
+++ ri/branches/kabir-builder/impl/src/main/java/org/jboss/webbeans/bootstrap/ExtensionBeanDeployer.java	2009-09-03 11:45:03 UTC (rev 3638)
@@ -22,6 +22,7 @@
 import javax.enterprise.inject.spi.Extension;
 
 import org.jboss.webbeans.BeanManagerImpl;
+import org.jboss.webbeans.bean.builder.InternalObserverMethodBuilder;
 import org.jboss.webbeans.bean.builtin.ExtensionBean;
 import org.jboss.webbeans.ejb.EjbDescriptors;
 import org.jboss.webbeans.introspector.WBClass;
@@ -51,8 +52,11 @@
          WBClass<Extension> clazz = (WBClass<Extension>) classTransformer.loadClass(extension.getClass());
          
          ExtensionBean bean = new ExtensionBean(getManager(), clazz, extension);
+         bean.initialize(getEnvironment());
          getEnvironment().addBean(bean);
-         createObserverMethods(bean, clazz);
+         
+         InternalObserverMethodBuilder observerMethodBuilder = getBeanBuilderFactory().getInternalObserverMethodBuilder(getManager());
+         observerMethodBuilder.createObserverMethods(bean, clazz);
       }
       return this;
    }




More information about the weld-commits mailing list