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]

Reply via email to