Following a discussion by a previous user and ended up on this article:
Now, this is something that looks super handy to have!
So - running into an issue where I'm getting an undeclared global.
This is a code snippet of what I'm trying out to see how this works:
```
List<DroolsRuleFileDocument> ruleFiles = mmDroolsSessionHandler.getRuleFiles();
KieFileSystem kfs = mmDroolsSessionHandler.getKieFileSystem(ruleFiles);
KieServices ks = KieServices.Factory.get();
var globalParameters = applicationProperties.getGlobalParameters();
var globalFactDTO = mapStructMapper.buildGlobalFactDTO(globalParameters);
KieSession kieSession = getKieSession(kfs);
kieSession.setGlobal("globalFactDTO", globalFactDTO);
kieSession.fireAllRules();
kieSession.dispose();
KieBuilder kieBuilder2 = ks.newKieBuilder(kfs);
kieBuilder2.buildAll(ImpactAnalysisProject.class);
ImpactAnalysisKieModule analysisKieModule = (ImpactAnalysisKieModule) kieBuilder2.getKieModule();
```
The ruleFiles is a list of the drl and xlsx files that I download from AWS DocumentDB. These have certain properties that I filter on. This is production code and working like a dream.
The problem is this line:
```
ImpactAnalysisKieModule analysisKieModule = (ImpactAnalysisKieModule) kieBuilder2.getKieModule();
```
The following is the error when the module is build:
org.drools.modelcompiler.builder.errors.UnknownDeclarationException: Unknown declaration: globalFactDTO
at org.drools.modelcompiler.builder.generator.RuleContext.lambda$getDeclarationByIdWithException$0(RuleContext.java:256)
at java.base/java.util.Optional.orElseThrow(Optional.java:401)
at org.drools.modelcompiler.builder.generator.RuleContext.getDeclarationByIdWithException(RuleContext.java:256)
at org.drools.modelcompiler.builder.generator.BoxedParameters.getBoxedParametersWithUnboxedAssignment(BoxedParameters.java:47)
at org.drools.modelcompiler.builder.generator.Consequence.executeCall(Consequence.java:288)
at org.drools.modelcompiler.builder.generator.Consequence.createCall(Consequence.java:154)
at org.drools.impact.analysis.parser.impl.RhsParser.parse(RhsParser.java:62)
at org.drools.impact.analysis.parser.impl.PackageParser.parseRule(PackageParser.java:63)
at org.drools.impact.analysis.parser.impl.PackageParser.parse(PackageParser.java:50)
at org.drools.impact.analysis.parser.internal.ImpactModelBuilderImpl.buildRules(ImpactModelBuilderImpl.java:192)
at org.drools.impact.analysis.parser.internal.ImpactModelBuilderImpl.doSecondBuildStep(ImpactModelBuilderImpl.java:114)
at org.drools.compiler.builder.impl.CompositeKnowledgeBuilderImpl.build(CompositeKnowledgeBuilderImpl.java:115)
at org.drools.compiler.builder.impl.CompositeKnowledgeBuilderImpl.build(CompositeKnowledgeBuilderImpl.java:99)
at org.drools.compiler.kie.builder.impl.AbstractKieProject.buildKnowledgePackages(AbstractKieProject.java:270)
at org.drools.compiler.kie.builder.impl.AbstractKieProject.buildKnowledgePackages(AbstractKieProject.java:216)
at org.drools.compiler.kie.builder.impl.AbstractKieProject.verify(AbstractKieProject.java:80)
at org.drools.compiler.kie.builder.impl.KieBuilderImpl.buildKieProject(KieBuilderImpl.java:277)
at org.drools.compiler.kie.builder.impl.KieBuilderImpl.buildAll(KieBuilderImpl.java:245)
at org.drools.compiler.kie.builder.impl.KieBuilderImpl.buildAll(KieBuilderImpl.java:202)
at za.co.mamamoney.commissions.controller.TestController.impactAnalysis(TestController.java:184)
It seems the error happens due to the global not inject into the session.
What I have tried so far as well:
Move buildAll(...) call to a bit later so that I can get hold of the session before that and then inject the global.
```
KieBuilder kieBuilder2 = ks.newKieBuilder(kfs);
// kieBuilder2.buildAll(ImpactAnalysisProject.class);
KieContainer kieContainer = ks.newKieContainer(kieBuilder2.getKieModule().getReleaseId());
KieSession session = kieContainer.newKieSession();
session.setGlobal("globalFactDTO", globalFactDTO);
kieBuilder2.buildAll(ImpactAnalysisProject.class);
ImpactAnalysisKieModule analysisKieModule = (ImpactAnalysisKieModule) kieBuilder2.getKieModule();
```
This throws a different error:
```
java.lang.ClassCastException: class org.drools.compiler.kie.builder.impl.MemoryKieModule cannot be cast to class org.drools.impact.analysis.parser.internal.ImpactAnalysisKieModule (org.drools.compiler.kie.builder.impl.MemoryKieModule and org.drools.impact.analysis.parser.internal.ImpactAnalysisKieModule are in unnamed module of loader 'app')
```
Any ideas on how to get past the Global fact problem. Removing it from all the rule files is not really an option..(unless I really really have to)
Tks
Andre