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 <mario.fu...@gmail.com>
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 = &lt;true|false&gt;
+ *
+ * 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: commits-unsubscr...@kie.apache.org
For additional commands, e-mail: commits-h...@kie.apache.org

Reply via email to