Wow!!! If I had read the exception a bit clearer, I would probably have gotten this sooner.
The return type is not public, and since the _Stud is in a different class space, it is not accessible. Since I am probably one of the few in the world who don't make every class public, this is probably a small concern. But I will try to put in a more reasonable error message. Cheers Niclas On Fri, Jun 9, 2017 at 11:31 AM, Niclas Hedhman <[email protected]> wrote: > Noooo... That was the Proxy of the mixin, that had the application > classloader. Of course.... > > Continue to dig in this. > > On Fri, Jun 9, 2017 at 11:11 AM, Niclas Hedhman <[email protected]> > wrote: > >> Ok, so I have traced this down to; >> >> The private mixin sqlTable is loaded by the Application/System >> classloader, but the public mixin is loaded by the Fragment classloader. >> >> The test that I tried to replicate this problem, both are loaded with the >> Fragment classloader. >> >> So, there is something here that triggers/prevents the fragment >> classloader to be used. Should not be impossible to track that down. >> >> >> Cheers >> >> On Wed, Jun 7, 2017 at 6:00 PM, Niclas Hedhman <[email protected]> >> wrote: >> >>> >>> I am inclined to think it is somehow related to the classloaders. There >>> is one classloader per mixin type, which doesn't seem right. And I can't >>> manage to trigger it in a test either, although the code in question is not >>> that convoluted. >>> >>> In essence, 2 private Mixins inside a service, and one of them >>> (SqlTable) also refers to the other (jooqDslContext). Perhaps it really is >>> classloading issues, and maybe I have just found a breaking case. And the >>> course of action would be to work around the issue now, and schedule >>> ClassLoader renovation for 3.1 >>> >>> public class JooqEntityStoreMixin >>> implements EntityStore, EntityStoreSPI, ServiceActivation >>> { >>> >>> @This >>> private SqlTable sqlTable; >>> >>> @This >>> private JooqDslContext jooqDslContext; >>> >>> >>> @Override >>> public EntityState entityStateOf( EntityStoreUnitOfWork unitOfWork, >>> ModuleDescriptor module, EntityReference reference ) >>> { >>> BaseEntity baseEntity = sqlTable.fetchBaseEntity( reference, module ); >>> // Problem happens here... >>> >>> >>> >>> @Mixins( SqlTable.Mixin.class ) >>> public interface SqlTable >>> { >>> BaseEntity fetchBaseEntity( EntityReference reference, ModuleDescriptor >>> module ); >>> >>> >>> class Mixin >>> implements SqlTable, Initializable, TableFields >>> { >>> >>> @Structure >>> private Application application; >>> >>> @Structure >>> private ObjectFactory objectFactory; >>> >>> @This >>> private JooqDslContext dsl; >>> >>> @This >>> private Configuration<JooqEntityStoreConfiguration> configuration; >>> >>> @Uses >>> private ServiceDescriptor serviceDescriptor; >>> >>> @Service >>> private DataSource datasource; >>> >>> private Schema schema; >>> >>> private SQLDialect dialect; >>> >>> private EntitiesTable entitiesTable; >>> private TypesTable types; >>> >>> @Override >>> public BaseEntity fetchBaseEntity( EntityReference reference, >>> ModuleDescriptor module ) >>> { >>> return entitiesTable.fetchBaseEntity( reference, module ); >>> } >>> >>> >>> java.lang.IllegalAccessError: tried to access class >>> org.apache.polygene.entitystore.jooq.BaseEntity from class >>> org.apache.polygene.entitystore.jooq.SqlTable_Mixin_Stub >>> at >>> org.apache.polygene.entitystore.jooq.SqlTable_Mixin_Stub._fetchBaseEntity(Unknown >>> Source) >>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) >>> at >>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) >>> at >>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) >>> at java.lang.reflect.Method.invoke(Method.java:498) >>> at >>> org.apache.polygene.runtime.composite.TypedModifierInvocationHandler.invoke(TypedModifierInvocationHandler.java:37) >>> at >>> org.apache.polygene.runtime.composite.CompositeMethodInstance.invoke(CompositeMethodInstance.java:66) >>> at >>> org.apache.polygene.runtime.composite.TransientInstance.invoke(TransientInstance.java:124) >>> at >>> org.apache.polygene.runtime.composite.CompositeMethodModel.invoke(CompositeMethodModel.java:116) >>> at >>> org.apache.polygene.runtime.composite.CompositeMethodsModel.invoke(CompositeMethodsModel.java:119) >>> at >>> org.apache.polygene.runtime.composite.CompositeModel.invoke(CompositeModel.java:235) >>> at >>> org.apache.polygene.runtime.composite.TransientInstance.invoke(TransientInstance.java:60) >>> at com.sun.proxy.$Proxy50.fetchBaseEntity(Unknown Source) >>> at >>> org.apache.polygene.entitystore.jooq.JooqEntityStoreMixin.entityStateOf(JooqEntityStoreMixin.java:79) >>> at >>> org.apache.polygene.entitystore.jooq.JooqEntityStoreMixin_Stub._entityStateOf(Unknown >>> Source) >>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) >>> at >>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) >>> at >>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) >>> at java.lang.reflect.Method.invoke(Method.java:498) >>> at >>> org.apache.polygene.runtime.composite.TypedModifierInvocationHandler.invoke(TypedModifierInvocationHandler.java:37) >>> at >>> org.apache.polygene.runtime.composite.CompositeMethodInstance.invoke(CompositeMethodInstance.java:66) >>> at >>> org.apache.polygene.runtime.composite.TransientInstance.invoke(TransientInstance.java:124) >>> at >>> org.apache.polygene.runtime.composite.CompositeMethodModel.invoke(CompositeMethodModel.java:116) >>> at >>> org.apache.polygene.runtime.composite.CompositeMethodsModel.invoke(CompositeMethodsModel.java:119) >>> at >>> org.apache.polygene.runtime.composite.CompositeModel.invoke(CompositeModel.java:235) >>> at >>> org.apache.polygene.runtime.composite.TransientInstance.invokeComposite(TransientInstance.java:81) >>> at >>> org.apache.polygene.entitystore.jooq.JooqEntityStoreMixin_Stub.entityStateOf(Unknown >>> Source) >>> at >>> org.apache.polygene.spi.entitystore.DefaultEntityStoreUnitOfWork.entityStateOf(DefaultEntityStoreUnitOfWork.java:106) >>> >>> at org.apache.polygene.spi.entitystore.ConcurrentModificationCh >>> eckConcern$ConcurrentCheckingEntityStoreUnitOfWork.entitySta >>> teOf(ConcurrentModificationCheckConcern.java:189) at >>> org.apache.polygene.runtime.unitofwork.UnitOfWorkInstance.get(UnitOfWorkInstance.java:138) >>> at >>> org.apache.polygene.runtime.unitofwork.ModuleUnitOfWork.get(ModuleUnitOfWork.java:301) >>> at org.apache.polygene.runtime.unitofwork.ModuleUnitOfWork_Stub._get(Unknown >>> Source) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) >>> at >>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) >>> at >>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) >>> at java.lang.reflect.Method.invoke(Method.java:498) at >>> org.apache.polygene.runtime.composite.TypedModifierInvocatio >>> nHandler.invoke(TypedModifierInvocationHandler.java:37) at >>> org.apache.polygene.runtime.composite.CompositeMethodInstanc >>> e.invoke(CompositeMethodInstance.java:66) at >>> org.apache.polygene.runtime.composite.TransientInstance.invoke(TransientInstance.java:124) >>> at org.apache.polygene.runtime.composite.CompositeMethodModel.i >>> nvoke(CompositeMethodModel.java:116) at org.apache.polygene.runtime.co >>> mposite.CompositeMethodsModel.invoke(CompositeMethodsModel.java:119) at >>> org.apache.polygene.runtime.composite.CompositeModel.invoke(CompositeModel.java:235) >>> at >>> org.apache.polygene.runtime.composite.TransientInstance.invoke(TransientInstance.java:60) >>> at com.sun.proxy.$Proxy17.get(Unknown Source) at >>> org.apache.polygene.test.entity.AbstractEntityStoreTest.give >>> nEntityIsNotModifiedWhenUnitOfWorkCompletesThenDontStoreStat >>> e(AbstractEntityStoreTest.java:338) at >>> sun.reflect.NativeMethodAccessorImpl.invoke0(Native >>> Method) at >>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) >>> at >>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) >>> at java.lang.reflect.Method.invoke(Method.java:498) at >>> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) >>> at >>> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) >>> at >>> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) >>> at >>> org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) >>> at >>> org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) >>> at org.junit.internal.runners.statements.RunAfters.evaluate(Run >>> Afters.java:27) >>> >>> >>> On Wed, Jun 7, 2017 at 5:21 PM, Niclas Hedhman <[email protected]> >>> wrote: >>> >>>> Except!!!! It is not that... It is something else... >>>> >>>> On Wed, Jun 7, 2017 at 3:40 PM, Niclas Hedhman <[email protected]> >>>> wrote: >>>> >>>>> Oh... some more; >>>>> >>>>> PropertyMapper >>>>> CompositeAssemblyImpl >>>>> >>>>> >>>>> >>>>> >>>>> On Wed, Jun 7, 2017 at 3:38 PM, Niclas Hedhman <[email protected]> >>>>> wrote: >>>>> >>>>>> I find it in the following places (note to myself where to fix it >>>>>> later); >>>>>> >>>>>> TransientClassLoader ( 2 places ) >>>>>> FragmentClassLoader ( 2 places ) >>>>>> ConstructorsModel (2 places) >>>>>> CompositeModel >>>>>> CompositeMethodModel >>>>>> >>>>>> I also suspect that the "check for public" in AccessibleObjects >>>>>> helper should just not be done. >>>>>> >>>>>> >>>>>> Since this is happening during startup, I suspect that you had other >>>>>> reason than performance to make this change. Would like to hear about it. >>>>>> >>>>>> >>>>>> Cheers >>>>>> >>>>>> >>>>>> >>>>>> On Wed, Jun 7, 2017 at 3:31 PM, Niclas Hedhman <[email protected]> >>>>>> wrote: >>>>>> >>>>>>> >>>>>>> So Paul, in commit 40d8d6de0c4c459d09ffad31110b3057d175536a you >>>>>>> removed setAccessible(true) in CompositeMethodModel, on the basis that >>>>>>> it >>>>>>> is not needed. After all, the method is from an interface and public by >>>>>>> default. >>>>>>> >>>>>>> But that is for some reason not true. >>>>>>> >>>>>>> https://drive.google.com/open?id=0B1oCChgcqYT7RVhvMG1oaHBJQXc >>>>>>> https://drive.google.com/open?id=0B1oCChgcqYT7YlRDZnRXc2VBcnc >>>>>>> >>>>>>> >>>>>>> and for completeness >>>>>>> >>>>>>> public interface SqlTable >>>>>>> { >>>>>>> BaseEntity fetchBaseEntity( EntityReference reference, >>>>>>> ModuleDescriptor module ); >>>>>>> >>>>>>> >>>>>>> >>>>>>> So, I have no idea why a public interface method is not >>>>>>> "accessible", perhaps it is something new, or something leaking from >>>>>>> Java 9. >>>>>>> >>>>>>> I am also very concerned that our tests don't catch this. I will try >>>>>>> to reproduce this for test setting prior to adding the "set accessible" >>>>>>> to >>>>>>> the above place. Additionally, were there any other locations where this >>>>>>> was changed? >>>>>>> >>>>>>> >>>>>>> >>>>>>> Cheers >>>>>>> >>>>>>> On Wed, Jun 7, 2017 at 3:01 PM, Niclas Hedhman <[email protected]> >>>>>>> wrote: >>>>>>> >>>>>>>> >>>>>>>> Uhhh.... I have just found this particularly interesting situation; >>>>>>>> >>>>>>>> https://drive.google.com/file/d/0B1oCChgcqYT7a2N5RktQNWlSQnM/view >>>>>>>> https://drive.google.com/open?id=0B1oCChgcqYT7aEJSeW9NdFUwaWM >>>>>>>> >>>>>>>> >>>>>>>> The method has "public" modifiers (it is public in the code), but >>>>>>>> the "isAccessible()" is reporting false. >>>>>>>> >>>>>>>> Anybody has any ideas on how this is possible? Is there anywhere we >>>>>>>> change "accessible" to false? >>>>>>>> >>>>>>>> Cheers >>>>>>>> -- >>>>>>>> Niclas Hedhman, Software Developer >>>>>>>> http://polygene.apache.org - New Energy for Java >>>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> Niclas Hedhman, Software Developer >>>>>>> http://polygene.apache.org - New Energy for Java >>>>>>> >>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> Niclas Hedhman, Software Developer >>>>>> http://polygene.apache.org - New Energy for Java >>>>>> >>>>> >>>>> >>>>> >>>>> -- >>>>> Niclas Hedhman, Software Developer >>>>> http://polygene.apache.org - New Energy for Java >>>>> >>>> >>>> >>>> >>>> -- >>>> Niclas Hedhman, Software Developer >>>> http://polygene.apache.org - New Energy for Java >>>> >>> >>> >>> >>> -- >>> Niclas Hedhman, Software Developer >>> http://polygene.apache.org - New Energy for Java >>> >> >> >> >> -- >> Niclas Hedhman, Software Developer >> http://polygene.apache.org - New Energy for Java >> > > > > -- > Niclas Hedhman, Software Developer > http://polygene.apache.org - New Energy for Java > -- Niclas Hedhman, Software Developer http://polygene.apache.org - New Energy for Java
