Skip to content

Commit

Permalink
WBRI-311
Browse files Browse the repository at this point in the history
git-svn-id: http://anonsvn.jboss.org/repos/weld/ri/trunk@3492 1c488680-804c-0410-94cd-c6b725194a0e
  • Loading branch information
pmuir committed Aug 14, 2009
1 parent d8d81f3 commit b96e1fc
Show file tree
Hide file tree
Showing 9 changed files with 184 additions and 116 deletions.
22 changes: 11 additions & 11 deletions impl/src/main/java/org/jboss/webbeans/BeanManagerImpl.java
Expand Up @@ -669,17 +669,17 @@ public Set<Bean<?>> getBeans(WBAnnotated<?, ?> element, Annotation... bindings)
throw new IllegalArgumentException("Not a binding type " + annotation);
}
}
for (Type type : element.getActualTypeArguments())
{
if (type instanceof WildcardType)
{
throw new IllegalArgumentException("Cannot resolve a type parameterized with a wildcard " + element);
}
if (type instanceof TypeVariable<?>)
{
throw new IllegalArgumentException("Cannot resolve a type parameterized with a type parameter " + element);
}
}
// for (Type type : element.getActualTypeArguments())
// {
// if (type instanceof WildcardType)
// {
// throw new IllegalArgumentException("Cannot resolve a type parameterized with a wildcard " + element);
// }
// if (type instanceof TypeVariable<?>)
// {
// throw new IllegalArgumentException("Cannot resolve a type parameterized with a type parameter " + element);
// }
// }
if (bindings != null && bindings.length > element.getMetaAnnotations(BindingType.class).size())
{
throw new IllegalArgumentException("Duplicate bindings (" + Arrays.asList(bindings) + ") type passed " + element.toString());
Expand Down
18 changes: 9 additions & 9 deletions impl/src/main/java/org/jboss/webbeans/Validator.java
Expand Up @@ -158,14 +158,14 @@ public void validateInjectionPoint(InjectionPoint ij, BeanManagerImpl beanManage
ParameterizedType parameterizedType = (ParameterizedType) ij.getType();
for (Type type : parameterizedType.getActualTypeArguments())
{
if (type instanceof TypeVariable<?>)
{
throw new DefinitionException("Injection point cannot have a type variable type parameter " + ij);
}
if (type instanceof WildcardType)
{
throw new DefinitionException("Injection point cannot have a wildcard type parameter " + ij);
}
// if (type instanceof TypeVariable<?>)
// {
// throw new DefinitionException("Injection point cannot have a type variable type parameter " + ij);
// }
// if (type instanceof WildcardType)
// {
// throw new DefinitionException("Injection point cannot have a wildcard type parameter " + ij);
// }
}
}
checkFacadeInjectionPoint(ij, Instance.class);
Expand All @@ -179,7 +179,7 @@ public void validateInjectionPoint(InjectionPoint ij, BeanManagerImpl beanManage
}
if (resolvedBeans.size() > 1)
{
throw new DeploymentException("The injection point " + ij + " with binding types " + Names.annotationsToString(ij.getBindings()) + " in " + ij.getBean() + " has ambiguous dependencies");
throw new DeploymentException("The injection point " + ij + " with binding types " + Names.annotationsToString(ij.getBindings()) + " in " + ij.getBean() + " has ambiguous dependencies " + resolvedBeans);
}
Bean<?> resolvedBean = (Bean<?>) resolvedBeans.iterator().next();
if (beanManager.getServices().get(MetaAnnotationStore.class).getScopeModel(resolvedBean.getScopeType()).isNormal() && !Proxies.isTypeProxyable(ij.getType()))
Expand Down
4 changes: 0 additions & 4 deletions impl/src/main/java/org/jboss/webbeans/bean/SimpleBean.java
Expand Up @@ -329,10 +329,6 @@ protected void checkType()
{
throw new DefinitionException("Simple bean " + type + " cannot be a non-static inner class");
}
if (getAnnotatedItem().isParameterizedType())
{
throw new DefinitionException("Simple bean " + type + " cannot be a parameterized type");
}
boolean passivating = manager.getServices().get(MetaAnnotationStore.class).getScopeModel(scopeType).isPassivating();
if (passivating && !Reflections.isSerializable(getBeanClass()))
{
Expand Down
Expand Up @@ -198,19 +198,19 @@ protected <T> void createEnterpriseBean(WBClass<T> annotatedClass)
*/
protected boolean isTypeManagedBeanOrDecorator(WBClass<?> clazz)
{
Class<?> rawType = clazz.getJavaClass();
Class<?> javaClass = clazz.getJavaClass();
EJBApiAbstraction ejbApiAbstraction = manager.getServices().get(EJBApiAbstraction.class);
JsfApiAbstraction jsfApiAbstraction = manager.getServices().get(JsfApiAbstraction.class);
ServletApiAbstraction servletApiAbstraction = manager.getServices().get(ServletApiAbstraction.class);
return !clazz.isNonStaticMemberClass() &&
!Reflections.isParameterizedType(rawType) &&
!servletApiAbstraction.SERVLET_CLASS.isAssignableFrom(rawType) &&
!servletApiAbstraction.FILTER_CLASS.isAssignableFrom(rawType) &&
!servletApiAbstraction.SERVLET_CONTEXT_LISTENER_CLASS.isAssignableFrom(rawType) &&
!servletApiAbstraction.HTTP_SESSION_LISTENER_CLASS.isAssignableFrom(rawType) &&
!servletApiAbstraction.SERVLET_REQUEST_LISTENER_CLASS.isAssignableFrom(rawType) &&
!ejbApiAbstraction.ENTERPRISE_BEAN_CLASS.isAssignableFrom(rawType) &&
!jsfApiAbstraction.UICOMPONENT_CLASS.isAssignableFrom(rawType) &&
!Reflections.isParamerterizedTypeWithWildcard(javaClass) &&
!servletApiAbstraction.SERVLET_CLASS.isAssignableFrom(javaClass) &&
!servletApiAbstraction.FILTER_CLASS.isAssignableFrom(javaClass) &&
!servletApiAbstraction.SERVLET_CONTEXT_LISTENER_CLASS.isAssignableFrom(javaClass) &&
!servletApiAbstraction.HTTP_SESSION_LISTENER_CLASS.isAssignableFrom(javaClass) &&
!servletApiAbstraction.SERVLET_REQUEST_LISTENER_CLASS.isAssignableFrom(javaClass) &&
!ejbApiAbstraction.ENTERPRISE_BEAN_CLASS.isAssignableFrom(javaClass) &&
!jsfApiAbstraction.UICOMPONENT_CLASS.isAssignableFrom(javaClass) &&
hasSimpleWebBeanConstructor(clazz);
}

Expand Down
170 changes: 152 additions & 18 deletions impl/src/main/java/org/jboss/webbeans/util/Reflections.java
Expand Up @@ -30,6 +30,7 @@
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.lang.reflect.WildcardType;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
Expand All @@ -47,6 +48,8 @@
public class Reflections
{

private static final Type[] EMPTY_TYPES = {};

public static class HierarchyDiscovery
{

Expand Down Expand Up @@ -82,19 +85,33 @@ public Type getResolvedType()
private void discoverTypes(Type type)
{
if (type != null)
{
add(type);
{
if (type instanceof Class)
{
discoverFromClass((Class<?>) type);
Class<?> clazz = (Class<?>) type;
if (clazz.getTypeParameters().length > 0)
{
TypeVariable[] actualTypeParameters = clazz.getTypeParameters();
ParameterizedType parameterizedType = new ParameterizedTypeImpl(clazz, actualTypeParameters, clazz.getDeclaringClass());
add(parameterizedType);
}
else
{
add(clazz);
}
discoverFromClass(clazz);
}
else if (type instanceof ParameterizedType)
else
{
Type rawType = ((ParameterizedType) type).getRawType();
if (rawType instanceof Class)
if (type instanceof ParameterizedType)
{
discoverFromClass((Class<?>) rawType);
Type rawType = ((ParameterizedType) type).getRawType();
if (rawType instanceof Class)
{
discoverFromClass((Class<?>) rawType);
}
}
add(type);
}
}
}
Expand Down Expand Up @@ -390,6 +407,30 @@ public static boolean isParameterizedType(Class<?> type)
{
return type.getTypeParameters().length > 0;
}

public static boolean isParamerterizedTypeWithWildcard(Class<?> type)
{
if (isParameterizedType(type))
{
return containsWildcards(type.getTypeParameters());
}
else
{
return false;
}
}

public static boolean containsWildcards(Type[] types)
{
for (Type type : types)
{
if (type instanceof WildcardType)
{
return true;
}
}
return false;
}

/**
* Invokes a method and wraps exceptions
Expand Down Expand Up @@ -579,7 +620,25 @@ public static boolean isBindings(Annotation binding)
*/
public static boolean isAssignableFrom(Class<?> rawType1, Type[] actualTypeArguments1, Class<?> rawType2, Type[] actualTypeArguments2)
{
return Types.boxedClass(rawType1).isAssignableFrom(Types.boxedClass(rawType2)) && Arrays.equals(actualTypeArguments1, actualTypeArguments2);
return Types.boxedClass(rawType1).isAssignableFrom(Types.boxedClass(rawType2)) && isAssignableFrom(actualTypeArguments1, actualTypeArguments2);
}

public static boolean isAssignableFrom(Type[] actualTypeArguments1, Type[] actualTypeArguments2)
{
for (int i = 0; i < actualTypeArguments1.length; i++)
{
Type type1 = actualTypeArguments1[i];
Type type2 = Object.class;
if (actualTypeArguments2.length > i)
{
type2 = actualTypeArguments2[i];
}
if (!isAssignableFrom(type1, type2))
{
return false;
}
}
return true;
}

public static boolean isAssignableFrom(Type type1, Set<? extends Type> types2)
Expand All @@ -594,6 +653,18 @@ public static boolean isAssignableFrom(Type type1, Set<? extends Type> types2)
return false;
}

public static boolean isAssignableFrom(Type type1, Type[] types2)
{
for (Type type2 : types2)
{
if (isAssignableFrom(type1, type2))
{
return true;
}
}
return false;
}

public static boolean isAssignableFrom(Type type1, Type type2)
{
if (type1 instanceof Class)
Expand All @@ -604,31 +675,74 @@ public static boolean isAssignableFrom(Type type1, Type type2)
return true;
}
}
else if (type1 instanceof ParameterizedType)
if (type1 instanceof ParameterizedType)
{
ParameterizedType parameterizedType = (ParameterizedType) type1;
if (parameterizedType.getRawType() instanceof Class)
ParameterizedType parameterizedType1 = (ParameterizedType) type1;
if (parameterizedType1.getRawType() instanceof Class)
{
if (isAssignableFrom((Class<?>) parameterizedType.getRawType(), parameterizedType.getActualTypeArguments(), type2))
if (isAssignableFrom((Class<?>) parameterizedType1.getRawType(), parameterizedType1.getActualTypeArguments(), type2))
{
return true;
}
}
}
if (type1 instanceof WildcardType)
{
WildcardType wildcardType = (WildcardType) type1;
if (isTypeBounded(type2, wildcardType.getLowerBounds(), wildcardType.getUpperBounds()))
{
return true;
}
}
if (type2 instanceof WildcardType)
{
WildcardType wildcardType = (WildcardType) type2;
if (isTypeBounded(type1, wildcardType.getUpperBounds(), wildcardType.getLowerBounds()))
{
return true;
}
}
if (type1 instanceof TypeVariable<?>)
{
TypeVariable<?> typeVariable = (TypeVariable<?>) type1;
if (isTypeBounded(type2, EMPTY_TYPES, typeVariable.getBounds()))
{
return true;
}
}
if (type2 instanceof TypeVariable<?>)
{
TypeVariable<?> typeVariable = (TypeVariable<?>) type2;
if (isTypeBounded(type1, typeVariable.getBounds(), EMPTY_TYPES))
{
return true;
}
}
return false;
}

public static boolean isAssignableFrom(Class<?> rawType1, Type[] actualTypeArguments1, Type type2)
public static boolean isTypeBounded(Type type, Type[] lowerBounds, Type[] upperBounds)
{
if (type2 instanceof Class)
if (lowerBounds.length > 0)
{
Class<?> clazz = (Class<?>) type2;
if (isAssignableFrom(rawType1, actualTypeArguments1, clazz, new Type[0]))
if (!isAssignableFrom(type, lowerBounds))
{
return true;
return false;
}
}
else if (type2 instanceof ParameterizedType)
if (upperBounds.length > 0)
{
if (!isAssignableFrom(upperBounds, type))
{
return false;
}
}
return true;
}

public static boolean isAssignableFrom(Class<?> rawType1, Type[] actualTypeArguments1, Type type2)
{
if (type2 instanceof ParameterizedType)
{
ParameterizedType parameterizedType = (ParameterizedType) type2;
if (parameterizedType.getRawType() instanceof Class)
Expand All @@ -639,6 +753,14 @@ else if (type2 instanceof ParameterizedType)
}
}
}
else if (type2 instanceof Class)
{
Class<?> clazz = (Class<?>) type2;
if (isAssignableFrom(rawType1, actualTypeArguments1, clazz, new Type[0]))
{
return true;
}
}
return false;
}

Expand Down Expand Up @@ -681,6 +803,18 @@ public static boolean isAssignableFrom(Set<Type> types1, Type type2)
}
return false;
}

public static boolean isAssignableFrom(Type[] types1, Type type2)
{
for (Type type : types1)
{
if (isAssignableFrom(type, type2))
{
return true;
}
}
return false;
}

public static boolean isSerializable(Class<?> clazz)
{
Expand Down
Expand Up @@ -10,9 +10,9 @@ public class ListInstance
@Any
Instance<List> instance;

public List get()
public Instance<List> get()
{
return instance.get();
return instance;
}

}

0 comments on commit b96e1fc

Please sign in to comment.