ebean-orm-tools / ebean-gradle-plugin

Plugin that performs Enhancement (entity, transactional, query bean) and can generate query beans from entity beans written in Kotlin via kapt
Apache License 2.0
10 stars 12 forks source link

Java record support #30

Closed apflieger closed 4 years ago

apflieger commented 4 years ago

Hi 👋

I am trying to put some java records in my code and found that the plugin now prints an exception when executing:

ebean-enhance> cls: com/meetinclass/controllers/routes$RouteEntry  msg: Error during transform java.lang.UnsupportedOperationException: This feature requires ASM8_EXPERIMENTAL
java.lang.UnsupportedOperationException: This feature requires ASM8_EXPERIMENTAL
        at io.ebean.enhance.asm.ClassVisitor.visitRecordComponentExperimental(ClassVisitor.java:304)
        at io.ebean.enhance.asm.ClassReader.readRecordComponent(ClassReader.java:929)
        at io.ebean.enhance.asm.ClassReader.accept(ClassReader.java:704)
        at io.ebean.enhance.asm.ClassReader.accept(ClassReader.java:401)
        at io.ebean.enhance.Transformer.detect(Transformer.java:373)
        at io.ebean.enhance.Transformer.enhanceEntityAndTransactional(Transformer.java:220)
        at io.ebean.enhance.Transformer.transform(Transformer.java:180)
        at java_lang_instrument_ClassFileTransformer$transform.call(Unknown Source)
        at io.ebean.gradle.EbeanEnhancer$_enhanceClassFile_closure2.doCall(EbeanEnhancer.groovy:90)
        at jdk.internal.reflect.GeneratedMethodAccessor725.invoke(Unknown Source)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:564)
        at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:101)
        at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323)
        at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:263)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1041)
        at groovy.lang.Closure.call(Closure.java:405)
        at groovy.lang.Closure.call(Closure.java:421)
        at org.codehaus.groovy.runtime.IOGroovyMethods.withStream(IOGroovyMethods.java:1185)
        at org.codehaus.groovy.runtime.ResourceGroovyMethods.withInputStream(ResourceGroovyMethods.java:1853)
        at org.codehaus.groovy.runtime.dgm$1076.invoke(Unknown Source)
        at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:244)
        at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:53)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:127)
        at io.ebean.gradle.EbeanEnhancer.enhanceClassFile(EbeanEnhancer.groovy:82)
        at jdk.internal.reflect.GeneratedMethodAccessor723.invoke(Unknown Source)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:564)
        at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:101)
        at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323)
        at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:351)
        at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:64)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:168)
        at io.ebean.gradle.EbeanEnhancer$_enhance_closure1.doCall(EbeanEnhancer.groovy:42)
        at jdk.internal.reflect.GeneratedMethodAccessor722.invoke(Unknown Source)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:564)
        at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:101)
        at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323)
        at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:263)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1041)
        at groovy.lang.Closure.call(Closure.java:405)
        at groovy.lang.Closure.call(Closure.java:421)
        at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2330)
        at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2315)
        at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2356)
        at org.codehaus.groovy.runtime.dgm$186.invoke(Unknown Source)
        at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:244)
        at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:53)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:127)
        at io.ebean.gradle.EbeanEnhancer.enhance(EbeanEnhancer.groovy:41)
        at io.ebean.gradle.EbeanEnhancer$enhance.call(Unknown Source)
        at io.ebean.gradle.EnhancePlugin$_enhanceTaskOutputs_closure7.doCall(EnhancePlugin.groovy:128)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:564)
        at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:101)
        at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323)
        at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:263)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1041)
        at groovy.lang.Closure.call(Closure.java:405)
        at groovy.lang.Closure.call(Closure.java:421)
        at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2330)
        at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2315)
        at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2368)
        at org.codehaus.groovy.runtime.dgm$188.invoke(Unknown Source)
        at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:244)
        at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:53)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:115)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:127)
        at io.ebean.gradle.EnhancePlugin.enhanceTaskOutputs(EnhancePlugin.groovy:123)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:564)
        at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:101)
        at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323)
        at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:351)
        at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:64)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:184)
        at io.ebean.gradle.EnhancePlugin$_tryHookCompilerTask_closure5.doCall(EnhancePlugin.groovy:98)

2 points:

rbygrave commented 4 years ago

The ASM library (embedded and repackaged) in ebean-agent will need an update.

Enhancement needs in examine classes for @Transactional and query beans. The packages checked/read for enhancement is generally determined automatically by code generated by query beans generator these days (so we don't specify that manually any more).

So really need to update ebean-agent with later ASM code.

rbygrave commented 4 years ago

Effectively this is https://github.com/ebean-orm/ebean-agent/issues/149 Fixed in ebean-agent 12.3.2

rbygrave commented 4 years ago

Fixed in 12.3.2 of this plugin by bumping the ebean-agent to 12.3.2 https://github.com/ebean-orm-tools/ebean-gradle-plugin/commit/c4ae41113dea3a3f444a93f08e0476fbc46a3ec2

rbygrave commented 4 years ago

Note that I have confirmed the fix using a maven project. If you could confirm the ebean gradle 12.3.2 plugin works as expected that would be great.

apflieger commented 4 years ago

The exception disappeared 👍 Note that I don't use any records in entities though

Thank's a lot. That was very quick

rbygrave commented 4 years ago

Cool.

Note that I don't use any records in entities though

Well yes we can't actually use records as entity beans due to the restrictions of records so that is expected. "Record support" for Ebean means enhancement (that is looking at classes for @Transactional and querybean enhancement etc doesn't blow up when it reads a record type).