[
https://issues.redhat.com/browse/DROOLS-5650?page=com.atlassian.jira.plug...
]
Mario Fusco commented on DROOLS-5650:
-------------------------------------
I still cannot reproduce the problem. I put all the pojos you provided in the test class
that I'm copying below, created a drl that should mimic exactly the first row of your
dtable and still it works for me with both java 8 and 11.
Please validate what I've done and if possible try to modify my test case so that it
fails on java 11. Thanks.
{code:java}
import org.junit.Test;
import org.kie.api.runtime.KieSession;
import org.kie.internal.utils.KieHelper;
import static org.junit.Assert.assertEquals;
public class MyTest {
public static class AuditVO {
private AuditVO.PolicyType type = AuditVO.PolicyType.COMPREHENSIVE;
private AuditVO.Test test1;
public enum PolicyType {
COMPREHENSIVE
};
public AuditVO.PolicyType getType() {
return type;
}
public void setType( AuditVO.PolicyType type) {
this.type = type;
}
private enum VOStatus {
NEW, UPDATE, DELETE
};
private AuditVO.VOStatus status;
public void setNew() {
this.status = AuditVO.VOStatus.NEW;
}
public void setUpdate() {
this.status = AuditVO.VOStatus.UPDATE;
}
public void setDelete() {
this.status = AuditVO.VOStatus.DELETE;
}
public boolean isNew() {
return this.status == AuditVO.VOStatus.NEW;
}
public boolean isUpdate() {
return this.status == AuditVO.VOStatus.UPDATE;
}
public boolean isDelete() {
return this.status == AuditVO.VOStatus.DELETE;
}
static class Test {
private int test;
public int getTest() {
return test;
}
public void setTest(int test) {
this.test = test;
}
}
public AuditVO.Test getTest1() {
return test1;
}
public void setTest1( AuditVO.Test test1) {
this.test1 = test1;
}
public AuditVO.VOStatus getStatus() {
return status;
}
public void setStatus( AuditVO.VOStatus status) {
this.status = status;
}
}
public static class Policy extends AuditVO {
private boolean approved = false;
private int discountPercent = 0;
private int basePrice;
public boolean isApproved() {
return approved;
}
public void setApproved(boolean approved) {
this.approved = approved;
}
public int getDiscountPercent() {
return discountPercent;
}
public void setDiscountPercent(int discountPercent) {
this.discountPercent = discountPercent;
}
public void applyDiscount(int discount) {
discountPercent += discount;
}
public int getBasePrice() {
return basePrice;
}
public void setBasePrice(int basePrice) {
this.basePrice = basePrice;
}
}
public static class Driver extends AuditVO {
private String name = "Mr Joe Blogs";
private Integer age = new Integer(30);
private Integer priorClaims = new Integer(1);
private String locationRiskProfile = "LOW";
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getLocationRiskProfile() {
return locationRiskProfile;
}
public void setLocationRiskProfile(String locationRiskProfile) {
this.locationRiskProfile = locationRiskProfile;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getPriorClaims() {
return priorClaims;
}
public void setPriorClaims(Integer priorClaims) {
this.priorClaims = priorClaims;
}
}
@Test
public void test() {
// DROOLS-5650
String str =
"import " + Driver.class.getCanonicalName() + ";\n" +
"import " + Policy.class.getCanonicalName() +
";\n" +
"import " + Policy.PolicyType.class.getCanonicalName() +
";\n" +
"rule R1 when\n" +
" $d: Driver( age >= 18, age <= 24,
locationRiskProfile == \"LOW\", priorClaims == 1)\n" +
" $p: Policy( type == PolicyType.COMPREHENSIVE )\n"
+
"then\n" +
" $p.setBasePrice(450);" +
"end\n";
KieSession ksession = new KieHelper().addContent( str, "test.drl"
).build().newKieSession();
assertEquals(0, ksession.fireAllRules());
}
}
{code}
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;
}}}
--
This message was sent by Atlassian Jira
(v7.13.8#713008)