-
Notifications
You must be signed in to change notification settings - Fork 25
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[RHDM-2029] Executable model doesn't report an error when duplicated … #58
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -16,6 +16,7 @@ | |
|
||
package org.drools.modelcompiler.builder; | ||
|
||
import java.util.ArrayList; | ||
import java.util.Collection; | ||
import java.util.HashMap; | ||
import java.util.HashSet; | ||
|
@@ -29,24 +30,35 @@ | |
import org.drools.compiler.builder.impl.KnowledgeBuilderImpl; | ||
import org.drools.compiler.builder.impl.TypeDeclarationFactory; | ||
import org.drools.compiler.compiler.PackageRegistry; | ||
import org.drools.compiler.compiler.ParserError; | ||
import org.drools.compiler.kie.builder.impl.AbstractKieModule; | ||
import org.drools.compiler.kie.builder.impl.BuildContext; | ||
import org.drools.compiler.kie.builder.impl.InternalKieModule; | ||
import org.drools.compiler.lang.descr.AbstractClassTypeDeclarationDescr; | ||
import org.drools.compiler.lang.descr.CompositePackageDescr; | ||
import org.drools.compiler.lang.descr.EnumDeclarationDescr; | ||
import org.drools.compiler.lang.descr.GlobalDescr; | ||
import org.drools.compiler.lang.descr.ImportDescr; | ||
import org.drools.compiler.lang.descr.PackageDescr; | ||
import org.drools.compiler.lang.descr.RuleDescr; | ||
import org.drools.compiler.lang.descr.TypeDeclarationDescr; | ||
import org.drools.core.addon.TypeResolver; | ||
import org.drools.core.definitions.InternalKnowledgePackage; | ||
import org.drools.core.rule.ImportDeclaration; | ||
import org.drools.core.rule.TypeDeclaration; | ||
import org.drools.core.util.StringUtils; | ||
import org.drools.modelcompiler.CanonicalKieModule; | ||
import org.drools.modelcompiler.builder.errors.UnsupportedFeatureError; | ||
import org.drools.modelcompiler.builder.generator.DRLIdGenerator; | ||
import org.drools.modelcompiler.builder.generator.DrlxParseUtil; | ||
import org.drools.modelcompiler.builder.generator.declaredtype.POJOGenerator; | ||
import org.kie.api.KieBase; | ||
import org.kie.api.KieServices; | ||
import org.kie.api.builder.KieModule; | ||
import org.kie.api.builder.KieRepository; | ||
import org.kie.api.builder.ReleaseId; | ||
import org.kie.api.runtime.KieContainer; | ||
import org.kie.internal.builder.KnowledgeBuilder; | ||
import org.kie.internal.builder.ResultSeverity; | ||
|
||
import static com.github.javaparser.StaticJavaParser.parseImport; | ||
|
@@ -303,4 +315,45 @@ public T getPackageSource(String packageName) { | |
protected BuildContext createBuildContext() { | ||
return new CanonicalModelBuildContext(); | ||
} | ||
|
||
// Overridden, because exec-model doesn't add assets of included kbase to the packageDescr | ||
@Override | ||
protected void validateUniqueRuleNames(final PackageDescr packageDescr) { | ||
super.validateUniqueRuleNames(packageDescr); | ||
|
||
// check for duplicated rule names in included kbase | ||
Map<String, InternalKieModule> includeModules = getBuildContext().getIncludeModules(); | ||
List<String> ruleNamesInIncludeKBases = new ArrayList<>(); | ||
for (Map.Entry<String, InternalKieModule> entry : includeModules.entrySet()) { | ||
String kBaseName = entry.getKey(); | ||
InternalKieModule includeModule = entry.getValue(); | ||
if (!(includeModule instanceof CanonicalKieModule)) { | ||
continue; | ||
} | ||
CanonicalKieModule canonicalKieModule = (CanonicalKieModule) includeModule; | ||
InternalKieModule internalKieModule = canonicalKieModule.getInternalKieModule(); | ||
if (!(internalKieModule instanceof AbstractKieModule)) { | ||
continue; | ||
} | ||
AbstractKieModule abstractKieModule = (AbstractKieModule) internalKieModule; | ||
ReleaseId internalReleaseId = abstractKieModule.getReleaseId(); | ||
KieServices ks = KieServices.Factory.get(); | ||
KieContainer kieContainer = ks.newKieContainer(internalReleaseId); | ||
KieBase kieBase = kieContainer.getKieBase(kBaseName); | ||
// add rule names to ruleNamesInIncludeKBases | ||
kieBase.getKiePackages().stream() | ||
.filter(kPkg -> kPkg.getName().equals(packageDescr.getNamespace())) | ||
.flatMap(kPkg -> kPkg.getRules().stream()) | ||
.forEach(rule -> ruleNamesInIncludeKBases.add(rule.getName())); | ||
Comment on lines
+341
to
+347
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This may be a naive approach to collect rule names (= build kbase and get rules), but I cannot find a way to collect them directly from the "included kbase"'s There may be a case that we can get cached PackageDescr/RuleDescr of the included kbase.
but it's not possible in case of kie-maven-plugin use case ( WDYT, @mariofusco ? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This works, but in all honesty it seems also to be a huge amount of wasteful computational resources that moreover needs to happen again and again for each and every There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
non-exec model (
Yes. Now #59 creates only KiePackage, instead of KieBase, so I hope it's relatively smaller.
Thank you for pointing this out. I have moved
Sure, I'm going to do it as another PR. Note that it means the duplication cannot be detected at the time of kjar build by kie-maven-plugin, right? |
||
} | ||
for (final RuleDescr ruleDescr : packageDescr.getRules()) { | ||
if (ruleNamesInIncludeKBases.contains(ruleDescr.getName())) { | ||
addBuilderResult(new ParserError(ruleDescr.getResource(), | ||
"Duplicate rule name: " + ruleDescr.getName(), | ||
ruleDescr.getLine(), | ||
ruleDescr.getColumn(), | ||
packageDescr.getNamespace())); | ||
} | ||
} | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It would better to return
Collections.emptyMap()
here instead of creating a new map at each invocation.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks! Fixed in #59