> It appears as though the interface methods are getting copied into the 
> transformed class which causes the wrong return type to be found when doing 
> any reflection.

I found my problem and it's in the jdk5/6 implementation of
Introspector, not tapestry.

http://bugs.sun.com/view_bug.do?bug_id=6528714

I'm adding code to ClassPropertyAdapterImpl that detects when the
Introspector returns a synthetic method and grabs the most specific
version (calls getDeclaredClass() with the same method name). You
could theoretically have multiple synthetic methods if you implement
an interface that extends a hierarchy of interfaces that each redefine
the same method using multiple levels of specificity.

Here is the specific diff for this change.
http://codereview.appspot.com/2140047/diff/17001/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/ClassPropertyAdapterImpl.java?context=10&column_width=120

Josh

On Sun, Sep 12, 2010 at 11:05 AM, Josh Canfield <[email protected]> wrote:
> Found a couple issues with pages that implement generic interfaces. It 
> appears as though the interface methods are getting copied into the 
> transformed class which causes the wrong return type to be found when doing 
> any reflection. The screwy thing is that both methods are in the class but 
> with different return types. Even screwier is that the order that the methods 
> are declared in the class changes reliably depending on how the page class is 
> first accessed. If I hit the page directly it works fine, but going through a 
> link the methods are ordered differently and the interface method is returned.
>
> I'm working on figuring out why the interface methods are added to the class 
> but I'm away from my computer for the next several hours so I thought I'd put 
> this out there in case someone was looking at my patch.
>
> Or, maybe someone can tell me why and I won't have to track it down!
>
> -- Josh
>
> On Sep 11, 2010, at 4:38 PM, Igor Drobiazko <[email protected]> wrote:
>
>> Hi Josh,
>>
>> looks promising. I applied the patch and was able run the build
>> successfully. More comments follow tomorrow.
>>
>> On Sat, Sep 11, 2010 at 6:52 AM, <[email protected]> wrote:
>>
>>> Reviewers: dev_tapestry.apache.org,
>>>
>>> Description:
>>> Added support for injected generic services. You can now implement the
>>> same service interface multiple times with different type parameters,
>>> and inject it using the generic interface.
>>> Made Loop generic and added public getters for index and value. No more
>>> need to add properties to the page or use the var binding for simple
>>> object rendering loops.
>>> Updated PropertyWorker, Transform* to copy generic field signature to
>>> created getter.
>>> Updated GenericsUtils/PropertyConduitSourceImpl to more fully support
>>> wildcard and parameterized types.
>>> Added tests for everything
>>>
>>> Please review this at http://codereview.appspot.com/2140047/
>>>
>>> Affected files:
>>>
>>> tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Loop.java
>>>
>>> tapestry-core/src/main/java/org/apache/tapestry5/internal/services/DefaultInjectionProvider.java
>>>
>>> tapestry-core/src/main/java/org/apache/tapestry5/internal/services/InternalClassTransformationImpl.java
>>>
>>> tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PropertyConduitSourceImpl.java
>>>
>>> tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ServiceInjectionProvider.java
>>>
>>> tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/PropertyWorker.java
>>>
>>> tapestry-core/src/main/java/org/apache/tapestry5/services/TransformField.java
>>>
>>> tapestry-core/src/main/java/org/apache/tapestry5/services/TransformMethodSignature.java
>>> tapestry-core/src/test/app1/GenericLoopDemo.tml
>>>
>>> tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/LoopTests.java
>>>
>>> tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/base/GenericLister.java
>>>
>>> tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/data/ExoticPet.java
>>>
>>> tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/data/Person.java
>>>
>>> tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/data/Pet.java
>>>
>>> tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/data/SubscribeData.java
>>>
>>> tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/data/ToDoItem.java
>>>
>>> tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/BaseGenericLoopDemo.java
>>>
>>> tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/GenericLoopDemo.java
>>>
>>> tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java
>>>
>>> tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/PersonLister.java
>>>
>>> tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/PetLister.java
>>>
>>> tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/ToDoList.java
>>>
>>> tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/services/AppModule.java
>>>
>>> tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/services/GenericDatabase.java
>>>
>>> tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/services/GenericDatabaseImpl.java
>>>
>>> tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/services/GenericDatabaseItem.java
>>>
>>> tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/services/PersonDatabaseImpl.java
>>>
>>> tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/services/PetDatabase.java
>>>
>>> tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/services/PetDatabaseImpl.java
>>>
>>> tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/services/ToDoDatabase.java
>>>
>>> tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/services/ToDoDatabaseImpl.java
>>>
>>> tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/services/TypedObjectDatabase.java
>>>
>>> tapestry-core/src/test/java/org/apache/tapestry5/internal/services/PropertyConduitSourceImplTest.java
>>>
>>> tapestry-core/src/test/java/org/apache/tapestry5/internal/test/InternalBaseTestCase.java
>>>
>>> tapestry-core/src/test/resources/org/apache/tapestry5/integration/app1/base/GenericLister.tml
>>> tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/ObjectLocator.java
>>>
>>> tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/DefaultModuleDefImpl.java
>>>
>>> tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/IOCInternalTestCase.java
>>>
>>> tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/IOCMessages.java
>>>
>>> tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/InternalRegistry.java
>>>
>>> tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/InternalServiceDef.java
>>> tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/Module.java
>>>
>>> tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ModuleImpl.java
>>>
>>> tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ObjectLocatorImpl.java
>>>
>>> tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/RegistryImpl.java
>>>
>>> tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/RegistryWrapper.java
>>>
>>> tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ServiceDefImpl.java
>>>
>>> tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/MasterObjectProviderImpl.java
>>>
>>> tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/GenericsUtils.java
>>>
>>> tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/InternalUtils.java
>>>
>>> tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/MasterObjectProvider.java
>>> tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/test/IOCTestCase.java
>>>
>>> tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/ServiceBuilderMethodInvokerTest.java
>>>
>>> tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/MasterObjectProviderImplTest.java
>>>
>>> tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/util/BaseGenericBean.java
>>>
>>> tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/util/GenericUtilsTest.java
>>>
>>> tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/util/GenericsAssumptionsTest.java
>>>
>>> tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/util/NonGenericBean.java
>>>
>>> tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/util/Pair.java
>>>
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: [email protected]
>>> For additional commands, e-mail: [email protected]
>>>
>>>
>>
>>
>> --
>> Best regards,
>>
>> Igor Drobiazko
>> http://tapestry5.de
>



-- 
--
http://www.bodylabgym.com - a private, by appointment only, one-on-one
health and fitness facility.
--
http://www.ectransition.com - Quality Electronic Cigarettes at a
reasonable price!
--
TheDailyTube.com. Sign up and get the best new videos on the internet
delivered fresh to your inbox.

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to