This is an automated email from the ASF dual-hosted git repository.
mariofusco pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-kie-drools.git
The following commit(s) were added to refs/heads/main by this push:
new 767c4ba6e1 [KIE-858] make executable model code generation optionally
reproducible (#5665)
767c4ba6e1 is described below
commit 767c4ba6e1dade0f4aa3c7cddc7575e7e09164f5
Author: Mario Fusco <[email protected]>
AuthorDate: Thu Jan 25 16:47:04 2024 +0100
[KIE-858] make executable model code generation optionally reproducible
(#5665)
* [KIE-858] make executable model code generation optionally reproducible
* disable reproducible executable model generation by defaul
* move reproducible exec model generation properties to pom
---
.../KnowledgeBuilderRulesConfigurationImpl.java | 26 ++++++++
.../builder/impl/processors/IteratingPhase.java | 4 +-
.../kie/builder/impl/AbstractKieProject.java | 8 ++-
.../model/codegen/execmodel/PackageModel.java | 33 +++++-----
.../execmodel/generator/ModelGenerator.java | 75 ++++++----------------
.../processors/DeclaredTypeCompilationPhase.java | 17 ++---
.../codegen/execmodel/ModelBuilderImplTest.java | 2 +-
.../dmn/validation/bootstrap/GenerateModel.java | 4 +-
kie-dmn/kie-dmn-validation/pom.xml | 21 ++++++
...eproducibleExecutableModelGenerationOption.java | 55 ++++++++++++++++
10 files changed, 159 insertions(+), 86 deletions(-)
diff --git
a/drools-compiler/src/main/java/org/drools/compiler/builder/impl/KnowledgeBuilderRulesConfigurationImpl.java
b/drools-compiler/src/main/java/org/drools/compiler/builder/impl/KnowledgeBuilderRulesConfigurationImpl.java
index 09ee9e930f..0c90262aa2 100644
---
a/drools-compiler/src/main/java/org/drools/compiler/builder/impl/KnowledgeBuilderRulesConfigurationImpl.java
+++
b/drools-compiler/src/main/java/org/drools/compiler/builder/impl/KnowledgeBuilderRulesConfigurationImpl.java
@@ -46,6 +46,7 @@ import
org.kie.internal.builder.conf.ParallelLambdaExternalizationOption;
import org.kie.internal.builder.conf.ParallelRulesBuildThresholdOption;
import org.kie.internal.builder.conf.ProcessStringEscapesOption;
import org.kie.internal.builder.conf.PropertySpecificOption;
+import
org.kie.internal.builder.conf.ReproducibleExecutableModelGenerationOption;
import org.kie.internal.builder.conf.SingleValueKieBuilderOption;
import org.kie.internal.builder.conf.TrimCellsInDTableOption;
import org.kie.internal.conf.CompositeConfiguration;
@@ -99,6 +100,8 @@ public class KnowledgeBuilderRulesConfigurationImpl extends
BaseConfiguration<Kn
private boolean trimCellsInDTable
= true;
private boolean groupDRLsInKieBasesByFolder
= false;
+ private boolean
reproducibleExecutableModelGeneration = false;
+
private boolean externaliseCanonicalModelLambda
= true;
private boolean parallelLambdaExternalization
= true;
@@ -162,6 +165,9 @@ public class KnowledgeBuilderRulesConfigurationImpl extends
BaseConfiguration<Kn
setProperty(ParallelLambdaExternalizationOption.PROPERTY_NAME,
getPropertyValue(ParallelLambdaExternalizationOption.PROPERTY_NAME,"true"));
+
+ setProperty(ReproducibleExecutableModelGenerationOption.PROPERTY_NAME,
+
getPropertyValue(ReproducibleExecutableModelGenerationOption.PROPERTY_NAME,"false"));
}
protected ClassLoader getFunctionFactoryClassLoader() {
@@ -206,6 +212,9 @@ public class KnowledgeBuilderRulesConfigurationImpl extends
BaseConfiguration<Kn
} case ParallelLambdaExternalizationOption.PROPERTY_NAME: {
setParallelLambdaExternalization(Boolean.parseBoolean(value));
break;
+ } case ReproducibleExecutableModelGenerationOption.PROPERTY_NAME: {
+
setReproducibleExecutableModelGeneration(Boolean.parseBoolean(value));
+ break;
} case AlphaNetworkCompilerOption.PROPERTY_NAME: {
try {
setAlphaNetworkCompilerOption(AlphaNetworkCompilerOption.determineAlphaNetworkCompilerMode(value.toUpperCase()));
@@ -244,6 +253,8 @@ public class KnowledgeBuilderRulesConfigurationImpl extends
BaseConfiguration<Kn
return String.valueOf(isExternaliseCanonicalModelLambda());
} case ParallelLambdaExternalizationOption.PROPERTY_NAME: {
return String.valueOf(isParallelLambdaExternalization());
+ } case ReproducibleExecutableModelGenerationOption.PROPERTY_NAME: {
+ return
String.valueOf(isReproducibleExecutableModelGeneration());
} default: {
if (name.startsWith(AccumulateFunctionOption.PROPERTY_NAME)) {
int index =
AccumulateFunctionOption.PROPERTY_NAME.length();
@@ -412,6 +423,14 @@ public class KnowledgeBuilderRulesConfigurationImpl
extends BaseConfiguration<Kn
this.parallelLambdaExternalization = parallelLambdaExternalization;
}
+ public boolean isReproducibleExecutableModelGeneration() {
+ return reproducibleExecutableModelGeneration;
+ }
+
+ public void setReproducibleExecutableModelGeneration(boolean
reproducibleExecutableModelGeneration) {
+ this.reproducibleExecutableModelGeneration =
reproducibleExecutableModelGeneration;
+ }
+
public AlphaNetworkCompilerOption getAlphaNetworkCompilerOption() {
return alphaNetworkCompilerOption;
}
@@ -444,6 +463,9 @@ public class KnowledgeBuilderRulesConfigurationImpl extends
BaseConfiguration<Kn
case ParallelLambdaExternalizationOption.PROPERTY_NAME: {
return (T) (parallelLambdaExternalization ?
ParallelLambdaExternalizationOption.ENABLED :
ParallelLambdaExternalizationOption.DISABLED);
}
+ case ReproducibleExecutableModelGenerationOption.PROPERTY_NAME: {
+ return (T) (reproducibleExecutableModelGeneration ?
ReproducibleExecutableModelGenerationOption.ENABLED :
ReproducibleExecutableModelGenerationOption.DISABLED);
+ }
case ParallelRulesBuildThresholdOption.PROPERTY_NAME: {
return (T) parallelRulesBuildThreshold;
}
@@ -524,6 +546,10 @@ public class KnowledgeBuilderRulesConfigurationImpl
extends BaseConfiguration<Kn
this.parallelLambdaExternalization =
((ParallelLambdaExternalizationOption)
option).isLambdaExternalizationParallel();
break;
}
+ case ReproducibleExecutableModelGenerationOption.PROPERTY_NAME: {
+ this.reproducibleExecutableModelGeneration =
((ReproducibleExecutableModelGenerationOption)
option).isReproducibleExecutableModelGeneration();
+ break;
+ }
case ParallelRulesBuildThresholdOption.PROPERTY_NAME: {
this.parallelRulesBuildThreshold =
(ParallelRulesBuildThresholdOption)option;
break;
diff --git
a/drools-compiler/src/main/java/org/drools/compiler/builder/impl/processors/IteratingPhase.java
b/drools-compiler/src/main/java/org/drools/compiler/builder/impl/processors/IteratingPhase.java
index ac5b5d8e80..3e5af144b4 100644
---
a/drools-compiler/src/main/java/org/drools/compiler/builder/impl/processors/IteratingPhase.java
+++
b/drools-compiler/src/main/java/org/drools/compiler/builder/impl/processors/IteratingPhase.java
@@ -49,9 +49,7 @@ public class IteratingPhase implements CompilationPhase {
public void process() {
for (CompositePackageDescr compositePackageDescr : packages) {
PackageRegistry packageRegistry =
pkgRegistryManager.getOrCreatePackageRegistry(compositePackageDescr);
- CompilationPhase phase = phaseFactory.create(
- packageRegistry,
- compositePackageDescr);
+ CompilationPhase phase = phaseFactory.create( packageRegistry,
compositePackageDescr );
phase.process();
this.results.addAll(phase.getResults());
if (this.results.hasErrors()) {
diff --git
a/drools-compiler/src/main/java/org/drools/compiler/kie/builder/impl/AbstractKieProject.java
b/drools-compiler/src/main/java/org/drools/compiler/kie/builder/impl/AbstractKieProject.java
index ed3466a805..7d8c399bea 100644
---
a/drools-compiler/src/main/java/org/drools/compiler/kie/builder/impl/AbstractKieProject.java
+++
b/drools-compiler/src/main/java/org/drools/compiler/kie/builder/impl/AbstractKieProject.java
@@ -21,6 +21,7 @@ package org.drools.compiler.kie.builder.impl;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
import java.util.function.Predicate;
@@ -222,7 +223,7 @@ public abstract class AbstractKieProject implements
KieProject {
public KnowledgeBuilder buildKnowledgePackages( KieBaseModelImpl
kBaseModel, BuildContext buildContext, Predicate<String> buildFilter ) {
boolean useFolders = useFolders( kBaseModel );
- Set<Asset> assets = new HashSet<>();
+ Set<Asset> assets = new LinkedHashSet<>();
boolean allIncludesAreValid = true;
for (String include : getTransitiveIncludes(kBaseModel)) {
@@ -361,5 +362,10 @@ public abstract class AbstractKieProject implements
KieProject {
result = 31 * result + name.hashCode();
return result;
}
+
+ @Override
+ public String toString() {
+ return "Asset: " + name;
+ }
}
}
diff --git
a/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/PackageModel.java
b/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/PackageModel.java
index 530b3e9b9c..121b722bc1 100644
---
a/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/PackageModel.java
+++
b/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/PackageModel.java
@@ -26,6 +26,7 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -44,7 +45,6 @@ import com.github.javaparser.ast.body.FieldDeclaration;
import com.github.javaparser.ast.body.InitializerDeclaration;
import com.github.javaparser.ast.body.MethodDeclaration;
import com.github.javaparser.ast.body.TypeDeclaration;
-import com.github.javaparser.ast.comments.JavadocComment;
import com.github.javaparser.ast.expr.AssignExpr;
import com.github.javaparser.ast.expr.ClassExpr;
import com.github.javaparser.ast.expr.Expression;
@@ -95,6 +95,7 @@ import org.drools.util.TypeResolver;
import org.kie.api.builder.ReleaseId;
import org.kie.api.conf.PrototypesOption;
import org.kie.api.runtime.rule.AccumulateFunction;
+import
org.kie.internal.builder.conf.ReproducibleExecutableModelGenerationOption;
import org.kie.internal.ruleunit.RuleUnitDescription;
import org.kie.internal.ruleunit.RuleUnitVariable;
@@ -155,7 +156,7 @@ public class PackageModel {
private final List<TypeDeclaration> generatedPOJOs = new ArrayList<>();
private final List<GeneratedClassWithPackage> generatedAccumulateClasses =
new ArrayList<>();
- private final Set<Class<?>> domainClasses = new HashSet<>();
+ private final Set<Class<?>> domainClasses = new LinkedHashSet<>();
private final Map<Class<?>, ClassDefinition> classDefinitionsMap = new
HashMap<>();
private final Set<Class<?>> otnsClasses = new HashSet<>();
@@ -187,7 +188,7 @@ public class PackageModel {
private final boolean prototypesAllowed;
private PackageModel( ReleaseId releaseId, String name,
KnowledgeBuilderConfigurationImpl configuration, DialectCompiletimeRegistry
dialectCompiletimeRegistry, DRLIdGenerator exprIdGenerator) {
- this(name, configuration, dialectCompiletimeRegistry, exprIdGenerator,
getPkgUUID(releaseId, name));
+ this(name, configuration, dialectCompiletimeRegistry, exprIdGenerator,
getPkgUUID(configuration, releaseId, name));
}
public PackageModel(String gav, String name,
KnowledgeBuilderConfigurationImpl configuration, DialectCompiletimeRegistry
dialectCompiletimeRegistry, DRLIdGenerator exprIdGenerator) {
@@ -233,10 +234,21 @@ public class PackageModel {
* @param packageName
* @return
*/
- public static String getPkgUUID(ReleaseId releaseId, String packageName) {
+ public static String getPkgUUID(KnowledgeBuilderConfigurationImpl
configuration, ReleaseId releaseId, String packageName) {
+ if (isReproducibleExecutableModelGeneration(configuration)) {
+ return StringUtils.getPkgUUID(releaseId != null ?
releaseId.toString() : "", packageName);
+ }
return (releaseId != null && !releaseId.isSnapshot()) ?
StringUtils.getPkgUUID(releaseId.toString(), packageName) :
StringUtils.generateUUID();
}
+ public boolean isReproducibleExecutableModelGeneration() {
+ return isReproducibleExecutableModelGeneration(configuration);
+ }
+
+ private static boolean
isReproducibleExecutableModelGeneration(KnowledgeBuilderConfigurationImpl
configuration) {
+ return configuration != null &&
configuration.getOption(ReproducibleExecutableModelGenerationOption.KEY).isReproducibleExecutableModelGeneration();
+ }
+
public Map<String, CreatedClass> getLambdaClasses() {
return lambdaClasses;
}
@@ -741,7 +753,7 @@ public class PackageModel {
int ruleCount = ruleMethodsInUnit.size();
boolean requiresMultipleRulesLists = ruleCount >=
RULES_DECLARATION_PER_CLASS-1;
- boolean parallelRulesLoad = ruleCount >=
(RULES_DECLARATION_PER_CLASS*3-1);
+ boolean parallelRulesLoad = !isReproducibleExecutableModelGeneration()
&& ruleCount >= (RULES_DECLARATION_PER_CLASS*3-1);
MethodCallExpr parallelRulesGetter = null;
@@ -761,9 +773,7 @@ public class PackageModel {
ruleMethodsInUnit.parallelStream().forEach(
DrlxParseUtil::transformDrlNameExprToNameExpr);
- int maxLength = ruleMethodsInUnit
- .parallelStream()
- .map( MethodDeclaration::toString ).mapToInt( String::length
).max().orElse( 1 );
+ int maxLength = ruleMethodsInUnit.parallelStream().map(
MethodDeclaration::toString ).mapToInt( String::length ).max().orElse( 1 );
int rulesPerClass = oneClassPerRule ? 1 : Math.max( 50000 / maxLength,
1 );
// each method per Drlx parser result
@@ -812,13 +822,6 @@ public class PackageModel {
" }\n"
);
rulesClass.addMember( getRulesMethod );
-
- StringBuilder sb = new StringBuilder("\n");
- sb.append("With the following expression ID:\n");
- sb.append(exprIdGenerator.toString());
- sb.append("\n");
- JavadocComment exprIdComment = new JavadocComment(sb.toString());
- getRulesMethod.setComment(exprIdComment);
}
private CompilationUnit createCompilationUnit(RuleSourceResult results ) {
diff --git
a/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/ModelGenerator.java
b/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/ModelGenerator.java
index 517c1c403f..9c030b7be7 100644
---
a/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/ModelGenerator.java
+++
b/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/ModelGenerator.java
@@ -40,31 +40,24 @@ import com.github.javaparser.ast.expr.StringLiteralExpr;
import com.github.javaparser.ast.expr.VariableDeclarationExpr;
import com.github.javaparser.ast.stmt.BlockStmt;
import com.github.javaparser.ast.stmt.ReturnStmt;
-import com.github.javaparser.ast.type.ClassOrInterfaceType;
-import com.github.javaparser.ast.type.Type;
-import org.drools.compiler.builder.impl.BuildResultCollector;
-import org.drools.compiler.builder.impl.KnowledgeBuilderImpl;
-import org.drools.compiler.builder.impl.TypeDeclarationContext;
-import org.drools.compiler.compiler.DescrBuildError;
import org.drools.base.base.CoreComponentsBuilder;
import org.drools.base.definitions.InternalKnowledgePackage;
import org.drools.base.definitions.rule.impl.RuleImpl;
import org.drools.base.factmodel.AnnotationDefinition;
-import org.drools.core.rule.BehaviorRuntime;
-import org.drools.base.time.TimeUtils;
+import org.drools.compiler.builder.impl.BuildResultCollector;
+import org.drools.compiler.builder.impl.KnowledgeBuilderImpl;
+import org.drools.compiler.builder.impl.TypeDeclarationContext;
+import org.drools.compiler.compiler.DescrBuildError;
import org.drools.drl.ast.descr.AndDescr;
import org.drools.drl.ast.descr.AnnotationDescr;
import org.drools.drl.ast.descr.AttributeDescr;
-import org.drools.drl.ast.descr.BehaviorDescr;
import org.drools.drl.ast.descr.PackageDescr;
import org.drools.drl.ast.descr.QueryDescr;
import org.drools.drl.ast.descr.RuleDescr;
import org.drools.model.Rule;
-import org.drools.model.Variable;
import org.drools.model.codegen.execmodel.PackageModel;
import org.drools.model.codegen.execmodel.errors.InvalidExpressionErrorResult;
import org.drools.model.codegen.execmodel.errors.ParseExpressionErrorResult;
-import org.drools.model.codegen.execmodel.errors.UnknownDeclarationError;
import
org.drools.model.codegen.execmodel.generator.expressiontyper.ExpressionTyper;
import
org.drools.model.codegen.execmodel.generator.expressiontyper.ExpressionTyperContext;
import
org.drools.model.codegen.execmodel.generator.visitor.ModelGeneratorVisitor;
@@ -75,24 +68,17 @@ import org.kie.internal.ruleunit.RuleUnitDescription;
import static com.github.javaparser.StaticJavaParser.parseExpression;
import static
org.drools.kiesession.session.StatefulKnowledgeSessionImpl.DEFAULT_RULE_UNIT;
import static
org.drools.model.codegen.execmodel.PackageModel.DATE_TIME_FORMATTER_FIELD;
-import static
org.drools.model.codegen.execmodel.PackageModel.DOMAIN_CLASSESS_METADATA_FILE_NAME;
-import static
org.drools.model.codegen.execmodel.PackageModel.DOMAIN_CLASS_METADATA_INSTANCE;
-import static
org.drools.model.codegen.execmodel.generator.DrlxParseUtil.classToReferenceType;
import static
org.drools.model.codegen.execmodel.generator.DrlxParseUtil.generateLambdaWithoutParameters;
import static
org.drools.model.codegen.execmodel.generator.DrlxParseUtil.toClassOrInterfaceType;
import static
org.drools.model.codegen.execmodel.generator.DrlxParseUtil.toStringLiteral;
import static
org.drools.model.codegen.execmodel.generator.DslMethodNames.ATTRIBUTE_CALL;
import static
org.drools.model.codegen.execmodel.generator.DslMethodNames.BUILD_CALL;
-import static
org.drools.model.codegen.execmodel.generator.DslMethodNames.DECLARATION_OF_CALL;
-import static
org.drools.model.codegen.execmodel.generator.DslMethodNames.ENTRY_POINT_CALL;
import static
org.drools.model.codegen.execmodel.generator.DslMethodNames.METADATA_CALL;
import static
org.drools.model.codegen.execmodel.generator.DslMethodNames.RULE_CALL;
import static
org.drools.model.codegen.execmodel.generator.DslMethodNames.SUPPLY_CALL;
import static
org.drools.model.codegen.execmodel.generator.DslMethodNames.UNIT_CALL;
-import static
org.drools.model.codegen.execmodel.generator.DslMethodNames.WINDOW_CALL;
import static
org.drools.model.codegen.execmodel.generator.DslMethodNames.createDslTopLevelMethod;
import static
org.drools.model.codegen.execmodel.generator.RuleContext.DIALECT_ATTRIBUTE;
-import static org.drools.modelcompiler.util.ClassUtil.asJavaSourceName;
import static org.drools.modelcompiler.util.StringUtil.toId;
import static org.drools.modelcompiler.util.TimerUtil.validateTimer;
@@ -134,46 +120,22 @@ public class ModelGenerator {
public static final boolean GENERATE_EXPR_ID = true;
- public static void generateModel(
- KnowledgeBuilderImpl knowledgeBuilder,
- InternalKnowledgePackage pkg,
- PackageDescr packageDescr,
- PackageModel packageModel) {
+ public static void generateModel( KnowledgeBuilderImpl knowledgeBuilder,
InternalKnowledgePackage pkg, PackageDescr packageDescr, PackageModel
packageModel) {
generateModel(knowledgeBuilder, knowledgeBuilder, pkg, packageDescr,
packageModel);
}
- public static void generateModel(
- TypeDeclarationContext typeDeclarationContext,
- BuildResultCollector resultCollector,
- InternalKnowledgePackage pkg,
- PackageDescr packageDescr,
- PackageModel packageModel) {
- TypeResolver typeResolver = pkg.getTypeResolver();
-
- List<RuleDescr> ruleDescrs = packageDescr.getRules();
- if (ruleDescrs.isEmpty()) {
- return;
+ public static void generateModel( TypeDeclarationContext
typeDeclarationContext, BuildResultCollector resultCollector,
+ InternalKnowledgePackage pkg,
PackageDescr packageDescr, PackageModel packageModel) {
+ if (!packageDescr.getRules().isEmpty()) {
+ packageModel.addRuleUnits(processRules( typeDeclarationContext,
resultCollector, packageDescr, packageModel, pkg.getTypeResolver()));
}
-
- packageModel.addRuleUnits( processRules(
- typeDeclarationContext,
- resultCollector,
- packageDescr,
- packageModel,
- typeResolver,
- ruleDescrs) );
}
- private static Set<RuleUnitDescription> processRules(
- TypeDeclarationContext typeDeclarationContext,
- BuildResultCollector resultCollector,
- PackageDescr packageDescr,
- PackageModel packageModel,
- TypeResolver typeResolver,
- List<RuleDescr> ruleDescrs) {
+ private static Set<RuleUnitDescription> processRules(
TypeDeclarationContext typeDeclarationContext, BuildResultCollector
resultCollector,
+ PackageDescr
packageDescr, PackageModel packageModel, TypeResolver typeResolver) {
Set<RuleUnitDescription> ruleUnitDescrs = new HashSet<>();
- for (RuleDescr descr : ruleDescrs) {
+ for (RuleDescr descr : packageDescr.getRules()) {
RuleContext context = new RuleContext(
typeDeclarationContext, resultCollector, packageModel,
typeResolver, descr);
if (context.getRuleUnitDescr() != null) {
@@ -185,10 +147,7 @@ public class ModelGenerator {
}
}
- int parallelRulesBuildThreshold =
typeDeclarationContext.getBuilderConfiguration().getOption(ParallelRulesBuildThresholdOption.KEY).getParallelRulesBuildThreshold();
- boolean parallelRulesBuild = parallelRulesBuildThreshold != -1 &&
ruleDescrs.size() > parallelRulesBuildThreshold;
-
- if (parallelRulesBuild) {
+ if ( isParallelRulesBuild(typeDeclarationContext, packageDescr,
packageModel) ) {
List<RuleContext> ruleContexts = new ArrayList<>();
int i = 0;
for (RuleDescr ruleDescr : packageDescr.getRules()) {
@@ -209,6 +168,14 @@ public class ModelGenerator {
return ruleUnitDescrs;
}
+ private static boolean isParallelRulesBuild(TypeDeclarationContext
typeDeclarationContext, PackageDescr packageDescr, PackageModel packageModel) {
+ if ( packageModel.isReproducibleExecutableModelGeneration() ) {
+ return false;
+ }
+ int parallelRulesBuildThreshold =
typeDeclarationContext.getBuilderConfiguration().getOption(ParallelRulesBuildThresholdOption.KEY).getParallelRulesBuildThreshold();
+ return parallelRulesBuildThreshold != -1 &&
packageDescr.getRules().size() > parallelRulesBuildThreshold;
+ }
+
private static void processRuleDescr(RuleContext context, PackageDescr
packageDescr) {
if (context.getRuleDescr() instanceof QueryDescr) {
QueryGenerator.processQuery(context.getPackageModel(),
(QueryDescr) context.getRuleDescr());
diff --git
a/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/processors/DeclaredTypeCompilationPhase.java
b/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/processors/DeclaredTypeCompilationPhase.java
index 2d0afcf712..a2755edfbb 100644
---
a/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/processors/DeclaredTypeCompilationPhase.java
+++
b/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/processors/DeclaredTypeCompilationPhase.java
@@ -18,22 +18,22 @@
*/
package org.drools.model.codegen.execmodel.processors;
+import java.util.Collection;
+import java.util.List;
+
import org.drools.compiler.builder.PackageRegistryManager;
import org.drools.compiler.builder.impl.BuildResultCollector;
import org.drools.compiler.builder.impl.BuildResultCollectorImpl;
import org.drools.compiler.builder.impl.KnowledgeBuilderConfigurationImpl;
import org.drools.compiler.builder.impl.processors.CompilationPhase;
-import org.drools.compiler.builder.impl.processors.SinglePackagePhaseFactory;
import org.drools.compiler.builder.impl.processors.IteratingPhase;
+import org.drools.compiler.builder.impl.processors.SinglePackagePhaseFactory;
import org.drools.compiler.lang.descr.CompositePackageDescr;
import org.drools.model.codegen.execmodel.CanonicalModelBuildContext;
import org.drools.model.codegen.execmodel.PackageModelManager;
import org.drools.model.codegen.execmodel.generator.declaredtype.POJOGenerator;
import org.kie.internal.builder.KnowledgeBuilderResult;
-import java.util.Collection;
-import java.util.List;
-
import static java.util.Arrays.asList;
public class DeclaredTypeCompilationPhase implements CompilationPhase {
@@ -45,12 +45,9 @@ public class DeclaredTypeCompilationPhase implements
CompilationPhase {
private final Collection<CompositePackageDescr> packages;
private final BuildResultCollector results;
- public DeclaredTypeCompilationPhase(
- PackageModelManager packageModelManager,
- PackageRegistryManager pkgRegistryManager,
- CanonicalModelBuildContext buildContext,
- KnowledgeBuilderConfigurationImpl buildConfiguration,
- Collection<CompositePackageDescr> packages) {
+ public DeclaredTypeCompilationPhase( PackageModelManager
packageModelManager, PackageRegistryManager pkgRegistryManager,
+ CanonicalModelBuildContext
buildContext, KnowledgeBuilderConfigurationImpl buildConfiguration,
+ Collection<CompositePackageDescr>
packages) {
this.packageModelManager = packageModelManager;
this.pkgRegistryManager = pkgRegistryManager;
this.buildContext = buildContext;
diff --git
a/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/ModelBuilderImplTest.java
b/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/ModelBuilderImplTest.java
index c483cedde1..76adb83215 100644
---
a/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/ModelBuilderImplTest.java
+++
b/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/ModelBuilderImplTest.java
@@ -63,7 +63,7 @@ public class ModelBuilderImplTest {
PackageDescr packageDescr = getPackageDescr(null);
PackageModel retrieved = modelBuilder.getPackageModel(packageDescr,
packageRegistry, internalKnowledgePackage.getName());
assertThat(retrieved).isNotNull();
- String expected = getPkgUUID(RELEASE_ID,
internalKnowledgePackage.getName());
+ String expected = getPkgUUID(retrieved.getConfiguration(), RELEASE_ID,
internalKnowledgePackage.getName());
assertThat(retrieved.getPackageUUID()).isEqualTo(expected);
}
diff --git
a/kie-dmn/kie-dmn-validation-bootstrap/src/main/java/org/kie/dmn/validation/bootstrap/GenerateModel.java
b/kie-dmn/kie-dmn-validation-bootstrap/src/main/java/org/kie/dmn/validation/bootstrap/GenerateModel.java
index adf87fba50..84b04e932c 100644
---
a/kie-dmn/kie-dmn-validation-bootstrap/src/main/java/org/kie/dmn/validation/bootstrap/GenerateModel.java
+++
b/kie-dmn/kie-dmn-validation-bootstrap/src/main/java/org/kie/dmn/validation/bootstrap/GenerateModel.java
@@ -65,8 +65,8 @@ public class GenerateModel {
kieBuilder.buildAll(ValidationBootstrapProject::new,
s -> !s.contains("src/test/java") &&
!s.contains("src\\test\\java") &&
- !s.contains("DMNValidator") && // <- to break
circularity which is only caused by the KieBuilder trying to early compile
everything by itself
- !s.contains("dtanalysis"));
+ !s.contains("DMNValidator") && // <- to
break circularity which is only caused by the KieBuilder trying to early
compile everything by itself
+ !s.contains("dtanalysis"));
Results results = kieBuilder.getResults();
results.getMessages().forEach(m -> LOG.info("{}", m.toString()));
diff --git a/kie-dmn/kie-dmn-validation/pom.xml
b/kie-dmn/kie-dmn-validation/pom.xml
index 3056ba4025..1e19a9f2a2 100644
--- a/kie-dmn/kie-dmn-validation/pom.xml
+++ b/kie-dmn/kie-dmn-validation/pom.xml
@@ -32,6 +32,7 @@
<properties>
<java.module.name>org.kie.dmn.validation</java.module.name>
+
<drools.reproducibleExecutableModelGeneration>true</drools.reproducibleExecutableModelGeneration>
</properties>
<dependencyManagement>
@@ -212,6 +213,26 @@
</execution>
</executions>
</plugin>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>properties-maven-plugin</artifactId>
+ <executions>
+ <execution>
+ <phase>initialize</phase>
+ <goals>
+ <goal>set-system-properties</goal>
+ </goals>
+ <configuration>
+ <properties>
+ <property>
+ <name>drools.reproducibleExecutableModelGeneration</name>
+
<value>${drools.reproducibleExecutableModelGeneration}</value>
+ </property>
+ </properties>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
</plugins>
</build>
diff --git
a/kie-internal/src/main/java/org/kie/internal/builder/conf/ReproducibleExecutableModelGenerationOption.java
b/kie-internal/src/main/java/org/kie/internal/builder/conf/ReproducibleExecutableModelGenerationOption.java
new file mode 100644
index 0000000000..1efa1a5d2d
--- /dev/null
+++
b/kie-internal/src/main/java/org/kie/internal/builder/conf/ReproducibleExecutableModelGenerationOption.java
@@ -0,0 +1,55 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.kie.internal.builder.conf;
+
+import org.kie.api.conf.OptionKey;
+
+/**
+ * An Enum to force the reproducible executable model generation.
+ *
+ * drools.reproducibleExecutableModelGeneration = <true|false>
+ *
+ * DEFAULT = false
+ */
+public enum ReproducibleExecutableModelGenerationOption implements
SingleValueRuleBuilderOption {
+
+ ENABLED(true),
+ DISABLED(false);
+
+ public static final String PROPERTY_NAME =
"drools.reproducibleExecutableModelGeneration";
+
+ public static OptionKey<ReproducibleExecutableModelGenerationOption> KEY =
new OptionKey<>(TYPE, PROPERTY_NAME);
+
+ private boolean value;
+
+ ReproducibleExecutableModelGenerationOption(final boolean value ) {
+ this.value = value;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getPropertyName() {
+ return PROPERTY_NAME;
+ }
+
+ public boolean isReproducibleExecutableModelGeneration() {
+ return this.value;
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]