]
Abhi Vuyyuru updated DROOLS-5650:
---------------------------------
Attachment: Driver.java
Policy.java
AuditVO.java
UnsupportedOperationException when using enum in Java 11, works fine
in Java 8
------------------------------------------------------------------------------
Key: DROOLS-5650
URL:
https://issues.redhat.com/browse/DROOLS-5650
Project: Drools
Issue Type: Bug
Components: core engine
Affects Versions: 7.43.1.Final
Reporter: Abhi Vuyyuru
Assignee: Mario Fusco
Priority: Major
Attachments: AuditVO.java, Driver.java, ExamplePolicyPricing.xls, Policy.java
I am porting an existing application Java 7 to Java 11 (Drools 7.42.0). The application
works as expected if I compile as Java 1.8 and deploy on Java 11 container (Weblogic 14).
But if I compile the same code in Java 11, I get the following error. The only change
between 1.8 and 11 is the java compiler level in Maven pom. I have ASM7 as a dependency in
Maven.
{{}}
{{{{Caused by: java.lang.UnsupportedOperationException: This feature requires ASM7
at org.mvel2.asm.ClassVisitor.visitNestMember(ClassVisitor.java:236)
at org.mvel2.asm.ClassReader.accept(ClassReader.java:651)
at org.mvel2.asm.ClassReader.accept(ClassReader.java:391)
at
org.drools.core.util.asm.ClassFieldInspector.processClassWithByteCode(ClassFieldInspector.java:107)
at
org.drools.core.util.asm.ClassFieldInspector.processClassWithByteCode(ClassFieldInspector.java:114)
at
org.drools.core.util.asm.ClassFieldInspector.<init>(ClassFieldInspector.java:86)
at
org.drools.core.util.asm.ClassFieldInspector.<init>(ClassFieldInspector.java:74)
at
org.drools.core.base.ClassFieldAccessorFactory.getClassFieldInspector(ClassFieldAccessorFactory.java:157)
at
org.drools.core.base.ClassFieldAccessorFactory.getFieldType(ClassFieldAccessorFactory.java:141)
at
org.drools.core.base.ClassFieldAccessorStore.getFieldType(ClassFieldAccessorStore.java:295)
at
org.drools.compiler.rule.builder.PatternBuilder.getValueType(PatternBuilder.java:1079)
at
org.drools.compiler.rule.builder.PatternBuilder.normalizeExpression(PatternBuilder.java:1047)
at
org.drools.compiler.rule.builder.PatternBuilder.buildExpression(PatternBuilder.java:965)
at
org.drools.compiler.rule.builder.PatternBuilder.buildCcdDescr(PatternBuilder.java:942)
at
org.drools.compiler.rule.builder.PatternBuilder.build(PatternBuilder.java:767)
at
org.drools.compiler.rule.builder.PatternBuilder.processConstraintsAndBinds(PatternBuilder.java:620)
at
org.drools.compiler.rule.builder.PatternBuilder.build(PatternBuilder.java:187)
at
org.drools.compiler.rule.builder.PatternBuilder.build(PatternBuilder.java:154)
at
org.drools.compiler.rule.builder.PatternBuilder.build(PatternBuilder.java:136)
at
org.drools.compiler.rule.builder.GroupElementBuilder.build(GroupElementBuilder.java:66)
at org.drools.compiler.rule.builder.RuleBuilder.build(RuleBuilder.java:107)
at
org.drools.compiler.builder.impl.KnowledgeBuilderImpl.internalAddRule(KnowledgeBuilderImpl.java:1183)
at
org.drools.compiler.builder.impl.KnowledgeBuilderImpl.addRule(KnowledgeBuilderImpl.java:1178)
at
org.drools.compiler.builder.impl.KnowledgeBuilderImpl.lambda$null$3(KnowledgeBuilderImpl.java:1134)
at
java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
at
java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177)
at
java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655)
at
java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
at
java.base/java.util.stream.ForEachOps$ForEachTask.compute(ForEachOps.java:290)
at
java.base/java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:746)}}}}
I noticed while debugging that this was caused by an "enum" in our code. Drools
works fine if we remove the enum and use constants. The error seems to suggest that this
could happen to any nested classes. Is there a better way to handle this other than
changing our code to remove nested classes and enums?
I see that in the class {{org.drools.core.util.asm.ClassFieldInspector}}, the API is set
to ASM5, but MVEL is expecting ASM7. But not sure why it would work in Java 8 and not in
Java 11. Any suggestions?
{{ClassFieldVisitor(final Class< ? > cls,
final boolean includeFinalMethods,
final ClassFieldInspector inspector) \{
super(Opcodes.ASM5);
this.clazz = cls;
this.includeFinalMethods = includeFinalMethods;
this.inspector = inspector;
}}}