[prev in list] [next in list] [prev in thread] [next in thread]
List: tapestry-dev
Subject: svn commit: r533824 - in /tapestry/tapestry4/trunk/tapestry-framework/src:
From: jkuhnert () apache ! org
Date: 2007-04-30 18:57:22
Message-ID: 20070430185722.6E4D91A9838 () eris ! apache ! org
[Download RAW message or body]
Author: jkuhnert
Date: Mon Apr 30 11:57:21 2007
New Revision: 533824
URL: http://svn.apache.org/viewvc?view=rev&rev=533824
Log:
Fixes TAPESTRY-1410 (again). Wasn't handling nested generics parameter types when \
doing class resolution. Now handles infinite levels of recursive type specifiers.
Modified:
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/enhance/GenericsMethodSignatureImpl.java
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/enhance/InjectObjectWorker.java
tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/MethodSignatureTest.java
Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/enhance/GenericsMethodSignatureImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java \
/org/apache/tapestry/enhance/GenericsMethodSignatureImpl.java?view=diff&rev=533824&r1=533823&r2=533824
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/enhance/GenericsMethodSignatureImpl.java \
(original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/enhance/GenericsMethodSignatureImpl.java \
Mon Apr 30 11:57:21 2007 @@ -50,20 +50,61 @@
TypeVariable tvar = (TypeVariable)ret;
ParameterizedType param = \
(ParameterizedType)type.getGenericSuperclass();
+ Class resolvedType = resolveType(param, tvar);
+ if (resolvedType != null)
+ return resolvedType;
+ /*
if (param.getActualTypeArguments().length > 0) {
for (int i = 0; i < tvar.getBounds().length; i++) {
-
+ System.out.println("bounds value class is: " + \
tvar.getBounds()[i].getClass()); + Type t = tvar.getBounds()[i];
+ if (ParameterizedType.class.isInstance(t)) {
+ ParameterizedType pt = (ParameterizedType)t;
+
+ //System.out.println("bounds param type arguments are: " + \
pt.getActualTypeArguments()[0].getClass() + " and param type arguments are: " + \
param.getA); + }
+
Class resolvedType = findType(param.getActualTypeArguments(), \
(Class)tvar.getBounds()[i]); if (resolvedType != null)
return resolvedType;
}
- }
+ }*/
}
return m.getReturnType();
}
+ static Class resolveType(ParameterizedType param, TypeVariable var)
+ {
+ if (param.getActualTypeArguments().length < 1)
+ return null;
+
+ for (int i=0; i < var.getBounds().length; i++) {
+
+ Type t = var.getBounds()[i];
+ Class resolvedType = null;
+ if (ParameterizedType.class.isInstance(t)) {
+
+ ParameterizedType pparam = (ParameterizedType)t;
+ for (int e=0; e < pparam.getActualTypeArguments().length; e++) {
+ if \
(!TypeVariable.class.isInstance(pparam.getActualTypeArguments()[e])) + \
continue; +
+ resolvedType = resolveType(pparam, \
(TypeVariable)pparam.getActualTypeArguments()[e]); + }
+ } else {
+
+ resolvedType = findType(param.getActualTypeArguments(), (Class)t);
+ }
+
+ if (resolvedType != null)
+ return resolvedType;
+ }
+
+ return null;
+ }
+
static Class findType(Type[] types, Class type)
{
for (int i = 0; i < types.length; i++) {
@@ -90,9 +131,14 @@
if (TypeVariable.class.isInstance(genTypes[i])) {
- TypeVariable tvar = (TypeVariable)genTypes[i];
+ Class resolved = resolveType(param, (TypeVariable)genTypes[i]);
+ System.out.println("Resolved parameter type is : " + resolved);
+
+ /* TypeVariable tvar = (TypeVariable)genTypes[i];
for (int p = 0; p < tvar.getBounds().length; p++) {
+ //System.out.println("Bounds parameter type is: " + \
tvar.getBounds()[p].getClass()); +
Class resolvedType = \
findType(param.getActualTypeArguments(), (Class)tvar.getBounds()[p]); if \
(resolvedType != null) { types[i] = resolvedType;
@@ -100,6 +146,10 @@
}
types[i] = m.getParameterTypes()[i];
+ }*/
+ if (resolved != null) {
+ types[i] = resolved;
+ continue;
}
}
Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/enhance/InjectObjectWorker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java \
/org/apache/tapestry/enhance/InjectObjectWorker.java?view=diff&rev=533824&r1=533823&r2=533824
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/enhance/InjectObjectWorker.java \
(original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/enhance/InjectObjectWorker.java \
Mon Apr 30 11:57:21 2007 @@ -14,8 +14,6 @@
package org.apache.tapestry.enhance;
-import java.lang.reflect.Modifier;
-
import org.apache.hivemind.ApplicationRuntimeException;
import org.apache.hivemind.Location;
import org.apache.hivemind.service.MethodSignature;
@@ -23,6 +21,8 @@
import org.apache.tapestry.services.InjectedValueProvider;
import org.apache.tapestry.spec.InjectSpecification;
+import java.lang.reflect.Modifier;
+
/**
* Implementation for injection type "object" (the default). Adds read-only
* properties to the enhanced class that contain objects injected from HiveMind.
@@ -53,7 +53,8 @@
Defense.notNull(objectReference, "objectReference");
Class propertyType = op.getPropertyType(propertyName);
- if (propertyType == null) propertyType = Object.class;
+ if (propertyType == null)
+ propertyType = Object.class;
op.claimReadonlyProperty(propertyName);
@@ -63,10 +64,9 @@
throw new ApplicationRuntimeException(EnhanceMessages
.locatedValueIsNull(objectReference), location, null);
- if (!propertyType.isAssignableFrom(injectedValue.getClass()))
- throw new ApplicationRuntimeException(EnhanceMessages
- .incompatibleInjectType(objectReference, injectedValue,
- propertyType), location, null);
+ if (!propertyType.isInstance(injectedValue))
+ throw new \
ApplicationRuntimeException(EnhanceMessages.incompatibleInjectType(objectReference, \
injectedValue, propertyType), + location, null);
String fieldName = op.addInjectedField("_$" + propertyName,
propertyType, injectedValue);
Modified: tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/MethodSignatureTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test \
/org/apache/tapestry/enhance/MethodSignatureTest.java?view=diff&rev=533824&r1=533823&r2=533824
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/MethodSignatureTest.java \
(original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/MethodSignatureTest.java \
Mon Apr 30 11:57:21 2007 @@ -113,7 +113,7 @@
public void test_Generic_Method_Hash() {
- Class testClass=MyTest.class;
+ Class testClass = MyTest.class;
Method[] methods = testClass.getMethods();
@@ -122,11 +122,17 @@
MethodSignatureImpl msi = new GenericsMethodSignatureImpl(testClass, \
method); msi.hashCode();
}
+
+ ClassInspector ins = new GenericsClassInspectorImpl();
+ MethodSignature sig = ins.getPropertyAccessor(MyTest.class, \
"relativeObject"); +
+ assert sig.getReturnType() != null;
+ assertEquals(sig.getReturnType(), BaseTest.class);
}
public static abstract class BaseTest<T>{ }
- public static abstract class MyTest<T,E>extends BaseTest<T> {
+ public static abstract class MyTest<T,E extends BaseTest<T>> extends BaseTest<T> \
{
public abstract E getRelativeObject();
public abstract void setRelativeObject(E e);
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic