dcdh opened a new issue, #6248:
URL: https://github.com/apache/incubator-kie-drools/issues/6248
Hello,
I am dynamically loading a rule at runtime this way:
```java
@Path("/shouldServerBeValid")
@POST
public boolean shouldServerBeValid() {
final KieServices kieServices = KieServices.Factory.get();
final KieFileSystem kieFileSystem = getKieFileSystem(kieServices);
kieServices.newKieBuilder(kieFileSystem).buildAll();
final KieContainer kContainer =
kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());
final KieBase kieBase = kContainer.getKieBase();
for (final KiePackage kp : kieBase.getKiePackages() ) {
for (final Rule rule : kp.getRules()) {
Log.info("kp " + kp + " rule " + rule.getName());
}
}
try (final KieSession session = kieBase.newKieSession()) {
final Server s1 = new Server("rhel7", 2, 1024, 2048);
session.insert(s1);
session.fireAllRules();
return s1.isValid();
}
}
private KieFileSystem getKieFileSystem(final KieServices kieServices) {
final KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
// language=drl
final String externalDrl = """
import org.acme.Server
dialect "java"
rule "Check Server Configuration"
when
$server : Server( processors < 2 || memory<=1024 ||
diskspace <= 2048)
then
$server.setValid(false);
System.out.println("Server "+ $server.getName() + "
configuration does not meet requirements!");
end
""";
kieFileSystem.write("src/main/resources/rules/external.drl",
externalDrl);
return kieFileSystem;
}
```
With these maven dependencies:
```xml
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-quarkus</artifactId>
<version>10.0.0</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-ruleunits-engine</artifactId>
<version>10.0.0</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>10.0.0</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-mvel</artifactId>
<version>10.0.0</version>
</dependency>
```
Running it will lead to this exception:
```
Suppressed: java.lang.NullPointerException: Cannot invoke
"org.drools.compiler.compiler.Dialect.analyzeExpression(org.drools.compiler.rule.builder.PackageBuildContext,
org.drools.drl.ast.descr.BaseDescr, Object,
org.drools.compiler.compiler.BoundIdentifiers)" because the return value of
"org.drools.compiler.rule.builder.RuleBuildContext.getDialect()" is null
at
org.drools.compiler.rule.builder.PatternBuilder.buildAnalysis(PatternBuilder.java:1585)
at
org.drools.compiler.rule.builder.PatternBuilder.buildEval(PatternBuilder.java:1508)
at
org.drools.compiler.rule.builder.PatternBuilder.createAndBuildPredicate(PatternBuilder.java:1390)
at
org.drools.compiler.rule.builder.PatternBuilder.buildExpression(PatternBuilder.java:998)
at
org.drools.compiler.rule.builder.PatternBuilder.buildCcdDescr(PatternBuilder.java:957)
at
org.drools.compiler.rule.builder.PatternBuilder.build(PatternBuilder.java:767)
at
org.drools.compiler.rule.builder.PatternBuilder.processConstraintsAndBinds(PatternBuilder.java:611)
at
org.drools.compiler.rule.builder.PatternBuilder.build(PatternBuilder.java:179)
at
org.drools.compiler.rule.builder.PatternBuilder.build(PatternBuilder.java:145)
at
org.drools.compiler.rule.builder.PatternBuilder.build(PatternBuilder.java:127)
at
org.drools.compiler.rule.builder.GroupElementBuilder.build(GroupElementBuilder.java:68)
at
org.drools.compiler.rule.builder.RuleBuilder.build(RuleBuilder.java:100)
at
org.drools.compiler.builder.impl.processors.ImmutableRuleCompilationPhase.internalAddRule(ImmutableRuleCompilationPhase.java:342)
at
org.drools.compiler.builder.impl.processors.ImmutableRuleCompilationPhase.addRule(ImmutableRuleCompilationPhase.java:337)
at
org.drools.compiler.builder.impl.processors.ImmutableRuleCompilationPhase.compileRulesLevel(ImmutableRuleCompilationPhase.java:301)
at
org.drools.compiler.builder.impl.processors.ImmutableRuleCompilationPhase.process(ImmutableRuleCompilationPhase.java:85)
at
java.base/java.util.Arrays$ArrayList.forEach(Arrays.java:4305)
at
org.drools.compiler.builder.impl.KnowledgeBuilderImpl.compileKnowledgePackages(KnowledgeBuilderImpl.java:457)
at
org.drools.compiler.builder.impl.KnowledgeBuilderImpl.buildRules(KnowledgeBuilderImpl.java:1016)
at
org.drools.compiler.builder.impl.KnowledgeBuilderImpl.doFirstBuildStep(KnowledgeBuilderImpl.java:990)
at
org.drools.compiler.builder.impl.CompositeKnowledgeBuilderImpl.build(CompositeKnowledgeBuilderImpl.java:119)
at
org.drools.compiler.builder.impl.CompositeKnowledgeBuilderImpl.build(CompositeKnowledgeBuilderImpl.java:109)
at
org.drools.compiler.kie.builder.impl.AbstractKieProject.buildKnowledgePackages(AbstractKieProject.java:280)
at
org.drools.compiler.kie.builder.impl.AbstractKieProject.buildKnowledgePackages(AbstractKieProject.java:220)
at
org.drools.compiler.kie.builder.impl.AbstractKieProject.verify(AbstractKieProject.java:84)
at
org.drools.compiler.kie.builder.impl.KieBuilderImpl.buildKieProject(KieBuilderImpl.java:285)
at
org.drools.compiler.kie.builder.impl.KieBuilderImpl.buildAll(KieBuilderImpl.java:251)
at
org.drools.compiler.kie.builder.impl.KieBuilderImpl.buildAll(KieBuilderImpl.java:198)
at
org.acme.RuntimeEndpoint.shouldServerBeValid(RuntimeEndpoint.java:53)
at
org.acme.RuntimeEndpoint$quarkusrestinvoker$shouldServerBeValid_91e5a3b77fe1b0322ebde70ff08c3aabb2e3173b.invoke(Unknown
Source)
at
org.jboss.resteasy.reactive.server.handlers.InvocationHandler.handle(InvocationHandler.java:29)
```
The getDialect() returns null from this point because it will define it to
"mvel"
https://github.com/kiegroup/drools/blob/ee4c7c6a6c3753cc5e6abc76c5f5e0ebca62c9a1/drools-compiler/src/main/java/org/drools/compiler/rule/builder/PatternBuilder.java#L1386
```java
protected Constraint createAndBuildPredicate(RuleBuildContext context,
Pattern pattern,
BaseDescr base,
String expr,
Map<String, OperatorDescr>
aliases) {
Dialect dialect = context.getDialect();
context.setDialect(context.getDialect("mvel"));
PredicateDescr pdescr = new
PredicateDescr(context.getRuleDescr().getResource(), expr);
pdescr.copyParameters(base);
pdescr.copyLocation(base);
Constraint evalConstraint = buildEval(context, pattern, pdescr,
aliases, expr, false);
// fall back to original dialect
context.setDialect(dialect);
return evalConstraint;
}
```
To fix this exception I had to a dependency on mvel even if I do not use it.
```xml
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-mvel</artifactId>
<version>10.0.0</version>
</dependency>
```
Regards,
Damien
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]