[webbeans-commits] Webbeans SVN: r532 - in ri/trunk/webbeans-ri/src: main/java/org/jboss/webbeans/bean and 8 other directories.

webbeans-commits at lists.jboss.org webbeans-commits at lists.jboss.org
Tue Dec 16 02:36:02 EST 2008


Author: nickarls
Date: 2008-12-16 02:36:02 -0500 (Tue, 16 Dec 2008)
New Revision: 532

Added:
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/ejb/EjbDescriptorCache.java
   ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/test/mock/MockEjbDescriptor.java
Removed:
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/ejb/EjbMetaData.java
   ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/test/EjbMetaDataTest.java
Modified:
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/MetaDataCache.java
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/EnterpriseBean.java
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bootstrap/WebBeansBootstrap.java
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bootstrap/spi/EjbDescriptor.java
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/ejb/DefaultEnterpriseBeanLookup.java
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/ejb/EJB.java
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/util/Names.java
   ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/test/BoostrapTest.java
   ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/test/SimpleBeanModelTest.java
   ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/test/contexts/NormalContextTest.java
   ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/test/ejb/EnterpriseBeanSpecializationTest.java
   ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/test/mock/MockBootstrap.java
   ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/test/mock/MockWebBeanDiscovery.java
Log:
EjbMetaData -> EjbDescriptor + mock

Pete, please review for sanity:

* I added a singleton EjbDescriptorCache, they are probably best kept somewhere else(?)

* I misuse the ejb name currently, grep for "/local"

* The EnterpriseBean shouldn't pull its own metadata(?)"

Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/MetaDataCache.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/MetaDataCache.java	2008-12-15 13:55:26 UTC (rev 531)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/MetaDataCache.java	2008-12-16 07:36:02 UTC (rev 532)
@@ -20,12 +20,10 @@
 import java.lang.annotation.Annotation;
 import java.util.concurrent.Callable;
 
-import org.jboss.webbeans.ejb.EjbMetaData;
 import org.jboss.webbeans.model.BindingTypeModel;
 import org.jboss.webbeans.model.ScopeModel;
 import org.jboss.webbeans.model.StereotypeModel;
 import org.jboss.webbeans.util.ConcurrentCache;
-import org.jboss.webbeans.util.Strings;
 
 /**
  * Metadata singleton for holding EJB metadata, scope models etc.
@@ -59,8 +57,6 @@
    private ConcurrentCache<Class<? extends Annotation>, ScopeModel<?>> scopes = new ConcurrentCache<Class<? extends Annotation>, ScopeModel<?>>();
    // The binding type models
    private ConcurrentCache<Class<? extends Annotation>, BindingTypeModel<?>> bindingTypes = new ConcurrentCache<Class<? extends Annotation>, BindingTypeModel<?>>();
-   // EJB metadata
-   private ConcurrentCache<Class<?>, EjbMetaData<?>> ejbMetaDataMap = new ConcurrentCache<Class<?>, EjbMetaData<?>>();
 
    /**
     * Gets a stereotype model
@@ -128,28 +124,6 @@
    }
 
    /**
-    * Gets metadata for an EJB
-    * 
-    * Adds the model if it is not present
-    * 
-    * @param <T> The type
-    * @param clazz The class of the EJB
-    * @return The EJB metadata
-    */
-   public <T> EjbMetaData<T> getEjbMetaData(final Class<T> clazz)
-   {
-      return ejbMetaDataMap.putIfAbsent(clazz, new Callable<EjbMetaData<T>>()
-      {
-
-         public EjbMetaData<T> call() throws Exception
-         {
-            return new EjbMetaData<T>(clazz);
-         }
-
-      });
-   }
-
-   /**
     * Gets a string representation
     * 
     * @return A string representation
@@ -162,22 +136,7 @@
       buffer.append("Registered binding type models: " + bindingTypes.size() + "\n");
       buffer.append("Registered scope type models: " + scopes.size() + "\n");
       buffer.append("Registered stereotype models: " + stereotypes.size() + "\n");
-      buffer.append("Registered EJB metadata: " + ejbMetaDataMap.size() + "\n");
       return buffer.toString();
    }
 
-   public String toDetailedString()
-   {
-      StringBuilder buffer = new StringBuilder();
-      buffer.append("====================\n");
-      buffer.append("Metadata cache\n");
-      buffer.append("====================\n");
-      buffer.append(bindingTypes.toString() + "\n");
-      buffer.append(ejbMetaDataMap.toString() + "\n");
-      buffer.append(scopes.toString() + "\n");
-      buffer.append(Strings.mapToString("Stereotypes: ", stereotypes));
-      buffer.append("====================\n");
-      return buffer.toString();
-   }
-
 }

Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/EnterpriseBean.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/EnterpriseBean.java	2008-12-15 13:55:26 UTC (rev 531)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/EnterpriseBean.java	2008-12-16 07:36:02 UTC (rev 532)
@@ -17,6 +17,9 @@
 
 package org.jboss.webbeans.bean;
 
+import java.util.HashSet;
+import java.util.Set;
+
 import javax.webbeans.ApplicationScoped;
 import javax.webbeans.Decorator;
 import javax.webbeans.DefinitionException;
@@ -32,16 +35,15 @@
 import javax.webbeans.manager.Manager;
 
 import org.jboss.webbeans.ManagerImpl;
-import org.jboss.webbeans.MetaDataCache;
+import org.jboss.webbeans.bootstrap.spi.EjbDescriptor;
 import org.jboss.webbeans.contexts.DependentContext;
 import org.jboss.webbeans.ejb.EJB;
-import org.jboss.webbeans.ejb.EjbMetaData;
+import org.jboss.webbeans.ejb.EjbDescriptorCache;
 import org.jboss.webbeans.introspector.AnnotatedField;
 import org.jboss.webbeans.introspector.AnnotatedMethod;
 import org.jboss.webbeans.introspector.AnnotatedParameter;
 import org.jboss.webbeans.log.LogProvider;
 import org.jboss.webbeans.log.Logging;
-import org.jboss.webbeans.util.Names;
 
 /**
  * An enterprise bean representation
@@ -52,11 +54,10 @@
  */
 public class EnterpriseBean<T> extends AbstractClassBean<T>
 {
-   
    private LogProvider log = Logging.getLogProvider(EnterpriseBean.class);
+   
+   private EjbDescriptor<T> ejbDescriptor;
 
-   private EjbMetaData<T> ejbMetaData;
-
    /**
     * Constructor
     * 
@@ -72,11 +73,12 @@
    /**
     * Initializes the bean and its metadata
     */
+   @SuppressWarnings("unchecked")
    @Override
    protected void init()
    {
       super.init();
-      ejbMetaData = MetaDataCache.instance().getEjbMetaData(getType());
+      ejbDescriptor = (EjbDescriptor<T>) EjbDescriptorCache.instance().get(getType().getSimpleName() + "/local");
       initRemoveMethod();
       initInjectionPoints();
       checkEnterpriseBeanTypeAllowed();
@@ -123,11 +125,11 @@
     */
    protected void checkEnterpriseScopeAllowed()
    {
-      if (getEjbMetaData().isStateless() && !getScopeType().equals(Dependent.class))
+      if (ejbDescriptor.isStateless() && !getScopeType().equals(Dependent.class))
       {
          throw new DefinitionException("Scope " + getScopeType() + " is not allowed on stateless enterpise beans for " + getType() + ". Only @Dependent is allowed on stateless enterprise beans");
       }
-      if (getEjbMetaData().isSingleton() && (!(getScopeType().equals(Dependent.class) || getScopeType().equals(ApplicationScoped.class))))
+      if (ejbDescriptor.isSingleton() && (!(getScopeType().equals(Dependent.class) || getScopeType().equals(ApplicationScoped.class))))
       {
          throw new DefinitionException("Scope " + getScopeType() + " is not allowed on singleton enterpise beans for " + getType() + ". Only @Dependent or @ApplicationScoped is allowed on singleton enterprise beans");
       }
@@ -142,7 +144,7 @@
       {
          return;
       }
-      if (!MetaDataCache.instance().getEjbMetaData(getAnnotatedItem().getSuperclass().getType()).isEjb())
+      if (!EJB.isEjb(getType().getSuperclass()))
       {
          throw new DefinitionException("Annotation defined specializing EJB must have EJB superclass");
       }
@@ -153,22 +155,23 @@
     */
    protected void initRemoveMethod()
    {
-      if (!getEjbMetaData().isStateful())
+      if (!ejbDescriptor.isStateful())
       {
          // Nothing to do for stateless enterprise beans;
          return;
       }
 
       // >1 @Destructor
-      if (getEjbMetaData().getDestructorMethods().size() > 1)
+      if (getAnnotatedItem().getAnnotatedMethods(Destructor.class).size() > 1)
       {
          throw new DefinitionException("Multiple @Destructor methods not allowed on " + getAnnotatedItem());
       }
 
       // <1 (0) @Destructors
-      if (getEjbMetaData().getNoArgsRemoveMethods().size() == 1)
+      Set<AnnotatedMethod<Object>> noArgsRemoveMethods = getNoArgsRemoveMethods();
+      if (noArgsRemoveMethods.size() == 1)
       {
-         super.removeMethod = getEjbMetaData().getNoArgsRemoveMethods().get(0);
+         super.removeMethod = noArgsRemoveMethods.iterator().next();
          return;
       }
 
@@ -179,6 +182,19 @@
 
    }
 
+   private Set<AnnotatedMethod<Object>> getNoArgsRemoveMethods()
+   {
+      Set<AnnotatedMethod<Object>> noArgsRemoveMethods = new HashSet<AnnotatedMethod<Object>>();
+      for (AnnotatedMethod<Object> removeMethod : getAnnotatedItem().getAnnotatedMethods(EJB.REMOVE_ANNOTATION))
+      {
+         if (removeMethod.getParameters().isEmpty())
+         {
+            noArgsRemoveMethods.add(removeMethod);
+         }
+      }
+      return noArgsRemoveMethods;
+   }
+
    /**
     * Validates the remove method
     */
@@ -223,7 +239,7 @@
       try
       {
          DependentContext.INSTANCE.setActive(true);
-         T instance = (T) manager.getInstanceByType(EnterpriseBeanLookup.class).lookup(ejbMetaData.getEjbName());
+         T instance = (T) manager.getInstanceByType(EnterpriseBeanLookup.class).lookup(ejbDescriptor.getEjbName());
          bindDecorators();
          bindInterceptors();
          injectEjbAndCommonFields();
@@ -304,7 +320,7 @@
    @Override
    protected AbstractBean<? extends T, Class<T>> getSpecializedType()
    {
-      // TODO lots of validation!
+      // TODO: lots of validation!
       Class<?> superclass = getAnnotatedItem().getType().getSuperclass();
       if (superclass != null)
       {
@@ -323,23 +339,13 @@
     */
    private void checkEnterpriseBeanTypeAllowed()
    {
-      if (getEjbMetaData().isMessageDriven())
+      if (ejbDescriptor.isMessageDriven())
       {
          throw new DefinitionException("Message Driven Beans can't be Web Beans");
       }
    }
 
    /**
-    * Gets the EJB metadata
-    * 
-    * @return The metadata
-    */
-   protected EjbMetaData<T> getEjbMetaData()
-   {
-      return ejbMetaData;
-   }
-
-   /**
     * Gets a string representation
     * 
     * @return The string representation
@@ -348,7 +354,8 @@
    public String toString()
    {
       StringBuilder buffer = new StringBuilder();
-      buffer.append("Annotated " + Names.scopeTypeToString(getScopeType()) + Names.ejbTypeFromMetaData(getEjbMetaData()));
+      // buffer.append("Annotated " + Names.scopeTypeToString(getScopeType()) +
+      // Names.ejbTypeFromMetaData(getEjbMetaData()));
       if (getName() == null)
       {
          buffer.append(" unnamed enterprise bean");
@@ -362,13 +369,4 @@
       return buffer.toString();
    }
 
-   public String toDetailedString()
-   {
-      StringBuilder buffer = new StringBuilder();
-      buffer.append("EnterpriseBean:\n");
-      buffer.append(super.toString() + "\n");
-      buffer.append(ejbMetaData.toString() + "\n");
-      return buffer.toString();
-   }
-
 }

Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bootstrap/WebBeansBootstrap.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bootstrap/WebBeansBootstrap.java	2008-12-15 13:55:26 UTC (rev 531)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bootstrap/WebBeansBootstrap.java	2008-12-16 07:36:02 UTC (rev 532)
@@ -46,7 +46,6 @@
 
 import org.jboss.webbeans.CurrentManager;
 import org.jboss.webbeans.ManagerImpl;
-import org.jboss.webbeans.MetaDataCache;
 import org.jboss.webbeans.bean.AbstractBean;
 import org.jboss.webbeans.bean.AbstractClassBean;
 import org.jboss.webbeans.bean.BeanFactory;
@@ -58,6 +57,8 @@
 import org.jboss.webbeans.bootstrap.spi.WebBeanDiscovery;
 import org.jboss.webbeans.contexts.DependentContext;
 import org.jboss.webbeans.ejb.DefaultEnterpriseBeanLookup;
+import org.jboss.webbeans.ejb.EJB;
+import org.jboss.webbeans.ejb.EjbDescriptorCache;
 import org.jboss.webbeans.event.ObserverImpl;
 import org.jboss.webbeans.introspector.AnnotatedField;
 import org.jboss.webbeans.introspector.AnnotatedItem;
@@ -138,7 +139,7 @@
       Set<AbstractBean<?, ?>> beans = new HashSet<AbstractBean<?, ?>>();
       for (Class<?> clazz : classes)
       {
-         if (MetaDataCache.instance().getEjbMetaData(clazz).isEjb())
+         if (EJB.isEjb(clazz))
          {
             createBean(createEnterpriseBean(clazz, manager), beans);
          }
@@ -153,6 +154,7 @@
       return beans;
    }
    
+
    public void createBean(AbstractClassBean<?> bean, Set<AbstractBean<?, ?>> beans)
    {
       beans.add(bean);
@@ -218,6 +220,7 @@
          throw new IllegalStateException("No WebBeanDiscovery provider found, you need to implement the org.jboss.webbeans.bootstrap.spi.WebBeanDiscovery interface, and tell the RI to use it by specifying -D" + WebBeansBootstrap.WEB_BEAN_DISCOVERY_PROPERTY_NAME + "=<classname>");
       }
       registerBeans(webBeanDiscovery.discoverWebBeanClasses());
+      EjbDescriptorCache.instance().setEjbDescriptors(webBeanDiscovery.discoverEjbs());
       log.info("Validing Web Bean injection points");
       manager.getResolver().resolveInjectionPoints();
       manager.fireEvent(manager, new InitializedBinding());

Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bootstrap/spi/EjbDescriptor.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bootstrap/spi/EjbDescriptor.java	2008-12-15 13:55:26 UTC (rev 531)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bootstrap/spi/EjbDescriptor.java	2008-12-16 07:36:02 UTC (rev 532)
@@ -67,12 +67,22 @@
     * @return An iterator over the remote business interfaces
     */
    public Iterator<BusinessInterfaceDescriptor> getRemoteBusinessInterfaces();
-
+   
    /**
     * Get the remove methods of the EJB
     * 
     * @return An iterator the remove methods
     */
    public Iterator<Method> getRemoveMethods();
+
+   public boolean isStateless();
+
+   public boolean isSingleton();
+
+   public boolean isStateful();
+
+   public boolean isMessageDriven();
+
+   public String getEjbName();
    
 }

Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/ejb/DefaultEnterpriseBeanLookup.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/ejb/DefaultEnterpriseBeanLookup.java	2008-12-15 13:55:26 UTC (rev 531)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/ejb/DefaultEnterpriseBeanLookup.java	2008-12-16 07:36:02 UTC (rev 532)
@@ -17,18 +17,13 @@
 
 package org.jboss.webbeans.ejb;
 
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
 import javax.webbeans.CreationException;
 import javax.webbeans.Standard;
 import javax.webbeans.manager.EnterpriseBeanLookup;
 
+import org.jboss.webbeans.bootstrap.spi.EjbDescriptor;
 import org.jboss.webbeans.util.JNDI;
-import org.jboss.webbeans.util.Strings;
 
-import com.google.common.collect.ForwardingMap;
-
 /**
  * Provides lookup and metadata registration services for EJBs
  * 
@@ -38,69 +33,22 @@
 @Standard
 public class DefaultEnterpriseBeanLookup implements EnterpriseBeanLookup
 {
-   /**
-    * An EJB name -> metadata map
-    */
-   private class EjbMetaDataMap extends ForwardingMap<String, EjbMetaData<?>>
-   {
-      private Map<String, EjbMetaData<?>> delegate;
 
-      public EjbMetaDataMap()
-      {
-         delegate = new ConcurrentHashMap<String, EjbMetaData<?>>();
-      }
-
-      @Override
-      protected Map<String, EjbMetaData<?>> delegate()
-      {
-         return delegate;
-      }
-
-      @Override
-      public String toString()
-      {
-         return Strings.mapToString("EjbMetaDataMap (EJB name -> metadata): ", delegate);
-      }
-   }
-
-   // A map from EJB name to EJB metadata
-   private EjbMetaDataMap ejbMetaDataMap = new EjbMetaDataMap();
-
-   /**
-    * Looks up and EJB based on the name
-    * 
-    * Gets the EJB metadata and calls helper method
-    * 
-    * @param ejbName The EJB name
-    * @return The EJB local home interface
-    * @see javax.webbeans.manager.EnterpriseBeanLookup#lookup(String)
-    */
    public Object lookup(String ejbName)
    {
       if (ejbName == null)
+      {
          throw new NullPointerException("No EJB name supplied for lookup");
-      return lookup(ejbMetaDataMap.get(ejbName));
+      }
+      return lookup(EjbDescriptorCache.instance().get(ejbName));
    }
 
-   /**
-    * Looks up an EJB
-    * 
-    * First tried the EJB link JNDI name, if available, then the default JNDI
-    * name. Throws an CreationException if it isn't found.
-    * 
-    * @param <T> The type of the EJB
-    * @param ejbMetaData The EJB metadata
-    * @return The EJB local interface
-    */
-   public static <T> T lookup(EjbMetaData<T> ejbMetaData)
+   @SuppressWarnings("unchecked")
+   public static <T> T lookup(EjbDescriptor<T> ejbDescriptor)
    {
       try
       {
-         if (ejbMetaData.getEjbLinkJndiName() != null)
-         {
-            return JNDI.lookup(ejbMetaData.getEjbLinkJndiName(), ejbMetaData.getType());
-         }
-         return JNDI.lookup(ejbMetaData.getDefaultJndiName(), ejbMetaData.getType());
+         return (T) JNDI.lookup(ejbDescriptor.getEjbName());
       }
       catch (Exception e)
       {
@@ -108,17 +56,4 @@
       }
    }
 
-   // TODO: this method needs to get called at startup
-   /**
-    * Creates and registers EJB metadata for a class
-    * 
-    * @param clazz The EJB class
-    * @return the EJB metadata
-    */
-   public <T> EjbMetaData<T> registerEjbMetaData(Class<T> clazz)
-   {
-      EjbMetaData<T> ejbMetaData = new EjbMetaData<T>(clazz);
-      ejbMetaDataMap.put(ejbMetaData.getEjbName(), ejbMetaData);
-      return ejbMetaData;
-   }
 }

Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/ejb/EJB.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/ejb/EJB.java	2008-12-15 13:55:26 UTC (rev 531)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/ejb/EJB.java	2008-12-16 07:36:02 UTC (rev 532)
@@ -54,5 +54,11 @@
       REMOVE_ANNOTATION = annotationTypeForName("javax.ejb.Remove");
       ENTERPRISE_BEAN_CLASS = classForName("javax.ejb.EnterpriseBean");
    }
+   
+   public static boolean isEjb(Class<?> clazz)
+   {
+      return clazz.isAnnotationPresent(STATEFUL_ANNOTATION) || clazz.isAnnotationPresent(STATELESS_ANNOTATION) || clazz.isAnnotationPresent(SINGLETON_ANNOTATION);
+   }
 
+
 }

Added: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/ejb/EjbDescriptorCache.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/ejb/EjbDescriptorCache.java	                        (rev 0)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/ejb/EjbDescriptorCache.java	2008-12-16 07:36:02 UTC (rev 532)
@@ -0,0 +1,65 @@
+package org.jboss.webbeans.ejb;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.jboss.webbeans.bootstrap.spi.EjbDescriptor;
+import org.jboss.webbeans.test.mock.MockEjbDescriptor;
+import org.jboss.webbeans.util.Strings;
+
+import com.google.common.collect.ForwardingMap;
+
+public class EjbDescriptorCache
+{
+   private static EjbDescriptorCache instance;
+
+   public static EjbDescriptorCache instance()
+   {
+      return instance;
+   }
+
+   static
+   {
+      instance = new EjbDescriptorCache();
+   }
+
+   private class EjbDescriptorMap extends ForwardingMap<String, EjbDescriptor<?>>
+   {
+      private Map<String, EjbDescriptor<?>> delegate;
+
+      public EjbDescriptorMap()
+      {
+         delegate = new ConcurrentHashMap<String, EjbDescriptor<?>>();
+      }
+
+      @Override
+      protected Map<String, EjbDescriptor<?>> delegate()
+      {
+         return delegate;
+      }
+
+      @Override
+      public String toString()
+      {
+         return Strings.mapToString("EjbMetaDataMap (EJB name -> metadata): ", delegate);
+      }
+   }
+
+   private EjbDescriptorMap ejbDescriptorMap = new EjbDescriptorMap();
+
+   public void setEjbDescriptors(Map<String, EjbDescriptor<?>> ejbDescriptorMap)
+   {
+      ejbDescriptorMap.putAll(ejbDescriptorMap);
+   }
+
+   public EjbDescriptor<?> get(String ejbName)
+   {
+      return ejbDescriptorMap.get(ejbName);
+   }
+
+   public void addEjbDescriptor(String ejbName, EjbDescriptor<?> ejbDescriptor)
+   {
+      ejbDescriptorMap.put(ejbName, ejbDescriptor);
+   }
+
+}

Deleted: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/ejb/EjbMetaData.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/ejb/EjbMetaData.java	2008-12-15 13:55:26 UTC (rev 531)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/ejb/EjbMetaData.java	2008-12-16 07:36:02 UTC (rev 532)
@@ -1,276 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2008, Red Hat Middleware LLC, and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,  
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.jboss.webbeans.ejb;
-
-import static org.jboss.webbeans.ejb.EJB.FAKE_MESSAGE_DRIVEN_ANNOTATION;
-import static org.jboss.webbeans.ejb.EJB.MESSAGE_DRIVEN_ANNOTATION;
-import static org.jboss.webbeans.ejb.EJB.REMOVE_ANNOTATION;
-import static org.jboss.webbeans.ejb.EJB.SINGLETON_ANNOTATION;
-import static org.jboss.webbeans.ejb.EJB.STATEFUL_ANNOTATION;
-import static org.jboss.webbeans.ejb.EJB.STATELESS_ANNOTATION;
-import static org.jboss.webbeans.ejb.EjbMetaData.EjbType.MESSAGE_DRIVEN;
-import static org.jboss.webbeans.ejb.EjbMetaData.EjbType.SINGLETON;
-import static org.jboss.webbeans.ejb.EjbMetaData.EjbType.STATEFUL;
-import static org.jboss.webbeans.ejb.EjbMetaData.EjbType.STATELESS;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.webbeans.DefinitionException;
-import javax.webbeans.Destructor;
-
-import org.jboss.webbeans.introspector.AnnotatedClass;
-import org.jboss.webbeans.introspector.AnnotatedMethod;
-import org.jboss.webbeans.introspector.jlr.AnnotatedClassImpl;
-import org.jboss.webbeans.util.Strings;
-
-/**
- * EJB metadata
- * 
- * @author Pete Muir
- * 
- * @param <T>
- */
-public class EjbMetaData<T>
-{
-   // The known EJB types
-   public enum EjbType
-   {
-      STATELESS, STATEFUL, SINGLETON, MESSAGE_DRIVEN;
-   }
-
-   // The type of the EJB
-   private EjbType ejbType;
-   // The remove methods
-   private List<AnnotatedMethod<Object>> removeMethods = new ArrayList<AnnotatedMethod<Object>>();
-   // The destructor methods
-   private List<AnnotatedMethod<Object>> destructorMethods = new ArrayList<AnnotatedMethod<Object>>();
-   // The remove methods with no arguments
-   private List<AnnotatedMethod<Object>> noArgsRemoveMethods = new ArrayList<AnnotatedMethod<Object>>();
-
-   // TODO Populate this from web.xml
-   // The EJB link jndi name
-   private String ejbLinkJndiName;
-
-   // TODO Initialize this based on the EJB 3.1 spec
-   // The default JNDI name
-   private String defaultJndiName;
-
-   // TODO Initialize the ejb name
-   // The EJB name
-   private String ejbName;
-
-   // The abstracted type
-   private AnnotatedClass<T> type;
-
-   /**
-    * Constrcutor
-    * 
-    * Creates a new abstracted class and delegates to another constructor
-    * 
-    * @param type The type
-    */
-   public EjbMetaData(Class<T> type)
-   {
-      this(new AnnotatedClassImpl<T>(type));
-   }
-
-   /**
-    * Constructor
-    * 
-    * Initializes the class based on information from the abstracted class.
-    * Detects the EJB type and remove/destructor methods
-    * 
-    * @param type The abstracted class
-    */
-   public EjbMetaData(AnnotatedClass<T> type)
-   {
-      // TODO Merge in ejb-jar.xml
-      this.type = type;
-      if (type.isAnnotationPresent(STATELESS_ANNOTATION))
-      {
-         this.ejbType = STATELESS;
-         // TODO Has to be done here? If they are not parsed, they can't be
-         // detected later on (EnterpriseBean remove method init)
-         if (type.getAnnotatedMethods(Destructor.class).size() > 0)
-         {
-            throw new DefinitionException("Stateless enterprise beans cannot have @Destructor methods");
-         }
-      }
-      else if (type.isAnnotationPresent(STATEFUL_ANNOTATION))
-      {
-         this.ejbType = STATEFUL;
-         for (AnnotatedMethod<Object> removeMethod : type.getAnnotatedMethods(REMOVE_ANNOTATION))
-         {
-            removeMethods.add(removeMethod);
-            if (removeMethod.getParameters().size() == 0)
-            {
-               noArgsRemoveMethods.add(removeMethod);
-            }
-         }
-         for (AnnotatedMethod<Object> destructorMethod : type.getAnnotatedMethods(Destructor.class))
-         {
-            destructorMethods.add(destructorMethod);
-         }
-      }
-      else if (type.isAnnotationPresent(MESSAGE_DRIVEN_ANNOTATION) || type.isAnnotationPresent(FAKE_MESSAGE_DRIVEN_ANNOTATION))
-      {
-         this.ejbType = MESSAGE_DRIVEN;
-      }
-      else if (type.isAnnotationPresent(SINGLETON_ANNOTATION))
-      {
-         this.ejbType = SINGLETON;
-      }
-   }
-
-   /**
-    * Indicates if the EJB is a stateless one
-    * 
-    * @return True if stateless, false otherwise
-    */
-   public boolean isStateless()
-   {
-      return STATELESS.equals(ejbType);
-   }
-
-   /**
-    * Indicates if the EJB is a stateful one
-    * 
-    * @return True if stateful, false otherwise
-    */
-   public boolean isStateful()
-   {
-      return STATEFUL.equals(ejbType);
-   }
-
-   /**
-    * Indicates if the EJB is a MDB
-    * 
-    * @return True if MDB, false otherwise
-    */
-   public boolean isMessageDriven()
-   {
-      return MESSAGE_DRIVEN.equals(ejbType);
-   }
-
-   /**
-    * Indicates if the EJB is a singleton
-    * 
-    * @return True if singleton, false otherwise
-    */
-   public boolean isSingleton()
-   {
-      return SINGLETON.equals(ejbType);
-   }
-
-   /**
-    * Indicates if class really is of a know EJB type
-    * 
-    * @return True if EJB, false otherwise
-    */
-
-   public boolean isEjb()
-   {
-      return ejbType != null;
-   }
-
-   /**
-    * Gets the EJB link JNDI name
-    * 
-    * @return The name
-    */
-   public String getEjbLinkJndiName()
-   {
-      return ejbLinkJndiName;
-   }
-
-   /**
-    * Gets the default JNDI name
-    * 
-    * @return The name
-    */
-   public String getDefaultJndiName()
-   {
-      return defaultJndiName;
-   }
-
-   /**
-    * Gets the EJB name
-    * 
-    * @return The name
-    */
-   public String getEjbName()
-   {
-      return ejbName;
-   }
-
-   public Class<T> getType()
-   {
-      return type.getType();
-   }
-
-   /**
-    * Gets the list of remove method abstractions
-    * 
-    * @return The list of remove methods. An empty list is returned if there are
-    *         none.
-    */
-   public List<AnnotatedMethod<Object>> getRemoveMethods()
-   {
-      return removeMethods;
-   }
-
-   /**
-    * Gets a list of destructor method abstractions
-    * 
-    * @return The list of destructor methods. An empty list is returned if there
-    *         are none.
-    */
-   public List<AnnotatedMethod<Object>> getDestructorMethods()
-   {
-      return destructorMethods;
-   }
-
-   /**
-    * Gets the list of remove method abstractions that take no arguments
-    * 
-    * @return The list of remove methods without arguments. An empty list is
-    *         returned if there are none.
-    */
-   public List<AnnotatedMethod<Object>> getNoArgsRemoveMethods()
-   {
-      return noArgsRemoveMethods;
-   }
-
-   @Override
-   public String toString()
-   {
-      StringBuilder buffer = new StringBuilder();
-      buffer.append("EJB metadata model\n");
-      buffer.append("EJB name: " + ejbName + "\n");
-      buffer.append("EJB type: " + ejbType + "\n");
-      buffer.append("EJB link JNDI name " + ejbLinkJndiName + "\n");
-      buffer.append("Default JNDI name: " + defaultJndiName + "\n");
-      buffer.append("Type: " + type.toString() + "\n");
-      buffer.append(Strings.collectionToString("Desctructor methods: ", getDestructorMethods()));
-      buffer.append(Strings.collectionToString("Remove methods: ", getRemoveMethods()));
-      buffer.append(Strings.collectionToString("No-args remove methods: ", getNoArgsRemoveMethods()));
-      return buffer.toString();
-   }
-
-}

Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/util/Names.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/util/Names.java	2008-12-15 13:55:26 UTC (rev 531)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/util/Names.java	2008-12-16 07:36:02 UTC (rev 532)
@@ -11,8 +11,6 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-import org.jboss.webbeans.ejb.EjbMetaData;
-
 /**
  * Utility class to produce friendly names e.g. for debugging
  * 
@@ -43,33 +41,6 @@
    }
 
    /**
-    * Gets EJB type from metadata
-    * 
-    * @param ejbMetaData The EJB meta data
-    * @return The EJB type
-    */
-   public static String ejbTypeFromMetaData(EjbMetaData<?> ejbMetaData)
-   {
-      if (ejbMetaData.isMessageDriven())
-      {
-         return "message driven";
-      }
-      else if (ejbMetaData.isSingleton())
-      {
-         return "singleton";
-      }
-      else if (ejbMetaData.isStateful())
-      {
-         return "stateful";
-      }
-      else if (ejbMetaData.isStateless())
-      {
-         return "stateless";
-      }
-      return "unknown";
-   }
-
-   /**
     * Counts item in an iteratble
     * 
     * @param iterable The iteraboe

Modified: ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/test/BoostrapTest.java
===================================================================
--- ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/test/BoostrapTest.java	2008-12-15 13:55:26 UTC (rev 531)
+++ ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/test/BoostrapTest.java	2008-12-16 07:36:02 UTC (rev 532)
@@ -210,7 +210,7 @@
    @Test(groups="bootstrap")
    public void testDiscover()
    {
-      webBeansBootstrap.boot(new MockWebBeanDiscovery(new HashSet<Class<?>>(Arrays.asList(Hound.class, Elephant.class, Panther.class, Tiger.class, Tuna.class, Salmon.class, SeaBass.class, Sole.class)), null, null));
+      webBeansBootstrap.boot(new MockWebBeanDiscovery(new HashSet<Class<?>>(Arrays.asList(Hound.class, Elephant.class, Panther.class, Tiger.class, Tuna.class, Salmon.class, SeaBass.class, Sole.class)), null, new HashSet<Class<?>>()));
       
       assert manager.getBeans().size() == 8 + MockManagerImpl.BUILT_IN_BEANS;
       Map<Class<?>, Bean<?>> classes = new HashMap<Class<?>, Bean<?>>();
@@ -244,22 +244,21 @@
    public void testInitializedEvent()
    {
       assert !InitializedObserver.observered;
+      webBeansBootstrap.boot(new MockWebBeanDiscovery(new HashSet<Class<?>>(Arrays.asList(InitializedObserver.class)), null, new HashSet<Class<?>>()));
       
-      webBeansBootstrap.boot(new MockWebBeanDiscovery(new HashSet<Class<?>>(Arrays.asList(InitializedObserver.class)), null, null));
-      
       assert InitializedObserver.observered;
    }
    
    @Test(groups="bootstrap")
    public void testRequestContextActiveDuringInitializtionEvent()
    {
-      webBeansBootstrap.boot(new MockWebBeanDiscovery(new HashSet<Class<?>>(Arrays.asList(InitializedObserverWhichUsesRequestContext.class, Tuna.class)), null, null));
+      webBeansBootstrap.boot(new MockWebBeanDiscovery(new HashSet<Class<?>>(Arrays.asList(InitializedObserverWhichUsesRequestContext.class, Tuna.class)), null, new HashSet<Class<?>>()));
    }
    
    @Test(groups="bootstrap")
    public void testApplicationContextActiveDuringInitializtionEvent()
    {
-      webBeansBootstrap.boot(new MockWebBeanDiscovery(new HashSet<Class<?>>(Arrays.asList(InitializedObserverWhichUsesApplicationContext.class, LadybirdSpider.class)), null, null));
+      webBeansBootstrap.boot(new MockWebBeanDiscovery(new HashSet<Class<?>>(Arrays.asList(InitializedObserverWhichUsesApplicationContext.class, LadybirdSpider.class)), null, new HashSet<Class<?>>()));
    }
    
 }

Deleted: ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/test/EjbMetaDataTest.java
===================================================================
--- ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/test/EjbMetaDataTest.java	2008-12-15 13:55:26 UTC (rev 531)
+++ ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/test/EjbMetaDataTest.java	2008-12-16 07:36:02 UTC (rev 532)
@@ -1,36 +0,0 @@
-package org.jboss.webbeans.test;
-
-import org.jboss.webbeans.ejb.EjbMetaData;
-import org.jboss.webbeans.test.beans.Leopard;
-import org.jboss.webbeans.test.beans.Lion;
-import org.jboss.webbeans.test.beans.Tiger;
-import org.testng.annotations.Test;
-
-public class EjbMetaDataTest
-{
-
-   @Test
-   public void testStateless()
-   {
-      EjbMetaData<Lion> lion = new EjbMetaData<Lion>(Lion.class);
-      assert lion.isStateless();
-      assert lion.getRemoveMethods().isEmpty();
-   }
-   
-   @Test
-   public void testStateful()
-   {
-      EjbMetaData<Tiger> tiger = new EjbMetaData<Tiger>(Tiger.class);
-      assert tiger.isStateful();
-      assert tiger.getRemoveMethods().size() == 1;
-   }
-   
-   @Test
-   public void testMessageDriven()
-   {
-      EjbMetaData<Leopard> leopard = new EjbMetaData<Leopard>(Leopard.class);
-      assert leopard.isMessageDriven();
-      assert leopard.getRemoveMethods().isEmpty();
-   }
-   
-}

Modified: ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/test/SimpleBeanModelTest.java
===================================================================
--- ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/test/SimpleBeanModelTest.java	2008-12-15 13:55:26 UTC (rev 531)
+++ ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/test/SimpleBeanModelTest.java	2008-12-16 07:36:02 UTC (rev 532)
@@ -1,7 +1,5 @@
 package org.jboss.webbeans.test;
 
-import static org.jboss.webbeans.bean.BeanFactory.createSimpleBean;
-
 import java.lang.annotation.Annotation;
 import java.util.Arrays;
 import java.util.HashMap;
@@ -41,6 +39,7 @@
 import org.jboss.webbeans.test.mock.MockManagerImpl;
 import org.jboss.webbeans.test.mock.MockWebBeanDiscovery;
 import org.testng.annotations.Test;
+import static org.jboss.webbeans.bean.BeanFactory.*;
 
 @SpecVersion("20081206")
 public class SimpleBeanModelTest extends AbstractTest
@@ -88,21 +87,21 @@
    @Test
    public void testClassesImplementingServletInterfacesNotDiscoveredAsSimpleBeans()
    {
-      webBeansBootstrap.boot(new MockWebBeanDiscovery(new HashSet<Class<?>>(Arrays.asList(FilterBean.class, HttpSessionListenerBean.class, ServletBean.class, ServletContextListenerBean.class, ServletRequestListenerBean.class)), null, null));
+      webBeansBootstrap.boot(new MockWebBeanDiscovery(new HashSet<Class<?>>(Arrays.asList(FilterBean.class, HttpSessionListenerBean.class, ServletBean.class, ServletContextListenerBean.class, ServletRequestListenerBean.class)), null, new HashSet<Class<?>>()));
       assert manager.getBeans().size() == MockManagerImpl.BUILT_IN_BEANS;
    }
    
    @Test
    public void testClassesImplementingEnterpriseBeanInterfaceNotDiscoveredAsSimpleBean()
    {
-      webBeansBootstrap.boot(new MockWebBeanDiscovery(new HashSet<Class<?>>(Arrays.asList(EnterpriseBeanWebBean.class)), null, null));
+      webBeansBootstrap.boot(new MockWebBeanDiscovery(new HashSet<Class<?>>(Arrays.asList(EnterpriseBeanWebBean.class)), null, new HashSet<Class<?>>()));
       assert manager.getBeans().size() == MockManagerImpl.BUILT_IN_BEANS;
    }
    
    @Test
    public void testClassExtendingUiComponentNotDiscoveredAsSimpleBean()
    {
-      webBeansBootstrap.boot(new MockWebBeanDiscovery(new HashSet<Class<?>>(Arrays.asList(UIComponentBean.class)), null, null));
+      webBeansBootstrap.boot(new MockWebBeanDiscovery(new HashSet<Class<?>>(Arrays.asList(UIComponentBean.class)), null, new HashSet<Class<?>>()));
       assert manager.getBeans().size() == MockManagerImpl.BUILT_IN_BEANS;
    }
    

Modified: ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/test/contexts/NormalContextTest.java
===================================================================
--- ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/test/contexts/NormalContextTest.java	2008-12-15 13:55:26 UTC (rev 531)
+++ ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/test/contexts/NormalContextTest.java	2008-12-16 07:36:02 UTC (rev 532)
@@ -1,25 +1,11 @@
 package org.jboss.webbeans.test.contexts;
 
-import static org.jboss.webbeans.bean.BeanFactory.createProducerMethodBean;
-import static org.jboss.webbeans.bean.BeanFactory.createSimpleBean;
-
-import java.lang.reflect.Method;
-
-import javax.webbeans.ContextNotActiveException;
-import javax.webbeans.manager.Bean;
 import javax.webbeans.manager.Context;
 
-import org.jboss.webbeans.bean.BeanFactory;
-import org.jboss.webbeans.bean.ProducerMethodBean;
-import org.jboss.webbeans.bean.SimpleBean;
-import org.jboss.webbeans.contexts.AbstractContext;
 import org.jboss.webbeans.contexts.RequestContext;
 import org.jboss.webbeans.test.AbstractTest;
 import org.jboss.webbeans.test.SpecAssertion;
 import org.jboss.webbeans.test.SpecVersion;
-import org.jboss.webbeans.test.beans.SpiderProducer;
-import org.jboss.webbeans.test.beans.Tarantula;
-import org.jboss.webbeans.test.beans.Tuna;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
@@ -28,53 +14,161 @@
  * @author Nicklas Karlsson (nickarls at gmail.com)
  * @author Pete Muir
  * 
- * This class tests a basic context against section 8 of the specification
- *
+ *         This class tests a basic context against section 8 of the
+ *         specification
+ * 
  */
- at SpecVersion("PDR")
+ at SpecVersion("20081206")
 public class NormalContextTest extends AbstractTest
 {
    Context context;
-   
+
    @BeforeMethod
-   public void initContext() {
-      context = new RequestContext() {};
+   public void initContext()
+   {
+      context = new RequestContext()
+      {
+      };
    }
-   
-   @Test(groups="contexts") @SpecAssertion(section="8.1")
-   public void testGetWithCreateFalseReturnsNull() {
-      Bean<Tuna> tunaBean = BeanFactory.createSimpleBean(Tuna.class, manager);      
-      assert context.get(tunaBean, false) == null;
+
+   /**
+    * return an existing instance of the given contextual type, or
+    */
+   @Test(groups = { "contexts", "stub" })
+   @SpecAssertion(section = "9.2")
+   public void testGetReturnsExistingInstace()
+   {
+      assert false;
    }
 
-   @Test(groups="contexts") @SpecAssertion(section="8.1")
-   public void testGetWithCreateTrueReturnsBean() {
-      Bean<Tuna> tunaBean = BeanFactory.createSimpleBean(Tuna.class, manager);      
-      assert context.get(tunaBean, true) != null;
+   /**
+    * if the value of the create parameter is false, return a null value, or
+    */
+   @Test(groups = { "contexts", "stub" })
+   @SpecAssertion(section = "9.2")
+   public void testGetWithCreateFalseReturnsNull()
+   {
+      assert false;
    }
-   
-   @Test(groups="contexts", expectedExceptions=ContextNotActiveException.class) @SpecAssertion(section="8.1")
-   public void testInactiveContextThrowsContextNotActiveException() {
-      ((AbstractContext)context).setActive(false);
-      context.get(null, false);
-      assert true;
+
+   /**
+    * if the value of the create parameter is true, create a new instance of the
+    * given contextual type by calling Bean.create() and return the new
+    * instance.
+    */
+   @Test(groups = { "contexts", "stub" })
+   @SpecAssertion(section = "9.2")
+   public void testGetWithCreateTrueReturnsNewInstance()
+   {
+      assert false;
    }
-   
-   @Test(groups="contexts") @SpecAssertion(section="8.1")
-   public void testReturnsCorrectExistingBean() {
-      Bean<Tuna> tunaBean = BeanFactory.createSimpleBean(Tuna.class, manager);
-      Tuna firstTuna = context.get(tunaBean, true);
-      Tuna secondTuna = context.get(tunaBean, false);
-      assert firstTuna == secondTuna;
+
+   /**
+    * The get() method may not return a null value unless the create parameter
+    * is false or Contextual.create() returns a null value
+    */
+   @Test(groups = { "contexts", "stub" })
+   @SpecAssertion(section = "9.2")
+   public void testGetMayNotReturnNullUnlessCreateIsFalseOrContextualCreateReturnsNull()
+   {
+      assert false;
    }
 
-   @Test(groups={"contexts", "producerMethod"}) @SpecAssertion(section="8.1")
-   public void testProducerMethodReturningNullOK() throws SecurityException, NoSuchMethodException {
-      SimpleBean<SpiderProducer> producer = createSimpleBean(SpiderProducer.class, manager);
-      manager.addBean(producer);
-      Method nullProducer = SpiderProducer.class.getMethod("produceShelob");  
-      ProducerMethodBean<Tarantula> shelobBean = createProducerMethodBean(Tarantula.class, nullProducer, producer, manager);
-      assert shelobBean.create() == null;
+   /**
+    * The get() method may not create a new instance of the given contextual
+    * type unless the create parameter is true
+    */
+   @Test(groups = { "contexts", "stub" })
+   @SpecAssertion(section = "9.2")
+   public void testGetMayNotCreateNewInstanceUnlessCreateIsTrue()
+   {
+      assert false;
    }
-   
+
+   /**
+    * The Context implementation is responsible for destroying any contextual
+    * instance it creates by passing the instance to the destroy() method of the
+    * Contextual object representing the contextual type.
+    */
+   public void testContextDestroysBeansWhenDestroyed()
+   {
+      assert false;
+   }
+
+   /**
+    * A destroyed instance must not subsequently be returned by the get()
+    * method.
+    */
+   @Test(groups = { "contexts", "stub" })
+   @SpecAssertion(section = "9.2")
+   public void testDestroyedInstanceMustNotBeReturnedByGet()
+   {
+      assert false;
+   }
+
+   /**
+    * When a scope is inactive, any invocation of the get() from the current
+    * thread upon the Context object for that scope results in a
+    * ContextNotActiveException.
+    */
+   @Test(groups = { "contexts", "stub" })
+   @SpecAssertion(section = "9.2")
+   public void testInvokingGetOnInactiveContextFails()
+   {
+      assert false;
+   }
+
+   /**
+    * There may be no more than one mapped instance per contextual type per
+    * thread
+    */
+   @Test(groups = { "contexts", "stub" })
+   @SpecAssertion(section = "9.3")
+   public void testOnlyMappedInstancePerContextualTypePerThread()
+   {
+      assert false;
+   }
+
+   /*
+    * @Test(groups = "contexts")
+    * 
+    * @SpecAssertion(section = "9.3") public void
+    * testGetWithCreateFalseReturnsNull() { Bean<Tuna> tunaBean =
+    * BeanFactory.createSimpleBean(Tuna.class, manager); assert
+    * context.get(tunaBean, false) == null; }
+    * 
+    * @Test(groups = "contexts")
+    * 
+    * @SpecAssertion(section = "8.1") public void
+    * testGetWithCreateTrueReturnsBean() { Bean<Tuna> tunaBean =
+    * BeanFactory.createSimpleBean(Tuna.class, manager); assert
+    * context.get(tunaBean, true) != null; }
+    * 
+    * @Test(groups = "contexts", expectedExceptions =
+    * ContextNotActiveException.class)
+    * 
+    * @SpecAssertion(section = "8.1") public void
+    * testInactiveContextThrowsContextNotActiveException() { ((AbstractContext)
+    * context).setActive(false); context.get(null, false); assert true; }
+    * 
+    * @Test(groups = "contexts")
+    * 
+    * @SpecAssertion(section = "8.1") public void
+    * testReturnsCorrectExistingBean() { Bean<Tuna> tunaBean =
+    * BeanFactory.createSimpleBean(Tuna.class, manager); Tuna firstTuna =
+    * context.get(tunaBean, true); Tuna secondTuna = context.get(tunaBean,
+    * false); assert firstTuna == secondTuna; }
+    * 
+    * @Test(groups = { "contexts", "producerMethod" })
+    * 
+    * @SpecAssertion(section = "8.1") public void
+    * testProducerMethodReturningNullOK() throws SecurityException,
+    * NoSuchMethodException { SimpleBean<SpiderProducer> producer =
+    * createSimpleBean(SpiderProducer.class, manager);
+    * manager.addBean(producer); Method nullProducer =
+    * SpiderProducer.class.getMethod("produceShelob");
+    * ProducerMethodBean<Tarantula> shelobBean =
+    * createProducerMethodBean(Tarantula.class, nullProducer, producer,
+    * manager); assert shelobBean.create() == null; }
+    */
 }

Modified: ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/test/ejb/EnterpriseBeanSpecializationTest.java
===================================================================
--- ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/test/ejb/EnterpriseBeanSpecializationTest.java	2008-12-15 13:55:26 UTC (rev 531)
+++ ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/test/ejb/EnterpriseBeanSpecializationTest.java	2008-12-16 07:36:02 UTC (rev 532)
@@ -109,7 +109,7 @@
     */
    @Test(expectedExceptions = DefinitionException.class, groups = { "stub", "specialization", "enterpriseBeans" })
    @SpecAssertion(section = "3.3.6")
-   public void EnabledSpecializationOverridesSpecialized()
+   public void testEnabledSpecializationOverridesSpecialized()
    {
       assert false;
    }

Modified: ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/test/mock/MockBootstrap.java
===================================================================
--- ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/test/mock/MockBootstrap.java	2008-12-15 13:55:26 UTC (rev 531)
+++ ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/test/mock/MockBootstrap.java	2008-12-16 07:36:02 UTC (rev 532)
@@ -7,6 +7,8 @@
 import org.jboss.webbeans.ManagerImpl;
 import org.jboss.webbeans.bean.AbstractBean;
 import org.jboss.webbeans.bootstrap.WebBeansBootstrap;
+import org.jboss.webbeans.ejb.EJB;
+import org.jboss.webbeans.ejb.EjbDescriptorCache;
 
 public class MockBootstrap extends WebBeansBootstrap
 { 
@@ -24,8 +26,15 @@
     * @param classes The classes to create Web Beans from
     * @return A set of Web Beans that represents the classes
     */
+   @SuppressWarnings("unchecked")
    public Set<AbstractBean<?, ?>> createBeans(Class<?>... classes)
    {
+      for (Class<?> clazz : classes) {
+         if (EJB.isEjb(clazz)) {
+            String ejbName = clazz.getSimpleName() + "/local";
+            EjbDescriptorCache.instance().addEjbDescriptor(ejbName, new MockEjbDescriptor(ejbName, clazz));
+         }
+      }
       return createBeans(new HashSet<Class<?>>(Arrays.asList(classes)));
    }
    

Added: ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/test/mock/MockEjbDescriptor.java
===================================================================
--- ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/test/mock/MockEjbDescriptor.java	                        (rev 0)
+++ ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/test/mock/MockEjbDescriptor.java	2008-12-16 07:36:02 UTC (rev 532)
@@ -0,0 +1,75 @@
+package org.jboss.webbeans.test.mock;
+
+import java.lang.reflect.Method;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+
+import org.jboss.webbeans.bootstrap.spi.EjbDescriptor;
+import org.jboss.webbeans.ejb.EJB;
+
+public class MockEjbDescriptor<T> implements EjbDescriptor<T>
+{
+   private Class<T> type;
+   private String ejbName;
+
+   public MockEjbDescriptor(String ejbName, Class<T> type)
+   {
+      this.ejbName = ejbName;
+      this.type = type;
+   }
+
+   public String getEjbName()
+   {
+      return ejbName;
+   }
+
+   public Iterator<BusinessInterfaceDescriptor> getLocalBusinessInterfaces()
+   {
+      return new HashSet<BusinessInterfaceDescriptor>().iterator();
+   }
+
+   public Iterator<BusinessInterfaceDescriptor> getRemoteBusinessInterfaces()
+   {
+      return new HashSet<BusinessInterfaceDescriptor>().iterator();
+   }
+
+   public Iterator<Method> getRemoveMethods()
+   {
+      Collection<Method> removeMethods = new HashSet<Method>();
+      for (Method method : type.getMethods())
+      {
+         if (method.isAnnotationPresent(EJB.REMOVE_ANNOTATION))
+         {
+            removeMethods.add(method);
+         }
+      }
+      return removeMethods.iterator();
+   }
+
+   public Class<T> getType()
+   {
+      return type;
+   }
+
+   public boolean isMessageDriven()
+   {
+      return type.isAnnotationPresent(EJB.MESSAGE_DRIVEN_ANNOTATION);
+   }
+
+   public boolean isSingleton()
+   {
+      return type.isAnnotationPresent(EJB.SINGLETON_ANNOTATION);
+   }
+
+   public boolean isStateful()
+   {
+      return type.isAnnotationPresent(EJB.STATEFUL_ANNOTATION);
+   }
+
+   public boolean isStateless()
+   {
+      return type.isAnnotationPresent(EJB.STATELESS_ANNOTATION);
+   }
+
+}

Modified: ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/test/mock/MockWebBeanDiscovery.java
===================================================================
--- ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/test/mock/MockWebBeanDiscovery.java	2008-12-15 13:55:26 UTC (rev 531)
+++ ri/trunk/webbeans-ri/src/test/java/org/jboss/webbeans/test/mock/MockWebBeanDiscovery.java	2008-12-16 07:36:02 UTC (rev 532)
@@ -11,21 +11,32 @@
 
 public class MockWebBeanDiscovery implements WebBeanDiscovery
 {
-   
+
    private Set<Class<?>> webBeanClasses = new HashSet<Class<?>>();
 
    private Set<URL> webBeansXmlFiles = new HashSet<URL>();
-   
-   private Map<Class<?>, EjbDescriptor<?>> ejbs = new HashMap<Class<?>, EjbDescriptor<?>>();
-   
-   public MockWebBeanDiscovery(Set<Class<?>> webBeanClasses, Set<URL> webBeansXmlFiles, Map<Class<?>, EjbDescriptor<?>> ejbs)
+
+   private Map<String, EjbDescriptor<?>> ejbs = new HashMap<String, EjbDescriptor<?>>();
+
+   @SuppressWarnings("unchecked")
+   public MockWebBeanDiscovery(Set<Class<?>> webBeanClasses, Set<URL> webBeansXmlFiles, Set<Class<?>> ejbs)
    {
       super();
       this.webBeanClasses = webBeanClasses;
       this.webBeansXmlFiles = webBeansXmlFiles;
-      this.ejbs = ejbs;
+      this.ejbs = new HashMap<String, EjbDescriptor<?>>();
+      for (Class<?> ejb : ejbs)
+      {
+         String ejbName = getEjbName(ejb);
+         this.ejbs.put(ejbName, new MockEjbDescriptor(ejbName, ejb));
+      }
    }
 
+   private String getEjbName(Class<?> clazz)
+   {
+      return clazz.getSimpleName() + "/local";
+   }
+
    public Iterable<Class<?>> discoverWebBeanClasses()
    {
       return webBeanClasses;
@@ -33,13 +44,13 @@
 
    public Map<String, EjbDescriptor<?>> discoverEjbs()
    {
-      // TODO Implement EJB discovery for embedded EJB
-      return null;
+      // TODO Auto-generated method stub
+      return new HashMap<String, EjbDescriptor<?>>();
    }
 
    public Iterable<URL> discoverWebBeansXml()
    {
       return webBeansXmlFiles;
    }
-   
+
 }




More information about the weld-commits mailing list