Author: pete.muir(a)jboss.org
Date: 2010-02-20 13:44:00 -0500 (Sat, 20 Feb 2010)
New Revision: 5894
Added:
core/trunk/impl/src/main/java/org/jboss/weld/manager/BeanManagers.java
Modified:
core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/Validator.java
core/trunk/impl/src/main/java/org/jboss/weld/manager/BeanManagerImpl.java
core/trunk/impl/src/main/java/org/jboss/weld/manager/Transform.java
core/trunk/impl/src/main/java/org/jboss/weld/resolution/NameBasedResolver.java
core/trunk/impl/src/main/java/org/jboss/weld/resolution/TypeSafeBeanResolver.java
core/trunk/impl/src/main/java/org/jboss/weld/util/Beans.java
Log:
WELD-304
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-02-20
18:05:53 UTC (rev 5893)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/Validator.java 2010-02-20
18:44:00 UTC (rev 5894)
@@ -419,7 +419,7 @@
for (String name : namedAccessibleBeans.keySet())
{
- Set<Bean<?>> resolvedBeans =
beanManager.getBeanResolver().resolve(Beans.removeDisabledAndSpecializedBeans(namedAccessibleBeans.get(name),
beanManager.getEnabledAlternativeClasses(),
beanManager.getEnabledAlternativeStereotypes(), beanManager.getSpecializedBeans()));
+ Set<Bean<?>> resolvedBeans =
beanManager.getBeanResolver().resolve(Beans.removeDisabledAndSpecializedBeans(namedAccessibleBeans.get(name),
beanManager));
if (resolvedBeans.size() > 1)
{
throw new DeploymentException(AMBIGUOUS_EL_NAME, name, resolvedBeans);
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-02-20
18:05:53 UTC (rev 5893)
+++ core/trunk/impl/src/main/java/org/jboss/weld/manager/BeanManagerImpl.java 2010-02-20
18:44:00 UTC (rev 5894)
@@ -28,6 +28,7 @@
import static org.jboss.weld.logging.messages.BeanManagerMessage.TOO_MANY_ACTIVITIES;
import static org.jboss.weld.logging.messages.BeanManagerMessage.UNPROXYABLE_RESOLUTION;
import static org.jboss.weld.logging.messages.BeanManagerMessage.UNRESOLVABLE_ELEMENT;
+import static org.jboss.weld.manager.BeanManagers.buildAccessibleClosure;
import java.io.Serializable;
import java.lang.annotation.Annotation;
@@ -385,22 +386,8 @@
this.childActivities = new CopyOnWriteArraySet<BeanManagerImpl>();
}
- private <T> Set<Iterable<T>>
buildAccessibleClosure(Collection<BeanManagerImpl> hierarchy, Transform<T>
transform)
- {
- Set<Iterable<T>> result = new HashSet<Iterable<T>>();
- hierarchy.add(this);
- result.add(transform.transform(this));
- for (BeanManagerImpl beanManager : accessibleManagers)
- {
- // Only add if we aren't already in the tree (remove cycles)
- if (!hierarchy.contains(beanManager))
- {
- result.addAll(beanManager.buildAccessibleClosure(new
ArrayList<BeanManagerImpl>(hierarchy), transform));
- }
- }
- return result;
- }
+
private <T> Iterable<T> createDynamicAccessibleIterable(final
Transform<T> transform)
{
return new Iterable<T>()
@@ -408,7 +395,7 @@
public Iterator<T> iterator()
{
- Set<Iterable<T>> iterable = buildAccessibleClosure(new
ArrayList<BeanManagerImpl>(), transform);
+ Set<Iterable<T>> iterable =
buildAccessibleClosure(BeanManagerImpl.this, new ArrayList<BeanManagerImpl>(),
transform);
return Iterators.concat(Iterators.transform(iterable.iterator(),
IterableToIteratorFunction.<T>instance()));
}
@@ -417,7 +404,7 @@
private <T> Iterable<T> createStaticAccessibleIterable(final
Transform<T> transform)
{
- Set<Iterable<T>> iterable = buildAccessibleClosure(new
ArrayList<BeanManagerImpl>(), transform);
+ Set<Iterable<T>> iterable = buildAccessibleClosure(this, new
ArrayList<BeanManagerImpl>(), transform);
return Iterables.concat(iterable);
}
@@ -426,6 +413,11 @@
accessibleManagers.add(accessibleBeanManager);
beanResolver.clear();
}
+
+ public HashSet<BeanManagerImpl> getAccessibleManagers()
+ {
+ return accessibleManagers;
+ }
public void addBean(Bean<?> bean)
{
Added: core/trunk/impl/src/main/java/org/jboss/weld/manager/BeanManagers.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/manager/BeanManagers.java
(rev 0)
+++ core/trunk/impl/src/main/java/org/jboss/weld/manager/BeanManagers.java 2010-02-20
18:44:00 UTC (rev 5894)
@@ -0,0 +1,51 @@
+package org.jboss.weld.manager;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+
+public class BeanManagers
+{
+
+ private static class BeanManagerTransform implements Transform<BeanManagerImpl>
+ {
+
+ public static final BeanManagerTransform INSTANCE = new BeanManagerTransform();
+
+ public Iterable<BeanManagerImpl> transform(BeanManagerImpl beanManager)
+ {
+ return beanManager.getAccessibleManagers();
+ }
+
+ }
+
+ private BeanManagers() {}
+
+ public static Set<Iterable<BeanManagerImpl>>
getAccessibleClosure(BeanManagerImpl beanManager)
+ {
+ Set<Iterable<BeanManagerImpl>> beanManagers = new
HashSet<Iterable<BeanManagerImpl>>();
+ beanManagers.add(Collections.singleton(beanManager));
+ beanManagers.addAll(buildAccessibleClosure(beanManager, new
HashSet<BeanManagerImpl>(), BeanManagerTransform.INSTANCE));
+ return beanManagers;
+ }
+
+ public static <T> Set<Iterable<T>>
buildAccessibleClosure(BeanManagerImpl beanManager, Collection<BeanManagerImpl>
hierarchy, Transform<T> transform)
+ {
+ Set<Iterable<T>> result = new HashSet<Iterable<T>>();
+ hierarchy.add(beanManager);
+ result.add(transform.transform(beanManager));
+ for (BeanManagerImpl accessibleBeanManager : beanManager.getAccessibleManagers())
+ {
+ // Only add if we aren't already in the tree (remove cycles)
+ if (!hierarchy.contains(accessibleBeanManager))
+ {
+ result.addAll(buildAccessibleClosure(accessibleBeanManager, new
ArrayList<BeanManagerImpl>(hierarchy), transform));
+ }
+ }
+ return result;
+ }
+
+}
Property changes on:
core/trunk/impl/src/main/java/org/jboss/weld/manager/BeanManagers.java
___________________________________________________________________
Name: svn:eol-style
+ native
Modified: core/trunk/impl/src/main/java/org/jboss/weld/manager/Transform.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/manager/Transform.java 2010-02-20
18:05:53 UTC (rev 5893)
+++ core/trunk/impl/src/main/java/org/jboss/weld/manager/Transform.java 2010-02-20
18:44:00 UTC (rev 5894)
@@ -16,7 +16,7 @@
*/
package org.jboss.weld.manager;
-interface Transform<T>
+public interface Transform<T>
{
public Iterable<T> transform(BeanManagerImpl beanManager);
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-02-20
18:05:53 UTC (rev 5893)
+++
core/trunk/impl/src/main/java/org/jboss/weld/resolution/NameBasedResolver.java 2010-02-20
18:44:00 UTC (rev 5894)
@@ -58,7 +58,7 @@
matchedBeans.add(bean);
}
}
- return Beans.removeDisabledAndSpecializedBeans(matchedBeans,
beanManager.getEnabledAlternativeClasses(),
beanManager.getEnabledAlternativeStereotypes(), beanManager.getSpecializedBeans());
+ return Beans.removeDisabledAndSpecializedBeans(matchedBeans, beanManager);
}
}
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-02-20
18:05:53 UTC (rev 5893)
+++
core/trunk/impl/src/main/java/org/jboss/weld/resolution/TypeSafeBeanResolver.java 2010-02-20
18:44:00 UTC (rev 5894)
@@ -105,7 +105,7 @@
@Override
protected Set<T> filterResult(Set<T> matched)
{
- return Beans.removeDisabledAndSpecializedBeans(matched,
beanManager.getEnabledAlternativeClasses(),
beanManager.getEnabledAlternativeStereotypes(), getBeanManager().getSpecializedBeans());
+ return Beans.removeDisabledAndSpecializedBeans(matched, beanManager);
}
@Override
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-02-20 18:05:53 UTC
(rev 5893)
+++ core/trunk/impl/src/main/java/org/jboss/weld/util/Beans.java 2010-02-20 18:44:00 UTC
(rev 5894)
@@ -54,7 +54,6 @@
import javax.annotation.PreDestroy;
import javax.decorator.Decorator;
import javax.enterprise.context.Dependent;
-import javax.enterprise.context.spi.Contextual;
import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.event.Observes;
import javax.enterprise.inject.Alternative;
@@ -91,6 +90,7 @@
import org.jboss.weld.introspector.WeldMethod;
import org.jboss.weld.introspector.WeldParameter;
import org.jboss.weld.manager.BeanManagerImpl;
+import org.jboss.weld.manager.BeanManagers;
import org.jboss.weld.metadata.cache.InterceptorBindingModel;
import org.jboss.weld.metadata.cache.MergedStereotypes;
import org.jboss.weld.metadata.cache.MetaAnnotationStore;
@@ -580,7 +580,7 @@
* @param enabledDeploymentTypes The enabled deployment types
* @return The filtered beans
*/
- public static <T extends Bean<?>> Set<T>
removeDisabledAndSpecializedBeans(Set<T> beans, Collection<Class<?>>
enabledAlternativeClasses, Collection<Class<? extends Annotation>>
enabledAlternativeSterotypes, Map<Contextual<?>, Contextual<?>>
specializedBeans)
+ public static <T extends Bean<?>> Set<T>
removeDisabledAndSpecializedBeans(Set<T> beans, BeanManagerImpl beanManager)
{
if (beans.size() == 0)
{
@@ -591,7 +591,7 @@
Set<T> result = new HashSet<T>();
for (T bean : beans)
{
- if (isBeanEnabled(bean, enabledAlternativeClasses,
enabledAlternativeSterotypes) && !isSpecialized(bean, beans, specializedBeans))
+ if (isBeanEnabled(bean, beanManager.getEnabledAlternativeClasses(),
beanManager.getEnabledAlternativeStereotypes()) && !isSpecialized(bean, beans,
beanManager))
{
result.add(bean);
}
@@ -661,16 +661,22 @@
*
* @param bean
* @param beans
- * @param specializedBeans
+ * @param allSpecializedBeans
* @return
*/
- public static <T extends Bean<?>> boolean isSpecialized(T bean,
Set<T> beans, Map<Contextual<?>, Contextual<?>> specializedBeans)
+ public static <T extends Bean<?>> boolean isSpecialized(T bean,
Set<T> beans, BeanManagerImpl beanManager)
{
- if (specializedBeans.containsKey(bean))
+ for (Iterable<BeanManagerImpl> beanManagers :
BeanManagers.getAccessibleClosure(beanManager))
{
- if (beans.contains(specializedBeans.get(bean)))
+ for (BeanManagerImpl accessibleBeanManager : beanManagers)
{
- return true;
+ if (accessibleBeanManager.getSpecializedBeans().containsKey(bean))
+ {
+ if
(beans.contains(accessibleBeanManager.getSpecializedBeans().get(bean)))
+ {
+ return true;
+ }
+ }
}
}
return false;