> 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]
