Author: kabir.khan(a)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(a)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(a)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(a)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(a)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(a)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(a)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(a)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(a)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;
}