[weld-commits] Weld SVN: r5450 - in core/trunk: impl/src/main/java/org/jboss/weld/bean and 11 other directories.

weld-commits at lists.jboss.org weld-commits at lists.jboss.org
Wed Jan 13 08:55:55 EST 2010


Author: pete.muir at jboss.org
Date: 2010-01-13 08:55:53 -0500 (Wed, 13 Jan 2010)
New Revision: 5450

Added:
   core/trunk/impl/src/main/java/org/jboss/weld/injection/CurrentInjectionPoint.java
   core/trunk/impl/src/main/java/org/jboss/weld/injection/DummyInjectionPoint.java
   core/trunk/impl/src/main/java/org/jboss/weld/metadata/cache/QualifierModel.java
   core/trunk/impl/src/main/java/org/jboss/weld/resolution/ForwardingInterceptorResolvable.java
Removed:
   core/trunk/impl/src/main/java/org/jboss/weld/manager/DummyInjectionPoint.java
   core/trunk/impl/src/main/java/org/jboss/weld/metadata/cache/BindingTypeModel.java
Modified:
   core/trunk/impl/src/main/java/org/jboss/weld/Container.java
   core/trunk/impl/src/main/java/org/jboss/weld/bean/AbstractProducerBean.java
   core/trunk/impl/src/main/java/org/jboss/weld/bean/ManagedBean.java
   core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/AbstractFacadeBean.java
   core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/InjectionPointBean.java
   core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/InstanceImpl.java
   core/trunk/impl/src/main/java/org/jboss/weld/bean/proxy/ClientProxyMethodHandler.java
   core/trunk/impl/src/main/java/org/jboss/weld/bean/proxy/ClientProxyProvider.java
   core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/Validator.java
   core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/WeldBootstrap.java
   core/trunk/impl/src/main/java/org/jboss/weld/introspector/jlr/WeldAnnotationImpl.java
   core/trunk/impl/src/main/java/org/jboss/weld/introspector/jlr/WeldClassImpl.java
   core/trunk/impl/src/main/java/org/jboss/weld/manager/BeanManagerImpl.java
   core/trunk/impl/src/main/java/org/jboss/weld/metadata/cache/MetaAnnotationStore.java
   core/trunk/impl/src/main/java/org/jboss/weld/resolution/NameBasedResolver.java
   core/trunk/impl/src/main/java/org/jboss/weld/resolution/Resolvable.java
   core/trunk/impl/src/main/java/org/jboss/weld/resolution/ResolvableFactory.java
   core/trunk/impl/src/main/java/org/jboss/weld/resolution/ResolvableTransformer.java
   core/trunk/impl/src/main/java/org/jboss/weld/resolution/ResolvableWeldClass.java
   core/trunk/impl/src/main/java/org/jboss/weld/resolution/TypeSafeBeanResolver.java
   core/trunk/impl/src/main/java/org/jboss/weld/resolution/TypeSafeDecoratorResolver.java
   core/trunk/impl/src/main/java/org/jboss/weld/resolution/TypeSafeDisposerResolver.java
   core/trunk/impl/src/main/java/org/jboss/weld/resolution/TypeSafeInterceptorResolver.java
   core/trunk/impl/src/main/java/org/jboss/weld/resolution/TypeSafeObserverResolver.java
   core/trunk/impl/src/main/java/org/jboss/weld/resolution/TypeSafeResolver.java
   core/trunk/impl/src/main/java/org/jboss/weld/util/Beans.java
   core/trunk/impl/src/main/java/org/jboss/weld/util/Names.java
   core/trunk/tests/src/main/java/org/jboss/weld/mock/cluster/AbstractClusterTest.java
   core/trunk/tests/src/test/java/org/jboss/weld/tests/unit/cluster/NaiveClusterTest.java
   core/trunk/tests/src/test/java/org/jboss/weld/tests/unit/cluster/SwitchableContainerTest.java
Log:
WELD-262

Modified: core/trunk/impl/src/main/java/org/jboss/weld/Container.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/Container.java	2010-01-13 13:53:14 UTC (rev 5449)
+++ core/trunk/impl/src/main/java/org/jboss/weld/Container.java	2010-01-13 13:55:53 UTC (rev 5450)
@@ -41,7 +41,7 @@
 public class Container
 {
    
-   private final static Singleton<Container> instance;
+   private static Singleton<Container> instance;
    
    static
    {
@@ -95,6 +95,7 @@
       this.managers.put(deploymentManager.getId(), deploymentManager);
       this.beanDeploymentArchives = new ConcurrentHashMap<BeanDeploymentArchive, BeanManagerImpl>();
       this.deploymentServices = deploymentServices;
+
    }
 
    /**
@@ -105,13 +106,11 @@
    {
       // TODO We should probably cleanup the bean managers for activities?
       managers.clear();
-      
       for (BeanManagerImpl beanManager : beanDeploymentArchives.values())
       {
          beanManager.cleanup();
       }
       beanDeploymentArchives.clear();
-      
       deploymentServices.cleanup();
       deploymentManager.cleanup();
       LoggerFactory.cleanup();

Modified: core/trunk/impl/src/main/java/org/jboss/weld/bean/AbstractProducerBean.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/AbstractProducerBean.java	2010-01-13 13:53:14 UTC (rev 5449)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/AbstractProducerBean.java	2010-01-13 13:55:53 UTC (rev 5450)
@@ -58,9 +58,10 @@
 import org.jboss.weld.exceptions.DefinitionException;
 import org.jboss.weld.exceptions.IllegalProductException;
 import org.jboss.weld.exceptions.WeldException;
+import org.jboss.weld.injection.CurrentInjectionPoint;
+import org.jboss.weld.injection.DummyInjectionPoint;
 import org.jboss.weld.introspector.WeldMember;
 import org.jboss.weld.manager.BeanManagerImpl;
-import org.jboss.weld.manager.DummyInjectionPoint;
 import org.jboss.weld.metadata.cache.MetaAnnotationStore;
 import org.jboss.weld.util.Beans;
 import org.jboss.weld.util.reflection.Reflections;
@@ -254,7 +255,7 @@
          {
             throw new IllegalProductException(NON_SERIALIZABLE_PRODUCT_ERROR, getProducer());
          }
-         InjectionPoint injectionPoint = beanManager.getCurrentInjectionPoint();
+         InjectionPoint injectionPoint = Container.instance().services().get(CurrentInjectionPoint.class).peek();
          if (injectionPoint == null || injectionPoint.equals(DummyInjectionPoint.INSTANCE))
          {
             return;

Modified: core/trunk/impl/src/main/java/org/jboss/weld/bean/ManagedBean.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/ManagedBean.java	2010-01-13 13:53:14 UTC (rev 5449)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/ManagedBean.java	2010-01-13 13:55:53 UTC (rev 5450)
@@ -52,6 +52,7 @@
 import org.jboss.weld.exceptions.DefinitionException;
 import org.jboss.weld.exceptions.DeploymentException;
 import org.jboss.weld.exceptions.ForbiddenStateException;
+import org.jboss.weld.injection.CurrentInjectionPoint;
 import org.jboss.weld.injection.InjectionContextImpl;
 import org.jboss.weld.injection.WeldInjectionPoint;
 import org.jboss.weld.introspector.WeldClass;
@@ -144,7 +145,18 @@
       {
          throw new ForbiddenStateException(DELEGATE_INJECTION_POINT_NOT_FOUND, decorator);
       }
-      return getBeanManager().replaceOrPushCurrentInjectionPoint(outerDelegateInjectionPoint);
+      CurrentInjectionPoint currentInjectionPoint = Container.instance().services().get(CurrentInjectionPoint.class);
+      if (currentInjectionPoint.peek() != null)
+      {
+         InjectionPoint originalInjectionPoint = currentInjectionPoint.pop();
+         currentInjectionPoint.push(outerDelegateInjectionPoint);
+         return originalInjectionPoint;
+      }
+      else
+      {
+         currentInjectionPoint.push(outerDelegateInjectionPoint);
+         return null;
+      }
    }
 
    /**

Modified: core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/AbstractFacadeBean.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/AbstractFacadeBean.java	2010-01-13 13:53:14 UTC (rev 5449)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/AbstractFacadeBean.java	2010-01-13 13:55:53 UTC (rev 5450)
@@ -23,6 +23,8 @@
 import javax.enterprise.context.spi.CreationalContext;
 import javax.enterprise.inject.spi.InjectionPoint;
 
+import org.jboss.weld.Container;
+import org.jboss.weld.injection.CurrentInjectionPoint;
 import org.jboss.weld.manager.BeanManagerImpl;
 import org.slf4j.cal10n.LocLogger;
 
@@ -38,7 +40,7 @@
 
    public T create(CreationalContext<T> creationalContext)
    {
-      InjectionPoint injectionPoint = this.getBeanManager().getCurrentInjectionPoint();
+      InjectionPoint injectionPoint = Container.instance().services().get(CurrentInjectionPoint.class).peek();
       if (injectionPoint != null)
       {
          return newInstance(injectionPoint);

Modified: core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/InjectionPointBean.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/InjectionPointBean.java	2010-01-13 13:53:14 UTC (rev 5449)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/InjectionPointBean.java	2010-01-13 13:55:53 UTC (rev 5450)
@@ -22,6 +22,8 @@
 import javax.enterprise.context.spi.CreationalContext;
 import javax.enterprise.inject.spi.InjectionPoint;
 
+import org.jboss.weld.Container;
+import org.jboss.weld.injection.CurrentInjectionPoint;
 import org.jboss.weld.manager.BeanManagerImpl;
 import org.jboss.weld.util.collections.Arrays2;
 
@@ -52,7 +54,7 @@
 
    public InjectionPoint create(CreationalContext<InjectionPoint> creationalContext)
    {
-      return getBeanManager().getCurrentInjectionPoint();
+      return Container.instance().services().get(CurrentInjectionPoint.class).peek();
    }
    
    public void destroy(InjectionPoint instance, CreationalContext<InjectionPoint> creationalContext) 

Modified: core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/InstanceImpl.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/InstanceImpl.java	2010-01-13 13:53:14 UTC (rev 5449)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/builtin/InstanceImpl.java	2010-01-13 13:55:53 UTC (rev 5450)
@@ -34,7 +34,9 @@
 import javax.enterprise.inject.spi.InjectionPoint;
 import javax.enterprise.util.TypeLiteral;
 
+import org.jboss.weld.Container;
 import org.jboss.weld.exceptions.InvalidObjectException;
+import org.jboss.weld.injection.CurrentInjectionPoint;
 import org.jboss.weld.manager.BeanManagerImpl;
 import org.jboss.weld.resolution.ResolvableWeldClass;
 import org.jboss.weld.util.Beans;
@@ -68,14 +70,14 @@
       // Push in an empty CC to ensure that we don't get the CC of whatever is injecting the bean containing the Instance injection point
       try
       {
-         getBeanManager().pushDummyInjectionPoint();
+         Container.instance().services().get(CurrentInjectionPoint.class).pushDummy();
          @SuppressWarnings("unchecked")
          T instance = (T) getBeanManager().getReference(bean, getType(), getBeanManager().createCreationalContext(bean));
          return instance;
       }
       finally
       {
-         getBeanManager().popDummyInjectionPoint();
+         Container.instance().services().get(CurrentInjectionPoint.class).popDummy();
       }
    }
 

Modified: core/trunk/impl/src/main/java/org/jboss/weld/bean/proxy/ClientProxyMethodHandler.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/proxy/ClientProxyMethodHandler.java	2010-01-13 13:53:14 UTC (rev 5449)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/proxy/ClientProxyMethodHandler.java	2010-01-13 13:55:53 UTC (rev 5450)
@@ -30,10 +30,10 @@
 import javax.enterprise.inject.spi.Bean;
 
 import org.jboss.weld.Container;
+import org.jboss.weld.context.CreationalContextImpl;
 import org.jboss.weld.context.WeldCreationalContext;
-import org.jboss.weld.manager.BeanManagerImpl;
+import org.jboss.weld.injection.CurrentInjectionPoint;
 import org.jboss.weld.serialization.spi.ContextualStore;
-import org.jboss.weld.util.reflection.Reflections;
 import org.jboss.weld.util.reflection.SecureReflections;
 import org.slf4j.cal10n.LocLogger;
 
@@ -57,8 +57,6 @@
    // The bean index in the manager
    private final String id;
 
-   private final BeanManagerImpl manager;
-
    private static final ThreadLocal<WeldCreationalContext<?>> currentCreationalContext = new ThreadLocal<WeldCreationalContext<?>>();
 
    /**
@@ -67,11 +65,10 @@
     * @param bean The bean to proxy
     * @param beanIndex The index to the bean in the manager bean list
     */
-   public ClientProxyMethodHandler(Bean<?> bean, BeanManagerImpl manager, String id)
+   public ClientProxyMethodHandler(Bean<?> bean, String id)
    {
       this.bean = bean;
       this.id = id;
-      this.manager = manager;
       log.trace("Created method handler for bean " + bean + " identified as " + id);
    }
 
@@ -128,7 +125,7 @@
       boolean outer;
       if (currentCreationalContext.get() == null)
       {
-         creationalContext = manager.createCreationalContext(bean);
+         creationalContext = new CreationalContextImpl<T>(bean);
          currentCreationalContext.set(creationalContext);
          outer = true;
       }
@@ -139,14 +136,14 @@
       }
       try
       {
-         Context context = manager.getContext(bean.getScope());
+         Context context = Container.instance().deploymentManager().getContext(bean.getScope());
          // Ensure that there is no injection point associated
-         manager.pushDummyInjectionPoint();
+         Container.instance().services().get(CurrentInjectionPoint.class).pushDummy();
          return context.get(bean, creationalContext);
       }
       finally
       {
-         manager.popDummyInjectionPoint();
+         Container.instance().services().get(CurrentInjectionPoint.class).popDummy();
          if (outer)
          {
             currentCreationalContext.remove();

Modified: core/trunk/impl/src/main/java/org/jboss/weld/bean/proxy/ClientProxyProvider.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/proxy/ClientProxyProvider.java	2010-01-13 13:53:14 UTC (rev 5449)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/proxy/ClientProxyProvider.java	2010-01-13 13:55:53 UTC (rev 5450)
@@ -21,20 +21,20 @@
 import static org.jboss.weld.logging.messages.BeanMessage.PROXY_INSTANTIATION_FAILED;
 
 import java.io.Serializable;
-import java.util.concurrent.Callable;
+import java.util.concurrent.ConcurrentMap;
 
 import javax.enterprise.inject.spi.Bean;
 
 import org.jboss.weld.Container;
 import org.jboss.weld.exceptions.DefinitionException;
 import org.jboss.weld.exceptions.WeldException;
-import org.jboss.weld.logging.messages.BeanMessage;
-import org.jboss.weld.manager.BeanManagerImpl;
 import org.jboss.weld.serialization.spi.ContextualStore;
 import org.jboss.weld.util.Proxies;
 import org.jboss.weld.util.Proxies.TypeInfo;
-import org.jboss.weld.util.collections.ConcurrentCache;
 
+import com.google.common.base.Function;
+import com.google.common.collect.MapMaker;
+
 /**
  * A proxy pool for holding scope adaptors (client proxies)
  * 
@@ -44,21 +44,34 @@
  */
 public class ClientProxyProvider
 {
-   private static final long serialVersionUID = 9029999149357529341L;
+   
+   private static final Function<Bean<Object>, Object> CREATE_CLIENT_PROXY = new Function<Bean<Object>, Object> ()
+   {
 
+      public Object apply(Bean<Object> from)
+      {
+         String id = Container.instance().services().get(ContextualStore.class).putIfAbsent(from);
+         if (id == null)
+         {
+            throw new DefinitionException(BEAN_ID_CREATION_FAILED, from);
+         }
+         return createClientProxy(from, id);
+      }
+   };
+
    /**
     * A container/cache for previously created proxies
     * 
     * @author Nicklas Karlsson
     */
-   private final ConcurrentCache<Bean<? extends Object>, Object> pool;
+   private final ConcurrentMap<Bean<Object>, Object> pool;
 
    /**
     * Constructor
     */
    public ClientProxyProvider()
    {
-      this.pool = new ConcurrentCache<Bean<? extends Object>, Object>();
+      this.pool = new MapMaker().makeComputingMap(CREATE_CLIENT_PROXY);
    }
 
    /**
@@ -74,11 +87,11 @@
     * @throws InstantiationException When the proxy couldn't be created
     * @throws IllegalAccessException When the proxy couldn't be created
     */
-   private static <T> T createClientProxy(Bean<T> bean, BeanManagerImpl manager, String id) throws RuntimeException
+   private static <T> T createClientProxy(Bean<T> bean, String id) throws RuntimeException
    {
       try
       {
-         return Proxies.<T>createProxy(new ClientProxyMethodHandler(bean, manager, id), TypeInfo.of(bean.getTypes()).add(Serializable.class));
+         return Proxies.<T>createProxy(new ClientProxyMethodHandler(bean, id), TypeInfo.of(bean.getTypes()).add(Serializable.class));
       }
       catch (InstantiationException e)
       {
@@ -99,23 +112,9 @@
     * @param bean The bean to get a proxy to
     * @return the client proxy for the bean
     */
-   public <T> T getClientProxy(final BeanManagerImpl manager, final Bean<T> bean)
+   public <T> T getClientProxy(final Bean<T> bean)
    {
-      T instance = pool.putIfAbsent(bean, new Callable<T>()
-      {
-
-         public T call() throws Exception
-         {
-            String id = Container.instance().services().get(ContextualStore.class).putIfAbsent(bean);
-            if (id == null)
-            {
-               throw new DefinitionException(BEAN_ID_CREATION_FAILED, bean);
-            }
-            return createClientProxy(bean, manager, id);
-         }
-
-      });
-      return instance;
+      return (T) pool.get(bean);
    }
 
    /**

Modified: core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/Validator.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/Validator.java	2010-01-13 13:53:14 UTC (rev 5449)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/Validator.java	2010-01-13 13:55:53 UTC (rev 5450)
@@ -94,8 +94,8 @@
 import org.jboss.weld.util.reflection.Reflections;
 
 import com.google.common.base.Supplier;
-import com.google.common.collect.Multimap;
 import com.google.common.collect.Multimaps;
+import com.google.common.collect.SetMultimap;
 
 /**
  * Checks a list of beans for DeploymentExceptions and their subclasses
@@ -322,7 +322,7 @@
 
    public void validateBeanNames(BeanManagerImpl beanManager)
    {
-      Multimap<String, Bean<?>> namedAccessibleBeans = Multimaps.newSetMultimap(new HashMap<String, Collection<Bean<?>>>(), new Supplier<Set<Bean<?>>>()
+      SetMultimap<String, Bean<?>> namedAccessibleBeans = Multimaps.newSetMultimap(new HashMap<String, Collection<Bean<?>>>(), new Supplier<Set<Bean<?>>>()
       {
 
          public Set<Bean<?>> get()

Modified: core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/WeldBootstrap.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/WeldBootstrap.java	2010-01-13 13:53:14 UTC (rev 5449)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/WeldBootstrap.java	2010-01-13 13:55:53 UTC (rev 5450)
@@ -71,6 +71,7 @@
 import org.jboss.weld.ejb.spi.EjbDescriptor;
 import org.jboss.weld.exceptions.ForbiddenArgumentException;
 import org.jboss.weld.exceptions.ForbiddenStateException;
+import org.jboss.weld.injection.CurrentInjectionPoint;
 import org.jboss.weld.jsf.JsfApiAbstraction;
 import org.jboss.weld.logging.messages.VersionMessage;
 import org.jboss.weld.manager.BeanManagerImpl;
@@ -319,6 +320,7 @@
       services.add(ContextualStore.class, new ContextualStoreImpl());
       services.add(ServiceLoaderFactory.class, new DefaultServiceLoaderFactory());
       services.add(JavassistCleaner.class, new JavassistCleaner());
+      services.add(CurrentInjectionPoint.class, new CurrentInjectionPoint());
       return services;
    }
    

Added: core/trunk/impl/src/main/java/org/jboss/weld/injection/CurrentInjectionPoint.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/injection/CurrentInjectionPoint.java	                        (rev 0)
+++ core/trunk/impl/src/main/java/org/jboss/weld/injection/CurrentInjectionPoint.java	2010-01-13 13:55:53 UTC (rev 5450)
@@ -0,0 +1,79 @@
+package org.jboss.weld.injection;
+
+import java.util.Stack;
+
+import javax.enterprise.inject.spi.InjectionPoint;
+
+import org.jboss.weld.bootstrap.api.Service;
+
+public class CurrentInjectionPoint implements Service
+{
+   
+   private final ThreadLocal<Stack<InjectionPoint>> currentInjectionPoint;
+   
+   public CurrentInjectionPoint()
+   {
+      this.currentInjectionPoint = new ThreadLocal<Stack<InjectionPoint>>()
+      {
+         @Override
+         protected Stack<InjectionPoint> initialValue()
+         {
+            return new Stack<InjectionPoint>();
+         }
+      };
+   }
+      
+   /**
+    * Replaces (or adds) the current injection point. If a current injection 
+    * point exists, it will be replaced. If no current injection point exists, 
+    * one will be added.
+    * 
+    * @param injectionPoint the injection point to use
+    * @return the injection point added, or null if previous existed did not exist
+    */
+   public void push(InjectionPoint injectionPoint)
+   {
+      currentInjectionPoint.get().push(injectionPoint);
+   }
+   
+   public InjectionPoint pop()
+   {
+      return currentInjectionPoint.get().pop();
+   }
+   
+   /**
+    * The injection point being operated on for this thread
+    * 
+    * @return the current injection point
+    */
+   public InjectionPoint peek()
+   {
+      if (!currentInjectionPoint.get().empty())
+      {
+         return currentInjectionPoint.get().peek();
+      }
+      else
+      {
+         return null;
+      }
+   }
+   
+   public void pushDummy()
+   {
+      currentInjectionPoint.get().push(DummyInjectionPoint.INSTANCE);
+   }
+   
+   public void popDummy()
+   {
+      if (!currentInjectionPoint.get().isEmpty() && DummyInjectionPoint.INSTANCE.equals(currentInjectionPoint.get().peek()))
+      {
+         currentInjectionPoint.get().pop();
+      }
+   }
+
+   public void cleanup()
+   {
+      this.currentInjectionPoint.remove();
+   }
+
+}


Property changes on: core/trunk/impl/src/main/java/org/jboss/weld/injection/CurrentInjectionPoint.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:eol-style
   + native

Copied: core/trunk/impl/src/main/java/org/jboss/weld/injection/DummyInjectionPoint.java (from rev 5441, core/trunk/impl/src/main/java/org/jboss/weld/manager/DummyInjectionPoint.java)
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/injection/DummyInjectionPoint.java	                        (rev 0)
+++ core/trunk/impl/src/main/java/org/jboss/weld/injection/DummyInjectionPoint.java	2010-01-13 13:55:53 UTC (rev 5450)
@@ -0,0 +1,56 @@
+/**
+ * 
+ */
+package org.jboss.weld.injection;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Member;
+import java.lang.reflect.Type;
+import java.util.Collections;
+import java.util.Set;
+
+import javax.enterprise.inject.spi.Annotated;
+import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.InjectionPoint;
+
+public class DummyInjectionPoint implements InjectionPoint
+{
+   
+   public static final DummyInjectionPoint INSTANCE = new DummyInjectionPoint();
+   
+   public boolean isTransient()
+   {
+      return true;
+   }
+
+   public boolean isDelegate()
+   {
+      return false;
+   }
+
+   public Type getType()
+   {
+      return InjectionPoint.class;
+   }
+
+   public Set<Annotation> getQualifiers()
+   {
+      return Collections.emptySet();
+   }
+
+   public Member getMember()
+   {
+      return null;
+   }
+
+   public Bean<?> getBean()
+   {
+      return null;
+   }
+
+   public Annotated getAnnotated()
+   {
+      return null;
+   }
+   
+}


Property changes on: core/trunk/impl/src/main/java/org/jboss/weld/injection/DummyInjectionPoint.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:eol-style
   + native

Modified: core/trunk/impl/src/main/java/org/jboss/weld/introspector/jlr/WeldAnnotationImpl.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/introspector/jlr/WeldAnnotationImpl.java	2010-01-13 13:53:14 UTC (rev 5449)
+++ core/trunk/impl/src/main/java/org/jboss/weld/introspector/jlr/WeldAnnotationImpl.java	2010-01-13 13:55:53 UTC (rev 5450)
@@ -28,7 +28,6 @@
 import org.jboss.weld.introspector.WeldAnnotation;
 import org.jboss.weld.introspector.WeldMethod;
 import org.jboss.weld.resources.ClassTransformer;
-import org.jboss.weld.util.Names;
 import org.jboss.weld.util.collections.HashSetSupplier;
 import org.jboss.weld.util.reflection.HierarchyDiscovery;
 import org.jboss.weld.util.reflection.SecureReflections;
@@ -129,7 +128,7 @@
    @Override
    public String toString()
    {
-      return new StringBuilder().append("class ").append(Names.classToString(getDelegate())).toString();
+      return getJavaClass().toString();
    }
 
    @Override

Modified: core/trunk/impl/src/main/java/org/jboss/weld/introspector/jlr/WeldClassImpl.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/introspector/jlr/WeldClassImpl.java	2010-01-13 13:53:14 UTC (rev 5449)
+++ core/trunk/impl/src/main/java/org/jboss/weld/introspector/jlr/WeldClassImpl.java	2010-01-13 13:55:53 UTC (rev 5450)
@@ -517,7 +517,7 @@
    @Override
    public String toString()
    {
-      return new StringBuilder().append("class ").append(Names.classToString(getJavaClass())).toString();
+      return Names.toString(getJavaClass(), getAnnotations(), getActualTypeArguments());
    }
 
    public String getSimpleName()

Modified: core/trunk/impl/src/main/java/org/jboss/weld/manager/BeanManagerImpl.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/manager/BeanManagerImpl.java	2010-01-13 13:53:14 UTC (rev 5449)
+++ core/trunk/impl/src/main/java/org/jboss/weld/manager/BeanManagerImpl.java	2010-01-13 13:55:53 UTC (rev 5450)
@@ -48,7 +48,6 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.Stack;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.CopyOnWriteArraySet;
@@ -96,11 +95,13 @@
 import org.jboss.weld.exceptions.InjectionException;
 import org.jboss.weld.exceptions.UnproxyableResolutionException;
 import org.jboss.weld.exceptions.UnsatisfiedResolutionException;
+import org.jboss.weld.injection.CurrentInjectionPoint;
 import org.jboss.weld.introspector.WeldAnnotated;
 import org.jboss.weld.literal.AnyLiteral;
 import org.jboss.weld.manager.api.WeldManager;
 import org.jboss.weld.metadata.cache.MetaAnnotationStore;
 import org.jboss.weld.metadata.cache.ScopeModel;
+import org.jboss.weld.resolution.InterceptorResolvable;
 import org.jboss.weld.resolution.NameBasedResolver;
 import org.jboss.weld.resolution.Resolvable;
 import org.jboss.weld.resolution.ResolvableFactory;
@@ -188,9 +189,9 @@
     * archives
     */
    private transient final TypeSafeBeanResolver<Bean<?>> beanResolver;
-   private transient final TypeSafeResolver<? extends Resolvable, Decorator<?>> decoratorResolver;
-   private transient final TypeSafeResolver<? extends Resolvable, Interceptor<?>> interceptorResolver;
-   private transient final TypeSafeResolver<? extends Resolvable, ObserverMethod<?>> observerResolver;
+   private transient final TypeSafeResolver<Resolvable, Decorator<?>> decoratorResolver;
+   private transient final TypeSafeResolver<InterceptorResolvable, Interceptor<?>> interceptorResolver;
+   private transient final TypeSafeResolver<Resolvable, ObserverMethod<?>> observerResolver;
    private transient final NameBasedResolver nameBasedResolver;
    private transient final ELResolver weldELResolver;
    private transient Namespace rootNamespace;
@@ -225,12 +226,6 @@
    
    private final AtomicInteger childIds;
    private final String id;
-   
-   /*
-    * Runtime data transfer
-    * *********************
-    */
-   private transient final ThreadLocal<Stack<InjectionPoint>> currentInjectionPoint;
 
    /**
     * Interception model
@@ -396,15 +391,6 @@
       this.nameBasedResolver = new NameBasedResolver(this, createDynamicAccessibleIterable(beanTransform));
       this.weldELResolver = new WeldELResolver(this);
       this.childActivities = new CopyOnWriteArraySet<BeanManagerImpl>();
-      
-      this.currentInjectionPoint = new ThreadLocal<Stack<InjectionPoint>>()
-      {
-         @Override
-         protected Stack<InjectionPoint> initialValue()
-         {
-            return new Stack<InjectionPoint>();
-         }
-      };
    }
    
    private <T> Set<Iterable<T>> buildAccessibleClosure(Collection<BeanManagerImpl> hierarchy, Transform<T> transform)
@@ -628,14 +614,14 @@
       {
          if (registerInjectionPoint)
          {
-            currentInjectionPoint.get().push(injectionPoint);
+            Container.instance().services().get(CurrentInjectionPoint.class).push(injectionPoint);
          }
          // TODO Do this properly
          Set<Bean<?>> beans = getBeans(ResolvableWeldClass.of(injectionPoint.getType(), injectionPoint.getQualifiers().toArray(new Annotation[0]), this));
          Set<Bean<?>> injectableBeans = new HashSet<Bean<?>>();
          for (Bean<?> bean : beans)
          {
-            if (!(bean instanceof Decorator || bean instanceof Interceptor))
+            if (!(bean instanceof Decorator<?> || bean instanceof Interceptor<?>))
             {
                injectableBeans.add(bean);
             }
@@ -646,7 +632,7 @@
       {
          if (registerInjectionPoint)
          {
-            currentInjectionPoint.get().pop();
+            Container.instance().services().get(CurrentInjectionPoint.class).pop();
          }
       }
    }
@@ -790,7 +776,7 @@
       {
          if (creationalContext != null || getContext(bean.getScope()).get(bean) != null)
          {
-            return clientProxyProvider.getClientProxy(this, bean);
+            return clientProxyProvider.getClientProxy(bean);
          }
          else
          {
@@ -845,7 +831,7 @@
       {
          if (registerInjectionPoint)
          {
-            currentInjectionPoint.get().push(injectionPoint);
+            Container.instance().services().get(CurrentInjectionPoint.class).push(injectionPoint);
          }
          if (getServices().get(MetaAnnotationStore.class).getScopeModel(resolvedBean.getScope()).isNormal() && !Proxies.isTypeProxyable(injectionPoint.getType()))
          {
@@ -873,7 +859,7 @@
       {
          if (registerInjectionPoint)
          {
-            currentInjectionPoint.get().pop();
+            Container.instance().services().get(CurrentInjectionPoint.class).pop();
          }
       }
    }
@@ -1084,56 +1070,7 @@
    }
 
    /**
-    * The injection point being operated on for this thread
     * 
-    * @return the current injection point
-    */
-   public InjectionPoint getCurrentInjectionPoint()
-   {
-      if (!currentInjectionPoint.get().empty())
-      {
-         return currentInjectionPoint.get().peek();
-      }
-      else
-      {
-         return null;
-      }
-   }
-   
-   /**
-    * Replaces (or adds) the current injection point. If a current injection 
-    * point exists, it will be replaced. If no current injection point exists, 
-    * one will be added.
-    * 
-    * @param injectionPoint the injection point to use
-    * @return the injection point added, or null if non previous existed
-    */
-   public InjectionPoint replaceOrPushCurrentInjectionPoint(InjectionPoint injectionPoint)
-   {
-      InjectionPoint originalInjectionPoint = null;
-      if (!currentInjectionPoint.get().empty())
-      {
-         originalInjectionPoint = currentInjectionPoint.get().pop();
-      }
-      currentInjectionPoint.get().push(injectionPoint);
-      return originalInjectionPoint;
-   }
-   
-   public void pushDummyInjectionPoint()
-   {
-      currentInjectionPoint.get().push(DummyInjectionPoint.INSTANCE);
-   }
-   
-   public void popDummyInjectionPoint()
-   {
-      if (!currentInjectionPoint.get().isEmpty() && DummyInjectionPoint.INSTANCE.equals(currentInjectionPoint.get().peek()))
-      {
-         currentInjectionPoint.get().pop();
-      }
-   }
-
-   /**
-    * 
     * @return
     */
    public Map<Contextual<?>, Contextual<?>> getSpecializedBeans()
@@ -1350,7 +1287,6 @@
    public void cleanup()
    {
       services.cleanup();
-      this.currentInjectionPoint.remove();
       this.accessibleManagers.clear();
       this.beanResolver.clear();
       this.beans.clear();

Deleted: core/trunk/impl/src/main/java/org/jboss/weld/manager/DummyInjectionPoint.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/manager/DummyInjectionPoint.java	2010-01-13 13:53:14 UTC (rev 5449)
+++ core/trunk/impl/src/main/java/org/jboss/weld/manager/DummyInjectionPoint.java	2010-01-13 13:55:53 UTC (rev 5450)
@@ -1,56 +0,0 @@
-/**
- * 
- */
-package org.jboss.weld.manager;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Member;
-import java.lang.reflect.Type;
-import java.util.Collections;
-import java.util.Set;
-
-import javax.enterprise.inject.spi.Annotated;
-import javax.enterprise.inject.spi.Bean;
-import javax.enterprise.inject.spi.InjectionPoint;
-
-public class DummyInjectionPoint implements InjectionPoint
-{
-   
-   public static final DummyInjectionPoint INSTANCE = new DummyInjectionPoint();
-   
-   public boolean isTransient()
-   {
-      return true;
-   }
-
-   public boolean isDelegate()
-   {
-      return false;
-   }
-
-   public Type getType()
-   {
-      return InjectionPoint.class;
-   }
-
-   public Set<Annotation> getQualifiers()
-   {
-      return Collections.emptySet();
-   }
-
-   public Member getMember()
-   {
-      return null;
-   }
-
-   public Bean<?> getBean()
-   {
-      return null;
-   }
-
-   public Annotated getAnnotated()
-   {
-      return null;
-   }
-   
-}

Deleted: core/trunk/impl/src/main/java/org/jboss/weld/metadata/cache/BindingTypeModel.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/metadata/cache/BindingTypeModel.java	2010-01-13 13:53:14 UTC (rev 5449)
+++ core/trunk/impl/src/main/java/org/jboss/weld/metadata/cache/BindingTypeModel.java	2010-01-13 13:55:53 UTC (rev 5450)
@@ -1,186 +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.weld.metadata.cache;
-
-import static org.jboss.weld.logging.Category.REFLECTION;
-import static org.jboss.weld.logging.LoggerFactory.loggerFactory;
-import static org.jboss.weld.logging.messages.MetadataMessage.NON_BINDING_MEMBER_TYPE;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.InvocationTargetException;
-import java.util.Set;
-
-import javax.enterprise.util.Nonbinding;
-import javax.inject.Qualifier;
-
-import org.jboss.weld.exceptions.WeldException;
-import org.jboss.weld.introspector.WeldMethod;
-import org.jboss.weld.resources.ClassTransformer;
-import org.jboss.weld.util.collections.Arrays2;
-import org.jboss.weld.util.reflection.Reflections;
-import org.slf4j.cal10n.LocLogger;
-
-/**
- * 
- * Model of a binding type
- * 
- * @author Pete Muir
- * 
- */
-public class BindingTypeModel<T extends Annotation> extends AnnotationModel<T>
-{
-   private static final LocLogger log = loggerFactory().getLogger(REFLECTION);
-   
-   private static final Set<Class<? extends Annotation>> META_ANNOTATIONS = Arrays2.<Class<? extends Annotation>>asSet(Qualifier.class);
-   
-   // The non-binding types
-   private Set<WeldMethod<?, ?>> nonBindingTypes;
-   
-
-   /**
-    * Constructor
-    * 
-    * @param type The type
-    */
-   public BindingTypeModel(Class<T> type, ClassTransformer transformer)
-   {
-      super(type, transformer);
-   }
-
-   /**
-    * Initializes the non-binding types and validates the members
-    */
-   @Override
-   protected void init()
-   {
-      super.init();
-      initNonBindingTypes();
-      checkArrayAndAnnotationValuedMembers();
-   }
-
-   /**
-    * Validates the members
-    */
-   private void checkArrayAndAnnotationValuedMembers()
-   {
-      for (WeldMethod<?, ?> annotatedMethod : getAnnotatedAnnotation().getMembers())
-      {
-         if ((Reflections.isArrayType(annotatedMethod.getJavaClass()) || Annotation.class.isAssignableFrom(annotatedMethod.getJavaClass())) && !nonBindingTypes.contains(annotatedMethod))
-         {
-            super.valid = false;
-            log.debug(NON_BINDING_MEMBER_TYPE, annotatedMethod);
-         }
-      }
-
-   }
-
-   /**
-    * Gets the meta-annotation type
-    * 
-    * @return The BindingType class
-    */
-   @Override
-   protected Set<Class<? extends Annotation>> getMetaAnnotationTypes() 
-   {
-      return META_ANNOTATIONS;
-   }
-
-   /**
-    * Indicates if there are non-binding types present
-    * 
-    * @return True if present, false otherwise
-    */
-   public boolean hasNonBindingTypes()
-   {
-      return nonBindingTypes.size() > 0;
-   }
-
-   /**
-    * Gets the non-binding types
-    * 
-    * @return A set of non-binding types, or an empty set if there are none
-    *         present
-    */
-   public Set<WeldMethod<?, ?>> getNonBindingTypes()
-   {
-      return nonBindingTypes;
-   }
-
-   /**
-    * Initializes the non-binding types
-    */
-   protected void initNonBindingTypes()
-   {
-      nonBindingTypes = getAnnotatedAnnotation().getMembers(Nonbinding.class);
-   }
-
-   /**
-    * Comparator for checking equality
-    * 
-    * @param instance The instance to check against
-    * @param other The other binding type
-    * @return True if equal, false otherwise
-    */
-   public boolean isEqual(Annotation instance, Annotation other)
-   {
-      if (instance.annotationType().equals(getRawType()) && other.annotationType().equals(getRawType()))
-      {
-         for (WeldMethod<?, ?> annotatedMethod : getAnnotatedAnnotation().getMembers())
-         {
-            if (!nonBindingTypes.contains(annotatedMethod))
-            {
-               try
-               {
-                  Object thisValue = annotatedMethod.invoke(instance);
-                  Object thatValue = annotatedMethod.invoke(other);
-                  if (!thisValue.equals(thatValue))
-                  {
-                     return false;
-                  }
-               }
-               catch (IllegalArgumentException e)
-               {
-                  throw new WeldException(e);
-               }
-               catch (IllegalAccessException e)
-               {
-                  throw new WeldException(e);
-               }
-               catch (InvocationTargetException e)
-               {
-                  throw new WeldException(e);
-               }
-              
-            }
-         }
-         return true;
-      }
-      return false;
-   }
-
-   /**
-    * Gets a string representation of the binding type model
-    * 
-    * @return The string representation
-    */
-   @Override
-   public String toString()
-   {
-     return (isValid() ? "Valid" : "Invalid") + " binding type model for " + getRawType() + " with non-binding types " + getNonBindingTypes();
-   }
-
-}

Modified: core/trunk/impl/src/main/java/org/jboss/weld/metadata/cache/MetaAnnotationStore.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/metadata/cache/MetaAnnotationStore.java	2010-01-13 13:53:14 UTC (rev 5449)
+++ core/trunk/impl/src/main/java/org/jboss/weld/metadata/cache/MetaAnnotationStore.java	2010-01-13 13:55:53 UTC (rev 5450)
@@ -17,12 +17,14 @@
 package org.jboss.weld.metadata.cache;
 
 import java.lang.annotation.Annotation;
-import java.util.concurrent.Callable;
+import java.util.concurrent.ConcurrentMap;
 
 import org.jboss.weld.bootstrap.api.Service;
 import org.jboss.weld.resources.ClassTransformer;
-import org.jboss.weld.util.collections.ConcurrentCache;
 
+import com.google.common.base.Function;
+import com.google.common.collect.MapMaker;
+
 /**
  * Metadata singleton for holding EJB metadata, scope models etc.
  * 
@@ -31,21 +33,103 @@
  */
 public class MetaAnnotationStore implements Service
 {
+   
+   private static abstract class AbstractMetaAnnotationFunction<M extends AnnotationModel<Annotation>> implements Function<Class<Annotation>, M>
+   {
+      
+      private final ClassTransformer classTransformer;
 
+      private AbstractMetaAnnotationFunction(ClassTransformer classTransformer)
+      {
+         this.classTransformer = classTransformer;
+      }
+      
+      public ClassTransformer getClassTransformer()
+      {
+         return classTransformer;
+      }
+      
+   }
+   
+   private static class StereotypeFunction extends AbstractMetaAnnotationFunction<StereotypeModel<Annotation>>
+   {
+      
+      public StereotypeFunction(ClassTransformer classTransformer)
+      {
+         super(classTransformer);
+      }
+
+      public StereotypeModel<Annotation> apply(Class<Annotation> from)
+      {
+         return new StereotypeModel<Annotation>(from, getClassTransformer());
+      }
+      
+   }
+   
+   private static class ScopeFunction extends AbstractMetaAnnotationFunction<ScopeModel<Annotation>>
+   {
+      
+      public ScopeFunction(ClassTransformer classTransformer)
+      {
+         super(classTransformer);
+      }
+
+      public ScopeModel<Annotation> apply(Class<Annotation> from)
+      {
+         return new ScopeModel<Annotation>(from, getClassTransformer());
+      }
+      
+   }
+   
+   private static class QualifierFunction extends AbstractMetaAnnotationFunction<QualifierModel<Annotation>>
+   {
+      
+      public QualifierFunction(ClassTransformer classTransformer)
+      {
+         super(classTransformer);
+      }
+
+      public QualifierModel<Annotation> apply(Class<Annotation> from)
+      {
+         return new QualifierModel<Annotation>(from, getClassTransformer());
+      }
+      
+   }
+   
+   private static class InterceptorBindingFunction extends AbstractMetaAnnotationFunction<InterceptorBindingModel<Annotation>>
+   {
+      
+      public InterceptorBindingFunction(ClassTransformer classTransformer)
+      {
+         super(classTransformer);
+      }
+
+      public InterceptorBindingModel<Annotation> apply(Class<Annotation> from)
+      {
+         return new InterceptorBindingModel<Annotation>(from, getClassTransformer());
+      }
+      
+   }
+
    // The stereotype models
-   private ConcurrentCache<Class<? extends Annotation>, StereotypeModel<?>> stereotypes = new ConcurrentCache<Class<? extends Annotation>, StereotypeModel<?>>();
+   private ConcurrentMap<Class<Annotation>, StereotypeModel<Annotation>> stereotypes;
    // The scope models
-   private ConcurrentCache<Class<? extends Annotation>, ScopeModel<?>> scopes = new ConcurrentCache<Class<? extends Annotation>, ScopeModel<?>>();
+   private ConcurrentMap<Class<Annotation>, ScopeModel<Annotation>> scopes;
    // The binding type models
-   private ConcurrentCache<Class<? extends Annotation>, BindingTypeModel<?>> bindingTypes = new ConcurrentCache<Class<? extends Annotation>, BindingTypeModel<?>>();
+   private ConcurrentMap<Class<Annotation>, QualifierModel<Annotation>> qualifiers;
    // the interceptor bindings
-   private ConcurrentCache<Class<? extends Annotation>, InterceptorBindingModel<?>> interceptorBindings = new ConcurrentCache<Class<? extends Annotation>, InterceptorBindingModel<?>>();
+   private ConcurrentMap<Class<Annotation>, InterceptorBindingModel<Annotation>> interceptorBindings;
 
    private final ClassTransformer classTransformer;
 
    public MetaAnnotationStore(ClassTransformer classTransformer)
    {
+      MapMaker mapMaker = new MapMaker();
       this.classTransformer = classTransformer;
+      this.stereotypes = mapMaker.makeComputingMap(new StereotypeFunction(classTransformer));
+      this.scopes = mapMaker.makeComputingMap(new ScopeFunction(classTransformer));
+      this.qualifiers = mapMaker.makeComputingMap(new QualifierFunction(classTransformer));
+      this.interceptorBindings = mapMaker.makeComputingMap(new InterceptorBindingFunction(classTransformer));
    }
 
    /**
@@ -59,14 +143,7 @@
     */
    public <T extends Annotation> StereotypeModel<T> getStereotype(final Class<T> stereotype)
    {
-      return stereotypes.putIfAbsent(stereotype, new Callable<StereotypeModel<T>>()
-      {
-
-         public StereotypeModel<T> call() throws Exception
-         {
-            return new StereotypeModel<T>(stereotype, classTransformer);
-         }
-      });
+      return (StereotypeModel<T>) stereotypes.get(stereotype);
    }
 
    /**
@@ -75,20 +152,12 @@
     * Adds the model if it is not present.
     * 
     * @param <T> The type
-    * @param scopeType The scope type
+    * @param scope The scope type
     * @return The scope type model
     */
-   public <T extends Annotation> ScopeModel<T> getScopeModel(final Class<T> scopeType)
+   public <T extends Annotation> ScopeModel<T> getScopeModel(final Class<T> scope)
    {
-      return scopes.putIfAbsent(scopeType, new Callable<ScopeModel<T>>()
-      {
-
-         public ScopeModel<T> call() throws Exception
-         {
-            return new ScopeModel<T>(scopeType, classTransformer);
-         }
-
-      });
+      return (ScopeModel<T>) scopes.get(scope);
    }
 
    /**
@@ -100,17 +169,10 @@
     * @param bindingType The binding type
     * @return The binding type model
     */
-   public <T extends Annotation> BindingTypeModel<T> getBindingTypeModel(final Class<T> bindingType)
+   @SuppressWarnings("unchecked")
+   public <T extends Annotation> QualifierModel<T> getBindingTypeModel(final Class<T> bindingType)
    {
-      return bindingTypes.putIfAbsent(bindingType, new Callable<BindingTypeModel<T>>()
-      {
-
-         public BindingTypeModel<T> call() throws Exception
-         {
-            return new BindingTypeModel<T>(bindingType, classTransformer);
-         }
-
-      });
+      return (QualifierModel<T>) qualifiers.get(bindingType);
    }
 
    /**
@@ -123,31 +185,23 @@
    {
       StringBuilder buffer = new StringBuilder();
       buffer.append("Metadata cache\n");
-      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 interceptor binding models: " + interceptorBindings.size() + "\n");
+      buffer.append("Registered binding type models: ").append(qualifiers.size()).append("\n");
+      buffer.append("Registered scope type models: ").append(scopes.size()).append("\n");
+      buffer.append("Registered stereotype models: ").append(stereotypes.size()).append("\n");
+      buffer.append("Registered interceptor binding models: ").append(interceptorBindings.size()).append("\n");
       return buffer.toString();
    }
    
    public void cleanup() 
    {
-      this.bindingTypes.clear();
+      this.qualifiers.clear();
       this.scopes.clear();
       this.stereotypes.clear();
       this.interceptorBindings.clear();
    }
 
-   public <T extends Annotation> InterceptorBindingModel getInterceptorBindingModel(final Class<T> interceptorBinding)
+   public <T extends Annotation> InterceptorBindingModel<T> getInterceptorBindingModel(final Class<T> interceptorBinding)
    {
-      return interceptorBindings.putIfAbsent(interceptorBinding, new Callable<InterceptorBindingModel<T>>()
-      {
-
-         public InterceptorBindingModel<T> call() throws Exception
-         {
-            return new InterceptorBindingModel<T>(interceptorBinding, classTransformer);
-         }
-
-      });
+      return (InterceptorBindingModel<T>) interceptorBindings.get(interceptorBinding);
    }
 }

Copied: core/trunk/impl/src/main/java/org/jboss/weld/metadata/cache/QualifierModel.java (from rev 5441, core/trunk/impl/src/main/java/org/jboss/weld/metadata/cache/BindingTypeModel.java)
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/metadata/cache/QualifierModel.java	                        (rev 0)
+++ core/trunk/impl/src/main/java/org/jboss/weld/metadata/cache/QualifierModel.java	2010-01-13 13:55:53 UTC (rev 5450)
@@ -0,0 +1,186 @@
+/*
+ * 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.weld.metadata.cache;
+
+import static org.jboss.weld.logging.Category.REFLECTION;
+import static org.jboss.weld.logging.LoggerFactory.loggerFactory;
+import static org.jboss.weld.logging.messages.MetadataMessage.NON_BINDING_MEMBER_TYPE;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.InvocationTargetException;
+import java.util.Collections;
+import java.util.Set;
+
+import javax.enterprise.util.Nonbinding;
+import javax.inject.Qualifier;
+
+import org.jboss.weld.exceptions.WeldException;
+import org.jboss.weld.introspector.WeldMethod;
+import org.jboss.weld.resources.ClassTransformer;
+import org.jboss.weld.util.reflection.Reflections;
+import org.slf4j.cal10n.LocLogger;
+
+/**
+ * 
+ * Model of a binding type
+ * 
+ * @author Pete Muir
+ * 
+ */
+public class QualifierModel<T extends Annotation> extends AnnotationModel<T>
+{
+   private static final LocLogger log = loggerFactory().getLogger(REFLECTION);
+   
+   private static final Set<Class<? extends Annotation>> META_ANNOTATIONS = Collections.<Class<? extends Annotation>>singleton(Qualifier.class);
+   
+   // The non-binding types
+   private Set<WeldMethod<?, ?>> nonBindingMembers;
+   
+
+   /**
+    * Constructor
+    * 
+    * @param type The type
+    */
+   public QualifierModel(Class<T> type, ClassTransformer transformer)
+   {
+      super(type, transformer);
+   }
+
+   /**
+    * Initializes the non-binding types and validates the members
+    */
+   @Override
+   protected void init()
+   {
+      super.init();
+      initNonBindingMembers();
+      checkArrayAndAnnotationValuedMembers();
+   }
+
+   /**
+    * Validates the members
+    */
+   private void checkArrayAndAnnotationValuedMembers()
+   {
+      for (WeldMethod<?, ?> annotatedMethod : getAnnotatedAnnotation().getMembers())
+      {
+         if ((Reflections.isArrayType(annotatedMethod.getJavaClass()) || Annotation.class.isAssignableFrom(annotatedMethod.getJavaClass())) && !nonBindingMembers.contains(annotatedMethod))
+         {
+            super.valid = false;
+            log.debug(NON_BINDING_MEMBER_TYPE, annotatedMethod);
+         }
+      }
+
+   }
+
+   /**
+    * Gets the meta-annotation type
+    * 
+    * @return The BindingType class
+    */
+   @Override
+   protected Set<Class<? extends Annotation>> getMetaAnnotationTypes() 
+   {
+      return META_ANNOTATIONS;
+   }
+
+   /**
+    * Indicates if there are non-binding types present
+    * 
+    * @return True if present, false otherwise
+    */
+   public boolean hasNonBindingMembers()
+   {
+      return nonBindingMembers.size() > 0;
+   }
+
+   /**
+    * Gets the non-binding types
+    * 
+    * @return A set of non-binding types, or an empty set if there are none
+    *         present
+    */
+   public Set<WeldMethod<?, ?>> getNonBindingMembers()
+   {
+      return nonBindingMembers;
+   }
+
+   /**
+    * Initializes the non-binding types
+    */
+   protected void initNonBindingMembers()
+   {
+      nonBindingMembers = getAnnotatedAnnotation().getMembers(Nonbinding.class);
+   }
+
+   /**
+    * Comparator for checking equality
+    * 
+    * @param instance The instance to check against
+    * @param other The other binding type
+    * @return True if equal, false otherwise
+    */
+   public boolean isEqual(Annotation instance, Annotation other)
+   {
+      if (instance.annotationType().equals(getRawType()) && other.annotationType().equals(getRawType()))
+      {
+         for (WeldMethod<?, ?> annotatedMethod : getAnnotatedAnnotation().getMembers())
+         {
+            if (!nonBindingMembers.contains(annotatedMethod))
+            {
+               try
+               {
+                  Object thisValue = annotatedMethod.invoke(instance);
+                  Object thatValue = annotatedMethod.invoke(other);
+                  if (!thisValue.equals(thatValue))
+                  {
+                     return false;
+                  }
+               }
+               catch (IllegalArgumentException e)
+               {
+                  throw new WeldException(e);
+               }
+               catch (IllegalAccessException e)
+               {
+                  throw new WeldException(e);
+               }
+               catch (InvocationTargetException e)
+               {
+                  throw new WeldException(e);
+               }
+              
+            }
+         }
+         return true;
+      }
+      return false;
+   }
+
+   /**
+    * Gets a string representation of the qualifier model
+    * 
+    * @return The string representation
+    */
+   @Override
+   public String toString()
+   {
+     return (isValid() ? "Valid" : "Invalid") + " qualifer model for " + getRawType() + " with non-binding members " + getNonBindingMembers();
+   }
+
+}


Property changes on: core/trunk/impl/src/main/java/org/jboss/weld/metadata/cache/QualifierModel.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:eol-style
   + native

Added: core/trunk/impl/src/main/java/org/jboss/weld/resolution/ForwardingInterceptorResolvable.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/resolution/ForwardingInterceptorResolvable.java	                        (rev 0)
+++ core/trunk/impl/src/main/java/org/jboss/weld/resolution/ForwardingInterceptorResolvable.java	2010-01-13 13:55:53 UTC (rev 5450)
@@ -0,0 +1,62 @@
+package org.jboss.weld.resolution;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+import java.util.Set;
+
+import javax.enterprise.inject.spi.InterceptionType;
+
+import org.jboss.weld.bean.AbstractClassBean;
+
+public class ForwardingInterceptorResolvable implements InterceptorResolvable
+{
+
+   public InterceptionType getInterceptionType()
+   {
+      // TODO Auto-generated method stub
+      return null;
+   }
+
+   public <A extends Annotation> A getAnnotation(Class<A> annotationType)
+   {
+      // TODO Auto-generated method stub
+      return null;
+   }
+
+   public AbstractClassBean<?> getDeclaringBean()
+   {
+      // TODO Auto-generated method stub
+      return null;
+   }
+
+   public Class<?> getJavaClass()
+   {
+      // TODO Auto-generated method stub
+      return null;
+   }
+
+   public Set<Annotation> getQualifiers()
+   {
+      // TODO Auto-generated method stub
+      return null;
+   }
+
+   public Set<Type> getTypeClosure()
+   {
+      // TODO Auto-generated method stub
+      return null;
+   }
+
+   public boolean isAnnotationPresent(Class<? extends Annotation> annotationType)
+   {
+      // TODO Auto-generated method stub
+      return false;
+   }
+
+   public boolean isAssignableTo(Class<?> clazz)
+   {
+      // TODO Auto-generated method stub
+      return false;
+   }
+
+}


Property changes on: core/trunk/impl/src/main/java/org/jboss/weld/resolution/ForwardingInterceptorResolvable.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:eol-style
   + native

Modified: core/trunk/impl/src/main/java/org/jboss/weld/resolution/NameBasedResolver.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/resolution/NameBasedResolver.java	2010-01-13 13:53:14 UTC (rev 5449)
+++ core/trunk/impl/src/main/java/org/jboss/weld/resolution/NameBasedResolver.java	2010-01-13 13:55:53 UTC (rev 5450)
@@ -18,14 +18,16 @@
 
 import java.util.HashSet;
 import java.util.Set;
-import java.util.concurrent.Callable;
+import java.util.concurrent.ConcurrentMap;
 
 import javax.enterprise.inject.spi.Bean;
 
 import org.jboss.weld.manager.BeanManagerImpl;
 import org.jboss.weld.util.Beans;
-import org.jboss.weld.util.collections.ConcurrentCache;
 
+import com.google.common.base.Function;
+import com.google.common.collect.MapMaker;
+
 /**
  * Implementation of name based bean resolution
  * 
@@ -33,14 +35,36 @@
  */
 public class NameBasedResolver
 {
-   // The resolved names
-   private ConcurrentCache<String, Set<Bean<?>>> resolvedNames;
    
-   // The beans to search
-   private final Iterable<? extends Bean<?>> allBeans;
+   private static class NameToBeanSet implements Function<String, Set<Bean<?>>>
+   {
+
+      private final BeanManagerImpl beanManager;
+      private final Iterable<? extends Bean<?>> allBeans;
+      
+      private NameToBeanSet(BeanManagerImpl beanManager, Iterable<? extends Bean<?>> allBeans)
+      {
+         this.beanManager = beanManager;
+         this.allBeans = allBeans;
+      }
+
+      public Set<Bean<?>> apply(String from)
+      {
+         Set<Bean<?>> matchedBeans = new HashSet<Bean<?>>();
+         for (Bean<?> bean : allBeans)
+         {
+            if ((bean.getName() == null && from == null) || (bean.getName() != null && bean.getName().equals(from)))
+            {
+               matchedBeans.add(bean);
+            }
+         }
+         return Beans.retainEnabledAlternatives(matchedBeans, beanManager.getEnabledAlternativeClasses(), beanManager.getEnabledAlternativeStereotypes());
+      }
+      
+   }
    
-   // The Bean manager
-   private final BeanManagerImpl manager;
+   // The resolved names
+   private ConcurrentMap<String, Set<Bean<?>>> resolvedNames;
 
    /**
     * Constructor
@@ -48,9 +72,7 @@
     */
    public NameBasedResolver(BeanManagerImpl manager, Iterable<? extends Bean<?>> allBeans)
    {
-      this.manager = manager;
-      this.allBeans = allBeans;
-      this.resolvedNames = new ConcurrentCache<String, Set<Bean<?>>>();
+      this.resolvedNames = new MapMaker().makeComputingMap(new NameToBeanSet(manager, allBeans));
    }
 
    /**
@@ -59,7 +81,7 @@
     */
    public void clear()
    {
-      this.resolvedNames = new ConcurrentCache<String, Set<Bean<?>>>();
+      this.resolvedNames.clear();
    }
 
    /**
@@ -70,23 +92,7 @@
     */
    public Set<Bean<?>> resolve(final String name)
    {
-      return resolvedNames.putIfAbsent(name, new Callable<Set<Bean<?>>>()
-      {
-
-         public Set<Bean<? extends Object>> call() throws Exception
-         {
-            Set<Bean<?>> matchedBeans = new HashSet<Bean<?>>();
-            for (Bean<?> bean : allBeans)
-            {
-               if ((bean.getName() == null && name == null) || (bean.getName() != null && bean.getName().equals(name)))
-               {
-                  matchedBeans.add(bean);
-               }
-            }
-            return Beans.retainEnabledAlternatives(matchedBeans, manager.getEnabledAlternativeClasses(), manager.getEnabledAlternativeStereotypes());
-         }
-
-      });
+      return resolvedNames.get(name);
    }
 
    /**
@@ -103,9 +109,4 @@
       return buffer.toString();
    }
 
-   protected BeanManagerImpl getManager()
-   {
-      return manager;
-   }
-
 }

Modified: core/trunk/impl/src/main/java/org/jboss/weld/resolution/Resolvable.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/resolution/Resolvable.java	2010-01-13 13:53:14 UTC (rev 5449)
+++ core/trunk/impl/src/main/java/org/jboss/weld/resolution/Resolvable.java	2010-01-13 13:55:53 UTC (rev 5450)
@@ -33,7 +33,7 @@
 {
 
    /**
-    * Get the bindings to use for resolution. @Current will be returned if no
+    * Get the bindings to use for resolution. @Default will be returned if no
     * bindings were specified
     * 
     * @return the bindings

Modified: core/trunk/impl/src/main/java/org/jboss/weld/resolution/ResolvableFactory.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/resolution/ResolvableFactory.java	2010-01-13 13:53:14 UTC (rev 5449)
+++ core/trunk/impl/src/main/java/org/jboss/weld/resolution/ResolvableFactory.java	2010-01-13 13:55:53 UTC (rev 5450)
@@ -19,19 +19,19 @@
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
-import java.util.Collections;
 
+import javax.enterprise.inject.spi.InterceptionType;
+
 import org.jboss.weld.bean.AbstractClassBean;
 import org.jboss.weld.introspector.WeldAnnotated;
 import org.jboss.weld.literal.DefaultLiteral;
 import org.jboss.weld.util.reflection.Reflections;
 
-import javax.enterprise.inject.spi.InterceptionType;
-
 public class ResolvableFactory
 {
 
@@ -59,7 +59,7 @@
       return new ResolvableImpl(new HashSet<Annotation>(Arrays.asList(bindings)), typeClosure, declaringBean);
    }
 
-   public static Resolvable of(InterceptionType interceptionType, Annotation... bindings)
+   public static InterceptorResolvable of(InterceptionType interceptionType, Annotation... bindings)
    {
       return new InterceptorResolvableImpl(new HashSet<Annotation>(Arrays.asList(bindings)), interceptionType );
    }

Modified: core/trunk/impl/src/main/java/org/jboss/weld/resolution/ResolvableTransformer.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/resolution/ResolvableTransformer.java	2010-01-13 13:53:14 UTC (rev 5449)
+++ core/trunk/impl/src/main/java/org/jboss/weld/resolution/ResolvableTransformer.java	2010-01-13 13:55:53 UTC (rev 5450)
@@ -16,9 +16,9 @@
  */
 package org.jboss.weld.resolution;
 
-public interface ResolvableTransformer
+public interface ResolvableTransformer<R extends Resolvable>
 {
    
-   public Resolvable transform(Resolvable element);
+   public R transform(R element);
    
 }

Modified: core/trunk/impl/src/main/java/org/jboss/weld/resolution/ResolvableWeldClass.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/resolution/ResolvableWeldClass.java	2010-01-13 13:53:14 UTC (rev 5449)
+++ core/trunk/impl/src/main/java/org/jboss/weld/resolution/ResolvableWeldClass.java	2010-01-13 13:55:53 UTC (rev 5450)
@@ -27,7 +27,6 @@
 import java.lang.reflect.Method;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
-import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
@@ -52,8 +51,6 @@
    private final Set<Type> typeClosure;
    private final Type[] actualTypeArguments;
 
-   private final String _string;
-
    public static <T> WeldAnnotated<T, Class<T>> of(TypeLiteral<T> typeLiteral, Annotation[] annotations, BeanManagerImpl manager)
    {
       return new ResolvableWeldClass<T>(typeLiteral.getType(), annotations, manager);
@@ -101,7 +98,7 @@
       if (type instanceof ParameterizedType)
       {
          ParameterizedType parameterizedType = (ParameterizedType) type;
-         if (parameterizedType.getRawType() instanceof Class)
+         if (parameterizedType.getRawType() instanceof Class<?>)
          {
             this.rawType = (Class<T>) parameterizedType.getRawType();
          }
@@ -110,13 +107,11 @@
             throw new ForbiddenArgumentException(CANNOT_EXTRACT_RAW_TYPE, type);
          }
          this.actualTypeArguments = ((ParameterizedType) type).getActualTypeArguments();
-         this._string = rawType.toString() + "<" + Arrays.asList(actualTypeArguments).toString() + ">; binding types = " + Names.annotationsToString(getQualifiers());
       }
-      else if (type instanceof Class)
+      else if (type instanceof Class<?>)
       {
          this.rawType = (Class<T>) type;
          this.actualTypeArguments = new Type[0];
-         this._string = rawType.toString() +"; binding types = " + Names.annotationsToString(getQualifiers());
       }
       else
       {
@@ -139,7 +134,7 @@
    @Override
    public String toString()
    {
-      return _string;
+      return Names.toString(getJavaClass(), getAnnotations(), getActualTypeArguments());
    }
 
    @Override

Modified: core/trunk/impl/src/main/java/org/jboss/weld/resolution/TypeSafeBeanResolver.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/resolution/TypeSafeBeanResolver.java	2010-01-13 13:53:14 UTC (rev 5449)
+++ core/trunk/impl/src/main/java/org/jboss/weld/resolution/TypeSafeBeanResolver.java	2010-01-13 13:55:53 UTC (rev 5450)
@@ -16,10 +16,9 @@
  */
 package org.jboss.weld.resolution;
 
-import java.util.Collection;
 import java.util.HashSet;
 import java.util.Set;
-import java.util.concurrent.Callable;
+import java.util.concurrent.ConcurrentMap;
 
 import javax.enterprise.event.Event;
 import javax.enterprise.inject.Instance;
@@ -30,9 +29,11 @@
 import org.jboss.weld.bean.builtin.FacadeBeanResolvableTransformer;
 import org.jboss.weld.manager.BeanManagerImpl;
 import org.jboss.weld.util.Beans;
-import org.jboss.weld.util.collections.ConcurrentCache;
 import org.jboss.weld.util.reflection.Reflections;
 
+import com.google.common.base.Function;
+import com.google.common.collect.MapMaker;
+
 /**
  * @author pmuir
  *
@@ -44,16 +45,50 @@
    private static final Class<Provider<?>> PROVIDER_TYPE = new TypeLiteral<Provider<?>>() {}.getRawType();
    private static final Class<Event<?>> EVENT_TYPE = new TypeLiteral<Event<?>>() {}.getRawType();
 
-   private final Set<ResolvableTransformer> transformers;
-   private final BeanManagerImpl manager;
-   private final ConcurrentCache<Set<?>, Set<Bean<?>>> disambiguatedBeans; 
+   private final Set<ResolvableTransformer<Resolvable>> transformers;
+   private final BeanManagerImpl beanManager;
+   private final ConcurrentMap<Set<Bean<?>>, Set<Bean<?>>> disambiguatedBeans; 
+   
+   public static class BeanDisambiguation implements Function<Set<Bean<?>>, Set<Bean<?>>>
+   {
+      
+      private final BeanManagerImpl beanManager;
 
-   public TypeSafeBeanResolver(BeanManagerImpl manager, Iterable<T> beans)
+      private BeanDisambiguation(BeanManagerImpl beanManager)
+      {
+         this.beanManager = beanManager;
+      }
+
+      public Set<Bean<?>> apply(Set<Bean<?>> from)
+      {
+         if (from.size() > 1)
+         {
+            boolean alternativePresent = Beans.isAlternativePresent(from);
+            Set<Bean<?>> disambiguatedBeans = new HashSet<Bean<?>>();
+            
+            for (Bean<?> bean : from)
+            {
+               if (alternativePresent ? bean.isAlternative() : true && !Beans.isSpecialized(bean, from, beanManager.getSpecializedBeans()))
+               {
+                  disambiguatedBeans.add(bean);
+               }
+            }
+            return disambiguatedBeans;
+         }
+         else
+         {
+            return from;
+         }
+      }
+      
+   }
+
+   public TypeSafeBeanResolver(BeanManagerImpl beanManager, Iterable<T> beans)
    {
       super(beans);
-      this.manager = manager;
-      this.disambiguatedBeans = new ConcurrentCache<Set<?>, Set<Bean<?>>>();
-      transformers = new HashSet<ResolvableTransformer>();
+      this.beanManager = beanManager;
+      this.disambiguatedBeans = new MapMaker().makeComputingMap(new BeanDisambiguation(beanManager));
+      transformers = new HashSet<ResolvableTransformer<Resolvable>>();
       transformers.add(new FacadeBeanResolvableTransformer(EVENT_TYPE));
       transformers.add(new FacadeBeanResolvableTransformer(INSTANCE_TYPE));
       transformers.add(new FacadeBeanResolvableTransformer(PROVIDER_TYPE));
@@ -63,25 +98,25 @@
    @Override
    protected boolean matches(Resolvable resolvable, T bean)
    {
-      return Reflections.matches(resolvable.getTypeClosure(), bean.getTypes()) && Beans.containsAllBindings(resolvable.getQualifiers(), bean.getQualifiers(), manager);
+      return Reflections.matches(resolvable.getTypeClosure(), bean.getTypes()) && Beans.containsAllBindings(resolvable.getQualifiers(), bean.getQualifiers(), beanManager);
    }
    
    /**
     * @return the manager
     */
-   public BeanManagerImpl getManager()
+   protected BeanManagerImpl getBeanManager()
    {
-      return manager;
+      return beanManager;
    }
    
    @Override
    protected Set<T> filterResult(Set<T> matched)
    {
-      return Beans.retainEnabledAlternatives(matched, manager.getEnabledAlternativeClasses(), manager.getEnabledAlternativeStereotypes());
+      return Beans.retainEnabledAlternatives(matched, beanManager.getEnabledAlternativeClasses(), beanManager.getEnabledAlternativeStereotypes());
    }
 
    @Override
-   protected Iterable<ResolvableTransformer> getTransformers()
+   protected Iterable<ResolvableTransformer<Resolvable>> getTransformers()
    {
       return transformers;
    }
@@ -92,38 +127,19 @@
       return matched;
    }
    
+
+   @SuppressWarnings("unchecked")
    public <X> Set<Bean<? extends X>> resolve(final Set<Bean<? extends X>> beans)
    {
-      return disambiguatedBeans.<Set<Bean<? extends X>>>putIfAbsent(beans, new Callable<Set<Bean<? extends X>>>()
-      {
-
-         public Set<Bean<? extends X>> call() throws Exception
-         {
-            Set<Bean<? extends X>> disambiguatedBeans = beans;
-            if (disambiguatedBeans.size() > 1)
-            {
-               boolean alternativePresent = Beans.isAlternativePresent(disambiguatedBeans);
-               disambiguatedBeans = new HashSet<Bean<? extends X>>();
-               
-               for (Bean<? extends X> bean : beans)
-               {
-                  if (alternativePresent ? bean.isAlternative() : true && !Beans.isSpecialized(bean, beans, manager.getSpecializedBeans()))
-                  {
-                     disambiguatedBeans.add(bean);
-                  }
-               }
-               
-            }
-            return disambiguatedBeans;
-         }
-         
-      });
+      return (Set) disambiguatedBeans.get(beans);
       
    }
    
-   public <X> Set<Bean<? extends X>> resolve(final Collection<Bean<? extends X>> beans)
+   @Override
+   public void clear()
    {
-      return resolve(new HashSet<Bean<? extends X>>(beans));
+      super.clear();
+      //this.disambiguatedBeans.clear();
    }
 
 

Modified: core/trunk/impl/src/main/java/org/jboss/weld/resolution/TypeSafeDecoratorResolver.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/resolution/TypeSafeDecoratorResolver.java	2010-01-13 13:53:14 UTC (rev 5449)
+++ core/trunk/impl/src/main/java/org/jboss/weld/resolution/TypeSafeDecoratorResolver.java	2010-01-13 13:55:53 UTC (rev 5450)
@@ -16,15 +16,14 @@
  */
 package org.jboss.weld.resolution;
 
+import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
 import java.util.Set;
 import java.util.TreeSet;
-import java.util.Collections;
 
 import javax.enterprise.inject.spi.Decorator;
 
-import org.jboss.weld.bean.DecoratorImpl;
 import org.jboss.weld.manager.BeanManagerImpl;
 import org.jboss.weld.util.Beans;
 import org.jboss.weld.util.reflection.Reflections;
@@ -35,7 +34,7 @@
  */
 public class TypeSafeDecoratorResolver extends TypeSafeBeanResolver<Decorator<?>>
 {
-
+   
    public TypeSafeDecoratorResolver(BeanManagerImpl manager, Iterable<Decorator<?>> decorators)
    {
       super(manager, decorators);
@@ -44,7 +43,7 @@
    @Override
    protected boolean matches(Resolvable resolvable, Decorator<?> bean)
    {
-      return Reflections.matches(Collections.singleton(bean.getDelegateType()), resolvable.getTypeClosure()) && Beans.containsAllBindings(bean.getDelegateQualifiers(), resolvable.getQualifiers(), getManager()) && getManager().getEnabledDecoratorClasses().contains(bean.getBeanClass());
+      return Reflections.matches(Collections.singleton(bean.getDelegateType()), resolvable.getTypeClosure()) && Beans.containsAllBindings(bean.getDelegateQualifiers(), resolvable.getQualifiers(), getBeanManager()) && getBeanManager().getEnabledDecoratorClasses().contains(bean.getBeanClass());
    }
    
    @Override
@@ -55,7 +54,7 @@
          
          public int compare(Decorator<?> o1, Decorator<?> o2)
          {
-            List<Class<?>> enabledDecorators = getManager().getEnabledDecoratorClasses();
+            List<Class<?>> enabledDecorators = getBeanManager().getEnabledDecoratorClasses();
             int p1 = enabledDecorators.indexOf(((Decorator<?>) o1).getBeanClass());
             int p2 = enabledDecorators.indexOf(((Decorator<?>) o2).getBeanClass());
             return p1 - p2;

Modified: core/trunk/impl/src/main/java/org/jboss/weld/resolution/TypeSafeDisposerResolver.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/resolution/TypeSafeDisposerResolver.java	2010-01-13 13:53:14 UTC (rev 5449)
+++ core/trunk/impl/src/main/java/org/jboss/weld/resolution/TypeSafeDisposerResolver.java	2010-01-13 13:55:53 UTC (rev 5450)
@@ -60,7 +60,7 @@
    }
 
    @Override
-   protected Iterable<ResolvableTransformer> getTransformers()
+   protected Iterable<ResolvableTransformer<Resolvable>> getTransformers()
    {
       return Collections.emptySet();
    }

Modified: core/trunk/impl/src/main/java/org/jboss/weld/resolution/TypeSafeInterceptorResolver.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/resolution/TypeSafeInterceptorResolver.java	2010-01-13 13:53:14 UTC (rev 5449)
+++ core/trunk/impl/src/main/java/org/jboss/weld/resolution/TypeSafeInterceptorResolver.java	2010-01-13 13:55:53 UTC (rev 5450)
@@ -32,10 +32,10 @@
 /**
  * @author <a href="mailto:mariusb at redhat.com">Marius Bogoevici</a>
  */
-public class TypeSafeInterceptorResolver extends TypeSafeResolver<InterceptorResolvable,Interceptor<?>>
+public class TypeSafeInterceptorResolver extends TypeSafeResolver<InterceptorResolvable, Interceptor<?>>
 {
-   private BeanManagerImpl manager;
 
+   private final BeanManagerImpl manager;
 
    public TypeSafeInterceptorResolver(BeanManagerImpl manager, Iterable<Interceptor<?>> interceptors)
    {
@@ -46,13 +46,9 @@
    @Override
    protected boolean matches(InterceptorResolvable resolvable, Interceptor<?> bean)
    {
-      return bean.intercepts(resolvable.getInterceptionType())
-            && bean.getInterceptorBindings().size() > 0
-            && Beans.containsAllInterceptionBindings(bean.getInterceptorBindings(), resolvable.getQualifiers(), getManager())
-            && getManager().getEnabledInterceptorClasses().contains(bean.getBeanClass());
+      return bean.intercepts(resolvable.getInterceptionType()) && bean.getInterceptorBindings().size() > 0 && Beans.containsAllInterceptionBindings(bean.getInterceptorBindings(), resolvable.getQualifiers(), getManager()) && getManager().getEnabledInterceptorClasses().contains(bean.getBeanClass());
    }
 
-
    @Override
    protected Set<Interceptor<?>> sortResult(Set<Interceptor<?>> matchedInterceptors)
    {
@@ -79,7 +75,7 @@
    }
 
    @Override
-   protected Iterable<ResolvableTransformer> getTransformers()
+   protected Iterable<ResolvableTransformer<InterceptorResolvable>> getTransformers()
    {
       return Collections.emptySet();
    }

Modified: core/trunk/impl/src/main/java/org/jboss/weld/resolution/TypeSafeObserverResolver.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/resolution/TypeSafeObserverResolver.java	2010-01-13 13:53:14 UTC (rev 5449)
+++ core/trunk/impl/src/main/java/org/jboss/weld/resolution/TypeSafeObserverResolver.java	2010-01-13 13:55:53 UTC (rev 5450)
@@ -61,7 +61,7 @@
    }
 
    @Override
-   protected Iterable<ResolvableTransformer> getTransformers()
+   protected Iterable<ResolvableTransformer<Resolvable>> getTransformers()
    {
       return Collections.emptySet();
    }

Modified: core/trunk/impl/src/main/java/org/jboss/weld/resolution/TypeSafeResolver.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/resolution/TypeSafeResolver.java	2010-01-13 13:53:14 UTC (rev 5449)
+++ core/trunk/impl/src/main/java/org/jboss/weld/resolution/TypeSafeResolver.java	2010-01-13 13:55:53 UTC (rev 5450)
@@ -19,9 +19,10 @@
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Set;
-import java.util.concurrent.Callable;
+import java.util.concurrent.ConcurrentMap;
 
-import org.jboss.weld.util.collections.ConcurrentCache;
+import com.google.common.base.Function;
+import com.google.common.collect.MapMaker;
 
 /**
  * Implementation of type safe bean resolution
@@ -29,34 +30,31 @@
  * @author Pete Muir
  * @author Marius Bogoevici
  */
-public abstract class TypeSafeResolver<R extends Resolvable,T>
-{
-   private static final long serialVersionUID = 1L;
+public abstract class TypeSafeResolver<R extends Resolvable, T>
+{  
    
-   private static abstract class MatchingResolvable extends ForwardingResolvable
+   private static class Key<R extends Resolvable>
    {
       
-      public static MatchingResolvable of(final Resolvable resolvable)
+      private final R resolvable;
+      
+      private Key(R resolvable)
       {
-         return new MatchingResolvable()
-         {
-
-            @Override
-            protected Resolvable delegate()
-            {
-               return resolvable;
-            }
-
-         };
+         this.resolvable = resolvable;
       }
       
+      public R getResolvable()
+      {
+         return resolvable;
+      }
+
       @Override
       public boolean equals(Object obj)
       {
          if (obj instanceof Resolvable)
          {
             Resolvable that = (Resolvable) obj;
-            return this.getTypeClosure().equals(that.getTypeClosure()) && this.getQualifiers().equals(that.getQualifiers());
+            return this.getResolvable().getTypeClosure().equals(that.getTypeClosure()) && this.getResolvable().getQualifiers().equals(that.getQualifiers());
          }
          else
          {
@@ -64,13 +62,47 @@
          }
       }
       
+      @Override
+      public int hashCode()
+      {
+         int result = 17;
+         result = 31 * result + this.getResolvable().getTypeClosure().hashCode();
+         result = 31 * result + this.getResolvable().getQualifiers().hashCode();
+         return result;
+      }
+      
+      @Override
+      public String toString()
+      {
+         return getResolvable().toString();
+      }
+      
    }
    
+   private static class ResolvableToBeanSet<R extends Resolvable, T> implements Function<Key<R>, Set<T>>
+   {
+      
+
+      private final TypeSafeResolver<R, T> resolver;
+
+      private ResolvableToBeanSet(TypeSafeResolver<R, T> resolver)
+      {
+         this.resolver = resolver;
+      }
+
+      public Set<T> apply(Key<R> from)
+      {
+         return resolver.sortResult(resolver.filterResult(resolver.findMatching(from.getResolvable())));
+      }
+      
+   }
+   
    // The resolved injection points
-   private ConcurrentCache<MatchingResolvable, Set<T>> resolved;
+   private final ConcurrentMap<Key<R>, Set<T>> resolved;
+   // The beans to search
+   private final Iterable<? extends T> allBeans;
    
-   // The beans to search
-   private final Iterable<? extends T> iterable;
+   
 
    /**
     * Constructor
@@ -78,9 +110,8 @@
     */
    public TypeSafeResolver(Iterable<? extends T> allBeans)
    {
-      this.iterable = allBeans;
-      this.resolved = new ConcurrentCache<MatchingResolvable, Set<T>>();
-      
+      this.resolved = new MapMaker().makeComputingMap(new ResolvableToBeanSet<R, T>(this));
+      this.allBeans = allBeans;
    }
 
    /**
@@ -88,46 +119,20 @@
     */
    public void clear()
    {
-      this.resolved = new ConcurrentCache<MatchingResolvable, Set<T>>();
+      this.resolved.clear();
    }
 
    /**
     * Get the possible beans for the given element
     * 
-    * @param key The resolving criteria
+    * @param resolvable The resolving criteria
     * @return An unmodifiable set of matching beans
     */
-   public Set<T> resolve(Resolvable key)
+   public Set<T> resolve(R resolvable)
    {
-      final MatchingResolvable resolvable = MatchingResolvable.of(transform(key));
-      
-      Callable<Set<T>> callable = new Callable<Set<T>>()
-      {
-         public Set<T> call() throws Exception
-         {
-            return sortResult(filterResult(findMatching(resolvable)));
-         }
-
-      };
-      Set<T> beans = resolved.putIfAbsent(resolvable, callable);
-      return Collections.unmodifiableSet(beans);
+      return Collections.unmodifiableSet(resolved.get(new Key<R>(transform(resolvable))));
    }
    
-   protected Resolvable transform(Resolvable resolvable)
-   {
-      for (ResolvableTransformer transformer : getTransformers())
-      {
-         resolvable = transformer.transform(resolvable);
-      }
-      return resolvable;
-   }
-   
-   protected abstract Iterable<ResolvableTransformer> getTransformers();
-   
-   protected abstract Set<T> filterResult(Set<T> matched);
-
-   protected abstract Set<T> sortResult(Set<T> matched);
-
    /**
     * Gets the matching beans for binding criteria from a list of beans
     * 
@@ -136,19 +141,34 @@
     * @param beans The beans to filter
     * @return A set of filtered beans
     */
-   private Set<T> findMatching(MatchingResolvable resolvable)
+   private Set<T> findMatching(R resolvable)
    {
       Set<T> result = new HashSet<T>();
-      for (T bean : iterable)
+      for (T bean : allBeans)
       {
-         if (matches((R)resolvable.delegate(), bean))
+         if (matches(resolvable, bean))
          {
             result.add(bean);
          }
       }
       return result;
    }
+   
+   protected R transform(R resolvable)
+   {
+      for (ResolvableTransformer<R> transformer : getTransformers())
+      {
+         resolvable = transformer.transform(resolvable);
+      }
+      return resolvable;
+   }
+   
+   protected abstract Iterable<ResolvableTransformer<R>> getTransformers();
+   
+   protected abstract Set<T> filterResult(Set<T> matched);
 
+   protected abstract Set<T> sortResult(Set<T> matched);
+
    protected abstract boolean matches(R resolvable, T t);
 
    /**

Modified: core/trunk/impl/src/main/java/org/jboss/weld/util/Beans.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/util/Beans.java	2010-01-13 13:53:14 UTC (rev 5449)
+++ core/trunk/impl/src/main/java/org/jboss/weld/util/Beans.java	2010-01-13 13:55:53 UTC (rev 5450)
@@ -90,10 +90,10 @@
 import org.jboss.weld.introspector.WeldMethod;
 import org.jboss.weld.introspector.WeldParameter;
 import org.jboss.weld.manager.BeanManagerImpl;
-import org.jboss.weld.metadata.cache.BindingTypeModel;
 import org.jboss.weld.metadata.cache.InterceptorBindingModel;
 import org.jboss.weld.metadata.cache.MergedStereotypes;
 import org.jboss.weld.metadata.cache.MetaAnnotationStore;
+import org.jboss.weld.metadata.cache.QualifierModel;
 import org.jboss.weld.persistence.PersistenceApiAbstraction;
 import org.jboss.weld.util.reflection.Reflections;
 import org.slf4j.cal10n.LocLogger;
@@ -495,7 +495,7 @@
    {
       for (Annotation binding : bindings1)
       {
-         BindingTypeModel<?> bindingType = manager.getServices().get(MetaAnnotationStore.class).getBindingTypeModel(binding.annotationType());
+         QualifierModel<?> bindingType = manager.getServices().get(MetaAnnotationStore.class).getBindingTypeModel(binding.annotationType());
          boolean matchFound = false;
          // TODO Something wrong with annotation proxy hashcode in JDK/AnnotationLiteral hashcode, so always do a full check, don't use contains
          for (Annotation otherBinding : bindings2)
@@ -619,7 +619,7 @@
     * @param beans
     * @return
     */
-   public static <X> boolean isAlternativePresent(Set<Bean<? extends X>> beans)
+   public static boolean isAlternativePresent(Set<Bean<?>> beans)
    {
       for (Bean<?> bean : beans)
       {
@@ -651,7 +651,7 @@
     * @param specializedBeans
     * @return
     */
-   public static <X> boolean isSpecialized(Bean<? extends X> bean, Set<Bean<? extends X>> beans, Map<Contextual<?>, Contextual<?>> specializedBeans)
+   public static boolean isSpecialized(Bean<?> bean, Set<Bean<?>> beans, Map<Contextual<?>, Contextual<?>> specializedBeans)
    {
       if (specializedBeans.containsKey(bean))
       {

Modified: core/trunk/impl/src/main/java/org/jboss/weld/util/Names.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/util/Names.java	2010-01-13 13:53:14 UTC (rev 5449)
+++ core/trunk/impl/src/main/java/org/jboss/weld/util/Names.java	2010-01-13 13:55:53 UTC (rev 5450)
@@ -17,9 +17,6 @@
 package org.jboss.weld.util;
 
 import java.lang.annotation.Annotation;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.lang.reflect.Type;
 import java.util.ArrayList;
@@ -30,8 +27,6 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-import org.jboss.weld.util.reflection.SecureReflections;
-
 /**
  * Utility class to produce friendly names e.g. for debugging
  * 
@@ -70,6 +65,18 @@
       }
       return result.toString();
    }
+   
+   public static String toString(Class<?> rawType, Set<Annotation> annotations, Type[] actualTypeArguments)
+   {
+      if (actualTypeArguments.length > 0)
+      {
+         return new StringBuilder().append(Names.annotationsToString(annotations)).append(" ").append(rawType.getName()).append("<").append(Arrays.asList(actualTypeArguments)).append(">").toString();
+      }
+      else
+      {
+         return new StringBuilder().append(Names.annotationsToString(annotations)).append(" ").append(rawType.getName()).toString();
+      }
+   }
 
    /**
     * Counts item in an iteratble
@@ -88,24 +95,6 @@
    }
 
    /**
-    * Converts a list of strings to a String with given delimeter
-    * 
-    * @param list The list
-    * @param delimiter The delimeter
-    * @return The string representation
-    */
-   private static String listToString(List<String> list, String delimiter)
-   {
-      StringBuilder buffer = new StringBuilder();
-      for (String item : list)
-      {
-         buffer.append(item);
-         buffer.append(delimiter);
-      }
-      return buffer.toString();
-   }
-
-   /**
     * Parses a reflection modifier to a list of string
     * 
     * @param modifier The modifier to parse
@@ -164,111 +153,6 @@
       }
       return modifiers;
    }
-
-
-
-   /**
-    * Gets a string representation from a field
-    * 
-    * @param field The field
-    * @return The string representation
-    */
-   public static String fieldToString(Field field)
-   {
-      return "  Field " + annotationsToString(field.getAnnotations()) + listToString(parseModifiers(field.getModifiers()), " ") + field.getName();
-   }
-
-   /**
-    * Gets the string representation from a method
-    * 
-    * @param method The method
-    * @return The string representation
-    */
-   public static String methodToString(Method method)
-   {
-      return "  Method " + method.getReturnType().getSimpleName() + " " + annotationsToString(method.getAnnotations()) + listToString(parseModifiers(method.getModifiers()), " ") + method.getName() + "(" + parametersToString(method.getParameterTypes(), method.getParameterAnnotations(), false) + ");\n";
-   }
-
-   /**
-    * Gets a string representation from an annotation
-    * 
-    * @param annotation The annotation
-    * @return The string representation
-    */
-   public static String annotationToString(Annotation annotation)
-   {
-      return "Annotation " + annotationsToString(annotation.annotationType().getAnnotations()) + annotation.annotationType().getSimpleName();
-   }
-
-   /**
-    * Gets a string representation from a method
-    * 
-    * @param constructor The method
-    * @return The string representation
-    */
-   public static String constructorToString(Constructor<?> constructor)
-   {
-      return "  Constructor " + annotationsToString(constructor.getAnnotations()) + listToString(parseModifiers(constructor.getModifiers()), " ") + constructor.getDeclaringClass().getSimpleName() + "(" + parametersToString(constructor.getParameterTypes(), constructor.getParameterAnnotations(), true) + ");\n";
-   }
-
-   /**
-    * Gets a string representation from a list of parameters and their
-    * annotations
-    * 
-    * @param parameterTypes The parameters
-    * @param annotations The annotation map
-    * @return The string representation
-    */
-   private static String parametersToString(Class<?>[] parameterTypes, Annotation[][] annotations, boolean constructor)
-   {
-      StringBuilder buffer = new StringBuilder();
-      int start = constructor ? 1 : 0;
-      for (int i = start; i < parameterTypes.length; i++)
-      {
-         if (i > start)
-         {
-            buffer.append(", ");
-         }
-         buffer.append(annotationsToString(annotations[i]) + typeToString(parameterTypes[i]));
-      }
-      return buffer.toString();
-   }
-
-   /**
-    * Gets a string representation from a type
-    * 
-    * @param clazz The type
-    * @return The string representation
-    */
-   private static String typeToString(Class<?> clazz)
-   {
-      return annotationsToString(clazz.getAnnotations()) + clazz.getSimpleName();
-   }
-
-   /**
-    * Gets a string representation from a class
-    * 
-    * @param clazz The class
-    * @return The string representation
-    */
-   public static String classToString(Class<?> clazz)
-   {
-      StringBuilder buffer = new StringBuilder();
-      buffer.append("Class " + typeToString(clazz) + "\n");
-      for (Field field : SecureReflections.getFields(clazz))
-      {
-         buffer.append(fieldToString(field));
-      }
-      for (Constructor<?> constructor : SecureReflections.getConstructors(clazz))
-      {
-         buffer.append(constructorToString(constructor));
-      }
-      for (Method method : SecureReflections.getMethods(clazz))
-      {
-         buffer.append(methodToString(method));
-      }
-      return buffer.toString();
-   }
    
    public static String typesToString(Set<? extends Type> types)
    {
@@ -299,17 +183,15 @@
    {
       StringBuilder builder = new StringBuilder();
       int i = 0;
-      builder.append("[");
       for (Annotation annotation : annotations)
       {
          if (i > 0)
          {
-            builder.append(", ");
+            builder.append(" ");
          }
          builder.append("@").append(annotation.annotationType().getSimpleName());
          i++;
       }
-      builder.append("]");
       return builder.toString();
    }
    

Modified: core/trunk/tests/src/main/java/org/jboss/weld/mock/cluster/AbstractClusterTest.java
===================================================================
--- core/trunk/tests/src/main/java/org/jboss/weld/mock/cluster/AbstractClusterTest.java	2010-01-13 13:53:14 UTC (rev 5449)
+++ core/trunk/tests/src/main/java/org/jboss/weld/mock/cluster/AbstractClusterTest.java	2010-01-13 13:55:53 UTC (rev 5450)
@@ -5,9 +5,11 @@
 import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
+import java.lang.reflect.Field;
 import java.util.Collection;
 
-import org.jboss.weld.bootstrap.api.SingletonProvider;
+import org.jboss.weld.Container;
+import org.jboss.weld.bootstrap.api.Singleton;
 import org.jboss.weld.context.ContextLifecycle;
 import org.jboss.weld.context.api.BeanStore;
 import org.jboss.weld.manager.BeanManagerImpl;
@@ -19,17 +21,26 @@
 public class AbstractClusterTest
 {
 
+   private Singleton<Container> singleton;
+   
    @BeforeClass
-   public void beforeClass()
+   public void beforeClass() throws Exception
    {
-      SingletonProvider.reset();
-      SingletonProvider.initialize(new SwitchableSingletonProvider());
+      singleton = (Singleton) getInstanceField().get(null);
+      getInstanceField().set(null, new SwitchableSingletonProvider().create(Container.class));
    }
    
+   private static Field getInstanceField() throws Exception
+   {
+      Field field = Container.class.getDeclaredField("instance");
+      field.setAccessible(true);
+      return field;
+   }
+   
    @AfterClass
-   public void afterClass()
+   public void afterClass() throws Exception
    {
-      SingletonProvider.reset();
+      getInstanceField().set(null, singleton);
    }
 
    protected TestContainer bootstrapContainer(int id, Collection<Class<?>> classes)

Modified: core/trunk/tests/src/test/java/org/jboss/weld/tests/unit/cluster/NaiveClusterTest.java
===================================================================
--- core/trunk/tests/src/test/java/org/jboss/weld/tests/unit/cluster/NaiveClusterTest.java	2010-01-13 13:53:14 UTC (rev 5449)
+++ core/trunk/tests/src/test/java/org/jboss/weld/tests/unit/cluster/NaiveClusterTest.java	2010-01-13 13:55:53 UTC (rev 5450)
@@ -35,6 +35,10 @@
       use(2);
       Foo foo2 = (Foo) beanManager2.getReference(fooBean2, Foo.class, beanManager2.createCreationalContext(fooBean2));
       assert foo2.getName().equals("container 1");
+      use(2);
+      container2.stopContainer();
+      use(1);
+      container1.stopContainer();
    }
    
    @Test
@@ -76,6 +80,10 @@
       use(1);
       
       assert stable1.getFodder().getAmount() == 11;
+      use(1);
+      container1.stopContainer();
+      use(2);
+      container2.stopContainer();
    }
    
    @Test
@@ -105,6 +113,10 @@
       Stable stable2 = (Stable) beanManager2.getReference(stableBean2, Stable.class, beanManager2.createCreationalContext(stableBean2));
       assert stable2.getFodder().getAmount() == stable1.getFodder().getAmount();
       assert stable2.getHorse().getName() == null;
+      use(1);
+      container1.stopContainer();
+      use(2);
+      container2.stopContainer();
    }
    
 }

Modified: core/trunk/tests/src/test/java/org/jboss/weld/tests/unit/cluster/SwitchableContainerTest.java
===================================================================
--- core/trunk/tests/src/test/java/org/jboss/weld/tests/unit/cluster/SwitchableContainerTest.java	2010-01-13 13:53:14 UTC (rev 5449)
+++ core/trunk/tests/src/test/java/org/jboss/weld/tests/unit/cluster/SwitchableContainerTest.java	2010-01-13 13:55:53 UTC (rev 5450)
@@ -8,17 +8,16 @@
 import org.jboss.weld.bootstrap.api.SingletonProvider;
 import org.jboss.weld.mock.MockEELifecycle;
 import org.jboss.weld.mock.TestContainer;
+import org.jboss.weld.mock.cluster.AbstractClusterTest;
 import org.jboss.weld.mock.cluster.SwitchableSingletonProvider;
 import org.testng.annotations.Test;
 
-public class SwitchableContainerTest
+public class SwitchableContainerTest extends AbstractClusterTest
 {
 
    @Test
    public void test()
    {
-      SingletonProvider.reset();
-      SingletonProvider.initialize(new SwitchableSingletonProvider());
       
       // Bootstrap container 1
       SwitchableSingletonProvider.use(1);
@@ -54,6 +53,9 @@
       foo2 = (Foo) beanManager2.getReference(fooBean2, Foo.class, beanManager2.createCreationalContext(fooBean2));
       assert foo2.getName().equals("container 2");
       SingletonProvider.reset();
+      container1.stopContainer();
+      container2.stopContainer();
+      SingletonProvider.reset();
    }
    
 }



More information about the weld-commits mailing list