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 706425de27 [incubator-kie-issues#2091] Modify the
`kogito-maven-plugin` to be a wrapper of the codegen library (#4058)
706425de27 is described below
commit 706425de27266e4c2a5fb69395d7cf41529e8a83
Author: Gabriele Cardosi <[email protected]>
AuthorDate: Tue Sep 23 15:42:09 2025 +0200
[incubator-kie-issues#2091] Modify the `kogito-maven-plugin` to be a
wrapper of the codegen library (#4058)
* [incubator-kie-issues#2091] Reorganizing most code.
Move all the logic inside codegen library.
Replaced URL with URI
Scaffold mojo not working inside kogito-maven-plugin-test
* [incubator-kie-issues#2091] Removing broken scaffold mojo.
ScaffoldMojo has been broken for long time.
* [incubator-kie-issues#2091] Fixing java level for springboot integration
tests
* [incubator-kie-issues#2091] Removing unused scaffold invocation from
integration test
* [incubator-kie-issues#2091] Removing duplicated GeneratedFileType
REST_TYPE from org.kie.kogito.codegen.api.GEnerator. Replaced with common one
from org.drools.codegen.common.GeneratedFileType
* [incubator-kie-issues#2091] Fix correct "maven.compiler.release" name
* [incubator-kie-issues#2091] Fix impsort/format
* [incubator-kie-issues#2091] Fix as pe PR suggestion
* [incubator-kie-issues#2091] Fix impsort
---------
Co-authored-by: Gabriele-Cardosi <[email protected]>
---
.../java/org/kie/kogito/codegen/api/Generator.java | 1 -
.../kogito/codegen/core/ApplicationGenerator.java | 4 +-
.../kogito/codegen/core/ObjectMapperGenerator.java | 5 +-
.../codegen/core/ApplicationGeneratorTest.java | 8 +-
.../codegen/decision/DecisionCodegenUtils.java | 6 +-
...ecisionModelResourcesProviderGeneratorTest.java | 8 +-
.../kie/kogito/codegen/manager/BuilderManager.java | 91 ++++++++++++
.../kie/kogito/codegen/manager/CompilerHelper.java | 66 ++++++---
.../codegen/manager/GenerateModelHelper.java | 95 ++++++++++++-
.../codegen/manager/util/CodeGenManagerUtil.java | 48 ++++++-
.../codegen/prediction/PredictionCodegenUtils.java | 4 +-
.../prediction/PredictionCodegenGenerateTest.java | 4 +-
.../kie/kogito/codegen/process/ProcessCodegen.java | 5 +-
.../kogito/codegen/usertask/UserTaskCodegen.java | 3 +-
.../codegen/rules/QueryEndpointGenerator.java | 4 +-
.../codegen/sample/generator/SampleCodegen.java | 3 +-
.../sample/generator/SampleCodegenTest.java | 4 +-
kogito-maven-plugin-test/pom.xml | 1 +
.../kie/kogito/maven/plugin/AbstractKieMojo.java | 127 +++++++++++------
.../kie/kogito/maven/plugin/GenerateModelMojo.java | 156 +--------------------
.../org/kie/kogito/maven/plugin/ScaffoldMojo.java | 54 -------
.../org/kie/kogito/maven/plugin/util/MojoUtil.java | 42 +++---
.../kogito/maven/plugin/GenerateModelMojoTest.java | 73 +++++-----
.../common/deployment/KogitoAssetsProcessor.java | 4 +-
.../invoker.properties | 2 +-
springboot/integration-tests/pom.xml | 1 +
26 files changed, 455 insertions(+), 364 deletions(-)
diff --git
a/kogito-codegen-modules/kogito-codegen-api/src/main/java/org/kie/kogito/codegen/api/Generator.java
b/kogito-codegen-modules/kogito-codegen-api/src/main/java/org/kie/kogito/codegen/api/Generator.java
index ac62d78117..45879f86c5 100644
---
a/kogito-codegen-modules/kogito-codegen-api/src/main/java/org/kie/kogito/codegen/api/Generator.java
+++
b/kogito-codegen-modules/kogito-codegen-api/src/main/java/org/kie/kogito/codegen/api/Generator.java
@@ -30,7 +30,6 @@ import org.kie.kogito.codegen.api.context.KogitoBuildContext;
*/
public interface Generator {
- GeneratedFileType REST_TYPE = GeneratedFileType.of("REST",
GeneratedFileType.Category.SOURCE, true, true);
GeneratedFileType MODEL_TYPE = GeneratedFileType.of("MODEL",
GeneratedFileType.Category.SOURCE, true, true);
/**
diff --git
a/kogito-codegen-modules/kogito-codegen-core/src/main/java/org/kie/kogito/codegen/core/ApplicationGenerator.java
b/kogito-codegen-modules/kogito-codegen-core/src/main/java/org/kie/kogito/codegen/core/ApplicationGenerator.java
index f239870d5a..78f5570431 100644
---
a/kogito-codegen-modules/kogito-codegen-core/src/main/java/org/kie/kogito/codegen/core/ApplicationGenerator.java
+++
b/kogito-codegen-modules/kogito-codegen-core/src/main/java/org/kie/kogito/codegen/core/ApplicationGenerator.java
@@ -41,7 +41,7 @@ import org.kie.kogito.codegen.api.context.KogitoBuildContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import static org.kie.kogito.codegen.api.Generator.REST_TYPE;
+import static org.drools.codegen.common.GeneratedFileType.REST;
import static
org.kie.kogito.codegen.core.CustomDashboardGeneratedUtils.loadCustomGrafanaDashboardsList;
public class ApplicationGenerator {
@@ -121,7 +121,7 @@ public class ApplicationGenerator {
}
private boolean filterGeneratedFile(GeneratedFile generatedFile, boolean
keepRestFile) {
- boolean keepFile = keepRestFile ||
!REST_TYPE.equals(generatedFile.type());
+ boolean keepFile = keepRestFile || !REST.equals(generatedFile.type());
if (!keepFile) {
LOGGER.warn("Skipping file because REST is disabled: " +
generatedFile.relativePath());
}
diff --git
a/kogito-codegen-modules/kogito-codegen-core/src/main/java/org/kie/kogito/codegen/core/ObjectMapperGenerator.java
b/kogito-codegen-modules/kogito-codegen-core/src/main/java/org/kie/kogito/codegen/core/ObjectMapperGenerator.java
index 58f9f31571..90975867bf 100644
---
a/kogito-codegen-modules/kogito-codegen-core/src/main/java/org/kie/kogito/codegen/core/ObjectMapperGenerator.java
+++
b/kogito-codegen-modules/kogito-codegen-core/src/main/java/org/kie/kogito/codegen/core/ObjectMapperGenerator.java
@@ -19,10 +19,11 @@
package org.kie.kogito.codegen.core;
import org.drools.codegen.common.GeneratedFile;
-import org.kie.kogito.codegen.api.Generator;
import org.kie.kogito.codegen.api.context.KogitoBuildContext;
import org.kie.kogito.codegen.api.template.TemplatedGenerator;
+import static org.drools.codegen.common.GeneratedFileType.REST;
+
public class ObjectMapperGenerator {
private ObjectMapperGenerator() {
@@ -33,7 +34,7 @@ public class ObjectMapperGenerator {
.withTemplateBasePath("class-templates/config")
.build(context, "GlobalObjectMapper");
- return new GeneratedFile(Generator.REST_TYPE,
+ return new GeneratedFile(REST,
generator.generatedFilePath(),
generator.compilationUnitOrThrow().toString());
}
diff --git
a/kogito-codegen-modules/kogito-codegen-core/src/test/java/org/kie/kogito/codegen/core/ApplicationGeneratorTest.java
b/kogito-codegen-modules/kogito-codegen-core/src/test/java/org/kie/kogito/codegen/core/ApplicationGeneratorTest.java
index 46b3019230..e172164510 100644
---
a/kogito-codegen-modules/kogito-codegen-core/src/test/java/org/kie/kogito/codegen/core/ApplicationGeneratorTest.java
+++
b/kogito-codegen-modules/kogito-codegen-core/src/test/java/org/kie/kogito/codegen/core/ApplicationGeneratorTest.java
@@ -36,7 +36,7 @@ import com.github.javaparser.ast.expr.Expression;
import com.github.javaparser.ast.expr.MethodCallExpr;
import static org.assertj.core.api.Assertions.assertThat;
-import static org.kie.kogito.codegen.api.Generator.REST_TYPE;
+import static org.drools.codegen.common.GeneratedFileType.REST;
import static
org.kie.kogito.codegen.api.context.KogitoBuildContext.generateRESTConfigurationKeyForResource;
public class ApplicationGeneratorTest {
@@ -136,7 +136,7 @@ public class ApplicationGeneratorTest {
assertThat(appGenerator.generateComponents())
.isNotEmpty()
.hasSize(1)
- .matches(files -> files.stream().anyMatch(gf ->
REST_TYPE.equals(gf.type())));
+ .matches(files -> files.stream().anyMatch(gf ->
REST.equals(gf.type())));
} else {
assertThat(appGenerator.generateComponents()).isEmpty();
}
@@ -163,7 +163,7 @@ public class ApplicationGeneratorTest {
assertThat(appGenerator.generateComponents())
.isNotEmpty()
.hasSize(1)
- .matches(files -> files.stream().anyMatch(gf ->
REST_TYPE.equals(gf.type())));
+ .matches(files -> files.stream().anyMatch(gf ->
REST.equals(gf.type())));
} else {
assertThat(appGenerator.generateComponents()).isEmpty();
}
@@ -294,7 +294,7 @@ public class ApplicationGeneratorTest {
@Override
protected Collection<GeneratedFile> internalGenerate() {
if (context.hasRESTForGenerator(this)) {
- return Collections.singleton(new GeneratedFile(REST_TYPE,
"my/path", ""));
+ return Collections.singleton(new GeneratedFile(REST,
"my/path", ""));
} else {
return Collections.emptyList();
}
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 c8082ebd63..8429c06be8 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
@@ -71,9 +71,9 @@ import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import static java.util.stream.Collectors.toList;
+import static org.drools.codegen.common.GeneratedFileType.REST;
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;
@@ -229,7 +229,7 @@ public class DecisionCodegenUtils {
DecisionRestResourceGenerator resourceGenerator = new
DecisionRestResourceGenerator(context, dmnModel, appCanonicalName)
.withStronglyTyped(stronglyTypedEnabled)
.withOASResult(oasResult, isMPAnnotationsPresent,
isIOSwaggerOASv3AnnotationsPresent);
- storeFile(generatedFiles, REST_TYPE,
resourceGenerator.generatedFilePath(), resourceGenerator.generate());
+ storeFile(generatedFiles, REST, resourceGenerator.generatedFilePath(),
resourceGenerator.generate());
if (context.getAddonsConfig().usePrometheusMonitoring()) {
generateAndStoreGrafanaDashboards(context, generatedFiles,
resourceGenerator);
}
@@ -258,7 +258,7 @@ public class DecisionCodegenUtils {
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());
+ storeFile(generatedFiles, REST,
ceMetaFactoryGenerator.generatedFilePath(), ceMetaFactoryGenerator.generate());
}
}
diff --git
a/kogito-codegen-modules/kogito-codegen-decisions/src/test/java/org/kie/kogito/codegen/decision/DecisionModelResourcesProviderGeneratorTest.java
b/kogito-codegen-modules/kogito-codegen-decisions/src/test/java/org/kie/kogito/codegen/decision/DecisionModelResourcesProviderGeneratorTest.java
index 8ee389ca86..9c318cb307 100644
---
a/kogito-codegen-modules/kogito-codegen-decisions/src/test/java/org/kie/kogito/codegen/decision/DecisionModelResourcesProviderGeneratorTest.java
+++
b/kogito-codegen-modules/kogito-codegen-decisions/src/test/java/org/kie/kogito/codegen/decision/DecisionModelResourcesProviderGeneratorTest.java
@@ -26,14 +26,12 @@ import java.util.NoSuchElementException;
import java.util.Set;
import org.drools.codegen.common.GeneratedFile;
-import org.drools.codegen.common.GeneratedFileType;
import org.junit.jupiter.api.Test;
import org.kie.api.io.ResourceType;
import org.kie.kogito.codegen.api.AddonsConfig;
import org.kie.kogito.codegen.api.context.KogitoBuildContext;
import org.kie.kogito.codegen.api.context.impl.QuarkusKogitoBuildContext;
import org.kie.kogito.codegen.api.io.CollectedResource;
-import org.kie.kogito.codegen.core.AbstractGenerator;
import org.kie.kogito.codegen.core.io.CollectedResourceProducer;
import com.github.javaparser.ast.CompilationUnit;
@@ -51,6 +49,8 @@ import static com.github.javaparser.StaticJavaParser.parse;
import static java.util.stream.Collectors.toList;
import static java.util.stream.Collectors.toSet;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.drools.codegen.common.GeneratedFileType.REST;
+import static org.drools.codegen.common.GeneratedFileType.SOURCE;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -82,13 +82,13 @@ public class DecisionModelResourcesProviderGeneratorTest {
// Align this FAI-215 test (#621) with unknown order of generated
files (ie.: additional generated files might be present)
//A Rest endpoint is always generated per model.
List<GeneratedFile> generatedRESTFiles = generatedFiles.stream()
- .filter(gf -> gf.type().equals(AbstractGenerator.REST_TYPE))
+ .filter(gf -> gf.type().equals(REST))
.collect(toList());
assertFalse(generatedRESTFiles.isEmpty());
assertEquals(numberOfModels, generatedRESTFiles.size());
List<GeneratedFile> generatedCLASSFile = generatedFiles.stream()
- .filter(gf -> gf.type().equals(GeneratedFileType.SOURCE))
+ .filter(gf -> gf.type().equals(SOURCE))
.collect(toList());
assertEquals(1, generatedCLASSFile.size());
GeneratedFile classFile = generatedCLASSFile.get(0);
diff --git
a/kogito-codegen-modules/kogito-codegen-manager/src/main/java/org/kie/kogito/codegen/manager/BuilderManager.java
b/kogito-codegen-modules/kogito-codegen-manager/src/main/java/org/kie/kogito/codegen/manager/BuilderManager.java
new file mode 100644
index 0000000000..23d1fab8b6
--- /dev/null
+++
b/kogito-codegen-modules/kogito-codegen-manager/src/main/java/org/kie/kogito/codegen/manager/BuilderManager.java
@@ -0,0 +1,91 @@
+/*
+ * 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.manager;
+
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.nio.file.Path;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.kie.kogito.KogitoGAV;
+import org.kie.kogito.codegen.api.context.KogitoBuildContext;
+import org.kie.kogito.codegen.manager.util.CodeGenManagerUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class BuilderManager {
+
+ private static final Logger LOGGER =
LoggerFactory.getLogger(BuilderManager.class);
+
+ public interface KogitoBuildContextInfo {
+ Path projectBaseAbsolutePath();
+
+ CodeGenManagerUtil.Framework framework();
+
+ boolean enablePersistence();
+
+ Set<URI> projectFilesUris();
+ }
+
+ public record BuildInfo(Set<URI> projectFilesUris,
+ Path projectBaseAbsolutePath, //MUST BE ABSOLUTE
+ Path outputDirectory,
+ String projectGroupId,
+ String projectArtifactId,
+ String projectVersion,
+ String javaSourceEncoding,
+ String javaVersion,
+ String jsonSchemaVersion,
+ boolean generatePartial,
+ boolean enablePersistence,
+ boolean onDemand,
+ boolean keepSources,
+ List<String> runtimeClassPathElements,
+ CodeGenManagerUtil.Framework framework,
+ Map<String, String> properties) implements KogitoBuildContextInfo {
+ }
+
+ public static void build(BuildInfo buildInfo) throws MalformedURLException
{
+ LOGGER.info("Building project: {}:{}:{}", buildInfo.projectGroupId(),
buildInfo.projectArtifactId(), buildInfo.projectVersion());
+ CodeGenManagerUtil.setSystemProperties(buildInfo.properties());
+ ClassLoader projectClassLoader =
CodeGenManagerUtil.projectClassLoader(buildInfo.projectFilesUris());
+ KogitoGAV kogitoGAV = new KogitoGAV(buildInfo.projectGroupId(),
buildInfo.projectArtifactId(), buildInfo.projectVersion());
+ KogitoBuildContext kogitoBuildContext =
getKogitoBuildContext(projectClassLoader, kogitoGAV, buildInfo);
+ GenerateModelHelper.GenerateModelInfo generateModelInfo = new
GenerateModelHelper.GenerateModelInfo(projectClassLoader,
+ kogitoBuildContext, buildInfo);
+ GenerateModelHelper.generateModel(generateModelInfo);
+ LOGGER.info("Project build done");
+ }
+
+ static KogitoBuildContext getKogitoBuildContext(ClassLoader
projectClassLoader, KogitoGAV kogitoGAV, KogitoBuildContextInfo
kogitoBuildContextInfo) {
+ return
CodeGenManagerUtil.discoverKogitoRuntimeContext(projectClassLoader,
kogitoBuildContextInfo.projectBaseAbsolutePath(), kogitoGAV,
+ new
CodeGenManagerUtil.ProjectParameters(kogitoBuildContextInfo.framework(), "",
"", "", "", kogitoBuildContextInfo.enablePersistence()),
+ className -> {
+ try {
+ return
CodeGenManagerUtil.isClassNameInUrlClassLoader(kogitoBuildContextInfo.projectFilesUris(),
className);
+ } catch (MalformedURLException e) {
+ throw new RuntimeException(e);
+ }
+ });
+ }
+
+}
diff --git
a/kogito-codegen-modules/kogito-codegen-manager/src/main/java/org/kie/kogito/codegen/manager/CompilerHelper.java
b/kogito-codegen-modules/kogito-codegen-manager/src/main/java/org/kie/kogito/codegen/manager/CompilerHelper.java
index 8d7b782671..a0029ed77f 100644
---
a/kogito-codegen-modules/kogito-codegen-manager/src/main/java/org/kie/kogito/codegen/manager/CompilerHelper.java
+++
b/kogito-codegen-modules/kogito-codegen-manager/src/main/java/org/kie/kogito/codegen/manager/CompilerHelper.java
@@ -44,28 +44,52 @@ public class CompilerHelper {
private static final Logger LOGGER =
LoggerFactory.getLogger(CompilerHelper.class);
private static final JavaCompiler JAVA_COMPILER =
JavaCompilerFactory.loadCompiler(JavaConfiguration.CompilerType.NATIVE, "17");
- private static final GeneratedFileWriter.Builder
GENERATED_FILE_WRITER_BUILDER = GeneratedFileWriter.builder("kogito",
"kogito.codegen.resources.directory", "kogito.codegen.sources.directory");
+ private static final GeneratedFileWriter.Builder
GENERATED_FILE_WRITER_BUILDER =
+ GeneratedFileWriter.builder("kogito",
"kogito.codegen.resources.directory", "kogito.codegen.sources.directory");
public static final String SOURCES = "SOURCES";
public static final String RESOURCES = "RESOURCES";
private CompilerHelper() {
}
- public static void
compileAndDumpGeneratedSources(Collection<GeneratedFile> generatedSources,
- ClassLoader classLoader,
+ public record CompileInfo(Collection<GeneratedFile> generatedSources,
+ Collection<GeneratedFile> resources,
+ ClassLoader projectClassLoader,
List<String> runtimeClassPathElements,
File baseDir,
String javaSourceEncoding,
- String javaSourceVersion,
- String javaTargetVersion) {
- compileAndWriteClasses(generatedSources,
- classLoader,
- buildJavaCompilerSettings(runtimeClassPathElements,
- javaSourceEncoding,
- javaSourceVersion,
- javaTargetVersion),
- getGeneratedFileWriter(baseDir));
- writeFiles(generatedSources, baseDir);
+ String javaVersion) {
+
+ public CompileInfo(Collection<GeneratedFile> generatedSources,
Collection<GeneratedFile> resources, GenerateModelHelper.GenerateModelInfo
generateModelInfo) {
+ this(generatedSources,
+ resources,
+ generateModelInfo.projectClassLoader(),
+ generateModelInfo.runtimeClassPathElements(),
+ generateModelInfo.baseDir(),
+ generateModelInfo.javaSourceEncoding(),
+ generateModelInfo.javaVersion());
+ }
+ }
+
+ public static void compileAndDump(CompileInfo compileInfo) {
+ compileAndDumpGeneratedSources(compileInfo);
+ dumpResources(compileInfo.resources(), compileInfo.baseDir());
+ }
+
+ public static void compileAndDumpGeneratedSources(CompileInfo compileInfo)
{
+ // Compile and write files
+ compileAndWriteClasses(compileInfo.generatedSources(),
+ compileInfo.projectClassLoader,
+ buildJavaCompilerSettings(compileInfo.runtimeClassPathElements,
+ compileInfo.javaSourceEncoding,
+ compileInfo.javaVersion),
+ getGeneratedFileWriter(compileInfo.baseDir));
+ // Dump resources
+ writeFiles(compileInfo.generatedSources, compileInfo.baseDir);
+ }
+
+ public static void dumpResources(Collection<GeneratedFile> resources, Path
baseDir) {
+ dumpResources(resources, baseDir.toFile());
}
public static void dumpResources(Collection<GeneratedFile> resources, File
baseDir) {
@@ -77,6 +101,15 @@ public class CompilerHelper {
toWrite.forEach(generatedFile -> writeGeneratedFile(generatedFile,
writer));
}
+ static void writeFiles(Collection<GeneratedFile> toWrite, Path baseDir) {
+ GeneratedFileWriter writer = getGeneratedFileWriter(baseDir);
+ toWrite.forEach(generatedFile -> writeGeneratedFile(generatedFile,
writer));
+ }
+
+ static GeneratedFileWriter getGeneratedFileWriter(Path baseDir) {
+ return GENERATED_FILE_WRITER_BUILDER.build(baseDir);
+ }
+
static void writeGeneratedFile(GeneratedFile generatedFile,
GeneratedFileWriter writer) {
LOGGER.info("Writing compiled class: {}",
generatedFile.relativePath());
writer.write(generatedFile);
@@ -119,15 +152,14 @@ public class CompilerHelper {
static JavaCompilerSettings buildJavaCompilerSettings(List<String>
runtimeClassPathElements,
String sourceEncoding,
- String sourceVersion,
- String targetVersion) {
+ String javaVersion) {
JavaCompilerSettings settings = new JavaCompilerSettings();
for (String path : runtimeClassPathElements) {
settings.addClasspath(new File(path));
}
settings.setSourceEncoding(sourceEncoding);
- settings.setSourceVersion(sourceVersion);
- settings.setTargetVersion(targetVersion);
+ settings.setSourceVersion(javaVersion);
+ settings.setTargetVersion(javaVersion);
return settings;
}
}
diff --git
a/kogito-codegen-modules/kogito-codegen-manager/src/main/java/org/kie/kogito/codegen/manager/GenerateModelHelper.java
b/kogito-codegen-modules/kogito-codegen-manager/src/main/java/org/kie/kogito/codegen/manager/GenerateModelHelper.java
index ec6d51d5b5..23a569595d 100644
---
a/kogito-codegen-modules/kogito-codegen-manager/src/main/java/org/kie/kogito/codegen/manager/GenerateModelHelper.java
+++
b/kogito-codegen-modules/kogito-codegen-manager/src/main/java/org/kie/kogito/codegen/manager/GenerateModelHelper.java
@@ -20,28 +20,108 @@ package org.kie.kogito.codegen.manager;
import java.io.File;
import java.util.Collection;
+import java.util.HashMap;
import java.util.HashSet;
+import java.util.List;
import java.util.Map;
import org.drools.codegen.common.GeneratedFile;
import org.kie.kogito.codegen.api.context.KogitoBuildContext;
import org.kie.kogito.codegen.core.ApplicationGenerator;
import org.kie.kogito.codegen.core.utils.ApplicationGeneratorDiscovery;
+import org.kie.kogito.codegen.manager.processes.PersistenceGenerationHelper;
+import org.kie.kogito.codegen.manager.util.CodeGenManagerUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import static org.drools.codegen.common.GeneratedFileType.COMPILED_CLASS;
+import static
org.kie.efesto.common.api.constants.Constants.INDEXFILE_DIRECTORY_PROPERTY;
import static org.kie.kogito.codegen.manager.CompilerHelper.RESOURCES;
import static org.kie.kogito.codegen.manager.CompilerHelper.SOURCES;
public class GenerateModelHelper {
+ private static final Logger LOGGER =
LoggerFactory.getLogger(GenerateModelHelper.class);
+
private GenerateModelHelper() {
}
- public static Map<String, Collection<GeneratedFile>>
generateModelFiles(KogitoBuildContext kogitoBuildContext, boolean
generatePartial) {
- ApplicationGenerator appGen =
ApplicationGeneratorDiscovery.discover(kogitoBuildContext);
+ public record GenerateModelInfo(ClassLoader projectClassLoader,
+ KogitoBuildContext kogitoBuildContext,
+ boolean onDemand,
+ boolean generatePartial,
+ Map<String, String> properties,
+ File outputDirectory,
+ List<String> runtimeClassPathElements,
+ File baseDir,
+ String javaSourceEncoding,
+ String javaVersion,
+ String schemaVersion,
+ boolean keepSources) {
+
+ public GenerateModelInfo(ClassLoader projectClassLoader,
KogitoBuildContext kogitoBuildContext, BuilderManager.BuildInfo buildInfo) {
+ this(projectClassLoader, kogitoBuildContext, buildInfo.onDemand(),
buildInfo.generatePartial(), buildInfo.properties(),
+ buildInfo.outputDirectory().toFile(),
+ buildInfo.runtimeClassPathElements(),
+ buildInfo.projectBaseAbsolutePath().toFile(),
+ buildInfo.javaSourceEncoding(),
+ buildInfo.javaVersion(),
+ buildInfo.jsonSchemaVersion(),
+ buildInfo.keepSources());
+ }
+ }
+
+ public record GenerateModelFilesInfo(KogitoBuildContext kogitoBuildContext,
+ boolean generatePartial) {
+
+ public GenerateModelFilesInfo(GenerateModelInfo generateModelInfo) {
+ this(generateModelInfo.kogitoBuildContext,
+ generateModelInfo.generatePartial);
+ }
+ }
+
+ public static void generateModel(GenerateModelInfo generateModelInfo) {
+ Map<String, Collection<GeneratedFile>> generatedModelFiles;
+ if (generateModelInfo.onDemand) {
+ LOGGER.info("On-Demand Mode is On. Use mvn compile
kogito:scaffold");
+ generatedModelFiles = new HashMap<>();
+ } else {
+ generatedModelFiles = generateModelFiles(new
GenerateModelFilesInfo(generateModelInfo));
+ }
+ if (generateModelInfo.outputDirectory == null) {
+ throw new IllegalStateException("outputDirectory is null");
+ }
+ boolean indexFileDirectorySet =
isIndexFileDirectorySet(generateModelInfo.outputDirectory);
+ if (indexFileDirectorySet) {
+ System.clearProperty(INDEXFILE_DIRECTORY_PROPERTY);
+ }
+
+ CompilerHelper.CompileInfo compileInfo =
+ new
CompilerHelper.CompileInfo(generatedModelFiles.get(SOURCES),
+ generatedModelFiles.get(RESOURCES), generateModelInfo);
+
+ // Compile and write model files
+ CompilerHelper.compileAndDump(compileInfo);
+
+ Map<String, Collection<GeneratedFile>> generatedPersistenceFiles =
+
PersistenceGenerationHelper.generatePersistenceFiles(generateModelInfo.kogitoBuildContext,
generateModelInfo.projectClassLoader, generateModelInfo.schemaVersion);
+
+ // Compile and write persistence files
+ compileInfo =
+ new
CompilerHelper.CompileInfo(generatedPersistenceFiles.get(SOURCES),
+ generatedPersistenceFiles.get(RESOURCES),
generateModelInfo);
+ CompilerHelper.compileAndDump(compileInfo);
+
+ if (!generateModelInfo.keepSources()) {
+
CodeGenManagerUtil.deleteDrlFiles(generateModelInfo.outputDirectory().toPath());
+ }
+ }
+
+ public static Map<String, Collection<GeneratedFile>>
generateModelFiles(GenerateModelFilesInfo generateModelFilesInfo) {
+ ApplicationGenerator appGen =
ApplicationGeneratorDiscovery.discover(generateModelFilesInfo.kogitoBuildContext());
Collection<GeneratedFile> generatedFiles;
- if (generatePartial) {
+ if (generateModelFilesInfo.generatePartial()) {
generatedFiles = appGen.generateComponents();
} else {
generatedFiles = appGen.generate();
@@ -59,6 +139,15 @@ public class GenerateModelHelper {
return Map.of(SOURCES, generatedClasses, RESOURCES,
generatedResources);
}
+ static boolean isIndexFileDirectorySet(File outputDirectory) {
+ boolean toReturn = false;
+ if (System.getProperty(INDEXFILE_DIRECTORY_PROPERTY) == null) {
+ System.setProperty(INDEXFILE_DIRECTORY_PROPERTY,
outputDirectory.toString());
+ toReturn = true;
+ }
+ return toReturn;
+ }
+
private static String convertPath(String toConvert) {
return toConvert.replace('.', File.separatorChar) + ".class";
}
diff --git
a/kogito-codegen-modules/kogito-codegen-manager/src/main/java/org/kie/kogito/codegen/manager/util/CodeGenManagerUtil.java
b/kogito-codegen-modules/kogito-codegen-manager/src/main/java/org/kie/kogito/codegen/manager/util/CodeGenManagerUtil.java
index 9fac05c91b..05addb853b 100644
---
a/kogito-codegen-modules/kogito-codegen-manager/src/main/java/org/kie/kogito/codegen/manager/util/CodeGenManagerUtil.java
+++
b/kogito-codegen-modules/kogito-codegen-manager/src/main/java/org/kie/kogito/codegen/manager/util/CodeGenManagerUtil.java
@@ -21,13 +21,17 @@ package org.kie.kogito.codegen.manager.util;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.lang.reflect.Modifier;
+import java.net.MalformedURLException;
+import java.net.URI;
import java.net.URL;
import java.net.URLClassLoader;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.PathMatcher;
+import java.util.Map;
import java.util.Optional;
+import java.util.Set;
import java.util.function.Predicate;
import java.util.stream.Stream;
@@ -56,9 +60,20 @@ public class CodeGenManagerUtil {
public static final PathMatcher DRL_FILE_MATCHER =
FileSystems.getDefault().getPathMatcher("glob:**.drl");
public enum Framework {
- QUARKUS,
- SPRING,
- NONE
+ QUARKUS("quarkus"),
+ SPRING("spring"),
+ NONE("");
+
+ private final String name;
+
+ Framework(String name) {
+ this.name = name;
+ }
+
+ public String toName() {
+ return name;
+ }
+
}
public record ProjectParameters(CodeGenManagerUtil.Framework framework,
@@ -69,6 +84,20 @@ public class CodeGenManagerUtil {
boolean persistence) {
}
+ public static ClassLoader projectClassLoader(Set<URI> uris) throws
MalformedURLException {
+ URL[] urlArray = convertURIsToURLs(uris);
+ return URLClassLoader.newInstance(urlArray,
Thread.currentThread().getContextClassLoader());
+ }
+
+ public static URL[] convertURIsToURLs(final Set<URI> uris) throws
MalformedURLException {
+ URL[] toReturn = new URL[uris.size()];
+ int counter = 0;
+ for (URI uri : uris) {
+ toReturn[counter++] = uri.toURL();
+ }
+ return toReturn;
+ }
+
public static KogitoBuildContext discoverKogitoRuntimeContext(ClassLoader
projectClassLoader,
Path projectDir,
KogitoGAV kogitoGAV,
@@ -90,6 +119,16 @@ public class CodeGenManagerUtil {
return context;
}
+ public static void setSystemProperties(Map<String, String> properties) {
+ if (properties != null) {
+ LOGGER.debug("Additional system properties: {}", properties);
+ for (Map.Entry<String, String> property : properties.entrySet()) {
+ System.setProperty(property.getKey(), property.getValue());
+ }
+ LOGGER.debug("Configured system properties were successfully
set.");
+ }
+ }
+
static KogitoBuildContext.Builder
contextBuilder(CodeGenManagerUtil.Framework framework) {
return switch (framework) {
case QUARKUS -> QuarkusKogitoBuildContext.builder();
@@ -158,7 +197,8 @@ public class CodeGenManagerUtil {
.anyMatch(c -> !c.isInterface() &&
!Modifier.isAbstract(c.getModifiers()));
}
- public static boolean isClassNameInUrlClassLoader(URL[] urls, String
className) {
+ public static boolean isClassNameInUrlClassLoader(Set<URI> uris, String
className) throws MalformedURLException {
+ URL[] urls = convertURIsToURLs(uris);
try (URLClassLoader cl = new URLClassLoader(urls)) {
cl.loadClass(className);
return true;
diff --git
a/kogito-codegen-modules/kogito-codegen-predictions/src/main/java/org/kie/kogito/codegen/prediction/PredictionCodegenUtils.java
b/kogito-codegen-modules/kogito-codegen-predictions/src/main/java/org/kie/kogito/codegen/prediction/PredictionCodegenUtils.java
index f42952c168..4980e0fe28 100644
---
a/kogito-codegen-modules/kogito-codegen-predictions/src/main/java/org/kie/kogito/codegen/prediction/PredictionCodegenUtils.java
+++
b/kogito-codegen-modules/kogito-codegen-predictions/src/main/java/org/kie/kogito/codegen/prediction/PredictionCodegenUtils.java
@@ -38,9 +38,9 @@ import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import static org.drools.codegen.common.GeneratedFileType.COMPILED_CLASS;
+import static org.drools.codegen.common.GeneratedFileType.REST;
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.pmml.commons.utils.KiePMMLModelUtils.getSanitizedClassName;
public class PredictionCodegenUtils {
@@ -131,7 +131,7 @@ public class PredictionCodegenUtils {
KogitoBuildContext context, String applicationCanonicalName) {
PMMLRestResourceGenerator resourceGenerator = new
PMMLRestResourceGenerator(context, model,
applicationCanonicalName);
- files.add(new GeneratedFile(REST_TYPE,
resourceGenerator.generatedFilePath(), resourceGenerator.generate()));
+ files.add(new GeneratedFile(REST,
resourceGenerator.generatedFilePath(), resourceGenerator.generate()));
PMMLOASResult oasResult = PMMLOASResultFactory.getPMMLOASResult(model);
try {
diff --git
a/kogito-codegen-modules/kogito-codegen-predictions/src/test/java/org/kie/kogito/codegen/prediction/PredictionCodegenGenerateTest.java
b/kogito-codegen-modules/kogito-codegen-predictions/src/test/java/org/kie/kogito/codegen/prediction/PredictionCodegenGenerateTest.java
index c119c0f74a..e2e5c6a796 100644
---
a/kogito-codegen-modules/kogito-codegen-predictions/src/test/java/org/kie/kogito/codegen/prediction/PredictionCodegenGenerateTest.java
+++
b/kogito-codegen-modules/kogito-codegen-predictions/src/test/java/org/kie/kogito/codegen/prediction/PredictionCodegenGenerateTest.java
@@ -48,9 +48,9 @@ import com.github.javaparser.ast.CompilationUnit;
import static java.util.stream.Collectors.toList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.drools.codegen.common.GeneratedFileType.COMPILED_CLASS;
+import static org.drools.codegen.common.GeneratedFileType.REST;
import static org.junit.jupiter.params.provider.Arguments.arguments;
import static
org.kie.efesto.common.api.constants.Constants.INDEXFILE_DIRECTORY_PROPERTY;
-import static org.kie.kogito.codegen.api.Generator.REST_TYPE;
import static
org.kie.kogito.codegen.api.utils.KogitoContextTestUtils.contextBuilders;
import static
org.kie.kogito.codegen.prediction.PredictionCodegenFactory.parsePredictions;
import static
org.kie.kogito.codegen.prediction.PredictionCodegenFactoryTest.REFLECT_JSON;
@@ -216,7 +216,7 @@ class PredictionCodegenGenerateTest {
if (hasREST) {
// REST resource
assertThat(expectedRestEndpoints).isEqualTo(generatedFiles.stream()
- .filter(generatedFile ->
generatedFile.type().equals(REST_TYPE))
+ .filter(generatedFile -> generatedFile.type().equals(REST))
.count());
// OpenAPI Json schema
assertThat(expectedRestEndpoints).isEqualTo(generatedFiles.stream()
diff --git
a/kogito-codegen-modules/kogito-codegen-processes/src/main/java/org/kie/kogito/codegen/process/ProcessCodegen.java
b/kogito-codegen-modules/kogito-codegen-processes/src/main/java/org/kie/kogito/codegen/process/ProcessCodegen.java
index fc33742b1e..8764aa28c0 100644
---
a/kogito-codegen-modules/kogito-codegen-processes/src/main/java/org/kie/kogito/codegen/process/ProcessCodegen.java
+++
b/kogito-codegen-modules/kogito-codegen-processes/src/main/java/org/kie/kogito/codegen/process/ProcessCodegen.java
@@ -71,6 +71,7 @@ import
com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
import static com.github.javaparser.StaticJavaParser.parse;
import static java.lang.String.format;
import static java.util.stream.Collectors.toList;
+import static org.drools.codegen.common.GeneratedFileType.REST;
import static
org.jbpm.process.core.constants.CalendarConstants.BUSINESS_CALENDAR_PATH;
import static
org.kie.kogito.codegen.process.util.BusinessCalendarUtil.conditionallyAddCustomBusinessCalendar;
import static
org.kie.kogito.codegen.process.util.CodegenUtil.generatorProperty;
@@ -495,7 +496,7 @@ public class ProcessCodegen extends AbstractGenerator {
if (context().hasRESTForGenerator(this)) {
for (ProcessResourceGenerator resourceGenerator : rgs) {
- storeFile(REST_TYPE, resourceGenerator.generatedFilePath(),
+ storeFile(REST, resourceGenerator.generatedFilePath(),
resourceGenerator.generate());
storeFile(MODEL_TYPE,
WorkItemModelClassGenerator.generatedFilePath(resourceGenerator.getTaskModelFactoryClassName()),
resourceGenerator.getTaskModelFactory());
}
@@ -530,7 +531,7 @@ public class ProcessCodegen extends AbstractGenerator {
if (context().hasRest() && context().hasRESTForGenerator(this)) {
final ProcessCloudEventMetaFactoryGenerator topicsGenerator =
new ProcessCloudEventMetaFactoryGenerator(context(),
processExecutableModelGenerators);
- storeFile(REST_TYPE, topicsGenerator.generatedFilePath(),
topicsGenerator.generate());
+ storeFile(REST, topicsGenerator.generatedFilePath(),
topicsGenerator.generate());
}
for (ProcessInstanceGenerator pi : pis) {
diff --git
a/kogito-codegen-modules/kogito-codegen-processes/src/main/java/org/kie/kogito/codegen/usertask/UserTaskCodegen.java
b/kogito-codegen-modules/kogito-codegen-processes/src/main/java/org/kie/kogito/codegen/usertask/UserTaskCodegen.java
index 5afa147e1c..a502f23d68 100644
---
a/kogito-codegen-modules/kogito-codegen-processes/src/main/java/org/kie/kogito/codegen/usertask/UserTaskCodegen.java
+++
b/kogito-codegen-modules/kogito-codegen-processes/src/main/java/org/kie/kogito/codegen/usertask/UserTaskCodegen.java
@@ -78,6 +78,7 @@ import com.github.javaparser.ast.stmt.BlockStmt;
import com.github.javaparser.ast.stmt.ExplicitConstructorInvocationStmt;
import static java.util.stream.Collectors.toList;
+import static org.drools.codegen.common.GeneratedFileType.REST;
import static
org.kie.kogito.codegen.faultTolerance.FaultToleranceUtil.lookFaultToleranceAnnotatorForContext;
import static
org.kie.kogito.codegen.process.util.CodegenUtil.isFaultToleranceEnabled;
import static
org.kie.kogito.codegen.process.util.CodegenUtil.isTransactionEnabled;
@@ -182,7 +183,7 @@ public class UserTaskCodegen extends AbstractGenerator {
Path basePath = UserTaskCodegenHelper.path(packageName);
- return new GeneratedFile(GeneratedFileType.REST,
basePath.resolve(className + ".java"), compilationUnit.toString());
+ return new GeneratedFile(REST, basePath.resolve(className + ".java"),
compilationUnit.toString());
}
protected CompilationUnit createRestEndpointCompilationUnit() {
diff --git
a/kogito-codegen-modules/kogito-codegen-rules/src/main/java/org/kie/kogito/codegen/rules/QueryEndpointGenerator.java
b/kogito-codegen-modules/kogito-codegen-rules/src/main/java/org/kie/kogito/codegen/rules/QueryEndpointGenerator.java
index ef34f2e81d..32c834d7f1 100644
---
a/kogito-codegen-modules/kogito-codegen-rules/src/main/java/org/kie/kogito/codegen/rules/QueryEndpointGenerator.java
+++
b/kogito-codegen-modules/kogito-codegen-rules/src/main/java/org/kie/kogito/codegen/rules/QueryEndpointGenerator.java
@@ -47,10 +47,10 @@ import com.github.javaparser.ast.stmt.TryStmt;
import com.github.javaparser.ast.type.Type;
import static com.github.javaparser.StaticJavaParser.parseStatement;
+import static org.drools.codegen.common.GeneratedFileType.REST;
import static
org.drools.model.codegen.execmodel.util.RuleCodegenUtils.setGeneric;
import static
org.drools.model.codegen.execmodel.util.RuleCodegenUtils.toKebabCase;
import static
org.drools.model.codegen.execmodel.util.RuleCodegenUtils.toNonPrimitiveType;
-import static org.kie.kogito.codegen.api.Generator.REST_TYPE;
public class QueryEndpointGenerator extends AbstractQueryEntrypointGenerator {
@@ -83,7 +83,7 @@ public class QueryEndpointGenerator extends
AbstractQueryEntrypointGenerator {
generateQueryMethods(cu, clazz, returnType);
clazz.getMembers().sort(new BodyDeclarationComparator());
- return new GeneratedFile(REST_TYPE,
+ return new GeneratedFile(REST,
generatedFilePath(),
cu.toString());
}
diff --git
a/kogito-codegen-modules/kogito-codegen-sample/kogito-codegen-sample-generator/src/main/java/org/kie/kogito/codegen/sample/generator/SampleCodegen.java
b/kogito-codegen-modules/kogito-codegen-sample/kogito-codegen-sample-generator/src/main/java/org/kie/kogito/codegen/sample/generator/SampleCodegen.java
index f95a6b5e61..66415eca84 100644
---
a/kogito-codegen-modules/kogito-codegen-sample/kogito-codegen-sample-generator/src/main/java/org/kie/kogito/codegen/sample/generator/SampleCodegen.java
+++
b/kogito-codegen-modules/kogito-codegen-sample/kogito-codegen-sample-generator/src/main/java/org/kie/kogito/codegen/sample/generator/SampleCodegen.java
@@ -45,6 +45,7 @@ import com.github.javaparser.ast.body.FieldDeclaration;
import com.github.javaparser.ast.expr.ObjectCreationExpr;
import static java.util.stream.Collectors.toList;
+import static org.drools.codegen.common.GeneratedFileType.REST;
public class SampleCodegen implements Generator {
@@ -95,7 +96,7 @@ public class SampleCodegen implements Generator {
SampleCodegen::isSampleRuntimeField).forEach(SampleCodegen::initializeSampleRuntimeField);
}
- return context.hasRESTForGenerator(this) ? Collections.singleton(new
GeneratedFile(REST_TYPE, generator.generatedFilePath(),
compilationUnit.toString())) : Collections.emptyList();
+ return context.hasRESTForGenerator(this) ? Collections.singleton(new
GeneratedFile(REST, generator.generatedFilePath(), compilationUnit.toString()))
: Collections.emptyList();
}
@Override
diff --git
a/kogito-codegen-modules/kogito-codegen-sample/kogito-codegen-sample-generator/src/test/java/org/kie/kogito/codegen/sample/generator/SampleCodegenTest.java
b/kogito-codegen-modules/kogito-codegen-sample/kogito-codegen-sample-generator/src/test/java/org/kie/kogito/codegen/sample/generator/SampleCodegenTest.java
index 2cccacf199..9605946304 100644
---
a/kogito-codegen-modules/kogito-codegen-sample/kogito-codegen-sample-generator/src/test/java/org/kie/kogito/codegen/sample/generator/SampleCodegenTest.java
+++
b/kogito-codegen-modules/kogito-codegen-sample/kogito-codegen-sample-generator/src/test/java/org/kie/kogito/codegen/sample/generator/SampleCodegenTest.java
@@ -39,7 +39,7 @@ import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.body.FieldDeclaration;
import static org.assertj.core.api.Assertions.assertThat;
-import static org.kie.kogito.codegen.api.Generator.REST_TYPE;
+import static org.drools.codegen.common.GeneratedFileType.REST;
class SampleCodegenTest {
@@ -90,7 +90,7 @@ class SampleCodegenTest {
if (contextBuilder.build().hasRESTForGenerator(codeGenerator)) {
assertThat(generatedFiles).hasSize(1);
- List<GeneratedFile> generatedRests =
generatedFiles.stream().filter(gf -> gf.type() ==
REST_TYPE).collect(Collectors.toList());
+ List<GeneratedFile> generatedRests =
generatedFiles.stream().filter(gf -> gf.type() ==
REST).collect(Collectors.toList());
assertThat(generatedRests).hasSize(1);
CompilationUnit compilationUnit = StaticJavaParser.parse(new
String(generatedRests.get(0).contents()));
diff --git a/kogito-maven-plugin-test/pom.xml b/kogito-maven-plugin-test/pom.xml
index 52dbda08d9..5daacf49f2 100644
--- a/kogito-maven-plugin-test/pom.xml
+++ b/kogito-maven-plugin-test/pom.xml
@@ -36,6 +36,7 @@
<properties>
<java.module.name>org.kie.kogito.maven.plugin.testing</java.module.name>
+ <maven.compiler.release>17</maven.compiler.release>
</properties>
<dependencyManagement>
diff --git
a/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/AbstractKieMojo.java
b/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/AbstractKieMojo.java
index ee16a43a10..92aff14dd5 100644
---
a/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/AbstractKieMojo.java
+++
b/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/AbstractKieMojo.java
@@ -19,89 +19,124 @@
package org.kie.kogito.maven.plugin;
import java.io.File;
-import java.nio.file.Path;
+import java.io.IOException;
+import java.net.URI;
import java.util.Map;
+import java.util.Set;
+import org.apache.maven.artifact.DependencyResolutionRequiredException;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugins.annotations.Component;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.project.MavenProject;
-import org.drools.codegen.common.GeneratedFileWriter;
+import org.kie.kogito.codegen.manager.BuilderManager;
import org.kie.kogito.codegen.manager.util.CodeGenManagerUtil;
import org.kie.kogito.maven.plugin.util.MojoUtil;
public abstract class AbstractKieMojo extends AbstractMojo {
- protected static final GeneratedFileWriter.Builder
GENERATED_FILE_WRITER_BUILDER = GeneratedFileWriter.builder("kogito",
"kogito.codegen.resources.directory", "kogito.codegen.sources.directory");
+ @Parameter(property = "kogito.codegen.decisions")
+ protected String generateDecisions;
- @Parameter(required = true, defaultValue = "${project.basedir}")
- protected File projectBaseDir;
+ /**
+ * Partial generation can be used when reprocessing a pre-compiled project
+ * for faster code-generation. It only generates code for rules and
processes,
+ * and does not generate extra meta-classes (etc. Application).
+ * Use only when doing recompilation and for development purposes
+ */
+ @Parameter(property = "kogito.codegen.partial", defaultValue = "false")
+ protected boolean generatePartial;
- @Parameter
- protected Map<String, String> properties;
+ @Parameter(property = "kogito.codegen.predictions")
+ protected String generatePredictions;
- @Parameter(required = true, defaultValue = "${project}")
- protected MavenProject project;
+ @Parameter(property = "kogito.codegen.processes")
+ protected String generateProcesses;
- @Parameter(required = true, defaultValue =
"${project.build.sourceEncoding}")
- protected String projectSourceEncoding;
+ @Parameter(property = "kogito.codegen.rules")
+ protected String generateRules;
- @Parameter(required = true, defaultValue =
"${project.build.outputDirectory}")
- protected File outputDirectory;
+ @Parameter
+ protected Map<String, String> properties;
- @Parameter(required = true, defaultValue = "${project.basedir}")
- protected File baseDir;
+ @Parameter(defaultValue = "17", property = "maven.compiler.release")
+ protected String mavenCompilerJavaVersion;
@Parameter(property = "kogito.codegen.persistence")
protected boolean persistence;
- @Parameter(property = "kogito.codegen.rules")
- protected String generateRules;
+ @Parameter(required = true, defaultValue = "${project.basedir}")
+ protected File projectBaseDir;
- @Parameter(property = "kogito.codegen.processes")
- protected String generateProcesses;
+ @Parameter(required = true, defaultValue =
"${project.build.outputDirectory}")
+ protected File projectBuildOutputDirectory;
- @Parameter(property = "kogito.codegen.decisions")
- protected String generateDecisions;
+ @Parameter(required = true, defaultValue =
"${project.build.sourceEncoding}")
+ protected String projectSourceEncoding;
- @Parameter(property = "kogito.codegen.predictions")
- protected String generatePredictions;
+ @Parameter(property = "kogito.jsonSchema.version", required = false)
//TODO double check this required false
+ protected String jsonSchemaVersion;
+
+ @Parameter(property = "kogito.codegen.ondemand", defaultValue = "false")
+ protected boolean onDemand;
+
+ @Parameter(property = "kogito.sources.keep", defaultValue = "false")
+ protected boolean keepSources;
+
+ @Parameter(required = true, defaultValue = "${project}")
+ protected MavenProject project;
- protected void setSystemProperties(Map<String, String> properties) {
- if (properties != null) {
- getLog().debug("Additional system properties: " + properties);
- for (Map.Entry<String, String> property : properties.entrySet()) {
- System.setProperty(property.getKey(), property.getValue());
- }
- getLog().debug("Configured system properties were successfully
set.");
+ @Component
+ protected MavenProject mavenProject;
+
+ public void buildProject() throws MojoExecutionException {
+ getLog().info("buildProject");
+ executionLog();
+ try {
+ Set<URI> projectFilesUris = MojoUtil.getProjectFiles(mavenProject,
null);
+ BuilderManager.BuildInfo buildInfo = new
BuilderManager.BuildInfo(projectFilesUris,
+ projectBaseDir.toPath(),
+ projectBuildOutputDirectory.toPath(),
+ mavenProject.getGroupId(),
+ mavenProject.getArtifactId(),
+ mavenProject.getVersion(),
+ projectSourceEncoding,
+ mavenCompilerJavaVersion,
+ jsonSchemaVersion,
+ generatePartial,
+ persistence,
+ onDemand,
+ keepSources,
+ mavenProject.getRuntimeClasspathElements(),
+ discoverFramework(),
+ properties);
+ BuilderManager.build(buildInfo);
+ } catch (DependencyResolutionRequiredException | IOException e) {
+ throw new MojoExecutionException("Error building project", e);
}
}
- protected ClassLoader projectClassLoader() throws MojoExecutionException {
- ClassLoader contextClassLoader =
Thread.currentThread().getContextClassLoader();
- return MojoUtil.createProjectClassLoader(contextClassLoader,
- project,
- outputDirectory,
- null);
+ protected void executionLog() {
+ getLog().info("Compiler Java Version: " + mavenCompilerJavaVersion);
+ getLog().info("Compiler Source Encoding: " + projectSourceEncoding);
+ getLog().info("Project base directory: " +
projectBaseDir.getAbsolutePath());
+ getLog().info("Build output directory: " +
projectBuildOutputDirectory);
+ getLog().info("Partial generation is enabled: " + generatePartial);
+ getLog().info("Json schema version: " + jsonSchemaVersion);
+ getLog().info("===================================");
}
- protected CodeGenManagerUtil.Framework discoverFramework() {
- if (hasDependency("quarkus")) {
+ CodeGenManagerUtil.Framework discoverFramework() {
+ if (MojoUtil.hasDependency(mavenProject,
CodeGenManagerUtil.Framework.QUARKUS)) {
return CodeGenManagerUtil.Framework.QUARKUS;
}
- if (hasDependency("spring")) {
+ if (MojoUtil.hasDependency(mavenProject,
CodeGenManagerUtil.Framework.SPRING)) {
return CodeGenManagerUtil.Framework.SPRING;
}
return CodeGenManagerUtil.Framework.NONE;
}
- private boolean hasDependency(String dependency) {
- return project.getDependencies().stream().anyMatch(d ->
d.getArtifactId().contains(dependency));
- }
-
- protected GeneratedFileWriter getGeneratedFileWriter() {
- return
GENERATED_FILE_WRITER_BUILDER.build(Path.of(baseDir.getAbsolutePath()));
- }
}
diff --git
a/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/GenerateModelMojo.java
b/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/GenerateModelMojo.java
index 17b910e149..9cf101dd55 100644
---
a/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/GenerateModelMojo.java
+++
b/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/GenerateModelMojo.java
@@ -15,171 +15,25 @@
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
+ *
*/
-package org.kie.kogito.maven.plugin;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
+package org.kie.kogito.maven.plugin;
-import org.apache.maven.execution.MavenSession;
-import org.apache.maven.plugin.MojoExecution;
import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
-import org.apache.maven.plugins.annotations.Component;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.plugins.annotations.ResolutionScope;
-import org.apache.maven.project.MavenProject;
-import org.drools.codegen.common.GeneratedFile;
-import org.kie.kogito.KogitoGAV;
-import org.kie.kogito.codegen.api.context.KogitoBuildContext;
-import org.kie.kogito.codegen.manager.CompilerHelper;
-import org.kie.kogito.codegen.manager.GenerateModelHelper;
-import org.kie.kogito.codegen.manager.processes.PersistenceGenerationHelper;
-import org.kie.kogito.codegen.manager.util.CodeGenManagerUtil;
-import org.kie.kogito.maven.plugin.util.MojoUtil;
-
-import static
org.kie.efesto.common.api.constants.Constants.INDEXFILE_DIRECTORY_PROPERTY;
-import static org.kie.kogito.codegen.manager.CompilerHelper.RESOURCES;
-import static org.kie.kogito.codegen.manager.CompilerHelper.SOURCES;
-import static
org.kie.kogito.codegen.manager.util.CodeGenManagerUtil.discoverKogitoRuntimeContext;
@Mojo(name = "generateModel",
requiresDependencyResolution = ResolutionScope.COMPILE_PLUS_RUNTIME,
- requiresProject = true,
defaultPhase = LifecyclePhase.COMPILE,
threadSafe = true)
public class GenerateModelMojo extends AbstractKieMojo {
- /**
- * Partial generation can be used when reprocessing a pre-compiled project
- * for faster code-generation. It only generates code for rules and
processes,
- * and does not generate extra meta-classes (etc. Application).
- * Use only when doing recompilation and for development purposes
- */
- @Parameter(property = "kogito.codegen.partial", defaultValue = "false")
- private boolean generatePartial;
-
- @Parameter(property = "kogito.codegen.ondemand", defaultValue = "false")
- private boolean onDemand;
-
- @Parameter(property = "kogito.sources.keep", defaultValue = "false")
- private boolean keepSources;
-
- @Parameter(property = "kogito.jsonSchema.version", required = false)
- String schemaVersion;
-
- @Parameter(defaultValue = "${mojoExecution}")
- private MojoExecution mojoExecution;
-
- /**
- * The <code>maven-compiler-plugin</code> version to use.
- * Default to <b>3.10.2</b>
- */
- @Parameter(defaultValue = "3.10.2", property = "version.compiler.plugin")
- private String compilerPluginVersion;
-
- @Parameter(defaultValue = "17", property = "maven.compiler.release")
- private String compilerSourceJavaVersion;
-
- @Parameter(defaultValue = "17", property = "maven.compiler.release")
- private String compilerTargetJavaVersion;
-
- @Component
- private MavenProject mavenProject;
-
- @Component
- private MavenSession mavenSession;
-
@Override
- public void execute() throws MojoExecutionException, MojoFailureException {
- getLog().debug("Compiler Target Java Version:" +
compilerTargetJavaVersion);
- getLog().debug("Compiler Source Java Version:" +
compilerSourceJavaVersion);
- getLog().debug("Compiler Source Encoding:" + projectSourceEncoding);
- getLog().debug("Targeting directory: " + outputDirectory);
-
- boolean indexFileDirectorySet = false;
- if (outputDirectory == null) {
- throw new MojoExecutionException("${project.build.directory} is
null");
- }
- if (System.getProperty(INDEXFILE_DIRECTORY_PROPERTY) == null) {
- System.setProperty(INDEXFILE_DIRECTORY_PROPERTY,
outputDirectory.toString());
- indexFileDirectorySet = true;
- }
- addCompileSourceRoots();
- Map<String, Collection<GeneratedFile>> generatedModelFiles;
- ClassLoader projectClassLoader = projectClassLoader();
- KogitoBuildContext kogitoBuildContext =
getKogitoBuildContext(projectClassLoader);
- if (isOnDemand()) {
- getLog().info("On-Demand Mode is On. Use mvn compile
kogito:scaffold");
- generatedModelFiles = new HashMap<>();
- } else {
- generatedModelFiles = generateModel(kogitoBuildContext);
- }
- if (indexFileDirectorySet) {
- System.clearProperty(INDEXFILE_DIRECTORY_PROPERTY);
- }
-
- // Compile and write model files
- compileAndDump(generatedModelFiles, projectClassLoader);
-
- Map<String, Collection<GeneratedFile>> generatedPersistenceFiles =
generatePersistence(kogitoBuildContext, projectClassLoader);
-
- compileAndDump(generatedPersistenceFiles, projectClassLoader);
-
- if (!keepSources) {
- CodeGenManagerUtil.deleteDrlFiles(outputDirectory.toPath());
- }
- }
-
- KogitoBuildContext getKogitoBuildContext(ClassLoader projectClassLoader) {
- return discoverKogitoRuntimeContext(projectClassLoader,
- projectBaseDir.toPath(),
- new KogitoGAV(project.getGroupId(),
- project.getArtifactId(),
- project.getVersion()),
- new CodeGenManagerUtil.ProjectParameters(discoverFramework(),
- generateDecisions,
- generatePredictions,
- generateProcesses,
- generateRules,
- persistence),
- className -> MojoUtil.hasClassOnClasspath(project, className));
- }
-
- protected boolean isOnDemand() {
- return onDemand;
- }
-
- protected void addCompileSourceRoots() {
-
project.addCompileSourceRoot(getGeneratedFileWriter().getScaffoldedSourcesDir().toString());
- }
-
- protected Map<String, Collection<GeneratedFile>>
generateModel(KogitoBuildContext kogitoBuildContext) {
- setSystemProperties(properties);
- return GenerateModelHelper.generateModelFiles(kogitoBuildContext,
generatePartial);
- }
-
- protected Map<String, Collection<GeneratedFile>>
generatePersistence(KogitoBuildContext kogitoBuildContext, ClassLoader
projectClassloader) {
- return
PersistenceGenerationHelper.generatePersistenceFiles(kogitoBuildContext,
projectClassloader, schemaVersion);
- }
-
- protected void compileAndDump(Map<String, Collection<GeneratedFile>>
generatedFiles, ClassLoader classloader) throws MojoExecutionException {
- try {
- // Compile and write files
-
CompilerHelper.compileAndDumpGeneratedSources(generatedFiles.get(SOURCES),
- classloader,
- project.getRuntimeClasspathElements(),
- baseDir,
- projectSourceEncoding,
- compilerSourceJavaVersion,
- compilerTargetJavaVersion);
- // Dump resources
- CompilerHelper.dumpResources(generatedFiles.get(RESOURCES),
baseDir);
- } catch (Exception e) {
- throw new MojoExecutionException("Error during processing model
classes: " + e.getMessage(), e);
- }
+ public void execute() throws MojoExecutionException {
+ getLog().info("execute");
+ buildProject();
}
}
diff --git
a/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/ScaffoldMojo.java
b/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/ScaffoldMojo.java
deleted file mode 100644
index 8bdd9d45b2..0000000000
---
a/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/ScaffoldMojo.java
+++ /dev/null
@@ -1,54 +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.kie.kogito.maven.plugin;
-
-import java.io.File;
-
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.plugins.annotations.Parameter;
-import org.apache.maven.plugins.annotations.ResolutionScope;
-import org.kie.kogito.codegen.api.context.KogitoBuildContext;
-
-@Mojo(name = "scaffold",
- requiresDependencyResolution = ResolutionScope.COMPILE_PLUS_RUNTIME,
- requiresProject = true,
- threadSafe = true)
-public class ScaffoldMojo extends GenerateModelMojo {
-
- @Parameter(property = "kogito.codegen.ondemand", defaultValue = "true")
- private boolean onDemand;
-
- @Parameter(property = "kogito.codegen.sources.directory", defaultValue =
"${project.build.sourceDirectory}")
- private File customizableSources;
-
- @Override
- public void execute() throws MojoExecutionException {
- addCompileSourceRoots();
- ClassLoader projectClassLoader = projectClassLoader();
- KogitoBuildContext kogitoBuildContext =
getKogitoBuildContext(projectClassLoader);
- generateModel(kogitoBuildContext);
- }
-
- @Override
- public boolean isOnDemand() {
- return onDemand;
- }
-
-}
diff --git
a/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/util/MojoUtil.java
b/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/util/MojoUtil.java
index 94bc4cee80..fcce7523db 100644
---
a/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/util/MojoUtil.java
+++
b/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/util/MojoUtil.java
@@ -20,6 +20,7 @@ package org.kie.kogito.maven.plugin.util;
import java.io.File;
import java.io.IOException;
+import java.net.URI;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Arrays;
@@ -45,26 +46,33 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import static
org.drools.compiler.kie.builder.impl.KieBuilderImpl.setDefaultsforEmptyKieModule;
+import static
org.kie.kogito.codegen.manager.util.CodeGenManagerUtil.convertURIsToURLs;
public final class MojoUtil {
private static final Logger LOGGER =
LoggerFactory.getLogger(MojoUtil.class);
- public static Set<URL> getProjectFiles(final MavenProject mavenProject,
+ public static Set<URI> getProjectFiles(final MavenProject mavenProject,
final List<InternalKieModule> kmoduleDeps)
throws DependencyResolutionRequiredException, IOException {
- final Set<URL> urls = new HashSet<>();
+ final Set<URI> toReturn = getScaffoldFiles(mavenProject, kmoduleDeps);
for (final String element :
mavenProject.getCompileClasspathElements()) {
- urls.add(new File(element).toURI().toURL());
+ toReturn.add(new File(element).toURI());
}
+ return toReturn;
+ }
+ public static Set<URI> getScaffoldFiles(final MavenProject mavenProject,
+ final List<InternalKieModule> kmoduleDeps)
+ throws IOException {
+ final Set<URI> toReturn = new HashSet<>();
mavenProject.setArtifactFilter(new
CumulativeScopeArtifactFilter(Arrays.asList("compile", "runtime")));
for (final Artifact artifact : mavenProject.getArtifacts()) {
if (artifact.getType().equals("jar")) {
- populateURLsFromJarArtifact(urls, artifact, kmoduleDeps);
+ populateURLsFromJarArtifact(toReturn, artifact, kmoduleDeps);
}
}
- return urls;
+ return toReturn;
}
public static ClassLoader createProjectClassLoader(final ClassLoader
parentClassLoader,
@@ -72,9 +80,9 @@ public final class MojoUtil {
final File outputDirectory,
final List<InternalKieModule> kmoduleDeps) throws
MojoExecutionException {
try {
- final Set<URL> urls = getProjectFiles(mavenProject, kmoduleDeps);
- urls.add(outputDirectory.toURI().toURL());
- URL[] urlArray = urls.toArray(new URL[urls.size()]);
+ final Set<URI> uris = getProjectFiles(mavenProject, kmoduleDeps);
+ uris.add(outputDirectory.toURI());
+ URL[] urlArray = convertURIsToURLs(uris);
LOGGER.debug("Creating maven project class loading with: {}",
Arrays.asList(urlArray));
return URLClassLoader.newInstance(urlArray, parentClassLoader);
} catch (final DependencyResolutionRequiredException | IOException e) {
@@ -82,11 +90,11 @@ public final class MojoUtil {
}
}
- private static void populateURLsFromJarArtifact(final Set<URL> toPopulate,
final Artifact artifact,
+ private static void populateURLsFromJarArtifact(final Set<URI> toPopulate,
final Artifact artifact,
final List<InternalKieModule> kmoduleDeps) throws IOException {
final File file = artifact.getFile();
if (file != null && file.isFile()) {
- toPopulate.add(file.toURI().toURL());
+ toPopulate.add(file.toURI());
final KieModuleModel depModel = getDependencyKieModel(file);
if (kmoduleDeps != null && depModel != null) {
final ReleaseId releaseId = new
ReleaseIdImpl(artifact.getGroupId(), artifact.getArtifactId(),
@@ -108,18 +116,18 @@ public final class MojoUtil {
return null;
}
+ public static boolean hasDependency(final MavenProject mavenProject,
CodeGenManagerUtil.Framework framework) {
+ return mavenProject.getDependencies().stream().anyMatch(d ->
d.getArtifactId().contains(framework.toName()));
+ }
+
public static boolean hasClassOnClasspath(final MavenProject project,
String className) {
try {
Set<Artifact> elements = project.getArtifacts();
- URL[] urls = new URL[elements.size()];
-
- int i = 0;
+ Set<URI> uris = new HashSet<>();
for (Artifact artifact : elements) {
- urls[i] = artifact.getFile().toURI().toURL();
- i++;
+ uris.add(artifact.getFile().toURI());
}
-
- return CodeGenManagerUtil.isClassNameInUrlClassLoader(urls,
className);
+ return CodeGenManagerUtil.isClassNameInUrlClassLoader(uris,
className);
} catch (Exception e) {
return false;
}
diff --git
a/kogito-maven-plugin/src/test/java/org/kie/kogito/maven/plugin/GenerateModelMojoTest.java
b/kogito-maven-plugin/src/test/java/org/kie/kogito/maven/plugin/GenerateModelMojoTest.java
index ddeb07214f..cd56c4ea81 100644
---
a/kogito-maven-plugin/src/test/java/org/kie/kogito/maven/plugin/GenerateModelMojoTest.java
+++
b/kogito-maven-plugin/src/test/java/org/kie/kogito/maven/plugin/GenerateModelMojoTest.java
@@ -19,78 +19,69 @@
package org.kie.kogito.maven.plugin;
import java.io.File;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Map;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.testing.junit5.InjectMojo;
import org.apache.maven.plugin.testing.junit5.MojoTest;
-import org.drools.codegen.common.GeneratedFile;
import org.junit.jupiter.api.Test;
-import org.kie.kogito.codegen.api.context.KogitoBuildContext;
+import org.kie.kogito.codegen.manager.BuilderManager;
import org.kie.kogito.codegen.manager.CompilerHelper;
import org.kie.kogito.codegen.manager.GenerateModelHelper;
import org.kie.kogito.codegen.manager.processes.PersistenceGenerationHelper;
+import org.kie.kogito.codegen.manager.util.CodeGenManagerUtil;
import org.mockito.MockedStatic;
+import org.mockito.verification.VerificationMode;
import static org.assertj.core.api.Fail.fail;
-import static org.kie.kogito.codegen.manager.CompilerHelper.RESOURCES;
-import static org.kie.kogito.codegen.manager.CompilerHelper.SOURCES;
-import static org.mockito.Mockito.mock;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mockStatic;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
@MojoTest
class GenerateModelMojoTest {
- private static final KogitoBuildContext kogitoBuildContextMocked =
mock(KogitoBuildContext.class);
- private static final ClassLoader classLoaderMocked =
mock(ClassLoader.class);
-
@Test
@InjectMojo(goal = "generateModel", pom =
"src/test/resources/unit/generate-model/pom.xml")
- void generateModel(GenerateModelMojo mojo) {
- commonSetup(mojo);
- try (MockedStatic<GenerateModelHelper> generateModelHelperMockedStatic
= mockStatic(GenerateModelHelper.class)) {
- mojo.generateModel(kogitoBuildContextMocked);
- generateModelHelperMockedStatic.verify(() ->
GenerateModelHelper.generateModelFiles(kogitoBuildContextMocked, false),
times(1));
- }
+ void generateModelWithOnDemand(GenerateModelMojo mojo) {
+ commonSetup(mojo, true);
+ commonGenerateModel(mojo);
}
@Test
@InjectMojo(goal = "generateModel", pom =
"src/test/resources/unit/generate-model/pom.xml")
- void generatePersistence(GenerateModelMojo mojo) {
- commonSetup(mojo);
- try (MockedStatic<PersistenceGenerationHelper>
persistenceGenerationHelperMockedStatic =
mockStatic(PersistenceGenerationHelper.class)) {
- mojo.generatePersistence(kogitoBuildContextMocked,
classLoaderMocked);
- persistenceGenerationHelperMockedStatic.verify(() ->
PersistenceGenerationHelper.generatePersistenceFiles(kogitoBuildContextMocked,
classLoaderMocked, mojo.schemaVersion), times(1));
- } catch (Exception e) {
- fail(e.getMessage(), e);
- }
+ void generateModelWithoutOnDemand(GenerateModelMojo mojo) {
+ commonSetup(mojo, false);
+ commonGenerateModel(mojo);
}
- @Test
- @InjectMojo(goal = "generateModel", pom =
"src/test/resources/unit/generate-model/pom.xml")
- void compileAndDump(GenerateModelMojo mojo) {
- commonSetup(mojo);
- try (MockedStatic<CompilerHelper> compilerHelperMockedStatic =
mockStatic(CompilerHelper.class)) {
- Collection<GeneratedFile> generatedSources = new HashSet<>();
- Collection<GeneratedFile> generatedResources = new HashSet<>();
- Map<String, Collection<GeneratedFile>> generatedFiles =
Map.of(SOURCES, generatedSources, RESOURCES, generatedResources);
- mojo.compileAndDump(generatedFiles, classLoaderMocked);
- compilerHelperMockedStatic.verify(
- () ->
CompilerHelper.compileAndDumpGeneratedSources(generatedSources,
classLoaderMocked, mojo.project.getRuntimeClasspathElements(), mojo.baseDir,
"UTF-8", "17", "17"),
- times(1));
- compilerHelperMockedStatic.verify(() ->
CompilerHelper.dumpResources(generatedResources, mojo.baseDir), times(1));
+ private void commonGenerateModel(GenerateModelMojo mojo) {
+ try (MockedStatic<BuilderManager> builderManagerMockedStatic =
mockStatic(BuilderManager.class);
+ MockedStatic<CodeGenManagerUtil>
codeGenManagerUtilMockedStatic = mockStatic(CodeGenManagerUtil.class);
+ MockedStatic<GenerateModelHelper>
generateModelHelperMockedStatic = mockStatic(GenerateModelHelper.class);
+ MockedStatic<CompilerHelper> compilerHelperMockedStatic =
mockStatic(CompilerHelper.class);
+ MockedStatic<PersistenceGenerationHelper>
persistenceGenerationHelperMockedStatic =
mockStatic(PersistenceGenerationHelper.class)) {
+ builderManagerMockedStatic.when(() ->
BuilderManager.build(any(BuilderManager.BuildInfo.class))).thenCallRealMethod();
+ generateModelHelperMockedStatic.when(() ->
GenerateModelHelper.generateModel(any(GenerateModelHelper.GenerateModelInfo.class))).thenCallRealMethod();
+ mojo.execute();
+ builderManagerMockedStatic.verify(() ->
BuilderManager.build(any(BuilderManager.BuildInfo.class)), times(1));
+ codeGenManagerUtilMockedStatic.verify(() ->
CodeGenManagerUtil.setSystemProperties(any()), times(1));
+ generateModelHelperMockedStatic.verify(() ->
GenerateModelHelper.generateModel(any(GenerateModelHelper.GenerateModelInfo.class)),
times(1));
+ VerificationMode expectedGeneratedModelFiles = mojo.onDemand ?
never() : times(1);
+ generateModelHelperMockedStatic.verify(() ->
GenerateModelHelper.generateModelFiles(any(GenerateModelHelper.GenerateModelFilesInfo.class)),
expectedGeneratedModelFiles);
+ compilerHelperMockedStatic.verify(() ->
CompilerHelper.compileAndDump(any(CompilerHelper.CompileInfo.class)), times(2));
+ persistenceGenerationHelperMockedStatic.verify(() ->
PersistenceGenerationHelper.generatePersistenceFiles(any(),
+ any(),
+ any()), times(1));
} catch (MojoExecutionException e) {
fail(e.getMessage(), e);
}
}
- private void commonSetup(GenerateModelMojo mojo) {
- mojo.outputDirectory = new
File(mojo.project.getModel().getBuild().getOutputDirectory());
- mojo.baseDir = mojo.project.getBasedir();
+ private void commonSetup(GenerateModelMojo mojo, boolean onDemand) {
+ mojo.projectBuildOutputDirectory = new
File(mojo.project.getModel().getBuild().getOutputDirectory());
mojo.projectBaseDir = mojo.project.getBasedir();
mojo.projectSourceEncoding = "UTF-8";
+ mojo.onDemand = onDemand;
}
}
diff --git
a/quarkus/extensions/kogito-quarkus-extension-common/kogito-quarkus-common-deployment/src/main/java/org/kie/kogito/quarkus/common/deployment/KogitoAssetsProcessor.java
b/quarkus/extensions/kogito-quarkus-extension-common/kogito-quarkus-common-deployment/src/main/java/org/kie/kogito/quarkus/common/deployment/KogitoAssetsProcessor.java
index 8dd96912d9..a4879226ea 100644
---
a/quarkus/extensions/kogito-quarkus-extension-common/kogito-quarkus-common-deployment/src/main/java/org/kie/kogito/quarkus/common/deployment/KogitoAssetsProcessor.java
+++
b/quarkus/extensions/kogito-quarkus-extension-common/kogito-quarkus-common-deployment/src/main/java/org/kie/kogito/quarkus/common/deployment/KogitoAssetsProcessor.java
@@ -44,7 +44,6 @@ import org.jboss.jandex.Indexer;
import org.jboss.logging.Logger;
import org.kie.efesto.quarkus.deployment.EfestoGeneratedClassBuildItem;
import org.kie.kogito.KogitoGAV;
-import org.kie.kogito.codegen.api.Generator;
import org.kie.kogito.codegen.api.context.KogitoBuildContext;
import org.kie.kogito.codegen.core.utils.ApplicationGeneratorDiscovery;
import org.kie.kogito.quarkus.KogitoRecorder;
@@ -77,6 +76,7 @@ import jakarta.inject.Inject;
import jakarta.inject.Singleton;
import static org.drools.codegen.common.GeneratedFileType.COMPILED_CLASS;
+import static org.drools.codegen.common.GeneratedFileType.REST;
import static
org.drools.quarkus.util.deployment.DroolsQuarkusResourceUtils.compileGeneratedSources;
import static
org.drools.quarkus.util.deployment.DroolsQuarkusResourceUtils.makeBuildItems;
import static
org.kie.efesto.common.api.constants.Constants.INDEXFILE_DIRECTORY_PROPERTY;
@@ -326,7 +326,7 @@ public class KogitoAssetsProcessor {
generatedBeanBuildItems.forEach(generatedBeans::produce);
Set<String> restResourceClassNameSet = generatedFiles.stream()
- .filter(file -> file.type().equals(Generator.REST_TYPE))
+ .filter(file -> file.type().equals(REST))
.map(file -> toClassName(file.path().toString()))
.collect(Collectors.toSet());
generatedBeanBuildItems.stream()
diff --git
a/quarkus/integration-tests/integration-tests-kogito-plugin/src/it/integration-tests-kogito-plugin-it/invoker.properties
b/quarkus/integration-tests/integration-tests-kogito-plugin/src/it/integration-tests-kogito-plugin-it/invoker.properties
index c077dc99c5..67fbc68e16 100644
---
a/quarkus/integration-tests/integration-tests-kogito-plugin/src/it/integration-tests-kogito-plugin-it/invoker.properties
+++
b/quarkus/integration-tests/integration-tests-kogito-plugin/src/it/integration-tests-kogito-plugin-it/invoker.properties
@@ -19,4 +19,4 @@
# disable verbose local download output
invoker.mavenOpts=-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn
-invoker.goals = clean compile kogito:scaffold compile verify
+invoker.goals = clean compile verify
diff --git a/springboot/integration-tests/pom.xml
b/springboot/integration-tests/pom.xml
index 4e76b10967..92ae70d977 100644
--- a/springboot/integration-tests/pom.xml
+++ b/springboot/integration-tests/pom.xml
@@ -33,6 +33,7 @@
<properties>
<sonar.exclusions>**/*</sonar.exclusions>
<java.module.name>org.kie.kogito.springboot.starter.tests</java.module.name>
+ <maven.compiler.release>17</maven.compiler.release>
</properties>
<modules>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]