This is an automated email from the ASF dual-hosted git repository.
gitgabrio pushed a commit to branch main
in repository
https://gitbox.apache.org/repos/asf/incubator-kie-kogito-runtimes.git
The following commit(s) were added to refs/heads/main by this push:
new ed92baa255 [incubator-kie-issues#1973] Adapt to benchmark-related
refactoring (#3949)
ed92baa255 is described below
commit ed92baa25516191486ca96f23d8c02f0d48c2ff6
Author: Gabriele Cardosi <[email protected]>
AuthorDate: Tue Jul 1 09:48:55 2025 +0200
[incubator-kie-issues#1973] Adapt to benchmark-related refactoring (#3949)
* [[incubator-kie-issues#1973] Refactoring to update to upstream changes -
reusing efesto-provide info to avoid duplicated evaluation
* [[incubator-kie-issues#1973] Remove unused method
* [[incubator-kie-issues#1973] adding timeout to potentially blocking test
* [[incubator-kie-issues#1973] Fix import sorting
* [[incubator-kie-issues#1973] Cleanup as per PR suggestion
---------
Co-authored-by: Gabriele-Cardosi <[email protected]>
---
.../codegen/decision/DecisionCodegenUtils.java | 41 ++++++++---
.../codegen/decision/DecisionValidation.java | 86 +++-------------------
.../codegen/decision/DecisionCodegenUtilsTest.java | 51 +++++++++++++
.../common/QuarkusEventThreadPoolTest.java | 3 +-
4 files changed, 92 insertions(+), 89 deletions(-)
diff --git
a/kogito-codegen-modules/kogito-codegen-decisions/src/main/java/org/kie/kogito/codegen/decision/DecisionCodegenUtils.java
b/kogito-codegen-modules/kogito-codegen-decisions/src/main/java/org/kie/kogito/codegen/decision/DecisionCodegenUtils.java
index 21543a3b14..c8082ebd63 100644
---
a/kogito-codegen-modules/kogito-codegen-decisions/src/main/java/org/kie/kogito/codegen/decision/DecisionCodegenUtils.java
+++
b/kogito-codegen-modules/kogito-codegen-decisions/src/main/java/org/kie/kogito/codegen/decision/DecisionCodegenUtils.java
@@ -21,6 +21,7 @@ package org.kie.kogito.codegen.decision;
import java.util.Collection;
import java.util.Collections;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@@ -48,6 +49,7 @@ import org.kie.dmn.openapi.model.DMNOASResult;
import org.kie.dmn.typesafe.DMNAllTypesIndex;
import org.kie.dmn.typesafe.DMNTypeSafePackageName;
import org.kie.dmn.typesafe.DMNTypeSafeTypeGenerator;
+import org.kie.dmn.validation.DMNValidator;
import org.kie.efesto.common.api.identifiers.LocalUri;
import org.kie.efesto.common.api.identifiers.ModelLocalUriId;
import org.kie.efesto.common.api.model.EfestoCompilationContext;
@@ -85,8 +87,11 @@ public class DecisionCodegenUtils {
SPIUtils.getCompilationManager(true).orElseThrow(() -> new
RuntimeException("Compilation Manager not " +
"available"));
- private static final String operationalDashboardDmnTemplate =
"/grafana-dashboard-template/operational-dashboard-template.json";
- private static final String domainDashboardDmnTemplate =
"/grafana-dashboard-template/blank-dashboard.json";
+ private static final String OPERATIONAL_DASHBOARD_DMN_TEMPLATE =
"/grafana-dashboard-template/operational-dashboard-template.json";
+ private static final String DOMAIN_DASHBOARD_DMN_TEMPLATE =
"/grafana-dashboard-template/blank-dashboard.json";
+
+ private DecisionCodegenUtils() {
+ }
static Map.Entry<String, GeneratedResources>
generateModelsFromResources(Collection<GeneratedFile> generatedFiles,
List<String> classesForManualReflection,
@@ -125,33 +130,45 @@ public class DecisionCodegenUtils {
static Map.Entry<String, GeneratedResources>
loadModelsAndValidate(KogitoBuildContext context, Map<Resource,
CollectedResource> r2cr,
Set<DMNProfile> customDMNProfiles,
RuntimeTypeCheckOption runtimeTypeCheckOption) {
- DecisionValidation.dmnValidateResources(context, r2cr.keySet());
+ Set<DMNValidator.Validation> validations = new HashSet<>();
+ DecisionValidation.ValidationOption validateOption =
DecisionValidation.fromContext(context);
+ if (validateOption == DecisionValidation.ValidationOption.DISABLED) {
+ LOGGER.info("DMN Validation was set to DISABLED, skipping
VALIDATE_SCHEMA, VALIDATE_MODEL.");
+ } else {
+ validations.add(DMNValidator.Validation.VALIDATE_SCHEMA);
+ validations.add(DMNValidator.Validation.VALIDATE_MODEL);
+ }
Set<Resource> dmnResources = r2cr.keySet();
ModelLocalUriId dmnModelLocalUriId = new
ModelLocalUriId(LocalUri.Root.append("dmn").append("scesim"));
DMNResourceSetResource toProcessDmn = new
DMNResourceSetResource(dmnResources, dmnModelLocalUriId);
- EfestoCompilationContext dmnCompilationContext =
DmnCompilationContext.buildWithParentClassLoader(context.getClassLoader(),
customDMNProfiles, runtimeTypeCheckOption);
+ EfestoCompilationContext dmnCompilationContext =
DmnCompilationContext.buildWithParentClassLoader(context.getClassLoader(),
customDMNProfiles, validations, runtimeTypeCheckOption);
compilationManager.processResource(dmnCompilationContext,
toProcessDmn);
Map<String, GeneratedResources> generatedResourcesMap =
dmnCompilationContext.getGeneratedResourcesMap();
- Map.Entry<String, GeneratedResources> toReturn =
generatedResourcesMap.entrySet().stream().filter(entry ->
entry.getKey().equals("dmn")).findFirst().orElseThrow(() -> new
RuntimeException());
+ Map.Entry<String, GeneratedResources> toReturn =
generatedResourcesMap.entrySet().stream().filter(entry ->
entry.getKey().equals("dmn")).findFirst().orElseThrow(RuntimeException::new);
toReturn.getValue().stream().filter(GeneratedModelResource.class::isInstance)
.map(GeneratedModelResource.class::cast)
- .forEach(generatedResource -> {
+ .forEach(generatedModelResource -> {
GeneratedResources generatedResources =
(GeneratedResources)
dmnCompilationContext.getGeneratedResourcesMap().get("dmn");
if (generatedResources == null) {
-
ContextStorage.putEfestoCompilationContext(generatedResource.getModelLocalUriId(),
dmnCompilationContext);
+
ContextStorage.putEfestoCompilationContext(generatedModelResource.getModelLocalUriId(),
dmnCompilationContext);
} else {
Optional<GeneratedModelResource> first =
generatedResources.stream()
.filter(GeneratedModelResource.class::isInstance)
.map(GeneratedModelResource.class::cast)
- .filter(storedGeneratedResources ->
storedGeneratedResources.getModelLocalUriId().equals(generatedResource.getModelLocalUriId()))
+ .filter(storedGeneratedResources ->
storedGeneratedResources.getModelLocalUriId().equals(generatedModelResource.getModelLocalUriId()))
.findFirst();
// let's avoid overwrite an already compiled resources
if (first.isEmpty() || first.get().getCompiledModel()
== null) {
-
ContextStorage.putEfestoCompilationContext(generatedResource.getModelLocalUriId(),
dmnCompilationContext);
+
ContextStorage.putEfestoCompilationContext(generatedModelResource.getModelLocalUriId(),
dmnCompilationContext);
+ }
+ // let's manage DMNMessages
+ Object additionalInfo =
generatedModelResource.getAdditionalInfo();
+ if (additionalInfo instanceof List
schemaModelValidations) {
+
DecisionValidation.logAndProcessValidationMessages(validateOption,
schemaModelValidations);
}
}
});
- return generatedResourcesMap.entrySet().stream().filter(entry ->
entry.getKey().equals("dmn")).findFirst().orElseThrow(() -> new
RuntimeException());
+ return toReturn;
}
static DMNResource
getDMNResourceFromGeneratedModelResource(GeneratedModelResource
generatedModelResource, Map<Resource, CollectedResource> r2cr) {
@@ -290,7 +307,7 @@ public class DecisionCodegenUtils {
Definitions definitions =
resourceGenerator.getDmnModel().getDefinitions();
List<Decision> decisions =
definitions.getDrgElement().stream().filter(x -> x.getParentDRDElement()
instanceof Decision).map(x -> (Decision) x).collect(toList());
Optional<String> operationalDashboard =
GrafanaConfigurationWriter.generateOperationalDashboard(
- operationalDashboardDmnTemplate,
+ OPERATIONAL_DASHBOARD_DMN_TEMPLATE,
resourceGenerator.getNameURL(),
context.getPropertiesMap(),
resourceGenerator.getNameURL(),
@@ -299,7 +316,7 @@ public class DecisionCodegenUtils {
String dashboardName =
GrafanaConfigurationWriter.buildDashboardName(context.getGAV(),
resourceGenerator.getNameURL());
operationalDashboard.ifPresent(dashboard ->
generatedFiles.addAll(DashboardGeneratedFileUtils.operational(dashboard,
dashboardName + ".json")));
Optional<String> domainDashboard =
GrafanaConfigurationWriter.generateDomainSpecificDMNDashboard(
- domainDashboardDmnTemplate,
+ DOMAIN_DASHBOARD_DMN_TEMPLATE,
resourceGenerator.getNameURL(),
context.getPropertiesMap(),
resourceGenerator.getNameURL(),
diff --git
a/kogito-codegen-modules/kogito-codegen-decisions/src/main/java/org/kie/kogito/codegen/decision/DecisionValidation.java
b/kogito-codegen-modules/kogito-codegen-decisions/src/main/java/org/kie/kogito/codegen/decision/DecisionValidation.java
index dd9894ee7e..c27dedc551 100644
---
a/kogito-codegen-modules/kogito-codegen-decisions/src/main/java/org/kie/kogito/codegen/decision/DecisionValidation.java
+++
b/kogito-codegen-modules/kogito-codegen-decisions/src/main/java/org/kie/kogito/codegen/decision/DecisionValidation.java
@@ -18,11 +18,8 @@
*/
package org.kie.kogito.codegen.decision;
-import java.io.IOException;
-import java.io.Reader;
import java.util.Arrays;
import java.util.Collection;
-import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.function.Consumer;
@@ -30,18 +27,12 @@ import java.util.function.Function;
import java.util.stream.Collectors;
import org.kie.api.builder.Message.Level;
-import org.kie.api.io.Resource;
import org.kie.dmn.api.core.DMNMessage;
-import org.kie.dmn.api.core.DMNModel;
-import org.kie.dmn.core.compiler.profiles.ExtendedDMNProfile;
import org.kie.dmn.model.api.DMNModelInstrumentedBase;
import org.kie.dmn.model.api.DecisionTable;
import org.kie.dmn.model.api.Definitions;
import org.kie.dmn.model.api.FunctionDefinition;
import org.kie.dmn.model.api.NamedElement;
-import org.kie.dmn.validation.DMNValidator;
-import org.kie.dmn.validation.DMNValidatorFactory;
-import org.kie.dmn.validation.dtanalysis.DMNDTAnalyser;
import org.kie.dmn.validation.dtanalysis.model.DTAnalysis;
import org.kie.kogito.codegen.api.context.KogitoBuildContext;
import org.slf4j.Logger;
@@ -58,7 +49,7 @@ public class DecisionValidation {
}
- public static enum ValidationOption {
+ public enum ValidationOption {
/**
* Perform DMN Validation and blocks if any Errors is found. This is
the default.
*/
@@ -73,19 +64,7 @@ public class DecisionValidation {
IGNORE;
}
- /**
- * Performs VALIDATE_SCHEMA, VALIDATE_MODEL for XSD schema validation and
Semantic validation with DRL rules as exec model
- */
- static void dmnValidateResources(KogitoBuildContext context,
Collection<Resource> resources) {
- ValidationOption validateOption = fromContext(context);
- if (validateOption == ValidationOption.DISABLED) {
- LOG.info("DMN Validation was set to DISABLED, skipping
VALIDATE_SCHEMA, VALIDATE_MODEL.");
- return;
- }
- List<DMNMessage> schemaModelValidations =
DMNValidatorFactory.newValidator(List.of(new ExtendedDMNProfile()))
- .validateUsing(DMNValidator.Validation.VALIDATE_SCHEMA,
- DMNValidator.Validation.VALIDATE_MODEL)
- .theseModels(resources.toArray(new Resource[] {}));
+ static void logAndProcessValidationMessages(ValidationOption
validateOption, List<DMNMessage> schemaModelValidations) {
logValidationMessages(schemaModelValidations,
DecisionValidation::extractMsgPrefix, DMNMessage::getText);
processMessagesHandleErrors(validateOption, schemaModelValidations);
}
@@ -103,50 +82,34 @@ public class DecisionValidation {
return "";
}
- private static ValidationOption fromContext(KogitoBuildContext context) {
+ public static ValidationOption fromContext(KogitoBuildContext context) {
if (context == null) {
LOG.info("No GeneratorContext available, will assume {}=ENABLED",
DecisionCodegen.VALIDATION_CONFIGURATION_KEY);
return ValidationOption.ENABLED;
}
Optional<String> applicationProperty =
context.getApplicationProperty(DecisionCodegen.VALIDATION_CONFIGURATION_KEY);
- if (!applicationProperty.isPresent()) {
+ if (applicationProperty.isEmpty()) {
return ValidationOption.ENABLED; // the default
}
Optional<ValidationOption> configOption =
Arrays.stream(ValidationOption.values())
.filter(e ->
e.name().equalsIgnoreCase(applicationProperty.get()))
.findAny();
- if (!configOption.isPresent()) {
+ if (configOption.isEmpty()) {
LOG.warn("Validation configuration value {} does not correspond to
any valid option, will assume {}=ENABLED", applicationProperty.get(),
DecisionCodegen.VALIDATION_CONFIGURATION_KEY);
return ValidationOption.ENABLED;
}
return configOption.get();
}
- private static Reader resourceToReader(Resource resource) {
- try {
- return resource.getReader();
- } catch (IOException e) {
- throw new RuntimeException("DecisionValidation unable to locate
Resource's Reader", e);
- }
- }
-
private static void logValidationMessages(List<DMNMessage> validation,
Function<DMNMessage, String> prefixer,
Function<DMNMessage, String> computeMessage) {
for (DMNMessage msg : validation) {
- Consumer<String> logFn = null;
- switch (msg.getLevel()) {
- case ERROR:
- logFn = LOG::error;
- break;
- case WARNING:
- logFn = LOG::warn;
- break;
- case INFO:
- default:
- logFn = LOG::info;
- break;
- }
+ Consumer<String> logFn = switch (msg.getLevel()) {
+ case ERROR -> LOG::error;
+ case WARNING -> LOG::warn;
+ default -> LOG::info;
+ };
StringBuilder sb = new StringBuilder();
sb.append(prefixer.apply(msg));
sb.append(computeMessage.apply(msg));
@@ -154,35 +117,6 @@ public class DecisionValidation {
}
}
- /**
- * Performs ANALYZE_DECISION_TABLE for DMN Decision Table (static) analysis
- */
- static void dmnValidateDecisionTablesInModels(KogitoBuildContext context,
Collection<DMNModel> dmnModels) {
- ValidationOption validateOption = fromContext(context);
- if (validateOption == ValidationOption.DISABLED) {
- LOG.info("DMN Validation was set to DISABLED, skipping Decision
Table (static) analysis.");
- return;
- }
-
- LOG.info("Initializing DMN DT Validator...");
- DMNDTAnalyser dmndtAnalyser = new DMNDTAnalyser(Arrays.asList(new
ExtendedDMNProfile())); // TODO pending DROOLS-5072 refactoring
- LOG.info("DMN DT Validator initialized.");
- for (DMNModel model : dmnModels) {
- LOG.info("Analysing decision tables in DMN Model '{}' ...",
model.getName());
- List<DTAnalysis> results = dmndtAnalyser.analyse(model, new
HashSet<>(Arrays.asList(DMNValidator.Validation.ANALYZE_DECISION_TABLE)));
- if (results.isEmpty()) {
- LOG.info(" no decision tables found.");
- } else {
- for (DTAnalysis r : results) {
- LOG.info(" analysis for decision table '{}':",
nameOrIDOfTable(r));
- List<DMNMessage> messages = r.asDMNMessages();
- logValidationMessages(messages, p -> " ",
DMNMessage::getMessage);
- processMessagesHandleErrors(validateOption, messages);
- }
- }
- }
- }
-
private static void processMessagesHandleErrors(ValidationOption
validateOption, Collection<DMNMessage> messages) {
List<DMNMessage> errors = messages.stream().filter(m -> m.getLevel()
== Level.ERROR).toList();
if (!errors.isEmpty()) {
diff --git
a/kogito-codegen-modules/kogito-codegen-decisions/src/test/java/org/kie/kogito/codegen/decision/DecisionCodegenUtilsTest.java
b/kogito-codegen-modules/kogito-codegen-decisions/src/test/java/org/kie/kogito/codegen/decision/DecisionCodegenUtilsTest.java
new file mode 100644
index 0000000000..f1856328cc
--- /dev/null
+++
b/kogito-codegen-modules/kogito-codegen-decisions/src/test/java/org/kie/kogito/codegen/decision/DecisionCodegenUtilsTest.java
@@ -0,0 +1,51 @@
+/*
+ * 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.kogito.codegen.decision;
+
+import java.nio.file.Paths;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
+import org.kie.api.io.Resource;
+import org.kie.dmn.core.compiler.RuntimeTypeCheckOption;
+import org.kie.efesto.common.api.model.GeneratedResources;
+import org.kie.kogito.codegen.api.context.KogitoBuildContext;
+import org.kie.kogito.codegen.api.io.CollectedResource;
+import org.kie.kogito.codegen.core.io.CollectedResourceProducer;
+
+class DecisionCodegenUtilsTest {
+
+ @ParameterizedTest
+
@MethodSource("org.kie.kogito.codegen.api.utils.KogitoContextTestUtils#contextBuilders")
+ void loadModelsAndValidate(KogitoBuildContext.Builder contextBuilder) {
+ KogitoBuildContext context = contextBuilder.build();
+ final Collection<CollectedResource> cResources =
CollectedResourceProducer.fromPaths(
+
Paths.get("src/test/resources/decision/models/vacationDays").toAbsolutePath());
+ Map<Resource, CollectedResource> r2cr =
cResources.stream().collect(Collectors.toMap(CollectedResource::resource,
Function.identity()));
+ Map.Entry<String, GeneratedResources> retrieved =
DecisionCodegenUtils.loadModelsAndValidate(context, r2cr,
Collections.emptySet(), new RuntimeTypeCheckOption(false));
+ System.out.println(retrieved.getKey());
+ }
+
+}
diff --git
a/quarkus/addons/messaging/common/src/test/java/org/kie/kogito/addon/quarkus/messaging/common/QuarkusEventThreadPoolTest.java
b/quarkus/addons/messaging/common/src/test/java/org/kie/kogito/addon/quarkus/messaging/common/QuarkusEventThreadPoolTest.java
index b77bd7e0fe..31c471b94e 100644
---
a/quarkus/addons/messaging/common/src/test/java/org/kie/kogito/addon/quarkus/messaging/common/QuarkusEventThreadPoolTest.java
+++
b/quarkus/addons/messaging/common/src/test/java/org/kie/kogito/addon/quarkus/messaging/common/QuarkusEventThreadPoolTest.java
@@ -24,6 +24,7 @@ import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import org.junit.jupiter.api.BeforeEach;
@@ -122,7 +123,7 @@ public class QuarkusEventThreadPoolTest {
return temp + 1;
});
}
- List<Future<Integer>> answers = executor.invokeAll(runnables);
+ List<Future<Integer>> answers = executor.invokeAll(runnables, 5,
TimeUnit.MINUTES);
assertEquals(count, counter.get());
for (int i = 0; i < answers.size(); i++) {
assertEquals(i + 1, answers.get(i).get());
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]