[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