Nikola Atanasov created DROOLS-5126:
---------------------------------------
Summary: JavaDialectConfiguration.LANGUAGE_LEVELS being strings causes binary
search to not properly locate version 9
Key: DROOLS-5126
URL:
https://issues.redhat.com/browse/DROOLS-5126
Project: Drools
Issue Type: Bug
Affects Versions: 7.33.0.Final
Reporter: Nikola Atanasov
Assignee: Mario Fusco
When i created a simple drools project (version 7.33.0.final) in eclipse (plugin version
7.32.0 final), i ran into the following error.
(Note: drools file didn't specify "dialect java")
{code:java}
java.lang.RuntimeException: Unable to load dialect
'org.drools.compiler.rule.builder.dialect.java.JavaDialectConfiguration:java:org.drools.compiler.rule.builder.dialect.java.JavaDialectConfiguration'
at
org.drools.compiler.builder.impl.KnowledgeBuilderConfigurationImpl.addDialect(KnowledgeBuilderConfigurationImpl.java:405)
at
org.drools.compiler.builder.impl.KnowledgeBuilderConfigurationImpl.buildDialectConfigurationMap(KnowledgeBuilderConfigurationImpl.java:391)
at
org.drools.compiler.builder.impl.KnowledgeBuilderConfigurationImpl.init(KnowledgeBuilderConfigurationImpl.java:239)
at
org.drools.compiler.builder.impl.KnowledgeBuilderConfigurationImpl.init(KnowledgeBuilderConfigurationImpl.java:191)
at
org.drools.compiler.builder.impl.KnowledgeBuilderConfigurationImpl.<init>(KnowledgeBuilderConfigurationImpl.java:159)
at
org.drools.compiler.kie.builder.impl.AbstractKieProject.getBuilderConfiguration(AbstractKieProject.java:302)
at
org.drools.compiler.kie.builder.impl.AbstractKieProject.createKnowledgeBuilder(AbstractKieProject.java:288)
at
org.drools.compiler.kie.builder.impl.AbstractKieProject.buildKnowledgePackages(AbstractKieProject.java:213)
at
org.drools.compiler.kie.builder.impl.AbstractKieProject.verify(AbstractKieProject.java:75)
at
org.drools.compiler.kie.builder.impl.KieBuilderImpl.buildKieProject(KieBuilderImpl.java:274)
at org.drools.compiler.kie.builder.impl.KieBuilderImpl.buildAll(KieBuilderImpl.java:242)
at org.drools.compiler.kie.builder.impl.KieBuilderImpl.buildAll(KieBuilderImpl.java:192)
at com.sample.RunnableTest.createKieBase(RunnableTest.java:67)
at com.sample.RunnableTest.run(RunnableTest.java:36)
at java.base/java.lang.Thread.run(Thread.java:844)
Caused by: java.lang.RuntimeException: value '9' is not a valid language level
at
org.drools.compiler.rule.builder.dialect.java.JavaDialectConfiguration.setJavaLanguageLevel(JavaDialectConfiguration.java:102)
at
org.drools.compiler.rule.builder.dialect.java.JavaDialectConfiguration.init(JavaDialectConfiguration.java:80)
at
org.drools.compiler.builder.impl.KnowledgeBuilderConfigurationImpl.addDialect(KnowledgeBuilderConfigurationImpl.java:401)
... 14 more
{code}
Once debugged, i saw that the "LANGUAGE_LEVEL" array in
"JavaDialectConfiguration" stores the java versions as strings, and in the
method that throws the exception "setJavaLanguageLevel", it uses binary search
to locate the version from that array.
The problem with this is that it compares them lexicographically, so java version 9 would
be greater than versions 10, 11 and 12.
So, out of the array {"1.5", "1.6", "1.7", "1.8",
"9", "10", "11", "12"}, to find 9, the following
values are tried out:
# Start: low=0, high=7
# Middle (index 3) is 1.8, smaller than 9, move middle to 10, low=4(mid + 1), high=7
# Middle (index 5) is 10, smaller than 9, move middle to 11, low=6(mid + 1), high=7
# Middle (index 6) is 11, smaller than 9, move middle to 12, low=7(mid + 1), high=7
# Middle is 12, smaller than 9, low > high, end search
The fix would be simple enough, either they should be sorted (lexicographically), or they
should be floats.
My default workspace jre is 9.0.1.
--
This message was sent by Atlassian Jira
(v7.13.8#713008)