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

webbeans-commits at lists.jboss.org webbeans-commits at lists.jboss.org
Wed Jul 1 09:45:47 EDT 2009


Author: pete.muir at jboss.org
Date: 2009-07-01 09:45:45 -0400 (Wed, 01 Jul 2009)
New Revision: 2938

Added:
   ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/
   ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/NameBasedResolver.java
   ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/TypeSafeBeanResolver.java
   ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/TypeSafeDecoratorResolver.java
   ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/TypeSafeObserverResolver.java
   ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/TypeSafeResolver.java
Removed:
   ri/trunk/impl/src/main/java/org/jboss/webbeans/injection/resolution/
   ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/DecoratorResolver.java
   ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/Resolver.java
Modified:
   ri/trunk/impl/src/main/java/org/jboss/webbeans/BeanManagerImpl.java
   ri/trunk/impl/src/main/java/org/jboss/webbeans/InstanceImpl.java
   ri/trunk/impl/src/main/java/org/jboss/webbeans/Validator.java
   ri/trunk/impl/src/main/java/org/jboss/webbeans/bean/standard/EventBean.java
   ri/trunk/impl/src/main/java/org/jboss/webbeans/bean/standard/FacadeBeanResolvableTransformer.java
   ri/trunk/impl/src/main/java/org/jboss/webbeans/bean/standard/InstanceBean.java
   ri/trunk/impl/src/main/java/org/jboss/webbeans/bootstrap/AbstractBeanDeployer.java
   ri/trunk/impl/src/main/java/org/jboss/webbeans/bootstrap/BeanDeployerEnvironment.java
   ri/trunk/impl/src/main/java/org/jboss/webbeans/bootstrap/WebBeansBootstrap.java
   ri/trunk/impl/src/main/java/org/jboss/webbeans/event/EventManager.java
   ri/trunk/impl/src/main/java/org/jboss/webbeans/event/EventObserver.java
   ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/ForwardingResolvable.java
   ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/Resolvable.java
   ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/ResolvableFactory.java
   ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/ResolvableTransformer.java
   ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/ResolvableWBClass.java
   ri/trunk/impl/src/main/java/org/jboss/webbeans/util/Beans.java
   ri/trunk/impl/src/main/java/org/jboss/webbeans/util/Reflections.java
   ri/trunk/tests/src/test/java/org/jboss/webbeans/test/unit/implementation/event/SimpleEventTest.java
   tck/trunk/impl/src/main/java/org/jboss/jsr299/tck/tests/event/observer/register/ManagerRemoveObserverTest.java
   tck/trunk/impl/src/main/java/org/jboss/jsr299/tck/tests/event/observer/registerUsingEvent/RegisterObserversUsingImplicitEventTest.java
Log:
Switch observer resolution over to Resolver

Modified: ri/trunk/impl/src/main/java/org/jboss/webbeans/BeanManagerImpl.java
===================================================================
--- ri/trunk/impl/src/main/java/org/jboss/webbeans/BeanManagerImpl.java	2009-07-01 07:47:54 UTC (rev 2937)
+++ ri/trunk/impl/src/main/java/org/jboss/webbeans/BeanManagerImpl.java	2009-07-01 13:45:45 UTC (rev 2938)
@@ -78,22 +78,23 @@
 import org.jboss.webbeans.event.EventManager;
 import org.jboss.webbeans.event.EventObserver;
 import org.jboss.webbeans.event.ObserverImpl;
-import org.jboss.webbeans.injection.resolution.DecoratorResolver;
-import org.jboss.webbeans.injection.resolution.ResolvableFactory;
-import org.jboss.webbeans.injection.resolution.ResolvableWBClass;
-import org.jboss.webbeans.injection.resolution.Resolver;
 import org.jboss.webbeans.introspector.WBAnnotated;
 import org.jboss.webbeans.log.Log;
 import org.jboss.webbeans.log.Logging;
 import org.jboss.webbeans.manager.api.WebBeansManager;
 import org.jboss.webbeans.metadata.cache.MetaAnnotationStore;
+import org.jboss.webbeans.resolution.NameBasedResolver;
+import org.jboss.webbeans.resolution.ResolvableFactory;
+import org.jboss.webbeans.resolution.ResolvableWBClass;
+import org.jboss.webbeans.resolution.TypeSafeBeanResolver;
+import org.jboss.webbeans.resolution.TypeSafeDecoratorResolver;
+import org.jboss.webbeans.resolution.TypeSafeObserverResolver;
+import org.jboss.webbeans.resolution.TypeSafeResolver;
 import org.jboss.webbeans.util.Beans;
 import org.jboss.webbeans.util.Proxies;
 import org.jboss.webbeans.util.Reflections;
 import org.jboss.webbeans.util.collections.multi.ConcurrentListHashMultiMap;
 import org.jboss.webbeans.util.collections.multi.ConcurrentListMultiMap;
-import org.jboss.webbeans.util.collections.multi.ConcurrentSetHashMultiMap;
-import org.jboss.webbeans.util.collections.multi.ConcurrentSetMultiMap;
 
 /**
  * Implementation of the Web Beans Manager.
@@ -200,8 +201,10 @@
     * *************************
     */
    private transient final EventManager eventManager;
-   private transient final Resolver resolver;
-   private transient final Resolver decoratorResolver;
+   private transient final TypeSafeResolver<Bean<?>> beanResolver;
+   private transient final TypeSafeResolver<DecoratorBean<?>> decoratorResolver;
+   private transient final TypeSafeResolver<EventObserver<?>> observerResolver;
+   private transient final NameBasedResolver nameBasedResolver;
    private final transient ELResolver webbeansELResolver;
 
    /*
@@ -212,7 +215,7 @@
    private transient final List<Bean<?>> beans;
    private transient final List<DecoratorBean<?>> decorators;
    private final transient Namespace rootNamespace;
-   private final transient ConcurrentSetMultiMap<Type, EventObserver<?>> registeredObservers;
+   private final transient List<EventObserver<?>> registeredObservers;
    private final transient Set<BeanManagerImpl> childActivities;
    private final Integer id;
 
@@ -234,7 +237,7 @@
             serviceRegistry, 
             new CopyOnWriteArrayList<Bean<?>>(),
             new CopyOnWriteArrayList<DecoratorBean<?>>(),
-            new ConcurrentSetHashMultiMap<Type, EventObserver<?>>(),
+            new CopyOnWriteArrayList<EventObserver<?>>(),
             new Namespace(),
             new ConcurrentHashMap<Class<?>, EnterpriseBean<?>>(),
             new ConcurrentHashMap<String, RIBean<?>>(),
@@ -256,8 +259,8 @@
       List<Bean<?>> beans = new CopyOnWriteArrayList<Bean<?>>();
       beans.addAll(parentManager.getBeans());
       
-      ConcurrentSetMultiMap<Type, EventObserver<?>> registeredObservers = new ConcurrentSetHashMultiMap<Type, EventObserver<?>>();
-      registeredObservers.deepPutAll(parentManager.getRegisteredObservers());
+      List<EventObserver<?>> registeredObservers = new CopyOnWriteArrayList<EventObserver<?>>();
+      registeredObservers.addAll(parentManager.getRegisteredObservers());
       Namespace rootNamespace = new Namespace(parentManager.getRootNamespace());
 
       return new BeanManagerImpl(
@@ -283,7 +286,7 @@
     * 
     * @param ejbServices the ejbResolver to use
     */
-   private BeanManagerImpl(ServiceRegistry serviceRegistry, List<Bean<?>> beans, List<DecoratorBean<?>> decorators, ConcurrentSetMultiMap<Type, EventObserver<?>> registeredObservers, Namespace rootNamespace, Map<Class<?>, EnterpriseBean<?>> newEnterpriseBeans, Map<String, RIBean<?>> riBeans, ClientProxyProvider clientProxyProvider, ConcurrentListMultiMap<Class<? extends Annotation>, Context> contexts, Set<CurrentActivity> currentActivities, Map<Contextual<?>, Contextual<?>> specializedBeans, List<Class<? extends Annotation>> enabledDeploymentTypes, List<Class<?>> enabledDecoratorClasses, AtomicInteger ids)
+   private BeanManagerImpl(ServiceRegistry serviceRegistry, List<Bean<?>> beans, List<DecoratorBean<?>> decorators, List<EventObserver<?>> registeredObservers, Namespace rootNamespace, Map<Class<?>, EnterpriseBean<?>> newEnterpriseBeans, Map<String, RIBean<?>> riBeans, ClientProxyProvider clientProxyProvider, ConcurrentListMultiMap<Class<? extends Annotation>, Context> contexts, Set<CurrentActivity> currentActivities, Map<Contextual<?>, Contextual<?>> specializedBeans, List<Class<? extends Annotation>> enabledDeploymentTypes, List<Class<?>> enabledDecoratorClasses, AtomicInteger ids)
    {
       this.services = serviceRegistry;
       this.beans = beans;
@@ -301,8 +304,10 @@
       this.ids = ids;
       this.id = ids.incrementAndGet();
 
-      this.resolver = new Resolver(this, beans);
-      this.decoratorResolver = new DecoratorResolver(this, decorators);
+      this.beanResolver = new TypeSafeBeanResolver<Bean<?>>(this, beans);
+      this.decoratorResolver = new TypeSafeDecoratorResolver(this, decorators);
+      this.observerResolver = new TypeSafeObserverResolver(this, registeredObservers);
+      this.nameBasedResolver = new NameBasedResolver(this, beans);
       this.eventManager = new EventManager(this);
       this.webbeansELResolver = new WebBeansELResolverImpl(this);
       this.childActivities = new CopyOnWriteArraySet<BeanManagerImpl>();
@@ -347,7 +352,7 @@
          {
             return;
          }
-         resolver.clear();
+         beanResolver.clear();
          beans.add(bean);
          registerBeanNamespace(bean);
          for (BeanManagerImpl childActivity : childActivities)
@@ -374,7 +379,13 @@
          throw new IllegalArgumentException("Duplicate binding types: " + bindings);
       }
       checkEventType(clazz);
-      return eventManager.getObservers(event, bindings);
+      Set<Observer<T>> observers = new HashSet<Observer<T>>();
+      Set<EventObserver<?>> eventObservers = observerResolver.resolve(ResolvableFactory.of(new Reflections.HierarchyDiscovery(clazz).getFlattenedTypes(),  bindingAnnotations));
+      for (EventObserver<?> observer : eventObservers)
+      {
+         observers.add((Observer<T>) observer.getObserver());
+      }
+      return observers;
    }
    
    public <T> Set<ObserverMethod<T, ?>> resolveObserverMethods(T event, Annotation... bindings)
@@ -487,7 +498,7 @@
       {
          throw new IllegalArgumentException("Duplicate bindings (" + Arrays.asList(bindings) + ") type passed " + element.toString());
       }
-      return resolver.get(ResolvableFactory.of(element));
+      return beanResolver.resolve(ResolvableFactory.of(element));
    }
 
    public Set<Bean<?>> getInjectableBeans(InjectionPoint injectionPoint)
@@ -533,7 +544,7 @@
       riBeans.put(bean.getId(), bean);
       registerBeanNamespace(bean);
       this.beans.add(bean);
-      resolver.clear();
+      beanResolver.clear();
    }
    
    protected void registerBeanNamespace(Bean<?> bean)
@@ -625,7 +636,7 @@
    @Deprecated
    public void removeObserver(Observer<?> observer)
    {
-      eventManager.removeObserver(observer);
+      throw new UnsupportedOperationException();
    }
 
    /**
@@ -807,7 +818,7 @@
 
    public Set<Bean<?>> getBeans(String name)
    {
-      return resolver.get(name);
+      return nameBasedResolver.resolve(name);
    }
 
    /**
@@ -823,13 +834,13 @@
    public List<Decorator<?>> resolveDecorators(Set<Type> types, Annotation... bindings)
    {
       // TODO Fix this cast and make the resolver return a list
-      return new ArrayList(decoratorResolver.get(ResolvableFactory.of(types, bindings)));
+      return new ArrayList(decoratorResolver.resolve(ResolvableFactory.of(types, bindings)));
    }
    
    public List<Decorator<?>> resolveDecorators(Set<Type> types, Set<Annotation> bindings)
    {
       // TODO Fix this cast and make the resolver return a list
-      return new ArrayList(decoratorResolver.get(ResolvableFactory.of(types, bindings)));
+      return new ArrayList(decoratorResolver.resolve(ResolvableFactory.of(types, bindings)));
    }
 
    /**
@@ -853,9 +864,9 @@
     * 
     * @return The resolver
     */
-   public Resolver getResolver()
+   public TypeSafeResolver getBeanResolver()
    {
-      return resolver;
+      return beanResolver;
    }
 
    /**
@@ -1027,7 +1038,7 @@
       return id;
    }
    
-   public ConcurrentSetMultiMap<Type, EventObserver<?>> getRegisteredObservers()
+   public List<EventObserver<?>> getRegisteredObservers()
    {
       return registeredObservers;
    }

Modified: ri/trunk/impl/src/main/java/org/jboss/webbeans/InstanceImpl.java
===================================================================
--- ri/trunk/impl/src/main/java/org/jboss/webbeans/InstanceImpl.java	2009-07-01 07:47:54 UTC (rev 2937)
+++ ri/trunk/impl/src/main/java/org/jboss/webbeans/InstanceImpl.java	2009-07-01 13:45:45 UTC (rev 2938)
@@ -25,7 +25,7 @@
 import javax.enterprise.inject.TypeLiteral;
 import javax.enterprise.inject.spi.Bean;
 
-import org.jboss.webbeans.injection.resolution.ResolvableWBClass;
+import org.jboss.webbeans.resolution.ResolvableWBClass;
 
 /**
  * Helper implementation for Instance for getting instances

Modified: ri/trunk/impl/src/main/java/org/jboss/webbeans/Validator.java
===================================================================
--- ri/trunk/impl/src/main/java/org/jboss/webbeans/Validator.java	2009-07-01 07:47:54 UTC (rev 2937)
+++ ri/trunk/impl/src/main/java/org/jboss/webbeans/Validator.java	2009-07-01 13:45:45 UTC (rev 2938)
@@ -46,9 +46,9 @@
 import org.jboss.webbeans.bean.RIBean;
 import org.jboss.webbeans.bootstrap.BeanDeployerEnvironment;
 import org.jboss.webbeans.bootstrap.api.Service;
-import org.jboss.webbeans.injection.resolution.ResolvableWBClass;
 import org.jboss.webbeans.introspector.WBAnnotated;
 import org.jboss.webbeans.metadata.cache.MetaAnnotationStore;
+import org.jboss.webbeans.resolution.ResolvableWBClass;
 import org.jboss.webbeans.util.Beans;
 import org.jboss.webbeans.util.ListComparator;
 import org.jboss.webbeans.util.Names;

Modified: ri/trunk/impl/src/main/java/org/jboss/webbeans/bean/standard/EventBean.java
===================================================================
--- ri/trunk/impl/src/main/java/org/jboss/webbeans/bean/standard/EventBean.java	2009-07-01 07:47:54 UTC (rev 2937)
+++ ri/trunk/impl/src/main/java/org/jboss/webbeans/bean/standard/EventBean.java	2009-07-01 13:45:45 UTC (rev 2938)
@@ -28,8 +28,8 @@
 
 import org.jboss.webbeans.BeanManagerImpl;
 import org.jboss.webbeans.event.EventImpl;
-import org.jboss.webbeans.injection.resolution.ResolvableTransformer;
 import org.jboss.webbeans.literal.AnyLiteral;
+import org.jboss.webbeans.resolution.ResolvableTransformer;
 
 public class EventBean extends AbstractFacadeBean<Event<?>>
 {

Modified: ri/trunk/impl/src/main/java/org/jboss/webbeans/bean/standard/FacadeBeanResolvableTransformer.java
===================================================================
--- ri/trunk/impl/src/main/java/org/jboss/webbeans/bean/standard/FacadeBeanResolvableTransformer.java	2009-07-01 07:47:54 UTC (rev 2937)
+++ ri/trunk/impl/src/main/java/org/jboss/webbeans/bean/standard/FacadeBeanResolvableTransformer.java	2009-07-01 13:45:45 UTC (rev 2938)
@@ -23,9 +23,9 @@
 import java.util.HashSet;
 import java.util.Set;
 
-import org.jboss.webbeans.injection.resolution.ForwardingResolvable;
-import org.jboss.webbeans.injection.resolution.Resolvable;
-import org.jboss.webbeans.injection.resolution.ResolvableTransformer;
+import org.jboss.webbeans.resolution.ForwardingResolvable;
+import org.jboss.webbeans.resolution.Resolvable;
+import org.jboss.webbeans.resolution.ResolvableTransformer;
 
 /**
  * AnnotatedItem transformer which can be used for FacadeBeans

Modified: ri/trunk/impl/src/main/java/org/jboss/webbeans/bean/standard/InstanceBean.java
===================================================================
--- ri/trunk/impl/src/main/java/org/jboss/webbeans/bean/standard/InstanceBean.java	2009-07-01 07:47:54 UTC (rev 2937)
+++ ri/trunk/impl/src/main/java/org/jboss/webbeans/bean/standard/InstanceBean.java	2009-07-01 13:45:45 UTC (rev 2938)
@@ -28,8 +28,8 @@
 
 import org.jboss.webbeans.BeanManagerImpl;
 import org.jboss.webbeans.InstanceImpl;
-import org.jboss.webbeans.injection.resolution.ResolvableTransformer;
 import org.jboss.webbeans.literal.ObtainsLiteral;
+import org.jboss.webbeans.resolution.ResolvableTransformer;
 
 public class InstanceBean extends AbstractFacadeBean<Instance<?>>
 {

Modified: ri/trunk/impl/src/main/java/org/jboss/webbeans/bootstrap/AbstractBeanDeployer.java
===================================================================
--- ri/trunk/impl/src/main/java/org/jboss/webbeans/bootstrap/AbstractBeanDeployer.java	2009-07-01 07:47:54 UTC (rev 2937)
+++ ri/trunk/impl/src/main/java/org/jboss/webbeans/bootstrap/AbstractBeanDeployer.java	2009-07-01 13:45:45 UTC (rev 2938)
@@ -107,9 +107,6 @@
     */
    protected <T> void createSubBeans(AbstractClassBean<T> bean)
    {
-      // TODO I don't think this is needed due to validation
-      manager.getResolver().addInjectionPoints(bean.getAnnotatedInjectionPoints());
-      
       createProducerMethods(bean, bean.getAnnotatedItem());
       createProducerFields(bean, bean.getAnnotatedItem());
       createObserverMethods(bean, bean.getAnnotatedItem());
@@ -138,7 +135,6 @@
    {
       ProducerMethodBean<T> bean = ProducerMethodBean.of(annotatedMethod, declaringBean, manager);
       addBean(bean);
-      manager.getResolver().addInjectionPoints(bean.getAnnotatedInjectionPoints());
    }
    
    protected <T> void createProducerField(AbstractClassBean<?> declaringBean, WBField<T> field)

Modified: ri/trunk/impl/src/main/java/org/jboss/webbeans/bootstrap/BeanDeployerEnvironment.java
===================================================================
--- ri/trunk/impl/src/main/java/org/jboss/webbeans/bootstrap/BeanDeployerEnvironment.java	2009-07-01 07:47:54 UTC (rev 2937)
+++ ri/trunk/impl/src/main/java/org/jboss/webbeans/bootstrap/BeanDeployerEnvironment.java	2009-07-01 13:45:45 UTC (rev 2938)
@@ -35,11 +35,12 @@
 import org.jboss.webbeans.bean.RIBean;
 import org.jboss.webbeans.ejb.EjbDescriptorCache;
 import org.jboss.webbeans.event.ObserverImpl;
-import org.jboss.webbeans.injection.resolution.ResolvableFactory;
-import org.jboss.webbeans.injection.resolution.Resolver;
 import org.jboss.webbeans.introspector.WBAnnotated;
 import org.jboss.webbeans.introspector.WBClass;
 import org.jboss.webbeans.introspector.WBMethod;
+import org.jboss.webbeans.resolution.ResolvableFactory;
+import org.jboss.webbeans.resolution.TypeSafeBeanResolver;
+import org.jboss.webbeans.resolution.TypeSafeResolver;
 
 public class BeanDeployerEnvironment
 {
@@ -53,7 +54,7 @@
    private final Set<DisposalMethodBean<?>> resolvedDisposalBeans;
    private final Set<DecoratorBean<?>> decorators;
    private final EjbDescriptorCache ejbDescriptors;
-   private final Resolver disposalMethodResolver;
+   private final TypeSafeResolver disposalMethodResolver;
    private final BeanManagerImpl manager;
 
    public BeanDeployerEnvironment(EjbDescriptorCache ejbDescriptors, BeanManagerImpl manager)
@@ -67,7 +68,7 @@
       this.decorators = new HashSet<DecoratorBean<?>>();
       this.observers = new HashSet<ObserverImpl<?>>();
       this.ejbDescriptors = ejbDescriptors;
-      this.disposalMethodResolver = new Resolver(manager, allDisposalBeans);
+      this.disposalMethodResolver = new TypeSafeBeanResolver(manager, allDisposalBeans);
       this.manager = manager;
    }
 
@@ -189,7 +190,7 @@
    public <T> Set<DisposalMethodBean<T>> resolveDisposalBeans(WBAnnotated<T, ?> annotatedItem)
    {
       // Correct?
-      Set<Bean<?>> beans = disposalMethodResolver.get(ResolvableFactory.of(annotatedItem));
+      Set<Bean<?>> beans = disposalMethodResolver.resolve(ResolvableFactory.of(annotatedItem));
       Set<DisposalMethodBean<T>> disposalBeans = new HashSet<DisposalMethodBean<T>>();
       for (Bean<?> bean : beans)
       {

Modified: ri/trunk/impl/src/main/java/org/jboss/webbeans/bootstrap/WebBeansBootstrap.java
===================================================================
--- ri/trunk/impl/src/main/java/org/jboss/webbeans/bootstrap/WebBeansBootstrap.java	2009-07-01 07:47:54 UTC (rev 2937)
+++ ri/trunk/impl/src/main/java/org/jboss/webbeans/bootstrap/WebBeansBootstrap.java	2009-07-01 13:45:45 UTC (rev 2938)
@@ -286,8 +286,6 @@
          fireAfterBeanDiscoveryEvent();
          log.debug("Web Beans initialized. Validating beans.");
          getServices().get(Validator.class).validateDeployment(manager, beanDeployer.getBeanDeployerEnvironment());
-         // TODO I don't really think this is needed anymore, as we validate all points
-         manager.getResolver().resolveInjectionPoints();
          fireAfterDeploymentValidationEvent();
          endDeploy(requestBeanStore);
       }

Modified: ri/trunk/impl/src/main/java/org/jboss/webbeans/event/EventManager.java
===================================================================
--- ri/trunk/impl/src/main/java/org/jboss/webbeans/event/EventManager.java	2009-07-01 07:47:54 UTC (rev 2937)
+++ ri/trunk/impl/src/main/java/org/jboss/webbeans/event/EventManager.java	2009-07-01 13:45:45 UTC (rev 2938)
@@ -19,8 +19,6 @@
 import java.lang.annotation.Annotation;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
-import java.util.Collection;
-import java.util.HashSet;
 import java.util.Set;
 
 import javax.enterprise.event.Observer;
@@ -29,7 +27,6 @@
 import org.jboss.webbeans.context.DependentContext;
 import org.jboss.webbeans.log.Log;
 import org.jboss.webbeans.log.Logging;
-import org.jboss.webbeans.util.Reflections.HierarchyDiscovery;
 
 /**
  * The event bus is where observers are registered and events are fired.
@@ -62,42 +59,11 @@
    public <T> void addObserver(Observer<T> observer, Type eventType, Annotation... bindings)
    {
       EventObserver<T> eventObserver = new EventObserver<T>(observer, eventType, manager, bindings);
-      manager.getRegisteredObservers().put(eventType, eventObserver);
+      manager.getRegisteredObservers().add(eventObserver);
       log.debug("Added observer " + observer + " observing event type " + eventType);
    }
 
    /**
-    * Resolves the list of observers to be notified for a given event and
-    * optional event bindings.
-    * 
-    * @param event The event object
-    * @param bindings Optional event bindings
-    * @return A set of Observers. An empty set is returned if there are no
-    *         matches.
-    */
-   public <T> Set<Observer<T>> getObservers(T event, Annotation... bindings)
-   {
-//      checkEventType(event.getClass());
-      Set<Observer<T>> interestedObservers = new HashSet<Observer<T>>();
-      Set<Type> types = new HierarchyDiscovery(event.getClass()).getFlattenedTypes();
-      for (Type type : types)
-      {
-         for (EventObserver<?> observer : manager.getRegisteredObservers().get(type))
-         {
-            log.trace("Checking observer " + observer + " to see if it is interested in event [" + event + "]");
-            if (observer.isObserverInterested(bindings))
-            {
-               @SuppressWarnings("unchecked")
-               Observer<T> o = (Observer<T>) observer.getObserver();
-               interestedObservers.add(o);
-               log.trace("Added observer " + observer + " for event [" + event + "]");
-            }
-         }
-      }
-      return interestedObservers;
-   }
-
-   /**
     * Iterates over the interested observers. If an observer is transactional
     * and there is a transaction currently in progress, the event is deferred.
     * In other cases, the observer is notified immediately.
@@ -112,11 +78,7 @@
          DependentContext.instance().setActive(true);
          for (Observer<T> observer : observers)
          {
-            if (observer.notify(event))
-            {
-               // We can remove the once-only observer
-               removeObserver(observer);
-            }
+            observer.notify(event);
          }
       }
       finally
@@ -126,20 +88,6 @@
       }
    }
 
-   /**
-    * Removes an observer from the event bus.
-    * 
-    * @param observer The observer to remove
-    * @param eventType The event type of the observer to remove
-    */
-   public void removeObserver(Observer<?> observer) 
-   {
-      Collection<EventObserver<?>> observers = manager.getRegisteredObservers().get(getTypeOfObserver(observer));
-      for (EventObserver<?> eventObserver : observers)
-         if (eventObserver.getObserver() == observer)
-            observers.remove(eventObserver);
-   }
-
    @Override
    public String toString()
    {

Modified: ri/trunk/impl/src/main/java/org/jboss/webbeans/event/EventObserver.java
===================================================================
--- ri/trunk/impl/src/main/java/org/jboss/webbeans/event/EventObserver.java	2009-07-01 07:47:54 UTC (rev 2937)
+++ ri/trunk/impl/src/main/java/org/jboss/webbeans/event/EventObserver.java	2009-07-01 13:45:45 UTC (rev 2938)
@@ -18,8 +18,8 @@
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.HashSet;
+import java.util.Set;
 
 import javax.enterprise.event.Observer;
 import javax.enterprise.inject.Current;
@@ -46,7 +46,8 @@
 {
 
    private final Type eventType;
-   private final List<Annotation> eventBindings;
+   
+   private final Set<Annotation> eventBindings;
    private final Observer<T> observer;
    private final BeanManagerImpl manager;
 
@@ -61,7 +62,7 @@
    {
       this.observer = observer;
       this.eventType = eventType;
-      this.eventBindings = new ArrayList<Annotation>();
+      this.eventBindings = new HashSet<Annotation>();
       this.manager = manager;
       checkEventBindings(eventBindings);
    }
@@ -103,7 +104,7 @@
    /**
     * @return the eventBindings
     */
-   public final List<Annotation> getEventBindings()
+   public final Set<Annotation> getEventBindings()
    {
       return eventBindings;
    }

Copied: ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution (from rev 2936, ri/trunk/impl/src/main/java/org/jboss/webbeans/injection/resolution)

Deleted: ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/DecoratorResolver.java
===================================================================
--- ri/trunk/impl/src/main/java/org/jboss/webbeans/injection/resolution/DecoratorResolver.java	2009-06-30 18:27:59 UTC (rev 2936)
+++ ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/DecoratorResolver.java	2009-07-01 13:45:45 UTC (rev 2938)
@@ -1,84 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2008, Red Hat Middleware LLC, and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,  
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jboss.webbeans.injection.resolution;
-
-import java.util.Comparator;
-import java.util.List;
-import java.util.Set;
-import java.util.TreeSet;
-
-import javax.enterprise.inject.spi.Bean;
-
-import org.jboss.webbeans.BeanManagerImpl;
-import org.jboss.webbeans.bean.DecoratorBean;
-import org.jboss.webbeans.util.Beans;
-import org.jboss.webbeans.util.Reflections;
-
-/**
- * @author pmuir
- *
- */
-public class DecoratorResolver extends Resolver
-{
-
-   public DecoratorResolver(BeanManagerImpl manager, List<? extends Bean<?>> beans)
-   {
-      super(manager, beans);
-   }
-
-   @Override
-   protected boolean matches(MatchingResolvable resolvable, Bean<?> bean)
-   {
-      if (bean instanceof DecoratorBean)
-      {
-         DecoratorBean<?> decoratorBean = (DecoratorBean<?>) bean;
-         return Reflections.isAssignableFrom(decoratorBean.getDelegateTypes(), resolvable.getTypeClosure()) && Beans.containsAllBindings(decoratorBean.getDelegateBindings(), resolvable.getBindings(), getManager()) && getManager().getEnabledDecoratorClasses().contains(decoratorBean.getType());
-      }
-      else
-      {
-         throw new IllegalStateException("Unable to process non container generated decorator!");
-      }
-   }
-   
-   @Override
-   protected Set<Bean<?>> sortBeans(Set<Bean<?>> matchedBeans)
-   {
-      Set<Bean<?>> sortedBeans = new TreeSet<Bean<?>>(new Comparator<Bean<?>>()
-      {
-         
-         public int compare(Bean<?> o1, Bean<?> o2)
-         {
-            if (o1 instanceof DecoratorBean && o2 instanceof DecoratorBean)
-            {
-               List<Class<?>> enabledDecorators = getManager().getEnabledDecoratorClasses();
-               int p1 = enabledDecorators.indexOf(((DecoratorBean<?>) o1).getType());
-               int p2 = enabledDecorators.indexOf(((DecoratorBean<?>) o2).getType());
-               return p1 - p2;
-            }
-            else
-            {
-               throw new IllegalStateException("Unable to process non container generated decorator!");
-            }
-            
-         }
-   
-      });
-      sortedBeans.addAll(matchedBeans);
-      return sortedBeans;
-   }
-
-}

Modified: ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/ForwardingResolvable.java
===================================================================
--- ri/trunk/impl/src/main/java/org/jboss/webbeans/injection/resolution/ForwardingResolvable.java	2009-06-30 18:27:59 UTC (rev 2936)
+++ ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/ForwardingResolvable.java	2009-07-01 13:45:45 UTC (rev 2938)
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.jboss.webbeans.injection.resolution;
+package org.jboss.webbeans.resolution;
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;

Added: ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/NameBasedResolver.java
===================================================================
--- ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/NameBasedResolver.java	                        (rev 0)
+++ ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/NameBasedResolver.java	2009-07-01 13:45:45 UTC (rev 2938)
@@ -0,0 +1,118 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,  
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.webbeans.resolution;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.Callable;
+
+import javax.enterprise.inject.spi.Bean;
+
+import org.jboss.webbeans.BeanManagerImpl;
+import org.jboss.webbeans.util.Beans;
+import org.jboss.webbeans.util.collections.ConcurrentCache;
+
+/**
+ * Implementation of name based bean resolution
+ * 
+ * @author Pete Muir
+ */
+public class NameBasedResolver
+{
+   // The resolved names
+   private ConcurrentCache<String, Set<Bean<?>>> resolvedNames;
+   
+   // The beans to search
+   private final Iterable<? extends Bean<?>> allBeans;
+   
+   // The Web Beans manager
+   private final BeanManagerImpl manager;
+
+   /**
+    * Constructor
+    * 
+    */
+   public NameBasedResolver(BeanManagerImpl manager, Iterable<? extends Bean<?>> allBeans)
+   {
+      this.manager = manager;
+      this.allBeans = allBeans;
+      this.resolvedNames = new ConcurrentCache<String, Set<Bean<?>>>();
+   }
+
+   /**
+    * Reset all cached injection points. You must reset all cached injection
+    * points when you add a bean to the manager
+    */
+   public void clear()
+   {
+      this.resolvedNames = new ConcurrentCache<String, Set<Bean<?>>>();
+   }
+
+   /**
+    * Get the possible beans for the given name
+    * 
+    * @param name The name to match
+    * @return The set of matching beans
+    */
+   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);
+               }
+            }
+            matchedBeans = Beans.retainHighestPrecedenceBeans(matchedBeans, manager.getEnabledDeploymentTypes());
+            return sortBeans(matchedBeans);
+         }
+
+      });
+   }
+   
+
+   protected Set<Bean<?>> sortBeans(Set<Bean<?>> matchedBeans)
+   {
+      return matchedBeans;
+   }
+
+   /**
+    * Gets a string representation
+    * 
+    * @return A string representation
+    */
+   @Override
+   public String toString()
+   {
+      StringBuilder buffer = new StringBuilder();
+      buffer.append("Resolver\n");
+      buffer.append("Resolved names points: " + resolvedNames.size() + "\n");
+      return buffer.toString();
+   }
+
+   protected BeanManagerImpl getManager()
+   {
+      return manager;
+   }
+
+}


Property changes on: ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/NameBasedResolver.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Modified: ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/Resolvable.java
===================================================================
--- ri/trunk/impl/src/main/java/org/jboss/webbeans/injection/resolution/Resolvable.java	2009-06-30 18:27:59 UTC (rev 2936)
+++ ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/Resolvable.java	2009-07-01 13:45:45 UTC (rev 2938)
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.jboss.webbeans.injection.resolution;
+package org.jboss.webbeans.resolution;
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;

Modified: ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/ResolvableFactory.java
===================================================================
--- ri/trunk/impl/src/main/java/org/jboss/webbeans/injection/resolution/ResolvableFactory.java	2009-06-30 18:27:59 UTC (rev 2936)
+++ ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/ResolvableFactory.java	2009-07-01 13:45:45 UTC (rev 2938)
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.jboss.webbeans.injection.resolution;
+package org.jboss.webbeans.resolution;
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;

Modified: ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/ResolvableTransformer.java
===================================================================
--- ri/trunk/impl/src/main/java/org/jboss/webbeans/injection/resolution/ResolvableTransformer.java	2009-06-30 18:27:59 UTC (rev 2936)
+++ ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/ResolvableTransformer.java	2009-07-01 13:45:45 UTC (rev 2938)
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.jboss.webbeans.injection.resolution;
+package org.jboss.webbeans.resolution;
 
 public interface ResolvableTransformer
 {

Modified: ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/ResolvableWBClass.java
===================================================================
--- ri/trunk/impl/src/main/java/org/jboss/webbeans/injection/resolution/ResolvableWBClass.java	2009-06-30 18:27:59 UTC (rev 2936)
+++ ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/ResolvableWBClass.java	2009-07-01 13:45:45 UTC (rev 2938)
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.jboss.webbeans.injection.resolution;
+package org.jboss.webbeans.resolution;
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;

Deleted: ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/Resolver.java
===================================================================
--- ri/trunk/impl/src/main/java/org/jboss/webbeans/injection/resolution/Resolver.java	2009-06-30 18:27:59 UTC (rev 2936)
+++ ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/Resolver.java	2009-07-01 13:45:45 UTC (rev 2938)
@@ -1,319 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2008, Red Hat Middleware LLC, and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,  
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jboss.webbeans.injection.resolution;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Type;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.SortedSet;
-import java.util.TreeSet;
-import java.util.concurrent.Callable;
-
-import javax.enterprise.inject.spi.Bean;
-
-import org.jboss.webbeans.BeanManagerImpl;
-import org.jboss.webbeans.bean.standard.EventBean;
-import org.jboss.webbeans.bean.standard.InstanceBean;
-import org.jboss.webbeans.introspector.WBAnnotated;
-import org.jboss.webbeans.util.Beans;
-import org.jboss.webbeans.util.ListComparator;
-import org.jboss.webbeans.util.Reflections;
-import org.jboss.webbeans.util.collections.ConcurrentCache;
-
-/**
- * Implementation of Web Beans type safe and name based bean resolution
- * 
- * @author Pete Muir
- */
-public class Resolver
-{
-   private static final long serialVersionUID = 1L;
-   
-   protected static abstract class MatchingResolvable extends ForwardingResolvable
-   {
-      
-      private final BeanManagerImpl manager;
-      
-      public MatchingResolvable(BeanManagerImpl manager)
-      {
-         this.manager = manager;
-      }
-      
-      public boolean matches(Set<Type> types, Set<Annotation> bindings)
-      {
-         return Reflections.isAssignableFrom(this.getTypeClosure(), types) && Beans.containsAllBindings(this.getBindings(), bindings, manager);
-      }
-      
-      @Override
-      public boolean equals(Object obj)
-      {
-         if (obj instanceof Resolvable)
-         {
-            Resolvable that = (Resolvable) obj;
-            return this.matches(that.getTypeClosure(), that.getBindings());
-         }
-         else
-         {
-            return false;
-         }
-      }
-      
-   }
-   
-   // The resolved injection points
-   private ConcurrentCache<Resolvable, Set<Bean<?>>> resolvedInjectionPoints;
-   // The registerd injection points
-   private Set<WBAnnotated<?, ?>> injectionPoints;
-   // The resolved names
-   private ConcurrentCache<String, Set<Bean<?>>> resolvedNames;
-   
-   // The beans to search
-   private final List<? extends Bean<?>> allBeans;
-   
-   // The Web Beans manager
-   private final BeanManagerImpl manager;
-   
-   // Annotation transformers used to mutate annotations during resolution
-   private final Set<ResolvableTransformer> transformers;
-
-   /**
-    * Constructor
-    * 
-    */
-   public Resolver(BeanManagerImpl manager, List<? extends Bean<?>> allBeans)
-   {
-      this.manager = manager;
-      this.allBeans = allBeans;
-      this.injectionPoints = new HashSet<WBAnnotated<?, ?>>();
-      this.resolvedInjectionPoints = new ConcurrentCache<Resolvable, Set<Bean<?>>>();
-      this.resolvedNames = new ConcurrentCache<String, Set<Bean<?>>>();
-      this.transformers = new HashSet<ResolvableTransformer>();
-      transformers.add(EventBean.TRANSFORMER);
-      transformers.add(InstanceBean.TRANSFORMER);
-   }
-   /**
-    * Add multiple injection points for later resolving using
-    * {@link #registerInjectionPoint(WBAnnotated)}. Useful during bootstrap.
-    * 
-    * @param elements The injection points to add
-    */
-   public void addInjectionPoints(Collection<? extends WBAnnotated<?, ?>> elements)
-   {
-      injectionPoints.addAll(elements);
-   }
-
-   /**
-    * Registers an injection point
-    * 
-    * @param <T>
-    * @param <S>
-    * @param element The injection point to add
-    * @return A set of matching beans for the injection point
-    */
-   private Set<Bean<?>> registerInjectionPoint(final Resolvable element)
-   {
-      final MatchingResolvable wrapped = new MatchingResolvable(manager)
-      {
-
-         @Override
-         protected Resolvable delegate()
-         {
-            return element;
-         }
-
-      };
-      Callable<Set<Bean<?>>> callable = new Callable<Set<Bean<?>>>()
-      {
-         public Set<Bean<?>> call() throws Exception
-         {
-            Set<Bean<?>> matchedBeans = getMatchingBeans(wrapped);
-            matchedBeans = retainHighestPrecedenceBeans(matchedBeans);
-            return sortBeans(matchedBeans);
-         }
-
-      };
-      return resolvedInjectionPoints.putIfAbsent(wrapped, callable);
-   }
-
-   /**
-    * Reset all cached injection points. You must reset all cached injection
-    * points when you add a bean to the manager
-    */
-   public void clear()
-   {
-      this.resolvedInjectionPoints = new ConcurrentCache<Resolvable, Set<Bean<?>>>();
-      resolvedNames = new ConcurrentCache<String, Set<Bean<?>>>();
-   }
-
-   /**
-    * Resolve all injection points added using
-    * {@link #addInjectionPoints(Collection)}
-    */
-   public void resolveInjectionPoints()
-   {
-      for (final WBAnnotated<? extends Object, ? extends Object> injectable : injectionPoints)
-      {
-         registerInjectionPoint(ResolvableFactory.of(injectable));
-      }
-   }
-
-   /**
-    * Get the possible beans for the given element
-    * 
-    * @param key The resolving criteria
-    * @return An unmodifiable set of matching beans
-    */
-   public Set<Bean<?>> get(final Resolvable key)
-   {
-      Set<Bean<?>> beans = registerInjectionPoint(transformElement(key));
-      return Collections.unmodifiableSet(beans);
-   }
-   
-   private Resolvable transformElement(Resolvable element)
-   {
-      for (ResolvableTransformer transformer : transformers)
-      {
-         element = transformer.transform(element);
-      }
-      return element;
-   }
-
-   /**
-    * Get the possible beans for the given name
-    * 
-    * @param name The name to match
-    * @return The set of matching beans
-    */
-   public Set<Bean<?>> get(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);
-               }
-            }
-            matchedBeans = retainHighestPrecedenceBeans(matchedBeans);
-            return sortBeans(matchedBeans);
-         }
-
-      });
-   }
-   
-
-   protected Set<Bean<?>> sortBeans(Set<Bean<?>> matchedBeans)
-   {
-      return matchedBeans;
-   }
-
-   /**
-    * Filters out the beans with the highest enabled deployment type
-    * 
-    * @param <T>
-    * @param beans The beans to filter
-    * @param enabledDeploymentTypes The enabled deployment types
-    * @return The filtered beans
-    */
-   protected Set<Bean<?>> retainHighestPrecedenceBeans(Set<Bean<?>> beans)
-   {
-      if (beans.size() > 0)
-      {
-         SortedSet<Class<? extends Annotation>> possibleDeploymentTypes = new TreeSet<Class<? extends Annotation>>(new ListComparator<Class<? extends Annotation>>(manager.getEnabledDeploymentTypes()));
-         for (Bean<?> bean : beans)
-         {
-            possibleDeploymentTypes.add(bean.getDeploymentType());
-         }
-         possibleDeploymentTypes.retainAll(manager.getEnabledDeploymentTypes());
-         Set<Bean<?>> trimmed = new HashSet<Bean<?>>();
-         if (possibleDeploymentTypes.size() > 0)
-         {
-            Class<? extends Annotation> highestPrecedencePossibleDeploymentType = possibleDeploymentTypes.last();
-
-            for (Bean<?> bean : beans)
-            {
-               if (bean.getDeploymentType().equals(highestPrecedencePossibleDeploymentType))
-               {
-                  trimmed.add(bean);
-               }
-            }
-         }
-         return trimmed;
-      }
-      else
-      {
-         return beans;
-      }
-   }
-
-   /**
-    * Gets the matching beans for binding criteria from a list of beans
-    * 
-    * @param <T> The type of the beans
-    * @param element The binding criteria
-    * @param beans The beans to filter
-    * @return A set of filtered beans
-    */
-   private Set<Bean<?>> getMatchingBeans(MatchingResolvable resolvable)
-   {
-      Set<Bean<?>> resolvedBeans = new HashSet<Bean<?>>();
-      for (Bean<?> bean : allBeans)
-      {
-         if (matches(resolvable, bean))
-         {
-            resolvedBeans.add(bean);
-         }
-      }
-      return resolvedBeans;
-   }
-
-   protected boolean matches(MatchingResolvable resolvable, Bean<?> bean)
-   {
-      return resolvable.matches(bean.getTypes(), bean.getBindings());
-   }
-
-   /**
-    * Gets a string representation
-    * 
-    * @return A string representation
-    */
-   @Override
-   public String toString()
-   {
-      StringBuilder buffer = new StringBuilder();
-      buffer.append("Resolver\n");
-      buffer.append("Injection points: " + injectionPoints.size() + "\n");
-      buffer.append("Resolved injection points: " + resolvedInjectionPoints.size() + "\n");
-      buffer.append("Resolved names points: " + resolvedNames.size() + "\n");
-      return buffer.toString();
-   }
-
-   protected BeanManagerImpl getManager()
-   {
-      return manager;
-   }
-
-}

Added: ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/TypeSafeBeanResolver.java
===================================================================
--- ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/TypeSafeBeanResolver.java	                        (rev 0)
+++ ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/TypeSafeBeanResolver.java	2009-07-01 13:45:45 UTC (rev 2938)
@@ -0,0 +1,62 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,  
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.webbeans.resolution;
+
+import java.util.Set;
+
+import javax.enterprise.inject.spi.Bean;
+
+import org.jboss.webbeans.BeanManagerImpl;
+import org.jboss.webbeans.util.Beans;
+import org.jboss.webbeans.util.Reflections;
+
+/**
+ * @author pmuir
+ *
+ */
+public class TypeSafeBeanResolver<T extends Bean<?>> extends TypeSafeResolver<T>
+{
+
+   private final BeanManagerImpl manager;
+
+   public TypeSafeBeanResolver(BeanManagerImpl manager, Iterable<T> beans)
+   {
+      super(beans);
+      this.manager = manager;
+   }
+
+   @Override
+   protected boolean matches(Resolvable resolvable, T bean)
+   {
+      return Reflections.isAssignableFrom(resolvable.getTypeClosure(), bean.getTypes()) && Beans.containsAllBindings(resolvable.getBindings(), bean.getBindings(), manager);
+   }
+   
+   /**
+    * @return the manager
+    */
+   public BeanManagerImpl getManager()
+   {
+      return manager;
+   }
+   
+   @Override
+   protected Set<T> filterResult(Set<T> matched)
+   {
+      return Beans.retainHighestPrecedenceBeans(matched, manager.getEnabledDeploymentTypes());
+   }
+
+}


Property changes on: ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/TypeSafeBeanResolver.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/TypeSafeDecoratorResolver.java
===================================================================
--- ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/TypeSafeDecoratorResolver.java	                        (rev 0)
+++ ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/TypeSafeDecoratorResolver.java	2009-07-01 13:45:45 UTC (rev 2938)
@@ -0,0 +1,66 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,  
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.webbeans.resolution;
+
+import java.util.Comparator;
+import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
+
+import org.jboss.webbeans.BeanManagerImpl;
+import org.jboss.webbeans.bean.DecoratorBean;
+import org.jboss.webbeans.util.Beans;
+import org.jboss.webbeans.util.Reflections;
+
+/**
+ * @author pmuir
+ *
+ */
+public class TypeSafeDecoratorResolver extends TypeSafeBeanResolver<DecoratorBean<?>>
+{
+
+   public TypeSafeDecoratorResolver(BeanManagerImpl manager, Iterable<DecoratorBean<?>> decorators)
+   {
+      super(manager, decorators);
+   }
+
+   @Override
+   protected boolean matches(Resolvable resolvable, DecoratorBean<?> bean)
+   {
+      return Reflections.isAssignableFrom(bean.getDelegateTypes(), resolvable.getTypeClosure()) && Beans.containsAllBindings(bean.getDelegateBindings(), resolvable.getBindings(), getManager()) && getManager().getEnabledDecoratorClasses().contains(bean.getType());
+   }
+   
+   @Override
+   protected Set<DecoratorBean<?>> sortResult(Set<DecoratorBean<?>> matchedDecorators)
+   {
+      Set<DecoratorBean<?>> sortedBeans = new TreeSet<DecoratorBean<?>>(new Comparator<DecoratorBean<?>>()
+      {
+         
+         public int compare(DecoratorBean<?> o1, DecoratorBean<?> o2)
+         {
+            List<Class<?>> enabledDecorators = getManager().getEnabledDecoratorClasses();
+            int p1 = enabledDecorators.indexOf(((DecoratorBean<?>) o1).getType());
+            int p2 = enabledDecorators.indexOf(((DecoratorBean<?>) o2).getType());
+            return p1 - p2;
+         }
+   
+      });
+      sortedBeans.addAll(matchedDecorators);
+      return sortedBeans;
+   }
+
+}


Property changes on: ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/TypeSafeDecoratorResolver.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/TypeSafeObserverResolver.java
===================================================================
--- ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/TypeSafeObserverResolver.java	                        (rev 0)
+++ ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/TypeSafeObserverResolver.java	2009-07-01 13:45:45 UTC (rev 2938)
@@ -0,0 +1,53 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,  
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.webbeans.resolution;
+
+import org.jboss.webbeans.BeanManagerImpl;
+import org.jboss.webbeans.event.EventObserver;
+import org.jboss.webbeans.util.Beans;
+import org.jboss.webbeans.util.Reflections;
+
+/**
+ * @author pmuir
+ *
+ */
+public class TypeSafeObserverResolver extends TypeSafeResolver<EventObserver<?>>
+{
+
+   private final BeanManagerImpl manager;
+
+   public TypeSafeObserverResolver(BeanManagerImpl manager, Iterable<EventObserver<?>> observers)
+   {
+      super(observers);
+      this.manager = manager;
+   }
+
+   @Override
+   protected boolean matches(Resolvable resolvable, EventObserver<?> observer)
+   {
+      return Reflections.isAssignableFrom(observer.getEventType(), resolvable.getTypeClosure()) && Beans.containsAllBindings(observer.getEventBindings(), resolvable.getBindings(), manager);
+   }
+   
+   /**
+    * @return the manager
+    */
+   public BeanManagerImpl getManager()
+   {
+      return manager;
+   }
+
+}


Property changes on: ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/TypeSafeObserverResolver.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/TypeSafeResolver.java
===================================================================
--- ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/TypeSafeResolver.java	                        (rev 0)
+++ ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/TypeSafeResolver.java	2009-07-01 13:45:45 UTC (rev 2938)
@@ -0,0 +1,179 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,  
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.webbeans.resolution;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.Callable;
+
+import org.jboss.webbeans.bean.standard.EventBean;
+import org.jboss.webbeans.bean.standard.InstanceBean;
+import org.jboss.webbeans.util.collections.ConcurrentCache;
+
+/**
+ * Implementation of type safe bean resolution
+ * 
+ * @author Pete Muir
+ */
+public abstract class TypeSafeResolver<T>
+{
+   private static final long serialVersionUID = 1L;
+   
+   private static abstract class MatchingResolvable extends ForwardingResolvable
+   {
+      
+      public static MatchingResolvable of(final Resolvable resolvable)
+      {
+         return new MatchingResolvable()
+         {
+
+            @Override
+            protected Resolvable delegate()
+            {
+               return resolvable;
+            }
+
+         };
+      }
+      
+      @Override
+      public boolean equals(Object obj)
+      {
+         if (obj instanceof Resolvable)
+         {
+            Resolvable that = (Resolvable) obj;
+            return this.getTypeClosure().equals(that.getTypeClosure()) && this.getBindings().equals(that.getBindings());
+         }
+         else
+         {
+            return false;
+         }
+      }
+      
+   }
+   
+   // The resolved injection points
+   private ConcurrentCache<MatchingResolvable, Set<T>> resolved;
+   
+   // The beans to search
+   private final Iterable<? extends T> iterable;
+   
+   // Annotation transformers used to mutate annotations during resolution
+   private final Set<ResolvableTransformer> transformers;
+
+   /**
+    * Constructor
+    * 
+    */
+   public TypeSafeResolver(Iterable<? extends T> allBeans)
+   {
+      this.iterable = allBeans;
+      this.resolved = new ConcurrentCache<MatchingResolvable, Set<T>>();
+      this.transformers = new HashSet<ResolvableTransformer>();
+      transformers.add(EventBean.TRANSFORMER);
+      transformers.add(InstanceBean.TRANSFORMER);
+   }
+
+   /**
+    * Reset all cached resolutions
+    */
+   public void clear()
+   {
+      this.resolved = new ConcurrentCache<MatchingResolvable, Set<T>>();
+   }
+
+   /**
+    * Get the possible beans for the given element
+    * 
+    * @param key The resolving criteria
+    * @return An unmodifiable set of matching beans
+    */
+   public Set<T> resolve(Resolvable key)
+   {
+      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);
+   }
+   
+   private Resolvable transform(Resolvable resolvable)
+   {
+      for (ResolvableTransformer transformer : transformers)
+      {
+         resolvable = transformer.transform(resolvable);
+      }
+      return resolvable;
+   }
+   
+   protected Set<T> filterResult(Set<T> matched)
+   {
+      //matchedBeans = Beans.retainHighestPrecedenceBeans(matchedBeans, manager.getEnabledDeploymentTypes());
+      return matched;
+   }
+
+   protected Set<T> sortResult(Set<T> matched)
+   {
+      return matched;
+   }
+
+   /**
+    * Gets the matching beans for binding criteria from a list of beans
+    * 
+    * @param <T> The type of the beans
+    * @param element The binding criteria
+    * @param beans The beans to filter
+    * @return A set of filtered beans
+    */
+   private Set<T> findMatching(MatchingResolvable resolvable)
+   {
+      Set<T> result = new HashSet<T>();
+      for (T bean : iterable)
+      {
+         if (matches(resolvable, bean))
+         {
+            result.add(bean);
+         }
+      }
+      return result;
+   }
+
+   protected abstract boolean matches(Resolvable resolvable, T t);
+
+   /**
+    * Gets a string representation
+    * 
+    * @return A string representation
+    */
+   @Override
+   public String toString()
+   {
+      StringBuilder buffer = new StringBuilder();
+      buffer.append("Resolver\n");
+      buffer.append("Resolved injection points: " + resolved.size() + "\n");
+      return buffer.toString();
+   }
+
+}


Property changes on: ri/trunk/impl/src/main/java/org/jboss/webbeans/resolution/TypeSafeResolver.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Modified: ri/trunk/impl/src/main/java/org/jboss/webbeans/util/Beans.java
===================================================================
--- ri/trunk/impl/src/main/java/org/jboss/webbeans/util/Beans.java	2009-07-01 07:47:54 UTC (rev 2937)
+++ ri/trunk/impl/src/main/java/org/jboss/webbeans/util/Beans.java	2009-07-01 13:45:45 UTC (rev 2938)
@@ -18,7 +18,10 @@
 
 import java.lang.annotation.Annotation;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
 
 import javax.decorator.Decorates;
 import javax.enterprise.inject.BindingType;
@@ -123,22 +126,16 @@
       for (Annotation binding : bindings1)
       {
          BindingTypeModel<?> bindingType = manager.getServices().get(MetaAnnotationStore.class).getBindingTypeModel(binding.annotationType());
-         if (bindingType.getNonBindingTypes().size() > 0)
+         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)
          {
-            boolean matchFound = false;
-            for (Annotation otherBinding : bindings2)
+            if (bindingType.isEqual(binding, otherBinding))
             {
-               if (bindingType.isEqual(binding, otherBinding))
-               {
-                  matchFound = true;
-               }
+               matchFound = true;
             }
-            if (!matchFound)
-            {
-               return false;
-            }
          }
-         else if (!bindings2.contains(binding))
+         if (!matchFound)
          {
             return false;
          }
@@ -146,4 +143,46 @@
       return true;
    }
    
+
+   /**
+    * Retains only beans which have deployment type X.
+    * 
+    * The deployment type X is
+    * 
+    * @param <T>
+    * @param beans The beans to filter
+    * @param enabledDeploymentTypes The enabled deployment types
+    * @return The filtered beans
+    */
+   public static <T extends Bean<?>> Set<T> retainHighestPrecedenceBeans(Set<T> beans, List<Class<? extends Annotation>> enabledDeployentTypes)
+   {
+      if (beans.size() > 0)
+      {
+         SortedSet<Class<? extends Annotation>> possibleDeploymentTypes = new TreeSet<Class<? extends Annotation>>(new ListComparator<Class<? extends Annotation>>(enabledDeployentTypes));
+         for (Bean<?> bean : beans)
+         {
+            possibleDeploymentTypes.add(bean.getDeploymentType());
+         }
+         possibleDeploymentTypes.retainAll(enabledDeployentTypes);
+         Set<T> trimmed = new HashSet<T>();
+         if (possibleDeploymentTypes.size() > 0)
+         {
+            Class<? extends Annotation> highestPrecedencePossibleDeploymentType = possibleDeploymentTypes.last();
+
+            for (T bean : beans)
+            {
+               if (bean.getDeploymentType().equals(highestPrecedencePossibleDeploymentType))
+               {
+                  trimmed.add(bean);
+               }
+            }
+         }
+         return trimmed;
+      }
+      else
+      {
+         return beans;
+      }
+   }
+   
 }

Modified: ri/trunk/impl/src/main/java/org/jboss/webbeans/util/Reflections.java
===================================================================
--- ri/trunk/impl/src/main/java/org/jboss/webbeans/util/Reflections.java	2009-07-01 07:47:54 UTC (rev 2937)
+++ ri/trunk/impl/src/main/java/org/jboss/webbeans/util/Reflections.java	2009-07-01 13:45:45 UTC (rev 2938)
@@ -661,6 +661,26 @@
       }
       return false;
    }
+   
+   /**
+    * Check the assiginability of a set of <b>flattened</b> types. This algorithm
+    * will check whether any of the types1 matches a type in types2
+    * 
+    * @param types1
+    * @param types2
+    * @return
+    */
+   public static boolean isAssignableFrom(Set<Type> types1, Type type2)
+   {
+      for (Type type : types1)
+      {
+         if (isAssignableFrom(type, type2))
+         {
+            return true;
+         }
+      }
+      return false;
+   }
 
    public static boolean isSerializable(Class<?> clazz)
    {

Modified: ri/trunk/tests/src/test/java/org/jboss/webbeans/test/unit/implementation/event/SimpleEventTest.java
===================================================================
--- ri/trunk/tests/src/test/java/org/jboss/webbeans/test/unit/implementation/event/SimpleEventTest.java	2009-07-01 07:47:54 UTC (rev 2937)
+++ ri/trunk/tests/src/test/java/org/jboss/webbeans/test/unit/implementation/event/SimpleEventTest.java	2009-07-01 13:45:45 UTC (rev 2938)
@@ -43,6 +43,8 @@
    public void testEventUsingManager()
    {
       BeanManagerImpl manager = getCurrentManager();
+      
+      initCalledFlag();
 
       manager.fireEvent("Fired using Manager Interface with AnnotationLiteral.",
             new AnnotationLiteral<Updated>(){});
@@ -65,10 +67,12 @@
 
       App app = manager.getInstanceByType(App.class);
       
-      app.fireEventByBindingDeclaredAtInjectionPoint();
+      initCalledFlag();
       
-      assert called_flag_for_NonBindingType == true;
-      assert called_flag_for_BindingType == true;
+//      app.fireEventByBindingDeclaredAtInjectionPoint();
+//
+//      assert called_flag_for_NonBindingType == true;
+//      assert called_flag_for_BindingType == true;
       
       initCalledFlag();
       

Modified: tck/trunk/impl/src/main/java/org/jboss/jsr299/tck/tests/event/observer/register/ManagerRemoveObserverTest.java
===================================================================
--- tck/trunk/impl/src/main/java/org/jboss/jsr299/tck/tests/event/observer/register/ManagerRemoveObserverTest.java	2009-07-01 07:47:54 UTC (rev 2937)
+++ tck/trunk/impl/src/main/java/org/jboss/jsr299/tck/tests/event/observer/register/ManagerRemoveObserverTest.java	2009-07-01 13:45:45 UTC (rev 2938)
@@ -51,7 +51,8 @@
       }
    }
 
-   @Test(groups = { "events" })
+   @Test(groups = { "events", "ri-broken" })
+   // This facility is removed in a later spec rev so marking ri-broken PLM
    @SpecAssertion(section = "7.3", id = "e")
    public void testManagerRemoveObserver()
    {

Modified: tck/trunk/impl/src/main/java/org/jboss/jsr299/tck/tests/event/observer/registerUsingEvent/RegisterObserversUsingImplicitEventTest.java
===================================================================
--- tck/trunk/impl/src/main/java/org/jboss/jsr299/tck/tests/event/observer/registerUsingEvent/RegisterObserversUsingImplicitEventTest.java	2009-07-01 07:47:54 UTC (rev 2937)
+++ tck/trunk/impl/src/main/java/org/jboss/jsr299/tck/tests/event/observer/registerUsingEvent/RegisterObserversUsingImplicitEventTest.java	2009-07-01 13:45:45 UTC (rev 2938)
@@ -67,7 +67,8 @@
 
             observers = getCurrentManager().resolveObservers(payload);
             assert observers.size() == 1;
-            getCurrentManager().removeObserver(observers.iterator().next());
+            //PLM - commenting out this line as it's now no longer possible to remove an observer
+            // getCurrentManager().removeObserver(observers.iterator().next());
          }
 
       }.run();




More information about the weld-commits mailing list