[
https://issues.apache.org/jira/browse/TAP5-2032?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Jochen Kemnade updated TAP5-2032:
---------------------------------
Description:
We have the following interfaces / classes
{code:java}
public interface IPersonWithRoleAssociation<A> extends
IEntityAssociationWithInfo<A, Person> {
PersonRole getRole();
void setRole(PersonRole role);
}
public interface IEntityAssociationWithInfo<P, C> {
P getParent();
void setParent(P parent);
C getChild();
void setChild(C child);
}
public class Person implements Serializable {
....
String name;
public String getName() {
return name;
}
}
{code}
and the page:
{code:java}
public class EditPersonsWithRoles {
@Property(write=false) IPersonWithRoleAssociation<A> personWithRole;
}
{code}
and the template snippet:
{code:html}
<t:textfield t:id="personSex" t:value="personWithRole.child.name"/>
{code}
Leads to the following exception:
{noformat}
Exception generating conduit for expression 'personWithRole.child.name': ...
...
Caused by: java.lang.ArrayIndexOutOfBoundsException: 1
at
org.apache.tapestry5.ioc.internal.util.GenericsUtils.resolve(GenericsUtils.java:388)
~[tapestry-ioc-5.3.6.jar:na]
at
org.apache.tapestry5.ioc.internal.util.GenericsUtils.resolve(GenericsUtils.java:128)
~[tapestry-ioc-5.3.6.jar:na]
at
org.apache.tapestry5.ioc.internal.util.GenericsUtils.extractActualType(GenericsUtils.java:74)
~[tapestry-ioc-5.3.6.jar:na]
at
org.apache.tapestry5.internal.services.PropertyConduitSourceImpl$PropertyConduitBuilder.buildGetterMethodAccessTerm(PropertyConduitSourceImpl.java:1119)
~[tapestry-core-5.3.6.jar:na]
{noformat}
At GenericsUtils.java:388 we have:
{code:java}
resolved = ((ParameterizedType) t).getActualTypeArguments()[i];
{code}
where:
{code:java}
i = 1
resolved = C
((ParameterizedType) t).getActualTypeArguments() =
[org.topfive.entities.IPersonWithRoleAssociation<P>]
{code}
so the problem seems to be that the code assumes that it can find the type
information for C as the second generic parameter for
IPersonWithRoleAssociation, when in fact is is the second generic parameter for
the superclass IEntityAssociationWithInfo which IPersonWithRoleAssociation
extends and passes C explicitly (Person). Everything is fine, if I use a marker
interface for Person (IPerson) and declare:
{code:java}
public interface IPersonWithRoleAssociation<A, P extends IPerson> extends
IEntityAssociationWithInfo<A, P>
{code}
was:
We have the following interfaces / classes
public interface IPersonWithRoleAssociation<A> extends
IEntityAssociationWithInfo<A, Person> {
PersonRole getRole();
void setRole(PersonRole role);
}
public interface IEntityAssociationWithInfo<P, C> {
P getParent();
void setParent(P parent);
C getChild();
void setChild(C child);
}
public class Person implements Serializable {
....
String name;
public String getName() {
return name;
}
}
and the page:
public class EditPersonsWithRoles {
@Property(write=false) IPersonWithRoleAssociation<A> personWithRole;
}
and the template snippet:
<t:textfield t:id="personSex" t:value="personWithRole.child.name"/>
Leads to the following exception:
Exception generating conduit for expression 'personWithRole.child.name': ...
...
Caused by: java.lang.ArrayIndexOutOfBoundsException: 1
at
org.apache.tapestry5.ioc.internal.util.GenericsUtils.resolve(GenericsUtils.java:388)
~[tapestry-ioc-5.3.6.jar:na]
at
org.apache.tapestry5.ioc.internal.util.GenericsUtils.resolve(GenericsUtils.java:128)
~[tapestry-ioc-5.3.6.jar:na]
at
org.apache.tapestry5.ioc.internal.util.GenericsUtils.extractActualType(GenericsUtils.java:74)
~[tapestry-ioc-5.3.6.jar:na]
at
org.apache.tapestry5.internal.services.PropertyConduitSourceImpl$PropertyConduitBuilder.buildGetterMethodAccessTerm(PropertyConduitSourceImpl.java:1119)
~[tapestry-core-5.3.6.jar:na]
At GenericsUtils.java:388 we have:
resolved = ((ParameterizedType) t).getActualTypeArguments()[i];
where:
i = 1
resolved = C
((ParameterizedType) t).getActualTypeArguments() =
[org.topfive.entities.IPersonWithRoleAssociation<P>]
so the problem seems to be that the code assumes that it can find the type
information for C as the second generic parameter for
IPersonWithRoleAssociation, when in fact is is the second generic parameter for
the superclass IEntityAssociationWithInfo which IPersonWithRoleAssociation
extends and passes C explicitly (Person). Everything is fine, if I use a marker
interface for Person (IPerson) and declare:
public interface IPersonWithRoleAssociation<A, P extends IPerson> extends
IEntityAssociationWithInfo<A, P>
> GenericsUtils does not handle generics properly when extracting the actual
> type
> -------------------------------------------------------------------------------
>
> Key: TAP5-2032
> URL: https://issues.apache.org/jira/browse/TAP5-2032
> Project: Tapestry 5
> Issue Type: Bug
> Components: tapestry-ioc
> Affects Versions: 5.3.6, 5.5.0
> Reporter: DI Florian Hackenberger
> Assignee: Thiago H. de Paula Figueiredo
>
> We have the following interfaces / classes
> {code:java}
> public interface IPersonWithRoleAssociation<A> extends
> IEntityAssociationWithInfo<A, Person> {
> PersonRole getRole();
> void setRole(PersonRole role);
> }
> public interface IEntityAssociationWithInfo<P, C> {
> P getParent();
> void setParent(P parent);
> C getChild();
> void setChild(C child);
> }
> public class Person implements Serializable {
> ....
> String name;
> public String getName() {
> return name;
> }
> }
> {code}
> and the page:
> {code:java}
> public class EditPersonsWithRoles {
> @Property(write=false) IPersonWithRoleAssociation<A> personWithRole;
> }
> {code}
> and the template snippet:
> {code:html}
> <t:textfield t:id="personSex" t:value="personWithRole.child.name"/>
> {code}
> Leads to the following exception:
> {noformat}
> Exception generating conduit for expression 'personWithRole.child.name': ...
> ...
> Caused by: java.lang.ArrayIndexOutOfBoundsException: 1
> at
> org.apache.tapestry5.ioc.internal.util.GenericsUtils.resolve(GenericsUtils.java:388)
> ~[tapestry-ioc-5.3.6.jar:na]
> at
> org.apache.tapestry5.ioc.internal.util.GenericsUtils.resolve(GenericsUtils.java:128)
> ~[tapestry-ioc-5.3.6.jar:na]
> at
> org.apache.tapestry5.ioc.internal.util.GenericsUtils.extractActualType(GenericsUtils.java:74)
> ~[tapestry-ioc-5.3.6.jar:na]
> at
> org.apache.tapestry5.internal.services.PropertyConduitSourceImpl$PropertyConduitBuilder.buildGetterMethodAccessTerm(PropertyConduitSourceImpl.java:1119)
> ~[tapestry-core-5.3.6.jar:na]
> {noformat}
> At GenericsUtils.java:388 we have:
> {code:java}
> resolved = ((ParameterizedType) t).getActualTypeArguments()[i];
> {code}
> where:
> {code:java}
> i = 1
> resolved = C
> ((ParameterizedType) t).getActualTypeArguments() =
> [org.topfive.entities.IPersonWithRoleAssociation<P>]
> {code}
> so the problem seems to be that the code assumes that it can find the type
> information for C as the second generic parameter for
> IPersonWithRoleAssociation, when in fact is is the second generic parameter
> for the superclass IEntityAssociationWithInfo which
> IPersonWithRoleAssociation extends and passes C explicitly (Person).
> Everything is fine, if I use a marker interface for Person (IPerson) and
> declare:
> {code:java}
> public interface IPersonWithRoleAssociation<A, P extends IPerson> extends
> IEntityAssociationWithInfo<A, P>
> {code}
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)