You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kie.apache.org by gi...@apache.org on 2025/05/20 10:05:22 UTC
(incubator-kie-kogito-runtimes) branch main updated: [incubator-kie-issues#1891] Add kie-dmn-efesto dependencies. (#3896)
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 0691bcac71 [incubator-kie-issues#1891] Add kie-dmn-efesto dependencies. (#3896)
0691bcac71 is described below
commit 0691bcac718ad91c132277fa2830186e6eb69e6d
Author: Gabriele Cardosi <ga...@gmail.com>
AuthorDate: Tue May 20 12:05:18 2025 +0200
[incubator-kie-issues#1891] Add kie-dmn-efesto dependencies. (#3896)
* [incubator-kie-issues#1891] Add kie-dmn-efesto dependencies. Remove override of KogitoDMNScenarioRunner.java
* [incubator-kie-issues#1891] Add kie-dmn-efesto dependencies. Remove override of KogitoDMNScenarioRunner.java
* [incubator-kie-issues#1891] Managing set of DMN resources
* [incubator-kie-issues#1891] Refactoring DevMojoIT
* [incubator-kie-issues#1891] experiment refactoring DevMojoIT
* [incubator-kie-issues#1891] Disabling DevMojoIT
* [incubator-kie-issues#1891] Fixing IndexFile discovery
---------
Co-authored-by: Gabriele-Cardosi <ga...@ibm.com>
---
drools/kogito-scenario-simulation/pom.xml | 12 +-
.../runner/KogitoDMNScenarioRunner.java | 52 ---
.../runner/KogitoDMNScenarioRunnerHelper.java | 114 -------
.../runner/KogitoJunitActivator.java | 11 +-
.../test/resources/dmnPmml/KiePMMLTreeTest.scesim | 2 +-
kogito-build/kogito-kie-bom/pom.xml | 11 +
.../kogito-codegen-decisions/pom.xml | 4 +
.../kogito/codegen/decision/DecisionCodegen.java | 252 +++------------
.../codegen/decision/DecisionCodegenUtils.java | 355 +++++++++++++++++++++
...DecisionCloudEventMetaFactoryGeneratorTest.java | 4 +-
.../io/quarkus/it/kogito/devmode/DevMojoIT.java | 5 +
11 files changed, 429 insertions(+), 393 deletions(-)
diff --git a/drools/kogito-scenario-simulation/pom.xml b/drools/kogito-scenario-simulation/pom.xml
index 01f98cde4e..9ec945b918 100644
--- a/drools/kogito-scenario-simulation/pom.xml
+++ b/drools/kogito-scenario-simulation/pom.xml
@@ -61,7 +61,8 @@
<groupId>org.kie.kogito</groupId>
<artifactId>kogito-pmml</artifactId>
</dependency>
-<!-- EFESTO -->
+ <!-- EFESTO -->
+ <!-- DRL -->
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-drl-compilation-common</artifactId>
@@ -70,6 +71,15 @@
<groupId>org.kie</groupId>
<artifactId>kie-drl-map-input-runtime</artifactId>
</dependency>
+ <!-- DMN -->
+ <dependency>
+ <groupId>org.kie</groupId>
+ <artifactId>kie-dmn-efesto-compilation</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.kie</groupId>
+ <artifactId>kie-dmn-efesto-runtime</artifactId>
+ </dependency>
<!-- Used indirectly by PMML during compilation of Drools based models -->
diff --git a/drools/kogito-scenario-simulation/src/main/java/org/kogito/scenariosimulation/runner/KogitoDMNScenarioRunner.java b/drools/kogito-scenario-simulation/src/main/java/org/kogito/scenariosimulation/runner/KogitoDMNScenarioRunner.java
deleted file mode 100644
index 66ce7cf92e..0000000000
--- a/drools/kogito-scenario-simulation/src/main/java/org/kogito/scenariosimulation/runner/KogitoDMNScenarioRunner.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * 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.kogito.scenariosimulation.runner;
-
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Proxy;
-
-import org.drools.scenariosimulation.backend.runner.AbstractRunnerHelper;
-import org.drools.scenariosimulation.backend.runner.DMNScenarioRunner;
-import org.drools.scenariosimulation.backend.runner.model.ScenarioRunnerDTO;
-import org.kie.api.runtime.KieContainer;
-
-public class KogitoDMNScenarioRunner extends DMNScenarioRunner {
-
- private static final KieContainer mockKieContainer = mockKieContainer();
-
- public KogitoDMNScenarioRunner(ScenarioRunnerDTO scenarioRunnerDTO) {
- super(mockKieContainer, scenarioRunnerDTO);
- }
-
- @Override
- protected AbstractRunnerHelper newRunnerHelper() {
- return new KogitoDMNScenarioRunnerHelper();
- }
-
- /**
- * Temporary hack, it is needed because AbstractScenarioRunner invokes kieContainer.getClassLoader() in the constructor
- *
- * @return
- */
- private static KieContainer mockKieContainer() {
- InvocationHandler nullHandler = (o, method, objects) -> null;
- return (KieContainer) Proxy.newProxyInstance(KieContainer.class.getClassLoader(),
- new Class[] { KieContainer.class }, nullHandler);
- }
-}
diff --git a/drools/kogito-scenario-simulation/src/main/java/org/kogito/scenariosimulation/runner/KogitoDMNScenarioRunnerHelper.java b/drools/kogito-scenario-simulation/src/main/java/org/kogito/scenariosimulation/runner/KogitoDMNScenarioRunnerHelper.java
deleted file mode 100644
index 2babf30313..0000000000
--- a/drools/kogito-scenario-simulation/src/main/java/org/kogito/scenariosimulation/runner/KogitoDMNScenarioRunnerHelper.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * 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.kogito.scenariosimulation.runner;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Stream;
-
-import org.drools.codegen.common.AppPaths;
-import org.drools.io.FileSystemResource;
-import org.drools.scenariosimulation.api.model.ScenarioSimulationModel;
-import org.drools.scenariosimulation.api.model.ScesimModelDescriptor;
-import org.drools.scenariosimulation.api.model.Settings;
-import org.drools.scenariosimulation.backend.expression.ExpressionEvaluatorFactory;
-import org.drools.scenariosimulation.backend.runner.DMNScenarioRunnerHelper;
-import org.drools.scenariosimulation.backend.runner.ScenarioException;
-import org.drools.scenariosimulation.backend.runner.model.ScenarioRunnerData;
-import org.drools.scenariosimulation.backend.util.DMNSimulationUtils;
-import org.kie.api.io.Resource;
-import org.kie.api.runtime.KieContainer;
-import org.kie.dmn.api.core.DMNContext;
-import org.kie.dmn.api.core.DMNModel;
-import org.kie.dmn.api.core.DMNResult;
-import org.kie.dmn.api.core.DMNRuntime;
-import org.kie.dmn.core.internal.utils.DMNRuntimeBuilder;
-
-import static java.util.stream.Collectors.toList;
-import static org.drools.scenariosimulation.backend.fluent.DMNScenarioExecutableBuilder.DMN_MODEL;
-import static org.drools.scenariosimulation.backend.fluent.DMNScenarioExecutableBuilder.DMN_RESULT;
-
-public class KogitoDMNScenarioRunnerHelper extends DMNScenarioRunnerHelper {
-
- private DMNRuntime dmnRuntime = initDmnRuntime();
-
- private static final String targetFolder = File.separator + AppPaths.TARGET_DIR + File.separator;
- private static final String generatedResourcesFolder = targetFolder + "generated-resources" + File.separator;
-
- @Override
- protected Map<String, Object> executeScenario(KieContainer kieContainer,
- ScenarioRunnerData scenarioRunnerData,
- ExpressionEvaluatorFactory expressionEvaluatorFactory,
- ScesimModelDescriptor scesimModelDescriptor,
- Settings settings) {
- if (!ScenarioSimulationModel.Type.DMN.equals(settings.getType())) {
- throw new ScenarioException("Impossible to run a not-DMN simulation with DMN runner");
- }
- DMNModel dmnModel = getDMNModel(dmnRuntime, settings);
- DMNContext dmnContext = dmnRuntime.newContext();
-
- defineInputValues(scenarioRunnerData.getBackgrounds(), scenarioRunnerData.getGivens()).forEach(dmnContext::set);
-
- DMNResult dmnResult = dmnRuntime.evaluateAll(dmnModel, dmnContext);
-
- Map<String, Object> toReturn = new HashMap<>();
- toReturn.put(DMN_MODEL, dmnModel);
- toReturn.put(DMN_RESULT, dmnResult);
-
- return toReturn;
- }
-
- private DMNModel getDMNModel(DMNRuntime dmnRuntime, Settings settings) {
- try {
- return DMNSimulationUtils.extractDMNModel(dmnRuntime, settings.getDmnFilePath());
- } catch (Exception e) {
- // if filename is not available or it fails, try directly with namespace/name
- return dmnRuntime.getModel(settings.getDmnNamespace(), settings.getDmnName());
- }
- }
-
- private DMNRuntime initDmnRuntime() {
- try (Stream<Path> fileStream = Files.walk(Paths.get("."))) {
- List<Resource> resources = fileStream.filter(path -> filterResource(path, ".dmn"))
- .map(Path::toFile)
- .map(FileSystemResource::new)
- .collect(toList());
-
- return DMNRuntimeBuilder.fromDefaults()
- .buildConfiguration()
- .fromResources(resources)
- .getOrElseThrow(e -> new RuntimeException("Error initializing DMNRuntime", e));
- } catch (IOException e) {
- throw new IllegalStateException("Error initializing KogitoDMNScenarioRunnerHelper", e);
- }
- }
-
- private boolean filterResource(Path path, String extension) {
- return path.toString().endsWith(extension) &&
- (path.toString().contains(generatedResourcesFolder) || !(path.toString().contains(targetFolder)))
- && Files.isRegularFile(path);
- }
-
-}
diff --git a/drools/kogito-scenario-simulation/src/main/java/org/kogito/scenariosimulation/runner/KogitoJunitActivator.java b/drools/kogito-scenario-simulation/src/main/java/org/kogito/scenariosimulation/runner/KogitoJunitActivator.java
index 9548b22c1e..3235f9d1d8 100644
--- a/drools/kogito-scenario-simulation/src/main/java/org/kogito/scenariosimulation/runner/KogitoJunitActivator.java
+++ b/drools/kogito-scenario-simulation/src/main/java/org/kogito/scenariosimulation/runner/KogitoJunitActivator.java
@@ -19,19 +19,12 @@
package org.kogito.scenariosimulation.runner;
import org.drools.scenariosimulation.backend.runner.ScenarioJunitActivator;
-import org.drools.scenariosimulation.backend.runner.model.ScenarioRunnerDTO;
-import org.junit.runner.notification.RunNotifier;
import org.junit.runners.model.InitializationError;
+@Deprecated(since = "10.2", forRemoval = true)
public class KogitoJunitActivator extends ScenarioJunitActivator {
public KogitoJunitActivator(Class<?> testClass) throws InitializationError {
super(testClass);
}
-
- @Override
- protected void runChild(ScenarioRunnerDTO child, RunNotifier notifier) {
- KogitoDMNScenarioRunner scenarioRunner = new KogitoDMNScenarioRunner(child);
- scenarioRunner.run(notifier);
- }
-}
\ No newline at end of file
+}
diff --git a/drools/kogito-scenario-simulation/src/test/resources/dmnPmml/KiePMMLTreeTest.scesim b/drools/kogito-scenario-simulation/src/test/resources/dmnPmml/KiePMMLTreeTest.scesim
index d731a3d8a3..a7d5442f3c 100644
--- a/drools/kogito-scenario-simulation/src/test/resources/dmnPmml/KiePMMLTreeTest.scesim
+++ b/drools/kogito-scenario-simulation/src/test/resources/dmnPmml/KiePMMLTreeTest.scesim
@@ -275,7 +275,7 @@ under the License.
</scesimData>
</background>
<settings>
- <dmnFilePath>src/main/resources/com/myspace/puppa/KiePMMLTree.dmn</dmnFilePath>
+ <dmnFilePath>src/test/resources/dmnPmml/KiePMMLTree.dmn</dmnFilePath>
<type>DMN</type>
<dmnNamespace>https://kiegroup.org/dmn/_FAA4232D-9D61-4089-BB05-5F5D7C1AECE1</dmnNamespace>
<dmnName>TestTreeDMN</dmnName>
diff --git a/kogito-build/kogito-kie-bom/pom.xml b/kogito-build/kogito-kie-bom/pom.xml
index 683003cdcc..0c068c5607 100644
--- a/kogito-build/kogito-kie-bom/pom.xml
+++ b/kogito-build/kogito-kie-bom/pom.xml
@@ -254,6 +254,17 @@
<artifactId>kie-dmn-openapi</artifactId>
<version>${version.org.kie}</version>
</dependency>
+ <!-- Efesto decisions -->
+ <dependency>
+ <groupId>org.kie</groupId>
+ <artifactId>kie-dmn-efesto-compilation</artifactId>
+ <version>${version.org.kie}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.kie</groupId>
+ <artifactId>kie-dmn-efesto-runtime</artifactId>
+ <version>${version.org.kie}</version>
+ </dependency>
<!-- PMML -->
<dependency>
diff --git a/kogito-codegen-modules/kogito-codegen-decisions/pom.xml b/kogito-codegen-modules/kogito-codegen-decisions/pom.xml
index 52b841b01d..d9ff03ab2b 100644
--- a/kogito-codegen-modules/kogito-codegen-decisions/pom.xml
+++ b/kogito-codegen-modules/kogito-codegen-decisions/pom.xml
@@ -71,6 +71,10 @@
<groupId>org.kie</groupId>
<artifactId>kie-dmn-openapi</artifactId>
</dependency>
+ <dependency>
+ <groupId>org.kie</groupId>
+ <artifactId>kie-dmn-efesto-compilation</artifactId>
+ </dependency>
<!-- Required because of GrafanaConfigurationWriter -->
<dependency>
diff --git a/kogito-codegen-modules/kogito-codegen-decisions/src/main/java/org/kie/kogito/codegen/decision/DecisionCodegen.java b/kogito-codegen-modules/kogito-codegen-decisions/src/main/java/org/kie/kogito/codegen/decision/DecisionCodegen.java
index dfef61899d..bcc27fcaec 100644
--- a/kogito-codegen-modules/kogito-codegen-decisions/src/main/java/org/kie/kogito/codegen/decision/DecisionCodegen.java
+++ b/kogito-codegen-modules/kogito-codegen-decisions/src/main/java/org/kie/kogito/codegen/decision/DecisionCodegen.java
@@ -21,56 +21,33 @@ package org.kie.kogito.codegen.decision;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Collection;
-import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Optional;
import java.util.Set;
-import java.util.function.Function;
import java.util.stream.Collectors;
import org.drools.codegen.common.GeneratedFile;
-import org.drools.codegen.common.GeneratedFileType;
import org.eclipse.microprofile.openapi.spi.OASFactoryResolver;
-import org.kie.api.io.Resource;
import org.kie.api.io.ResourceType;
-import org.kie.dmn.api.core.DMNModel;
-import org.kie.dmn.api.core.DMNRuntime;
-import org.kie.dmn.api.marshalling.DMNMarshaller;
-import org.kie.dmn.backend.marshalling.v1x.DMNMarshallerFactory;
import org.kie.dmn.core.compiler.DMNProfile;
import org.kie.dmn.core.compiler.RuntimeTypeCheckOption;
-import org.kie.dmn.core.internal.utils.DMNRuntimeBuilder;
-import org.kie.dmn.feel.codegen.feel11.CodegenStringUtil;
-import org.kie.dmn.model.api.BusinessKnowledgeModel;
-import org.kie.dmn.model.api.DRGElement;
-import org.kie.dmn.model.api.Decision;
-import org.kie.dmn.model.api.Definitions;
-import org.kie.dmn.openapi.DMNOASGeneratorFactory;
-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.kogito.KogitoGAV;
+import org.kie.efesto.common.api.model.GeneratedResources;
import org.kie.kogito.codegen.api.ApplicationSection;
import org.kie.kogito.codegen.api.context.KogitoBuildContext;
import org.kie.kogito.codegen.api.io.CollectedResource;
import org.kie.kogito.codegen.core.AbstractGenerator;
-import org.kie.kogito.codegen.core.DashboardGeneratedFileUtils;
import org.kie.kogito.codegen.core.io.CollectedResourceProducer;
import org.kie.kogito.codegen.decision.config.DecisionConfigGenerator;
-import org.kie.kogito.codegen.decision.events.DecisionCloudEventMetaFactoryGenerator;
-import org.kie.kogito.grafana.GrafanaConfigurationWriter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
import static java.util.stream.Collectors.toList;
import static org.kie.dmn.core.assembler.DMNAssemblerService.DMN_PROFILE_PREFIX;
-import static org.kie.kogito.codegen.decision.CodegenUtils.getDefinitionsFileFromModel;
+import static org.kie.kogito.codegen.decision.DecisionCodegenUtils.generateModelFromGeneratedResources;
+import static org.kie.kogito.codegen.decision.DecisionCodegenUtils.generateModelsFromResources;
public class DecisionCodegen extends AbstractGenerator {
@@ -122,54 +99,59 @@ public class DecisionCodegen extends AbstractGenerator {
return ofCollectedResources(context, CollectedResourceProducer.fromPaths(context.ignoreHiddenFiles(), paths));
}
- private static final String operationalDashboardDmnTemplate = "/grafana-dashboard-template/operational-dashboard-template.json";
- private static final String domainDashboardDmnTemplate = "/grafana-dashboard-template/blank-dashboard.json";
-
private final List<CollectedResource> cResources;
- private final List<DMNResource> resources = new ArrayList<>();
- private final List<GeneratedFile> generatedFiles = new ArrayList<>();
private final List<String> classesForManualReflection = new ArrayList<>();
private final Set<DMNProfile> customDMNProfiles = new HashSet<>();
private final boolean enableRuntimeTypeCheckOption;
public DecisionCodegen(KogitoBuildContext context, List<CollectedResource> cResources) {
super(context, GENERATOR_NAME, new DecisionConfigGenerator(context));
+ LOGGER.debug("DecisionCodegen {}", cResources);
Set<String> customDMNProfilesProperties = getCustomDMNProfilesProperties();
customDMNProfiles.addAll(getCustomDMNProfiles(customDMNProfilesProperties, context.getClassLoader()));
enableRuntimeTypeCheckOption = getEnableRuntimeTypeCheckOption();
this.cResources = cResources;
}
- private void loadModelsAndValidate() {
- Map<Resource, CollectedResource> r2cr = cResources.stream().collect(Collectors.toMap(CollectedResource::resource, Function.identity()));
- // First, we perform static validation on directly the XML
- DecisionValidation.dmnValidateResources(context(), r2cr.keySet());
- // DMN model processing; any semantic error during compilation will also be thrown accordingly
- DMNRuntimeBuilder dmnRuntimeBuilder = DMNRuntimeBuilder.fromDefaults().setOption(new RuntimeTypeCheckOption(enableRuntimeTypeCheckOption));
- customDMNProfiles.forEach(dmnRuntimeBuilder::addProfile);
- DMNRuntime dmnRuntime = dmnRuntimeBuilder
- .setRootClassLoader(context().getClassLoader()) // KOGITO-4788
- .buildConfiguration()
- .fromResources(r2cr.keySet())
- .getOrElseThrow(e -> new RuntimeException("Error compiling DMN model(s)", e));
- // Any post-compilation of the DMN model validations: DT (static) analysis
- DecisionValidation.dmnValidateDecisionTablesInModels(context(), dmnRuntime.getModels());
- List<DMNResource> dmnResources = dmnRuntime.getModels().stream().map(model -> new DMNResource(model, r2cr.get(model.getResource()))).collect(toList());
- resources.addAll(dmnResources);
+ @Override
+ public Optional<ApplicationSection> section() {
+ LOGGER.debug("section");
+ return Optional.of(new DecisionContainerGenerator(
+ context(),
+ applicationCanonicalName(),
+ this.cResources,
+ this.classesForManualReflection,
+ this.customDMNProfiles,
+ this.enableRuntimeTypeCheckOption));
}
@Override
- protected Collection<GeneratedFile> internalGenerate() {
- loadModelsAndValidate();
- generateAndStoreRestResources();
- generateAndStoreDecisionModelResourcesProvider();
+ public boolean isEmpty() {
+ return cResources.isEmpty();
+ }
- return generatedFiles;
+ @Override
+ public int priority() {
+ return 30;
}
@Override
- public boolean isEmpty() {
- return cResources.isEmpty();
+ public String applicationCanonicalName() {
+ return super.applicationCanonicalName();
+ }
+
+ @Override
+ protected Collection<GeneratedFile> internalGenerate() {
+ LOGGER.debug("internalGenerate");
+ Collection<GeneratedFile> generatedFiles = new ArrayList<>();
+ Map.Entry<String, GeneratedResources> generatedResourcesEntry = generateModelsFromResources(generatedFiles,
+ classesForManualReflection,
+ cResources,
+ customDMNProfiles,
+ new RuntimeTypeCheckOption(getEnableRuntimeTypeCheckOption()),
+ this);
+ generateModelFromGeneratedResources(generatedFiles, generatedResourcesEntry);
+ return generatedFiles;
}
Set<String> getCustomDMNProfilesProperties() {
@@ -205,169 +187,11 @@ public class DecisionCodegen extends AbstractGenerator {
return toReturn;
}
- private void generateAndStoreRestResources() {
- List<DecisionRestResourceGenerator> rgs = new ArrayList<>(); // REST resources
- List<DMNModel> models = resources.stream().map(DMNResource::getDmnModel).collect(Collectors.toList());
-
- for (DMNModel model : models) {
- if (model.getName() == null || model.getName().isEmpty()) {
- throw new RuntimeException("Model name should not be empty");
- }
- DMNOASResult oasResult = generateAndStoreDefinitionsJson(model);
-
- boolean stronglyTypedEnabled = Optional.ofNullable(context())
- .flatMap(c -> c.getApplicationProperty(STRONGLY_TYPED_CONFIGURATION_KEY))
- .map(Boolean::parseBoolean)
- .orElse(false);
-
- if (stronglyTypedEnabled) {
- generateStronglyTypedInput(model);
- }
- DecisionRestResourceGenerator resourceGenerator = new DecisionRestResourceGenerator(context(), model, applicationCanonicalName())
- .withStronglyTyped(stronglyTypedEnabled)
- .withOASResult(oasResult, isMPAnnotationsPresent(), isIOSwaggerOASv3AnnotationsPresent());
- rgs.add(resourceGenerator);
- }
-
- if (context().hasRESTForGenerator(this)) {
- for (DecisionRestResourceGenerator resourceGenerator : rgs) {
- if (context().getAddonsConfig().usePrometheusMonitoring()) {
- generateAndStoreGrafanaDashboards(resourceGenerator);
- }
-
- storeFile(REST_TYPE, resourceGenerator.generatedFilePath(), resourceGenerator.generate());
- }
- }
-
- DMNMarshaller marshaller = DMNMarshallerFactory.newDefaultMarshaller();
- for (DMNResource resource : resources) {
- DMNModel model = resource.getDmnModel();
- Definitions definitions = model.getDefinitions();
- for (DRGElement drg : definitions.getDrgElement()) {
- if (drg instanceof Decision) {
- Decision decision = (Decision) drg;
- decision.setExpression(null);
- } else if (drg instanceof BusinessKnowledgeModel) {
- BusinessKnowledgeModel bkm = (BusinessKnowledgeModel) drg;
- bkm.setEncapsulatedLogic(null);
- }
- }
- String relativePath = CodegenStringUtil.escapeIdentifier(model.getNamespace()).replace(".", "/") + "/" + CodegenStringUtil.escapeIdentifier(model.getName()) + ".dmn_nologic";
- storeFile(GeneratedFileType.INTERNAL_RESOURCE, relativePath, marshaller.marshal(definitions));
- }
-
- if (context().getAddonsConfig().useCloudEvents()) {
- final DecisionCloudEventMetaFactoryGenerator ceMetaFactoryGenerator = new DecisionCloudEventMetaFactoryGenerator(context(), models);
- storeFile(REST_TYPE, ceMetaFactoryGenerator.generatedFilePath(), ceMetaFactoryGenerator.generate());
- }
- }
-
- private DMNOASResult generateAndStoreDefinitionsJson(DMNModel dmnModel) {
- DMNOASResult toReturn = null;
- try {
- toReturn = DMNOASGeneratorFactory.generator(Collections.singleton(dmnModel)).build();
- String jsonContent = new ObjectMapper().writeValueAsString(toReturn.getJsonSchemaNode());
- final String DMN_DEFINITIONS_JSON = getDefinitionsFileFromModel(dmnModel);
- storeFile(GeneratedFileType.STATIC_HTTP_RESOURCE, DMN_DEFINITIONS_JSON, jsonContent);
- } catch (Exception e) {
- LOGGER.error("Error while trying to generate OpenAPI specification for the DMN models", e);
- }
- return toReturn;
- }
-
- private void generateAndStoreDecisionModelResourcesProvider() {
- final DecisionModelResourcesProviderGenerator generator = new DecisionModelResourcesProviderGenerator(context(),
- applicationCanonicalName(),
- resources);
- storeFile(GeneratedFileType.SOURCE, generator.generatedFilePath(), generator.generate());
- }
-
- private void generateStronglyTypedInput(DMNModel model) {
- try {
- DMNTypeSafePackageName.Factory factory = m -> new DMNTypeSafePackageName("", m.getNamespace(), "");
- DMNAllTypesIndex index = new DMNAllTypesIndex(factory, model);
-
- DMNTypeSafeTypeGenerator generator = new DMNTypeSafeTypeGenerator(model, index, factory).withJacksonAnnotation();
- boolean useMPAnnotations = isMPAnnotationsPresent();
- if (useMPAnnotations) {
- LOGGER.debug("useMPAnnotations");
- generator.withMPAnnotation();
- } else {
- LOGGER.debug("NO useMPAnnotations");
- }
- boolean useIOSwaggerOASv3Annotations = isIOSwaggerOASv3AnnotationsPresent();
- if (useIOSwaggerOASv3Annotations) {
- LOGGER.debug("useIOSwaggerOASv3Annotations");
- generator.withIOSwaggerOASv3();
- } else {
- LOGGER.debug("NO useIOSwaggerOASv3Annotations");
- }
- Map<String, String> allTypesSourceCode = generator
- .processTypes()
- .generateSourceCodeOfAllTypes();
-
- for (Entry<String, String> kv : allTypesSourceCode.entrySet()) {
- String fqcn = kv.getKey();
- String sourceCode = kv.getValue();
-
- storeFile(GeneratedFileType.SOURCE, fqcn.replace(".", "/") + ".java", sourceCode);
- classesForManualReflection.add(fqcn);
- }
- LOGGER.debug("classesForManualReflection: {}", classesForManualReflection);
- } catch (Exception e) {
- LOGGER.error("Unable to generate Strongly Typed Input for: {} {}", model.getNamespace(), model.getName());
- throw e;
- }
- }
-
- private boolean isMPAnnotationsPresent() {
+ boolean isMPAnnotationsPresent() {
return context().hasClassAvailable("org.eclipse.microprofile.openapi.models.OpenAPI");
}
- private boolean isIOSwaggerOASv3AnnotationsPresent() {
+ boolean isIOSwaggerOASv3AnnotationsPresent() {
return context().hasClassAvailable("io.swagger.v3.oas.annotations.media.Schema");
}
-
- private void generateAndStoreGrafanaDashboards(DecisionRestResourceGenerator resourceGenerator) {
- 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,
- resourceGenerator.getNameURL(),
- context().getPropertiesMap(),
- resourceGenerator.getNameURL(),
- context().getGAV().orElse(KogitoGAV.EMPTY_GAV),
- context().getAddonsConfig().useTracing());
- String dashboardName = GrafanaConfigurationWriter.buildDashboardName(context().getGAV(), resourceGenerator.getNameURL());
- operationalDashboard.ifPresent(dashboard -> generatedFiles.addAll(DashboardGeneratedFileUtils.operational(dashboard, dashboardName + ".json")));
- Optional<String> domainDashboard = GrafanaConfigurationWriter.generateDomainSpecificDMNDashboard(
- domainDashboardDmnTemplate,
- resourceGenerator.getNameURL(),
- context().getPropertiesMap(),
- resourceGenerator.getNameURL(),
- context().getGAV().orElse(KogitoGAV.EMPTY_GAV),
- decisions,
- context().getAddonsConfig().useTracing());
- domainDashboard.ifPresent(dashboard -> generatedFiles.addAll(DashboardGeneratedFileUtils.domain(dashboard, dashboardName + ".json")));
- }
-
- private void storeFile(GeneratedFileType type, String path, String source) {
- generatedFiles.add(new GeneratedFile(type, path, source));
- }
-
- @Override
- public Optional<ApplicationSection> section() {
- return Optional.of(new DecisionContainerGenerator(
- context(),
- applicationCanonicalName(),
- this.cResources,
- this.classesForManualReflection,
- this.customDMNProfiles,
- this.enableRuntimeTypeCheckOption));
- }
-
- @Override
- public int priority() {
- return 30;
- }
}
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
new file mode 100644
index 0000000000..21543a3b14
--- /dev/null
+++ b/kogito-codegen-modules/kogito-codegen-decisions/src/main/java/org/kie/kogito/codegen/decision/DecisionCodegenUtils.java
@@ -0,0 +1,355 @@
+/*
+ * 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.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import org.drools.codegen.common.GeneratedFile;
+import org.drools.codegen.common.GeneratedFileType;
+import org.kie.api.io.Resource;
+import org.kie.dmn.api.core.DMNModel;
+import org.kie.dmn.api.marshalling.DMNMarshaller;
+import org.kie.dmn.backend.marshalling.v1x.DMNMarshallerFactory;
+import org.kie.dmn.core.compiler.DMNProfile;
+import org.kie.dmn.core.compiler.RuntimeTypeCheckOption;
+import org.kie.dmn.efesto.compiler.model.DMNResourceSetResource;
+import org.kie.dmn.efesto.compiler.model.DmnCompilationContext;
+import org.kie.dmn.feel.codegen.feel11.CodegenStringUtil;
+import org.kie.dmn.model.api.BusinessKnowledgeModel;
+import org.kie.dmn.model.api.DRGElement;
+import org.kie.dmn.model.api.Decision;
+import org.kie.dmn.model.api.Definitions;
+import org.kie.dmn.openapi.DMNOASGeneratorFactory;
+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.efesto.common.api.identifiers.LocalUri;
+import org.kie.efesto.common.api.identifiers.ModelLocalUriId;
+import org.kie.efesto.common.api.model.EfestoCompilationContext;
+import org.kie.efesto.common.api.model.GeneratedModelResource;
+import org.kie.efesto.common.api.model.GeneratedResources;
+import org.kie.efesto.common.core.storage.ContextStorage;
+import org.kie.efesto.compilationmanager.api.service.CompilationManager;
+import org.kie.efesto.compilationmanager.api.utils.SPIUtils;
+import org.kie.kogito.KogitoGAV;
+import org.kie.kogito.codegen.api.context.KogitoBuildContext;
+import org.kie.kogito.codegen.api.io.CollectedResource;
+import org.kie.kogito.codegen.core.DashboardGeneratedFileUtils;
+import org.kie.kogito.codegen.decision.events.DecisionCloudEventMetaFactoryGenerator;
+import org.kie.kogito.grafana.GrafanaConfigurationWriter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import static java.util.stream.Collectors.toList;
+import static org.kie.efesto.common.core.utils.JSONUtils.getGeneratedResourcesObject;
+import static org.kie.efesto.common.core.utils.JSONUtils.getGeneratedResourcesString;
+import static org.kie.kogito.codegen.api.Generator.REST_TYPE;
+import static org.kie.kogito.codegen.decision.CodegenUtils.getDefinitionsFileFromModel;
+import static org.kie.kogito.codegen.decision.DecisionCodegen.STRONGLY_TYPED_CONFIGURATION_KEY;
+
+@SuppressWarnings({ "unchecked", "rawtypes" })
+public class DecisionCodegenUtils {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(DecisionCodegenUtils.class);
+ private static final GeneratedFileType INDEX_FILE = GeneratedFileType.of("IndexFile",
+ GeneratedFileType.Category.INTERNAL_RESOURCE);
+ private static final CompilationManager compilationManager =
+ 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";
+
+ static Map.Entry<String, GeneratedResources> generateModelsFromResources(Collection<GeneratedFile> generatedFiles,
+ List<String> classesForManualReflection,
+ List<CollectedResource> cResources,
+ Set<DMNProfile> customDMNProfiles,
+ RuntimeTypeCheckOption runtimeTypeCheckOption,
+ DecisionCodegen generator) {
+ Map<Resource, CollectedResource> r2cr = cResources.stream().collect(Collectors.toMap(CollectedResource::resource, Function.identity()));
+ Map.Entry<String, GeneratedResources> generatedResourcesEntry = loadModelsAndValidate(generator.context(), r2cr, customDMNProfiles, runtimeTypeCheckOption);
+ List<DMNResource> resources = getDMNResources(generatedResourcesEntry, r2cr);
+ boolean stronglyTypedEnabled = Optional.ofNullable(generator.context())
+ .flatMap(c -> c.getApplicationProperty(STRONGLY_TYPED_CONFIGURATION_KEY))
+ .map(Boolean::parseBoolean)
+ .orElse(false);
+ DMNMarshaller marshaller = DMNMarshallerFactory.newDefaultMarshaller();
+ List<DMNModel> dmnModels = resources.stream().map(DMNResource::getDmnModel).toList();
+ for (DMNModel model : dmnModels) {
+ if (model.getName() == null || model.getName().isEmpty()) {
+ throw new RuntimeException("Model name should not be empty");
+ }
+ generateModel(generatedFiles, classesForManualReflection, model, generator, stronglyTypedEnabled, marshaller);
+ }
+ generateCloudEventsResources(generatedFiles, generator.context(), dmnModels);
+ generateAndStoreDecisionModelResourcesProvider(generatedFiles, resources, generator.context(), generator.applicationCanonicalName());
+ return generatedResourcesEntry;
+ }
+
+ static List<DMNResource> getDMNResources(Map.Entry<String, GeneratedResources> generatedResourcesEntry, Map<Resource, CollectedResource> r2cr) {
+ return generatedResourcesEntry.getValue().stream()
+ .filter(GeneratedModelResource.class::isInstance)
+ .map(GeneratedModelResource.class::cast)
+ .map(generatedModelResource -> getDMNResourceFromGeneratedModelResource(generatedModelResource, r2cr))
+ .toList();
+ }
+
+ static Map.Entry<String, GeneratedResources> loadModelsAndValidate(KogitoBuildContext context, Map<Resource, CollectedResource> r2cr,
+ Set<DMNProfile> customDMNProfiles,
+ RuntimeTypeCheckOption runtimeTypeCheckOption) {
+ DecisionValidation.dmnValidateResources(context, r2cr.keySet());
+ 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);
+ 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());
+ toReturn.getValue().stream().filter(GeneratedModelResource.class::isInstance)
+ .map(GeneratedModelResource.class::cast)
+ .forEach(generatedResource -> {
+ GeneratedResources generatedResources = (GeneratedResources) dmnCompilationContext.getGeneratedResourcesMap().get("dmn");
+ if (generatedResources == null) {
+ ContextStorage.putEfestoCompilationContext(generatedResource.getModelLocalUriId(), dmnCompilationContext);
+ } else {
+ Optional<GeneratedModelResource> first = generatedResources.stream()
+ .filter(GeneratedModelResource.class::isInstance)
+ .map(GeneratedModelResource.class::cast)
+ .filter(storedGeneratedResources -> storedGeneratedResources.getModelLocalUriId().equals(generatedResource.getModelLocalUriId()))
+ .findFirst();
+ // let's avoid overwrite an already compiled resources
+ if (first.isEmpty() || first.get().getCompiledModel() == null) {
+ ContextStorage.putEfestoCompilationContext(generatedResource.getModelLocalUriId(), dmnCompilationContext);
+ }
+ }
+ });
+ return generatedResourcesMap.entrySet().stream().filter(entry -> entry.getKey().equals("dmn")).findFirst().orElseThrow(() -> new RuntimeException());
+ }
+
+ static DMNResource getDMNResourceFromGeneratedModelResource(GeneratedModelResource generatedModelResource, Map<Resource, CollectedResource> r2cr) {
+ DMNModel dmnModel = getDMNModelFromGeneratedModelResource(generatedModelResource);
+ CollectedResource collectedResource = r2cr.get(dmnModel.getResource());
+ return new DMNResource(dmnModel, collectedResource);
+ }
+
+ static DMNModel getDMNModelFromGeneratedModelResource(GeneratedModelResource generatedModelResource) {
+ DMNModel toReturn = (DMNModel) generatedModelResource.getCompiledModel();
+ if (toReturn == null) {
+ EfestoCompilationContext dmnCompilationContext = ContextStorage.getEfestoCompilationContext(generatedModelResource.getModelLocalUriId());
+ GeneratedResources generatedResources = (GeneratedResources) dmnCompilationContext.getGeneratedResourcesMap().get("dmn");
+ Optional<GeneratedModelResource> first = generatedResources.stream()
+ .filter(GeneratedModelResource.class::isInstance)
+ .map(GeneratedModelResource.class::cast)
+ .filter(storedGeneratedResources -> storedGeneratedResources.getModelLocalUriId().equals(generatedModelResource.getModelLocalUriId()))
+ .findFirst();
+ if (first.isPresent()) {
+ toReturn = (DMNModel) first.get().getCompiledModel();
+ }
+ }
+ return toReturn;
+ }
+
+ static void generateModel(Collection<GeneratedFile> files,
+ List<String> classesForManualReflection,
+ DMNModel dmnModel, DecisionCodegen generator,
+ boolean stronglyTypedEnabled,
+ DMNMarshaller marshaller) {
+ if (stronglyTypedEnabled) {
+ generateStronglyTypedInput(files, classesForManualReflection, dmnModel, generator.isMPAnnotationsPresent(), generator.isIOSwaggerOASv3AnnotationsPresent());
+ }
+ generateModelRESTFiles(files, dmnModel, generator, stronglyTypedEnabled);
+ generateDecisionsFiles(files, dmnModel, marshaller);
+ }
+
+ static void generateModelRESTFiles(Collection<GeneratedFile> generatedFiles, DMNModel dmnModel, DecisionCodegen generator, boolean stronglyTypedEnabled) {
+ KogitoBuildContext context = generator.context();
+ if (context.hasRESTForGenerator(generator)) {
+ generateModelRESTFiles(generatedFiles, dmnModel,
+ context,
+ generator.applicationCanonicalName(),
+ stronglyTypedEnabled,
+ generator.isMPAnnotationsPresent(),
+ generator.isIOSwaggerOASv3AnnotationsPresent());
+ }
+ }
+
+ static void generateModelRESTFiles(Collection<GeneratedFile> generatedFiles,
+ DMNModel dmnModel,
+ KogitoBuildContext context,
+ String appCanonicalName,
+ boolean stronglyTypedEnabled,
+ boolean isMPAnnotationsPresent,
+ boolean isIOSwaggerOASv3AnnotationsPresent) {
+ DMNOASResult oasResult = DMNOASGeneratorFactory.generator(Collections.singleton(dmnModel)).build();
+ DecisionRestResourceGenerator resourceGenerator = new DecisionRestResourceGenerator(context, dmnModel, appCanonicalName)
+ .withStronglyTyped(stronglyTypedEnabled)
+ .withOASResult(oasResult, isMPAnnotationsPresent, isIOSwaggerOASv3AnnotationsPresent);
+ storeFile(generatedFiles, REST_TYPE, resourceGenerator.generatedFilePath(), resourceGenerator.generate());
+ if (context.getAddonsConfig().usePrometheusMonitoring()) {
+ generateAndStoreGrafanaDashboards(context, generatedFiles, resourceGenerator);
+ }
+ try {
+ String jsonContent = new ObjectMapper().writeValueAsString(oasResult.getJsonSchemaNode());
+ final String DMN_DEFINITIONS_JSON = getDefinitionsFileFromModel(dmnModel);
+ storeFile(generatedFiles, GeneratedFileType.STATIC_HTTP_RESOURCE, DMN_DEFINITIONS_JSON, jsonContent);
+ } catch (Exception e) {
+ LOGGER.warn("Failed to write OAS schema");
+ }
+ }
+
+ static void generateDecisionsFiles(Collection<GeneratedFile> generatedFiles, DMNModel model, DMNMarshaller marshaller) {
+ Definitions definitions = model.getDefinitions();
+ for (DRGElement drg : definitions.getDrgElement()) {
+ if (drg instanceof Decision decision) {
+ decision.setExpression(null);
+ } else if (drg instanceof BusinessKnowledgeModel bkm) {
+ bkm.setEncapsulatedLogic(null);
+ }
+ }
+ String relativePath = CodegenStringUtil.escapeIdentifier(model.getNamespace()).replace(".", "/") + "/" + CodegenStringUtil.escapeIdentifier(model.getName()) + ".dmn_nologic";
+ storeFile(generatedFiles, GeneratedFileType.INTERNAL_RESOURCE, relativePath, marshaller.marshal(definitions));
+ }
+
+ static void generateCloudEventsResources(Collection<GeneratedFile> generatedFiles, KogitoBuildContext context, List<DMNModel> dmnModels) {
+ if (context.getAddonsConfig().useCloudEvents()) {
+ final DecisionCloudEventMetaFactoryGenerator ceMetaFactoryGenerator = new DecisionCloudEventMetaFactoryGenerator(context, dmnModels);
+ storeFile(generatedFiles, REST_TYPE, ceMetaFactoryGenerator.generatedFilePath(), ceMetaFactoryGenerator.generate());
+ }
+ }
+
+ static void generateStronglyTypedInput(Collection<GeneratedFile> generatedFiles,
+ List<String> classesForManualReflection,
+ DMNModel model,
+ boolean useMPAnnotations,
+ boolean useIOSwaggerOASv3Annotations) {
+ try {
+ DMNTypeSafePackageName.Factory factory = m -> new DMNTypeSafePackageName("", m.getNamespace(), "");
+ DMNAllTypesIndex index = new DMNAllTypesIndex(factory, model);
+
+ DMNTypeSafeTypeGenerator generator = new DMNTypeSafeTypeGenerator(model, index, factory).withJacksonAnnotation();
+ if (useMPAnnotations) {
+ LOGGER.debug("useMPAnnotations");
+ generator.withMPAnnotation();
+ } else {
+ LOGGER.debug("NO useMPAnnotations");
+ }
+ if (useIOSwaggerOASv3Annotations) {
+ LOGGER.debug("useIOSwaggerOASv3Annotations");
+ generator.withIOSwaggerOASv3();
+ } else {
+ LOGGER.debug("NO useIOSwaggerOASv3Annotations");
+ }
+ Map<String, String> allTypesSourceCode = generator
+ .processTypes()
+ .generateSourceCodeOfAllTypes();
+
+ for (Map.Entry<String, String> kv : allTypesSourceCode.entrySet()) {
+ String fqcn = kv.getKey();
+ String sourceCode = kv.getValue();
+ storeFile(generatedFiles, GeneratedFileType.SOURCE, fqcn.replace(".", "/") + ".java", sourceCode);
+ classesForManualReflection.add(fqcn);
+ }
+ LOGGER.debug("classesForManualReflection: {}", classesForManualReflection);
+ } catch (Exception e) {
+ LOGGER.error("Unable to generate Strongly Typed Input for: {} {}", model.getNamespace(), model.getName());
+ throw e;
+ }
+ }
+
+ static void generateAndStoreGrafanaDashboards(KogitoBuildContext context,
+ Collection<GeneratedFile> generatedFiles,
+ DecisionRestResourceGenerator resourceGenerator) {
+ 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,
+ resourceGenerator.getNameURL(),
+ context.getPropertiesMap(),
+ resourceGenerator.getNameURL(),
+ context.getGAV().orElse(KogitoGAV.EMPTY_GAV),
+ context.getAddonsConfig().useTracing());
+ String dashboardName = GrafanaConfigurationWriter.buildDashboardName(context.getGAV(), resourceGenerator.getNameURL());
+ operationalDashboard.ifPresent(dashboard -> generatedFiles.addAll(DashboardGeneratedFileUtils.operational(dashboard, dashboardName + ".json")));
+ Optional<String> domainDashboard = GrafanaConfigurationWriter.generateDomainSpecificDMNDashboard(
+ domainDashboardDmnTemplate,
+ resourceGenerator.getNameURL(),
+ context.getPropertiesMap(),
+ resourceGenerator.getNameURL(),
+ context.getGAV().orElse(KogitoGAV.EMPTY_GAV),
+ decisions,
+ context.getAddonsConfig().useTracing());
+ domainDashboard.ifPresent(dashboard -> generatedFiles.addAll(DashboardGeneratedFileUtils.domain(dashboard, dashboardName + ".json")));
+ }
+
+ static void generateAndStoreDecisionModelResourcesProvider(Collection<GeneratedFile> generatedFiles, List<DMNResource> resources, KogitoBuildContext context, String applicationCanonicalName) {
+ final DecisionModelResourcesProviderGenerator generator = new DecisionModelResourcesProviderGenerator(context,
+ applicationCanonicalName,
+ resources);
+ storeFile(generatedFiles, GeneratedFileType.SOURCE, generator.generatedFilePath(), generator.generate());
+ }
+
+ private static void storeFile(Collection<GeneratedFile> generatedFiles, GeneratedFileType type, String path, String source) {
+ generatedFiles.add(new GeneratedFile(type, path, source));
+ }
+
+ static void generateModelFromGeneratedResources(Collection<GeneratedFile> files, Map.Entry<String, GeneratedResources> generatedResourcesEntry) {
+ String indexFileName = String.format("%s.%s%s", "IndexFile", generatedResourcesEntry.getKey(), "_json");
+ addUpdateGeneratedFile(files, indexFileName, generatedResourcesEntry.getValue());
+ }
+
+ static void addUpdateGeneratedFile(Collection<GeneratedFile> files, String indexFileName,
+ GeneratedResources newGeneratedResources) {
+ try {
+ Optional<GeneratedFile> existing = files.stream().filter(generatedFile -> generatedFile.type().equals(INDEX_FILE) && generatedFile.relativePath().equals(indexFileName))
+ .findFirst();
+ String content;
+ if (existing.isPresent()) {
+ GeneratedFile generatedFile = existing.get();
+ content = getUpdatedGeneratedResourcesContent(generatedFile, newGeneratedResources);
+ files.remove(generatedFile);
+ } else {
+ content = getGeneratedResourcesString(newGeneratedResources);
+ }
+ files.add(new GeneratedFile(INDEX_FILE, indexFileName, content));
+ } catch (JsonProcessingException e) {
+ throw new IllegalStateException("Failed to serialize " + newGeneratedResources, e);
+ }
+ }
+
+ static String getUpdatedGeneratedResourcesContent(GeneratedFile generatedFile,
+ GeneratedResources newGeneratedResources) throws JsonProcessingException {
+ String oldContent = new String(generatedFile.contents());
+ GeneratedResources oldGeneratedResources = getGeneratedResourcesObject(oldContent);
+ oldGeneratedResources.addAll(newGeneratedResources);
+ return getGeneratedResourcesString(oldGeneratedResources);
+ }
+
+}
diff --git a/kogito-codegen-modules/kogito-codegen-decisions/src/test/java/org/kie/kogito/codegen/decision/DecisionCloudEventMetaFactoryGeneratorTest.java b/kogito-codegen-modules/kogito-codegen-decisions/src/test/java/org/kie/kogito/codegen/decision/DecisionCloudEventMetaFactoryGeneratorTest.java
index d6b60d255f..71c69ebe44 100644
--- a/kogito-codegen-modules/kogito-codegen-decisions/src/test/java/org/kie/kogito/codegen/decision/DecisionCloudEventMetaFactoryGeneratorTest.java
+++ b/kogito-codegen-modules/kogito-codegen-decisions/src/test/java/org/kie/kogito/codegen/decision/DecisionCloudEventMetaFactoryGeneratorTest.java
@@ -36,8 +36,8 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
class DecisionCloudEventMetaFactoryGeneratorTest {
private static final String MODEL_PATH = "src/test/resources/decision/models/vacationDays";
- private static final int EXPECTED_FILES_WITH_CLOUDEVENTS = 5;
- private static final int EXPECTED_FILES_WITHOUT_CLOUDEVENTS = 4;
+ private static final int EXPECTED_FILES_WITH_CLOUDEVENTS = 6; // Now it includes IndexFile.dmn_json
+ private static final int EXPECTED_FILES_WITHOUT_CLOUDEVENTS = 5; // Now it includes IndexFile.dmn_json
private static final String EXPECTED_FILE_PATH = "org/kie/kogito/app/DecisionCloudEventMetaFactory.java";
@Test
diff --git a/quarkus/extensions/kogito-quarkus-extension/kogito-quarkus-integration-test-maven-devmode/src/test/java/io/quarkus/it/kogito/devmode/DevMojoIT.java b/quarkus/extensions/kogito-quarkus-extension/kogito-quarkus-integration-test-maven-devmode/src/test/java/io/quarkus/it/kogito/devmode/DevMojoIT.java
index 578cac7926..1505b79459 100644
--- a/quarkus/extensions/kogito-quarkus-extension/kogito-quarkus-integration-test-maven-devmode/src/test/java/io/quarkus/it/kogito/devmode/DevMojoIT.java
+++ b/quarkus/extensions/kogito-quarkus-extension/kogito-quarkus-integration-test-maven-devmode/src/test/java/io/quarkus/it/kogito/devmode/DevMojoIT.java
@@ -34,6 +34,7 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.maven.shared.invoker.MavenInvocationException;
+import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -223,6 +224,7 @@ public class DevMojoIT extends RunAndCheckMojoTestBase {
return additionalArguments;
}
+ @Disabled() // See https://github.com/apache/incubator-kie-issues/issues/1960
@Test
public void testBPMN2HotReload() throws Exception {
testDir = initProject("projects/classic-inst", "projects/project-instrumentation-reload-bpmn");
@@ -298,6 +300,7 @@ public class DevMojoIT extends RunAndCheckMojoTestBase {
LOGGER.info("[testBPMN2HotReload] done.");
}
+ @Disabled() // See https://github.com/apache/incubator-kie-issues/issues/1960
@Test
public void testDMNHotReload() throws Exception {
testDir = initProject("projects/classic-inst", "projects/project-instrumentation-reload-dmn");
@@ -369,6 +372,7 @@ public class DevMojoIT extends RunAndCheckMojoTestBase {
LOGGER.info("[testDMNHotReload] done.");
}
+ @Disabled() // See https://github.com/apache/incubator-kie-issues/issues/1960
@Test
public void testDRLHotReload() throws Exception {
testDir = initProject("projects/classic-inst", "projects/project-instrumentation-reload-drl");
@@ -440,6 +444,7 @@ public class DevMojoIT extends RunAndCheckMojoTestBase {
LOGGER.info("done.");
}
+ @Disabled() // See https://github.com/apache/incubator-kie-issues/issues/1960
@Test
public void testStaticResource() throws MavenInvocationException {
testDir = initProject("projects/simple-dmn", "projects/simple-dmn-static-resource");
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@kie.apache.org
For additional commands, e-mail: commits-help@kie.apache.org