Uploaded image for project: 'Drools'
  1. Drools
  2. DROOLS-5650

UnsupportedOperationException when using enum in Java 11, works fine in Java 8

    XMLWordPrintable

Details

    • Bug
    • Resolution: Won't Do
    • Major
    • None
    • 7.43.1.Final
    • core engine
    • None

    Description

      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;
      }}}

      Attachments

        1. AuditVO.java
          1 kB
        2. Driver.java
          2 kB
        3. ExamplePolicyPricing.xls
          28 kB
        4. Policy.java
          2 kB

        Activity

          People

            mfusco@redhat.com Mario Fusco
            abhi_tx Abhi Vuyyuru (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: