polygene-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Niclas Hedhman <nic...@hedhman.org>
Subject Re: Non-Accessible Public Method??
Date Fri, 09 Jun 2017 03:11:08 GMT
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 <niclas@hedhman.org> 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.ConcurrentModificationCheckConcern$
> ConcurrentCheckingEntityStoreUnitOfWork.entityStateOf(
> 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.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.$Proxy17.get(Unknown
> Source) at org.apache.polygene.test.entity.AbstractEntityStoreTest.
> givenEntityIsNotModifiedWhenUnitOfWorkCompletesThenDontStore
> State(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(
> RunAfters.java:27)
>
>
> On Wed, Jun 7, 2017 at 5:21 PM, Niclas Hedhman <niclas@hedhman.org> wrote:
>
>> Except!!!!  It is not that... It is something else...
>>
>> On Wed, Jun 7, 2017 at 3:40 PM, Niclas Hedhman <niclas@hedhman.org>
>> wrote:
>>
>>> Oh... some more;
>>>
>>>     PropertyMapper
>>>     CompositeAssemblyImpl
>>>
>>>
>>>
>>>
>>> On Wed, Jun 7, 2017 at 3:38 PM, Niclas Hedhman <niclas@hedhman.org>
>>> 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 <niclas@hedhman.org>
>>>> 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 <niclas@hedhman.org>
>>>>> 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

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message