Skip to content

Commit

Permalink
WELD-671
Browse files Browse the repository at this point in the history
  • Loading branch information
pmuir committed Sep 6, 2010
1 parent 9ccd658 commit 90ddf36
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 21 deletions.
Expand Up @@ -70,7 +70,16 @@ public Map<Class<?>, Type> getTypeMap()
private void init()
{
this.types = HashBiMap.create();
discoverTypes(type);
try
{
discoverTypes(type);
}
catch (StackOverflowError e)
{
System.out.println("type" + type);
Thread.dumpStack();
throw e;
}
}

public Type getResolvedType()
Expand Down Expand Up @@ -129,10 +138,10 @@ private void discoverFromClass(Class<?> clazz)
{
try
{
discoverTypes(resolveType(type, clazz.getGenericSuperclass()));
discoverTypes(resolveType(type, type, clazz.getGenericSuperclass()));
for (Type c : clazz.getGenericInterfaces())
{
discoverTypes(resolveType(type, c));
discoverTypes(resolveType(type, type, c));
}
}
catch (AccessControlException e)
Expand All @@ -150,7 +159,7 @@ private void discoverFromClass(Class<?> clazz)
* @param type
* @return actual type
*/
private Type resolveType(Type beanType, Type type)
private Type resolveType(Type beanType, Type beanType2, Type type)
{
if (type instanceof ParameterizedType)
{
Expand All @@ -160,19 +169,19 @@ private Type resolveType(Type beanType, Type type)
}
if (beanType instanceof Class<?>)
{
return resolveType(((Class<?>) beanType).getGenericSuperclass(), type);
return resolveType(((Class<?>) beanType).getGenericSuperclass(), beanType2, type);
}
}

if (type instanceof TypeVariable<?>)
{
if (beanType instanceof ParameterizedType)
{
return resolveTypeParameter((ParameterizedType) beanType, (TypeVariable<?>) type);
return resolveTypeParameter((ParameterizedType) beanType, beanType2, (TypeVariable<?>) type);
}
if (beanType instanceof Class<?>)
{
return resolveType(((Class<?>) beanType).getGenericSuperclass(), type);
return resolveType(((Class<?>) beanType).getGenericSuperclass(), beanType2, type);
}
}
return type;
Expand All @@ -183,46 +192,49 @@ private Type resolveParameterizedType(ParameterizedType beanType, ParameterizedT
Type rawType = parameterizedType.getRawType();
Type[] actualTypes = parameterizedType.getActualTypeArguments();

Type resolvedRawType = resolveType(beanType, rawType);
Type resolvedRawType = resolveType(beanType, beanType, rawType);
Type[] resolvedActualTypes = new Type[actualTypes.length];

for (int i = 0; i < actualTypes.length; i++)
{
resolvedActualTypes[i] = resolveType(beanType, actualTypes[i]);
resolvedActualTypes[i] = resolveType(beanType, beanType, actualTypes[i]);
}
// reconstruct ParameterizedType by types resolved TypeVariable.
return new ParameterizedTypeImpl(resolvedRawType, resolvedActualTypes, parameterizedType.getOwnerType());
}

private Type resolveTypeParameter(ParameterizedType beanType, TypeVariable<?> typeVariable)
private Type resolveTypeParameter(ParameterizedType type, Type beanType, TypeVariable<?> typeVariable)
{
// step1. raw type
Class<?> actualType = (Class<?>) beanType.getRawType();
Class<?> actualType = (Class<?>) type.getRawType();
TypeVariable<?>[] typeVariables = actualType.getTypeParameters();
Type[] actualTypes = beanType.getActualTypeArguments();
Type[] actualTypes = type.getActualTypeArguments();
for (int i = 0; i < typeVariables.length; i++)
{
if (typeVariables[i].equals(typeVariable) && !actualTypes[i].equals(typeVariable))
{
return resolveType(type, actualTypes[i]);
return resolveType(this.type, beanType, actualTypes[i]);
}
}

// step2. generic super class
Type genericSuperType = actualType.getGenericSuperclass();
Type type = resolveType(genericSuperType, typeVariable);
if (!(type instanceof TypeVariable<?>))
Type resolvedGenericSuperType = resolveType(genericSuperType, beanType, typeVariable);
if (!(resolvedGenericSuperType instanceof TypeVariable<?>))
{
return type;
return resolvedGenericSuperType;
}

// step3. generic interfaces
for (Type interfaceType : actualType.getGenericInterfaces())
if (beanType instanceof ParameterizedType)
{
Type resolvedType = resolveType(interfaceType, typeVariable);
if (!(resolvedType instanceof TypeVariable<?>))
for (Type interfaceType : ((Class<?>) ((ParameterizedType) beanType).getRawType()).getGenericInterfaces())
{
return resolvedType;
Type resolvedType = resolveType(interfaceType, interfaceType, typeVariable);
if (!(resolvedType instanceof TypeVariable<?>))
{
return resolvedType;
}
}
}

Expand Down
@@ -0,0 +1,10 @@
package org.jboss.weld.tests.unit.reflection.clazz;

import java.util.Map;

public interface AdvancedMap<K, V> extends Map<K, V>
{

public ReallyAdvancedMap<K, V> getReallyAdvancedMap();

}
@@ -0,0 +1,6 @@
package org.jboss.weld.tests.unit.reflection.clazz;

public interface ReallyAdvancedMap<K, V> extends AdvancedMap<K, V>
{

}
Expand Up @@ -17,7 +17,10 @@
package org.jboss.weld.tests.unit.reflection.clazz;

import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import javax.enterprise.inject.Stereotype;
Expand All @@ -28,7 +31,7 @@
import org.jboss.weld.introspector.jlr.WeldClassImpl;
import org.jboss.weld.metadata.TypeStore;
import org.jboss.weld.resources.ClassTransformer;
import org.jboss.weld.util.reflection.instantiation.InstantiatorFactory;
import org.jboss.weld.util.reflection.HierarchyDiscovery;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
Expand Down Expand Up @@ -113,5 +116,14 @@ public void testEmpty()
WeldClass<Antelope> classWithNoAnnotations = WeldClassImpl.of(Antelope.class, transformer);
Assert.assertEquals(0, classWithNoAnnotations.getAnnotations().size());
}

@Test
public void testStackOverflow() throws Throwable
{
Type type = AdvancedMap.class.getMethod("getReallyAdvancedMap").getGenericReturnType();
HierarchyDiscovery discovery = new HierarchyDiscovery(type);

discovery.getTypeClosure();
}

}

0 comments on commit 90ddf36

Please sign in to comment.