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 = <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: commits-unsubscr...@kie.apache.org For additional commands, e-mail: commits-h...@kie.apache.org