This is an automated email from the ASF dual-hosted git repository.
yamer 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 cfb424e7e3 kie-issues#1910: Create a single “codegen” management
library (#3881)
cfb424e7e3 is described below
commit cfb424e7e374bd32ea073549ba0a802807fc4333
Author: Yeser Amer <[email protected]>
AuthorDate: Thu Apr 10 11:19:56 2025 +0200
kie-issues#1910: Create a single “codegen” management library (#3881)
* First Draft
* Test Ignore
* Test Ignore
* Test Ignore
* Fix
* Fix + Tests
* Fix + Tests
* Fix + Tests
* Fix + Tests
* Tests
* Readme
* Tests
* Tests
* Fix imports
* Fix importsAdd dep scope
* pom cleanup
* Logback classic added
* Change Request
* Change Request
* Change Request
* Change Request
* Format?
* Format
---
kogito-bom/pom.xml | 11 ++
kogito-build/kogito-dependencies-bom/pom.xml | 5 +
.../kogito-codegen-manager/README.md | 30 ++++
.../kogito-codegen-manager/pom.xml | 136 +++++++++++++++
.../kogito/codegen/manager}/CompilerHelper.java | 90 ++++++----
.../codegen/manager}/GenerateModelHelper.java | 7 +-
.../processes}/PersistenceGenerationHelper.java | 16 +-
.../codegen/manager/util/CodeGenManagerUtil.java | 186 ++++++++++++++++++++
.../manager/util/CodeGenManagerUtilTest.java | 139 +++++++++++++++
kogito-codegen-modules/pom.xml | 9 +-
kogito-maven-plugin-test/pom.xml | 2 +-
kogito-maven-plugin/README.md | 55 ++++++
kogito-maven-plugin/pom.xml | 112 ++++--------
.../kie/kogito/maven/plugin/AbstractKieMojo.java | 194 ++-------------------
.../kie/kogito/maven/plugin/GenerateModelMojo.java | 106 ++++++-----
.../org/kie/kogito/maven/plugin/ScaffoldMojo.java | 6 +-
.../org/kie/kogito/maven/plugin/util/MojoUtil.java | 18 ++
.../kogito/maven/plugin/AbstractKieMojoTest.java | 111 ------------
.../kogito/maven/plugin/GenerateModelMojoTest.java | 33 ++--
19 files changed, 775 insertions(+), 491 deletions(-)
diff --git a/kogito-bom/pom.xml b/kogito-bom/pom.xml
index 346809d6d6..aa38acc76e 100755
--- a/kogito-bom/pom.xml
+++ b/kogito-bom/pom.xml
@@ -638,6 +638,17 @@
<version>${project.version}</version>
<classifier>sources</classifier>
</dependency>
+ <dependency>
+ <groupId>org.kie.kogito</groupId>
+ <artifactId>kogito-codegen-manager</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.kie.kogito</groupId>
+ <artifactId>kogito-codegen-manager</artifactId>
+ <version>${project.version}</version>
+ <classifier>sources</classifier>
+ </dependency>
<!-- Monitoring addon -->
<dependency>
diff --git a/kogito-build/kogito-dependencies-bom/pom.xml
b/kogito-build/kogito-dependencies-bom/pom.xml
index 605eca46dc..92b76f6fbc 100644
--- a/kogito-build/kogito-dependencies-bom/pom.xml
+++ b/kogito-build/kogito-dependencies-bom/pom.xml
@@ -620,6 +620,11 @@
<artifactId>maven-artifact</artifactId>
<version>${version.maven}</version>
</dependency>
+ <dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-model</artifactId>
+ <version>${version.maven}</version>
+ </dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
diff --git a/kogito-codegen-modules/kogito-codegen-manager/README.md
b/kogito-codegen-modules/kogito-codegen-manager/README.md
new file mode 100644
index 0000000000..a3ba59455b
--- /dev/null
+++ b/kogito-codegen-modules/kogito-codegen-manager/README.md
@@ -0,0 +1,30 @@
+<!--
+ 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.
+ -->
+
+# Kogito Codegen Manager
+
+The aim of this module is to be consumed by a build automation and project
management tool such as Maven or Gradle.
+
+This module manages all the required logic to actually execute the KIE assets
Generators defined in the other `kogito-codegen-*`
+, togheter with the glue code that perform the following actions:
+- It generates the CodeGen classes based on the given Apache KIE assets (BPMN,
DMN, DRL, PMML), using its specific Generator;
+- It writes the CodeGen classes;
+- It compiles the CodeGen classes, based on the Java version used in the user
Apache KIE project
+- It writes the compiled CodeGen classes;
+
diff --git a/kogito-codegen-modules/kogito-codegen-manager/pom.xml
b/kogito-codegen-modules/kogito-codegen-manager/pom.xml
new file mode 100644
index 0000000000..5912dfea55
--- /dev/null
+++ b/kogito-codegen-modules/kogito-codegen-manager/pom.xml
@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ 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.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.kie.kogito</groupId>
+ <artifactId>kogito-codegen-modules</artifactId>
+ <version>999-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>kogito-codegen-manager</artifactId>
+ <name>Kogito :: Codegen Manager</name>
+
+ <properties>
+ <java.module.name>org.kie.kogito.codegen.manager</java.module.name>
+ </properties>
+
+ <dependencyManagement>
+ <dependencies>
+ <dependency>
+ <groupId>org.kie.kogito</groupId>
+ <artifactId>kogito-kie-bom</artifactId>
+ <version>${project.version}</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+
+ <dependencies>
+ <!-- Internal dependencies -->
+ <dependency>
+ <groupId>org.drools</groupId>
+ <artifactId>drools-codegen-common</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.drools</groupId>
+ <artifactId>drools-compiler</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.drools</groupId>
+ <artifactId>drools-model-codegen</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.drools</groupId>
+ <artifactId>drools-util</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.kie.kogito</groupId>
+ <artifactId>kogito-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.kie.kogito</groupId>
+ <artifactId>kogito-codegen-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.kie.kogito</groupId>
+ <artifactId>kogito-codegen-core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.kie.kogito</groupId>
+ <artifactId>kogito-codegen-decisions</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.kie.kogito</groupId>
+ <artifactId>kogito-codegen-predictions</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.kie.kogito</groupId>
+ <artifactId>kogito-codegen-processes</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.kie.kogito</groupId>
+ <artifactId>kogito-codegen-rules</artifactId>
+ </dependency>
+
+ <!-- 3rd party dependencies -->
+ <dependency>
+ <groupId>org.reflections</groupId>
+ <artifactId>reflections</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ </dependency>
+
+ <!-- Test -->
+ <dependency>
+ <groupId>org.assertj</groupId>
+ <artifactId>assertj-core</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.junit.jupiter</groupId>
+ <artifactId>junit-jupiter-api</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.junit.jupiter</groupId>
+ <artifactId>junit-jupiter-params</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>ch.qos.logback</groupId>
+ <artifactId>logback-classic</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-core</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+</project>
\ No newline at end of file
diff --git
a/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/util/CompilerHelper.java
b/kogito-codegen-modules/kogito-codegen-manager/src/main/java/org/kie/kogito/codegen/manager/CompilerHelper.java
similarity index 54%
rename from
kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/util/CompilerHelper.java
rename to
kogito-codegen-modules/kogito-codegen-manager/src/main/java/org/kie/kogito/codegen/manager/CompilerHelper.java
index 58d32a1b44..8d7b782671 100644
---
a/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/util/CompilerHelper.java
+++
b/kogito-codegen-modules/kogito-codegen-manager/src/main/java/org/kie/kogito/codegen/manager/CompilerHelper.java
@@ -16,71 +16,76 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.kie.kogito.maven.plugin.util;
+package org.kie.kogito.codegen.manager;
import java.io.File;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.Collection;
+import java.util.List;
+import java.util.stream.Collectors;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
-import org.apache.maven.plugin.logging.Log;
-import org.apache.maven.project.MavenProject;
import org.drools.codegen.common.GeneratedFile;
import org.drools.codegen.common.GeneratedFileType;
import org.drools.codegen.common.GeneratedFileWriter;
import org.drools.compiler.compiler.io.memory.MemoryFileSystem;
import org.drools.util.PortablePath;
+import org.kie.memorycompiler.CompilationProblem;
import org.kie.memorycompiler.CompilationResult;
import org.kie.memorycompiler.JavaCompiler;
import org.kie.memorycompiler.JavaCompilerFactory;
import org.kie.memorycompiler.JavaCompilerSettings;
import org.kie.memorycompiler.JavaConfiguration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
public class CompilerHelper {
- private static final JavaCompiler JAVA_COMPILER =
JavaCompilerFactory.loadCompiler(JavaConfiguration.CompilerType.NATIVE, "1.8");
- private static final GeneratedFileWriter.Builder
generatedFileWriterBuilder = GeneratedFileWriter.builder("kogito",
"kogito.codegen.resources.directory", "kogito.codegen.sources.directory");
+ 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");
public static final String SOURCES = "SOURCES";
public static final String RESOURCES = "RESOURCES";
private CompilerHelper() {
}
- public static void
dumpAndCompileGeneratedSources(Collection<GeneratedFile> generatedSources,
+ public static void
compileAndDumpGeneratedSources(Collection<GeneratedFile> generatedSources,
ClassLoader classLoader,
- MavenProject project,
- File baseDir, Log log) throws MojoExecutionException {
- try {
- JavaCompilerSettings settings = new JavaCompilerSettings();
- for (String path : project.getRuntimeClasspathElements()) {
- File pathFile = new File(path);
- settings.addClasspath(pathFile);
- }
- compileAndWriteClasses(generatedSources, classLoader, settings,
getGeneratedFileWriter(baseDir), log);
- writeFiles(generatedSources, baseDir, log);
- } catch (Exception e) {
- throw new MojoExecutionException("Error during processing model
classes", e);
- }
+ List<String> runtimeClassPathElements,
+ File baseDir,
+ String javaSourceEncoding,
+ String javaSourceVersion,
+ String javaTargetVersion) {
+ compileAndWriteClasses(generatedSources,
+ classLoader,
+ buildJavaCompilerSettings(runtimeClassPathElements,
+ javaSourceEncoding,
+ javaSourceVersion,
+ javaTargetVersion),
+ getGeneratedFileWriter(baseDir));
+ writeFiles(generatedSources, baseDir);
}
- public static void dumpResources(Collection<GeneratedFile> resources, File
baseDir, Log log) {
- writeFiles(resources, baseDir, log);
+ public static void dumpResources(Collection<GeneratedFile> resources, File
baseDir) {
+ writeFiles(resources, baseDir);
}
- static void writeFiles(Collection<GeneratedFile> toWrite, File baseDir,
Log log) {
+ static void writeFiles(Collection<GeneratedFile> toWrite, File baseDir) {
GeneratedFileWriter writer = getGeneratedFileWriter(baseDir);
- toWrite.forEach(generatedFile -> writeGeneratedFile(generatedFile,
writer, log));
+ toWrite.forEach(generatedFile -> writeGeneratedFile(generatedFile,
writer));
}
- static void writeGeneratedFile(GeneratedFile generatedFile,
GeneratedFileWriter writer, Log log) {
- log.info("Generating: " + generatedFile.relativePath());
+ static void writeGeneratedFile(GeneratedFile generatedFile,
GeneratedFileWriter writer) {
+ LOGGER.info("Writing compiled class: {}",
generatedFile.relativePath());
writer.write(generatedFile);
}
- static void compileAndWriteClasses(Collection<GeneratedFile>
generatedClasses, ClassLoader cl, JavaCompilerSettings settings,
GeneratedFileWriter fileWriter, Log log)
- throws MojoFailureException {
+ static void compileAndWriteClasses(Collection<GeneratedFile>
generatedClasses,
+ ClassLoader classLoader,
+ JavaCompilerSettings javaCompilerSettings,
+ GeneratedFileWriter fileWriter) {
MemoryFileSystem srcMfs = new MemoryFileSystem();
MemoryFileSystem trgMfs = new MemoryFileSystem();
@@ -93,21 +98,36 @@ public class CompilerHelper {
}
if (sources.length > 0) {
+ CompilationResult result = JAVA_COMPILER.compile(sources, srcMfs,
trgMfs, classLoader, javaCompilerSettings);
- CompilationResult result = JAVA_COMPILER.compile(sources, srcMfs,
trgMfs, cl, settings);
if (result.getErrors().length > 0) {
- throw new
MojoFailureException(Arrays.toString(result.getErrors()));
+ throw new
IllegalStateException(Arrays.stream(result.getErrors())
+ .map(CompilationProblem::getMessage)
+ .collect(Collectors.joining(",")));
}
for (PortablePath path : trgMfs.getFilePaths()) {
byte[] data = trgMfs.getBytes(path);
- writeGeneratedFile(new
GeneratedFile(GeneratedFileType.COMPILED_CLASS, path.asString(), data),
fileWriter, log);
+ writeGeneratedFile(new
GeneratedFile(GeneratedFileType.COMPILED_CLASS, path.asString(), data),
fileWriter);
}
}
}
- private static GeneratedFileWriter getGeneratedFileWriter(File baseDir) {
- return generatedFileWriterBuilder
- .build(Path.of(baseDir.getAbsolutePath()));
+ static GeneratedFileWriter getGeneratedFileWriter(File baseDir) {
+ return
GENERATED_FILE_WRITER_BUILDER.build(Path.of(baseDir.getAbsolutePath()));
+ }
+
+ static JavaCompilerSettings buildJavaCompilerSettings(List<String>
runtimeClassPathElements,
+ String sourceEncoding,
+ String sourceVersion,
+ String targetVersion) {
+ JavaCompilerSettings settings = new JavaCompilerSettings();
+ for (String path : runtimeClassPathElements) {
+ settings.addClasspath(new File(path));
+ }
+ settings.setSourceEncoding(sourceEncoding);
+ settings.setSourceVersion(sourceVersion);
+ settings.setTargetVersion(targetVersion);
+ return settings;
}
}
diff --git
a/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/util/GenerateModelHelper.java
b/kogito-codegen-modules/kogito-codegen-manager/src/main/java/org/kie/kogito/codegen/manager/GenerateModelHelper.java
similarity index 93%
rename from
kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/util/GenerateModelHelper.java
rename to
kogito-codegen-modules/kogito-codegen-manager/src/main/java/org/kie/kogito/codegen/manager/GenerateModelHelper.java
index 826c92eb58..ec6d51d5b5 100644
---
a/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/util/GenerateModelHelper.java
+++
b/kogito-codegen-modules/kogito-codegen-manager/src/main/java/org/kie/kogito/codegen/manager/GenerateModelHelper.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.kie.kogito.maven.plugin.util;
+package org.kie.kogito.codegen.manager;
import java.io.File;
import java.util.Collection;
@@ -29,8 +29,8 @@ import org.kie.kogito.codegen.core.ApplicationGenerator;
import org.kie.kogito.codegen.core.utils.ApplicationGeneratorDiscovery;
import static org.drools.codegen.common.GeneratedFileType.COMPILED_CLASS;
-import static org.kie.kogito.maven.plugin.util.CompilerHelper.RESOURCES;
-import static org.kie.kogito.maven.plugin.util.CompilerHelper.SOURCES;
+import static org.kie.kogito.codegen.manager.CompilerHelper.RESOURCES;
+import static org.kie.kogito.codegen.manager.CompilerHelper.SOURCES;
public class GenerateModelHelper {
@@ -55,7 +55,6 @@ public class GenerateModelHelper {
case COMPILED_CLASS -> generatedResources.add(new
GeneratedFile(COMPILED_CLASS, convertPath(generatedFile.path().toString()),
generatedFile.contents()));
default -> throw new IllegalStateException("Unexpected file
with category: " + generatedFile.category());
}
-
});
return Map.of(SOURCES, generatedClasses, RESOURCES,
generatedResources);
}
diff --git
a/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/util/PersistenceGenerationHelper.java
b/kogito-codegen-modules/kogito-codegen-manager/src/main/java/org/kie/kogito/codegen/manager/processes/PersistenceGenerationHelper.java
similarity index 89%
rename from
kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/util/PersistenceGenerationHelper.java
rename to
kogito-codegen-modules/kogito-codegen-manager/src/main/java/org/kie/kogito/codegen/manager/processes/PersistenceGenerationHelper.java
index c783408eca..9234e9aa4e 100644
---
a/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/util/PersistenceGenerationHelper.java
+++
b/kogito-codegen-modules/kogito-codegen-manager/src/main/java/org/kie/kogito/codegen/manager/processes/PersistenceGenerationHelper.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.kie.kogito.maven.plugin.util;
+package org.kie.kogito.codegen.manager.processes;
import java.io.IOException;
import java.util.Collection;
@@ -25,7 +25,6 @@ import java.util.Map;
import java.util.Set;
import java.util.stream.Stream;
-import org.apache.maven.plugin.MojoExecutionException;
import org.drools.codegen.common.GeneratedFile;
import org.drools.codegen.common.GeneratedFileType;
import org.kie.kogito.Model;
@@ -33,6 +32,7 @@ import org.kie.kogito.ProcessInput;
import org.kie.kogito.UserTask;
import org.kie.kogito.codegen.api.context.KogitoBuildContext;
import org.kie.kogito.codegen.json.JsonSchemaGenerator;
+import org.kie.kogito.codegen.manager.util.CodeGenManagerUtil;
import org.kie.kogito.codegen.process.persistence.PersistenceGenerator;
import
org.kie.kogito.codegen.process.persistence.marshaller.ReflectionMarshallerGenerator;
import
org.kie.kogito.codegen.process.persistence.proto.ReflectionProtoGenerator;
@@ -40,8 +40,8 @@ import org.reflections.Reflections;
import static java.util.Arrays.asList;
import static
org.kie.kogito.codegen.core.utils.GeneratedFileValidation.validateGeneratedFileTypes;
-import static org.kie.kogito.maven.plugin.util.CompilerHelper.RESOURCES;
-import static org.kie.kogito.maven.plugin.util.CompilerHelper.SOURCES;
+import static org.kie.kogito.codegen.manager.CompilerHelper.RESOURCES;
+import static org.kie.kogito.codegen.manager.CompilerHelper.SOURCES;
public class PersistenceGenerationHelper {
@@ -49,9 +49,10 @@ public class PersistenceGenerationHelper {
}
public static Map<String, Collection<GeneratedFile>>
generatePersistenceFiles(KogitoBuildContext context,
- Reflections reflections,
- String schemaVersion) throws MojoExecutionException {
+ ClassLoader projectClassloader,
+ String schemaVersion) {
try {
+ Reflections reflections =
CodeGenManagerUtil.getReflections(projectClassloader);
@SuppressWarnings({ "rawtype", "unchecked" })
Set<Class<?>> modelClasses = (Set)
reflections.getSubTypesOf(Model.class);
@@ -71,7 +72,7 @@ public class PersistenceGenerationHelper {
toReturn.get(RESOURCES).addAll(generateJsonSchemaFromClasses(userTaskClassStream,
schemaVersion));
return toReturn;
} catch (Exception e) {
- throw new MojoExecutionException("Error during processing model
classes", e);
+ throw new IllegalStateException("Error during processing model
classes", e);
}
}
@@ -97,5 +98,4 @@ public class PersistenceGenerationHelper {
.withSchemaVersion(schemaVersion).build()
.generate();
}
-
}
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
new file mode 100644
index 0000000000..ced206c650
--- /dev/null
+++
b/kogito-codegen-modules/kogito-codegen-manager/src/main/java/org/kie/kogito/codegen/manager/util/CodeGenManagerUtil.java
@@ -0,0 +1,186 @@
+/*
+ * 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.util;
+
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.lang.reflect.Modifier;
+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.Optional;
+import java.util.function.Predicate;
+import java.util.stream.Stream;
+
+import org.drools.codegen.common.AppPaths;
+import org.drools.codegen.common.DroolsModelBuildContext;
+import org.drools.model.codegen.project.RuleCodegen;
+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.api.context.impl.JavaKogitoBuildContext;
+import org.kie.kogito.codegen.api.context.impl.QuarkusKogitoBuildContext;
+import org.kie.kogito.codegen.api.context.impl.SpringBootKogitoBuildContext;
+import org.kie.kogito.codegen.decision.DecisionCodegen;
+import org.kie.kogito.codegen.prediction.PredictionCodegen;
+import org.kie.kogito.codegen.process.ProcessCodegen;
+import org.kie.kogito.codegen.process.persistence.PersistenceGenerator;
+import org.reflections.Reflections;
+import org.reflections.util.ConfigurationBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class CodeGenManagerUtil {
+
+ private static final Logger LOGGER =
LoggerFactory.getLogger(CodeGenManagerUtil.class);
+ public static final PathMatcher DRL_FILE_MATCHER =
FileSystems.getDefault().getPathMatcher("glob:**.drl");
+
+ public enum Framework {
+ QUARKUS,
+ SPRING,
+ NONE
+ }
+
+ public record ProjectParameters(CodeGenManagerUtil.Framework framework,
+ String generateDecisions,
+ String generatePredictions,
+ String generateProcesses,
+ String generateRules,
+ boolean persistence) {
+ }
+
+ public static KogitoBuildContext discoverKogitoRuntimeContext(ClassLoader
projectClassLoader,
+ Path projectDir,
+ KogitoGAV kogitoGAV,
+ ProjectParameters projectParameters,
+ Predicate<String> classAvaialbilityPredicate) {
+ AppPaths appPaths = AppPaths.fromProjectDir(projectDir);
+ KogitoBuildContext context =
contextBuilder(projectParameters.framework)
+ .withClassAvailabilityResolver(classAvaialbilityPredicate)
+
.withClassSubTypeAvailabilityResolver(classSubTypeAvailabilityResolver(projectClassLoader))
+ .withApplicationProperties(appPaths.getResourceFiles())
+ .withPackageName(DroolsModelBuildContext.DEFAULT_PACKAGE_NAME)
+ .withClassLoader(projectClassLoader)
+ .withAppPaths(appPaths)
+ .withGAV(kogitoGAV)
+ .build();
+
+ additionalProperties(context, projectParameters);
+ return context;
+ }
+
+ static KogitoBuildContext.Builder
contextBuilder(CodeGenManagerUtil.Framework framework) {
+ return switch (framework) {
+ case QUARKUS -> QuarkusKogitoBuildContext.builder();
+ case SPRING -> SpringBootKogitoBuildContext.builder();
+ default -> JavaKogitoBuildContext.builder();
+ };
+ }
+
+ static Optional<String> classToCheckForREST(CodeGenManagerUtil.Framework
framework) {
+ return switch (framework) {
+ case QUARKUS ->
Optional.of(QuarkusKogitoBuildContext.QUARKUS_REST);
+ case SPRING ->
Optional.of(SpringBootKogitoBuildContext.SPRING_REST);
+ default -> Optional.empty();
+ };
+ }
+
+ static Optional<String> classToCheckForDI(CodeGenManagerUtil.Framework
framework) {
+ return switch (framework) {
+ case QUARKUS -> Optional.of(QuarkusKogitoBuildContext.QUARKUS_DI);
+ case SPRING -> Optional.of(SpringBootKogitoBuildContext.SPRING_DI);
+ default -> Optional.empty();
+ };
+ }
+
+ static void overwritePropertiesIfNeeded(KogitoBuildContext context,
ProjectParameters projectParameters) {
+ overwritePropertyIfNeeded(context, RuleCodegen.GENERATOR_NAME,
projectParameters.generateRules());
+ overwritePropertyIfNeeded(context, ProcessCodegen.GENERATOR_NAME,
projectParameters.generateProcesses());
+ overwritePropertyIfNeeded(context, PredictionCodegen.GENERATOR_NAME,
projectParameters.generatePredictions());
+ overwritePropertyIfNeeded(context, DecisionCodegen.GENERATOR_NAME,
projectParameters.generateDecisions());
+ overwritePropertyIfNeeded(context,
PersistenceGenerator.GENERATOR_NAME,
Boolean.toString(projectParameters.persistence()));
+ }
+
+ static void overwritePropertyIfNeeded(KogitoBuildContext context, String
generatorName, String propertyValue) {
+ if (propertyValue != null && !propertyValue.isEmpty()) {
+ context.setApplicationProperty(Generator.CONFIG_PREFIX +
generatorName, propertyValue);
+ }
+ }
+
+ static void additionalProperties(KogitoBuildContext context,
ProjectParameters projectParameters) {
+ classToCheckForREST(projectParameters.framework).ifPresent(restClass
-> {
+ if (!context.hasClassAvailable(restClass)) {
+ LOGGER.info("Disabling REST generation because class '{}' is
not available", restClass);
+
context.setApplicationProperty(DroolsModelBuildContext.KOGITO_GENERATE_REST,
"false");
+ }
+ });
+ classToCheckForDI(projectParameters.framework).ifPresent(diClass -> {
+ if (!context.hasClassAvailable(diClass)) {
+ LOGGER.info("Disabling dependency injection generation because
class '{}", diClass);
+
context.setApplicationProperty(DroolsModelBuildContext.KOGITO_GENERATE_DI,
"false");
+ }
+ });
+
+ overwritePropertiesIfNeeded(context, projectParameters);
+ }
+
+ public static Reflections getReflections(ClassLoader projectClassLoader) {
+ URLClassLoader urlClassLoader = (URLClassLoader) projectClassLoader;
+ ConfigurationBuilder builder = new ConfigurationBuilder();
+ builder.addUrls(urlClassLoader.getURLs());
+ builder.addClassLoaders(urlClassLoader);
+ return new Reflections(builder);
+ }
+
+ static Predicate<Class<?>> classSubTypeAvailabilityResolver(ClassLoader
projectClassLoader) {
+ return clazz ->
getReflections(projectClassLoader).getSubTypesOf(clazz).stream()
+ .anyMatch(c -> !c.isInterface() &&
!Modifier.isAbstract(c.getModifiers()));
+ }
+
+ public static boolean isClassNameInUrlClassLoader(URL[] urls, String
className) {
+ try (URLClassLoader cl = new URLClassLoader(urls)) {
+ cl.loadClass(className);
+ return true;
+ } catch (Exception e) {
+ return false;
+ }
+ }
+
+ /**
+ * It deletes all DRL files in a given Path directory
+ */
+ public static void deleteDrlFiles(Path directory) {
+ try (final Stream<Path> drlFiles = Files.find(directory,
+ Integer.MAX_VALUE,
+ (p, f) -> DRL_FILE_MATCHER.matches(p))) {
+ drlFiles.forEach(p -> {
+ try {
+ Files.delete(p);
+ } catch (IOException e) {
+ throw new UncheckedIOException(e);
+ }
+ });
+ } catch (IOException e) {
+ throw new UncheckedIOException("Error during .drl files deletion",
e);
+ }
+ }
+}
diff --git
a/kogito-codegen-modules/kogito-codegen-manager/src/test/java/org/kie/kogito/codegen/manager/util/CodeGenManagerUtilTest.java
b/kogito-codegen-modules/kogito-codegen-manager/src/test/java/org/kie/kogito/codegen/manager/util/CodeGenManagerUtilTest.java
new file mode 100644
index 0000000000..8a56e3fe37
--- /dev/null
+++
b/kogito-codegen-modules/kogito-codegen-manager/src/test/java/org/kie/kogito/codegen/manager/util/CodeGenManagerUtilTest.java
@@ -0,0 +1,139 @@
+/*
+ * 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.util;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Stream;
+
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
+import org.kie.kogito.codegen.api.Generator;
+import org.kie.kogito.codegen.api.context.KogitoBuildContext;
+import org.kie.kogito.codegen.decision.DecisionCodegen;
+import org.kie.kogito.codegen.prediction.PredictionCodegen;
+import org.kie.kogito.codegen.process.ProcessCodegen;
+import org.kie.kogito.codegen.process.persistence.PersistenceGenerator;
+import org.kie.kogito.codegen.rules.RuleCodegen;
+import org.mockito.Mockito;
+
+class CodeGenManagerUtilTest {
+
+ private static final List<String> generatorNames;
+
+ static {
+ generatorNames = new ArrayList<>();
+ generatorNames.add(RuleCodegen.GENERATOR_NAME);
+ generatorNames.add(ProcessCodegen.GENERATOR_NAME);
+ generatorNames.add(PredictionCodegen.GENERATOR_NAME);
+ generatorNames.add(DecisionCodegen.GENERATOR_NAME);
+ generatorNames.add(PersistenceGenerator.GENERATOR_NAME);
+ }
+
+ @ParameterizedTest
+ @MethodSource("getGeneratorNamesStream")
+ void overwritePropertiesIfNeededWithNullParameters(String generatorName) {
+ String expectedWrittenProperty = Generator.CONFIG_PREFIX +
generatorName;
+ KogitoBuildContext kogitoBuildContextMocked =
Mockito.mock(KogitoBuildContext.class);
+ CodeGenManagerUtil.ProjectParameters parameters = new
CodeGenManagerUtil.ProjectParameters(CodeGenManagerUtil.Framework.QUARKUS,
+ null,
+ null,
+ null,
+ null,
+ false);
+
CodeGenManagerUtil.overwritePropertiesIfNeeded(kogitoBuildContextMocked,
parameters);
+ if (generatorName.equals(PersistenceGenerator.GENERATOR_NAME)) {
+ Mockito.verify(kogitoBuildContextMocked,
Mockito.times(1)).setApplicationProperty(expectedWrittenProperty, "false"); //
being a boolean property, it default to false
+ } else {
+ Mockito.verify(kogitoBuildContextMocked,
Mockito.never()).setApplicationProperty(Mockito.eq(expectedWrittenProperty),
Mockito.any());
+ }
+ }
+
+ @ParameterizedTest
+ @MethodSource("getGeneratorNamesStream")
+ void overwritePropertiesIfNeededWithEmptyParameters(String generatorName) {
+ String expectedWrittenProperty = Generator.CONFIG_PREFIX +
generatorName;
+ KogitoBuildContext kogitoBuildContextMocked =
Mockito.mock(KogitoBuildContext.class);
+ CodeGenManagerUtil.ProjectParameters parameters = new
CodeGenManagerUtil.ProjectParameters(CodeGenManagerUtil.Framework.QUARKUS,
+ "",
+ "",
+ "",
+ "",
+ false);
+
CodeGenManagerUtil.overwritePropertiesIfNeeded(kogitoBuildContextMocked,
parameters);
+ if (generatorName.equals(PersistenceGenerator.GENERATOR_NAME)) {
+ Mockito.verify(kogitoBuildContextMocked,
Mockito.times(1)).setApplicationProperty(expectedWrittenProperty, "false"); //
being a boolean property, it default to false
+ } else {
+ Mockito.verify(kogitoBuildContextMocked,
Mockito.never()).setApplicationProperty(Mockito.eq(expectedWrittenProperty),
Mockito.any());
+ }
+ }
+
+ @ParameterizedTest
+ @MethodSource("getGeneratorNamesStream")
+ void overwritePropertiesIfNeededWithNotNullParameters(String
generatorName) {
+ String expectedWrittenProperty = Generator.CONFIG_PREFIX +
generatorName;
+ KogitoBuildContext kogitoBuildContextMocked =
Mockito.mock(KogitoBuildContext.class);
+ CodeGenManagerUtil.ProjectParameters parameters = new
CodeGenManagerUtil.ProjectParameters(CodeGenManagerUtil.Framework.QUARKUS,
+ "notnull",
+ "notnull",
+ "notnull",
+ "notnull",
+ true);
+
CodeGenManagerUtil.overwritePropertiesIfNeeded(kogitoBuildContextMocked,
parameters);
+ if (generatorName.equals(PersistenceGenerator.GENERATOR_NAME)) {
+ Mockito.verify(kogitoBuildContextMocked,
Mockito.times(1)).setApplicationProperty(expectedWrittenProperty, "true");
+ } else {
+ Mockito.verify(kogitoBuildContextMocked,
Mockito.times(1)).setApplicationProperty(Mockito.eq(expectedWrittenProperty),
Mockito.eq("notnull"));
+ }
+ }
+
+ @ParameterizedTest
+ @MethodSource("getGeneratorNamesStream")
+ void overwritePropertyIfNeededWithNotNull(String generatorName) {
+ String propertyValue = "notnull";
+ String expectedWrittenProperty = Generator.CONFIG_PREFIX +
generatorName;
+ KogitoBuildContext kogitoBuildContextMocked =
Mockito.mock(KogitoBuildContext.class);
+ CodeGenManagerUtil.overwritePropertyIfNeeded(kogitoBuildContextMocked,
generatorName, propertyValue);
+ Mockito.verify(kogitoBuildContextMocked,
Mockito.times(1)).setApplicationProperty(expectedWrittenProperty,
propertyValue);
+ }
+
+ @ParameterizedTest
+ @MethodSource("getGeneratorNamesStream")
+ void overwritePropertyIfNeededWithEmpty(String generatorName) {
+ String propertyValue = "";
+ String expectedWrittenProperty = Generator.CONFIG_PREFIX +
generatorName;
+ KogitoBuildContext kogitoBuildContextMocked =
Mockito.mock(KogitoBuildContext.class);
+ CodeGenManagerUtil.overwritePropertyIfNeeded(kogitoBuildContextMocked,
generatorName, propertyValue);
+ Mockito.verify(kogitoBuildContextMocked,
Mockito.never()).setApplicationProperty(expectedWrittenProperty, propertyValue);
+ }
+
+ @ParameterizedTest
+ @MethodSource("getGeneratorNamesStream")
+ void overwritePropertyIfNeededWithNull(String generatorName) {
+ String propertyValue = null;
+ String expectedWrittenProperty = Generator.CONFIG_PREFIX +
generatorName;
+ KogitoBuildContext kogitoBuildContextMocked =
Mockito.mock(KogitoBuildContext.class);
+ CodeGenManagerUtil.overwritePropertyIfNeeded(kogitoBuildContextMocked,
generatorName, propertyValue);
+ Mockito.verify(kogitoBuildContextMocked,
Mockito.never()).setApplicationProperty(expectedWrittenProperty, propertyValue);
+ }
+
+ static Stream<String> getGeneratorNamesStream() {
+ return generatorNames.stream();
+ }
+}
diff --git a/kogito-codegen-modules/pom.xml b/kogito-codegen-modules/pom.xml
index 942697d379..9ab6872eae 100644
--- a/kogito-codegen-modules/pom.xml
+++ b/kogito-codegen-modules/pom.xml
@@ -36,14 +36,15 @@
<name>Kogito :: Codegen Modules</name>
<modules>
- <module>kogito-codegen-core</module>
<module>kogito-codegen-api</module>
+ <module>kogito-codegen-core</module>
+ <module>kogito-codegen-decisions</module>
+ <module>kogito-codegen-integration-tests</module>
+ <module>kogito-codegen-manager</module>
+ <module>kogito-codegen-predictions</module>
<module>kogito-codegen-processes</module>
<module>kogito-codegen-processes-integration-tests</module>
<module>kogito-codegen-rules</module>
- <module>kogito-codegen-decisions</module>
- <module>kogito-codegen-predictions</module>
- <module>kogito-codegen-integration-tests</module>
<module>kogito-codegen-sample</module>
</modules>
diff --git a/kogito-maven-plugin-test/pom.xml b/kogito-maven-plugin-test/pom.xml
index b125e8a525..52dbda08d9 100644
--- a/kogito-maven-plugin-test/pom.xml
+++ b/kogito-maven-plugin-test/pom.xml
@@ -32,7 +32,7 @@
</parent>
<artifactId>kogito-maven-plugin-test</artifactId>
-
+ <name>Kogito :: Maven Plugin :: Test</name>
<properties>
<java.module.name>org.kie.kogito.maven.plugin.testing</java.module.name>
diff --git a/kogito-maven-plugin/README.md b/kogito-maven-plugin/README.md
new file mode 100644
index 0000000000..bae92dfa2a
--- /dev/null
+++ b/kogito-maven-plugin/README.md
@@ -0,0 +1,55 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ -->
+
+# Kogito Maven Plugin
+
+This Maven plugin aims to manage the code generation assets during the compile
time of a Kogito application.
+
+Supported frameworks of this plugin are:
+- Apache KIE plain Java projects;
+- Apache KIE Springboot based projects;
+
+During the execution, the plugin will discover all Apache KIE assets, which
are:
+- Decisions (DMN);
+- Predictions (PMML);
+- Processes (BPMN);
+- Rules (DRL)
+
+and will generate and compile all the Java Classes auto-generated by the
Kogito Codegen layer
+(see the `kogito-coden-modules`) that are mandatory for a correct Kogito
application operation.
+
+## How to use it
+
+In your Kogito project root `pom.xml` file, add the following plugin
declaration:
+
+```
+<plugin>
+ <groupId>org.kie.kogito</groupId>
+ <artifactId>kogito-maven-plugin</artifactId>
+ <version>${version.org.kie.kogito}</version>
+ <executions>
+ <execution>
+ <phase>compile</phase>
+ <goals>
+ <goal>generateModel</goal>
+ </goals>
+ </execution>
+ </executions>
+</plugin>
+```
\ No newline at end of file
diff --git a/kogito-maven-plugin/pom.xml b/kogito-maven-plugin/pom.xml
index 8fe97c300b..566bc96bb8 100644
--- a/kogito-maven-plugin/pom.xml
+++ b/kogito-maven-plugin/pom.xml
@@ -53,13 +53,6 @@
<dependencyManagement>
<dependencies>
- <dependency>
- <groupId>org.kie.kogito</groupId>
- <artifactId>kogito-pmml-dependencies</artifactId>
- <version>${project.version}</version>
- <type>pom</type>
- <scope>import</scope>
- </dependency>
<dependency>
<groupId>org.kie.kogito</groupId>
<artifactId>kogito-kie-bom</artifactId>
@@ -71,102 +64,72 @@
</dependencyManagement>
<dependencies>
+ <!-- Internal dependencies -->
<dependency>
- <groupId>org.apache.maven</groupId>
- <artifactId>maven-plugin-api</artifactId>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.maven.plugin-tools</groupId>
- <artifactId>maven-plugin-annotations</artifactId>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.maven</groupId>
- <artifactId>maven-core</artifactId>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.maven</groupId>
- <artifactId>maven-project</artifactId>
- <scope>provided</scope>
+ <groupId>org.drools</groupId>
+ <artifactId>drools-codegen-common</artifactId>
</dependency>
-
<dependency>
- <groupId>com.google.protobuf</groupId>
- <artifactId>protobuf-java</artifactId>
+ <groupId>org.drools</groupId>
+ <artifactId>drools-compiler</artifactId>
</dependency>
- <!-- Internal dependencies -->
<dependency>
- <groupId>org.kie.kogito</groupId>
- <artifactId>kogito-drools</artifactId>
+ <groupId>org.drools</groupId>
+ <artifactId>drools-decisiontables</artifactId>
+ <scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.drools</groupId>
- <artifactId>drools-model-compiler</artifactId>
+ <artifactId>drools-util</artifactId>
</dependency>
-
<dependency>
<groupId>org.kie.kogito</groupId>
<artifactId>kogito-api</artifactId>
</dependency>
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-api</artifactId>
- </dependency>
<dependency>
<groupId>org.kie.kogito</groupId>
- <artifactId>kogito-dmn</artifactId>
+ <artifactId>kogito-codegen-api</artifactId>
</dependency>
- <!-- PMML -->
<dependency>
<groupId>org.kie.kogito</groupId>
- <artifactId>kogito-pmml-dependencies</artifactId>
- <type>pom</type>
+ <artifactId>kogito-codegen-manager</artifactId>
</dependency>
+ <!-- 3rd party dependencies -->
<dependency>
- <groupId>org.drools</groupId>
- <artifactId>drools-decisiontables</artifactId>
- </dependency>
-
- <!-- codegen dependencies -->
- <dependency>
- <groupId>org.kie.kogito</groupId>
- <artifactId>kogito-codegen-core</artifactId>
- </dependency>
- <dependency>
- <groupId>org.kie.kogito</groupId>
- <artifactId>kogito-codegen-processes</artifactId>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-artifact</artifactId>
+ <scope>provided</scope>
</dependency>
<dependency>
- <groupId>org.kie.kogito</groupId>
- <artifactId>kogito-codegen-rules</artifactId>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-core</artifactId>
+ <scope>provided</scope>
</dependency>
<dependency>
- <groupId>org.kie.kogito</groupId>
- <artifactId>kogito-codegen-decisions</artifactId>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-model</artifactId>
+ <scope>provided</scope>
</dependency>
<dependency>
- <groupId>org.kie.kogito</groupId>
- <artifactId>kogito-codegen-predictions</artifactId>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-plugin-api</artifactId>
+ <scope>provided</scope>
</dependency>
- <!-- code generation for executable model -->
<dependency>
- <groupId>com.github.javaparser</groupId>
- <artifactId>javaparser-core</artifactId>
+ <groupId>org.apache.maven.plugin-tools</groupId>
+ <artifactId>maven-plugin-annotations</artifactId>
+ <scope>provided</scope>
</dependency>
-
- <!-- classpath scanning -->
<dependency>
- <groupId>org.reflections</groupId>
- <artifactId>reflections</artifactId>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
</dependency>
<!-- Test -->
<dependency>
- <groupId>ch.qos.logback</groupId>
- <artifactId>logback-classic</artifactId>
+ <groupId>org.assertj</groupId>
+ <artifactId>assertj-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
@@ -175,21 +138,20 @@
<scope>test</scope>
</dependency>
<dependency>
- <groupId>org.junit.jupiter</groupId>
- <artifactId>junit-jupiter-engine</artifactId>
+ <groupId>ch.qos.logback</groupId>
+ <artifactId>logback-classic</artifactId>
<scope>test</scope>
</dependency>
<dependency>
- <groupId>org.junit.jupiter</groupId>
- <artifactId>junit-jupiter-params</artifactId>
+ <groupId>org.apache.maven.plugin-testing</groupId>
+ <artifactId>maven-plugin-testing-harness</artifactId>
<scope>test</scope>
</dependency>
<dependency>
- <groupId>org.apache.maven.plugin-testing</groupId>
- <artifactId>maven-plugin-testing-harness</artifactId>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-core</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
-
</project>
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 1833ae35c0..ee16a43a10 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,45 +19,23 @@
package org.kie.kogito.maven.plugin;
import java.io.File;
-import java.lang.reflect.Modifier;
-import java.net.URL;
-import java.net.URLClassLoader;
import java.nio.file.Path;
-import java.util.Iterator;
import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-import java.util.function.Predicate;
-import org.apache.maven.artifact.Artifact;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.project.MavenProject;
-import org.drools.codegen.common.AppPaths;
-import org.drools.codegen.common.DroolsModelBuildContext;
import org.drools.codegen.common.GeneratedFileWriter;
-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.api.context.impl.JavaKogitoBuildContext;
-import org.kie.kogito.codegen.api.context.impl.QuarkusKogitoBuildContext;
-import org.kie.kogito.codegen.api.context.impl.SpringBootKogitoBuildContext;
-import org.kie.kogito.codegen.decision.DecisionCodegen;
-import org.kie.kogito.codegen.prediction.PredictionCodegen;
-import org.kie.kogito.codegen.process.ProcessCodegen;
-import org.kie.kogito.codegen.process.persistence.PersistenceGenerator;
-import org.kie.kogito.codegen.rules.RuleCodegen;
+import org.kie.kogito.codegen.manager.util.CodeGenManagerUtil;
import org.kie.kogito.maven.plugin.util.MojoUtil;
-import org.reflections.Reflections;
-import org.reflections.util.ConfigurationBuilder;
public abstract class AbstractKieMojo extends AbstractMojo {
- protected static final GeneratedFileWriter.Builder
generatedFileWriterBuilder = GeneratedFileWriter.builder("kogito",
"kogito.codegen.resources.directory", "kogito.codegen.sources.directory");
+ protected static final GeneratedFileWriter.Builder
GENERATED_FILE_WRITER_BUILDER = GeneratedFileWriter.builder("kogito",
"kogito.codegen.resources.directory", "kogito.codegen.sources.directory");
@Parameter(required = true, defaultValue = "${project.basedir}")
- protected File projectDir;
+ protected File projectBaseDir;
@Parameter
protected Map<String, String> properties;
@@ -65,6 +43,9 @@ public abstract class AbstractKieMojo extends AbstractMojo {
@Parameter(required = true, defaultValue = "${project}")
protected MavenProject project;
+ @Parameter(required = true, defaultValue =
"${project.build.sourceEncoding}")
+ protected String projectSourceEncoding;
+
@Parameter(required = true, defaultValue =
"${project.build.outputDirectory}")
protected File outputDirectory;
@@ -86,10 +67,7 @@ public abstract class AbstractKieMojo extends AbstractMojo {
@Parameter(property = "kogito.codegen.predictions")
protected String generatePredictions;
- private Reflections reflections;
-
protected void setSystemProperties(Map<String, String> properties) {
-
if (properties != null) {
getLog().debug("Additional system properties: " + properties);
for (Map.Entry<String, String> property : properties.entrySet()) {
@@ -99,52 +77,6 @@ public abstract class AbstractKieMojo extends AbstractMojo {
}
}
- protected KogitoBuildContext discoverKogitoRuntimeContext(ClassLoader
classLoader) {
- AppPaths appPaths = AppPaths.fromProjectDir(projectDir.toPath());
- KogitoBuildContext context = contextBuilder()
- .withClassAvailabilityResolver(this::hasClassOnClasspath)
-
.withClassSubTypeAvailabilityResolver(classSubTypeAvailabilityResolver())
- .withApplicationProperties(appPaths.getResourceFiles())
- .withPackageName(appPackageName())
- .withClassLoader(classLoader)
- .withAppPaths(appPaths)
- .withGAV(new KogitoGAV(project.getGroupId(),
project.getArtifactId(), project.getVersion()))
- .build();
-
- additionalProperties(context);
- return context;
- }
-
- protected Reflections getReflections() throws MojoExecutionException {
- if (reflections == null) {
- URLClassLoader classLoader = (URLClassLoader) projectClassLoader();
- ConfigurationBuilder builder = new ConfigurationBuilder();
- builder.addUrls(classLoader.getURLs());
- builder.addClassLoaders(classLoader);
- reflections = new Reflections(builder);
- }
- return reflections;
- }
-
- protected Reflections getReflections(ClassLoader toAdd) throws
MojoExecutionException {
- URLClassLoader classLoader = (URLClassLoader) projectClassLoader();
- ConfigurationBuilder builder = new ConfigurationBuilder();
- builder.addUrls(classLoader.getURLs());
- builder.addClassLoaders(classLoader, toAdd);
- return new Reflections(builder);
- }
-
- protected Predicate<Class<?>> classSubTypeAvailabilityResolver() {
- return clazz -> {
- try {
- return getReflections().getSubTypesOf(clazz).stream()
- .anyMatch(c -> !c.isInterface() &&
!Modifier.isAbstract(c.getModifiers()));
- } catch (MojoExecutionException e) {
- throw new RuntimeException(e);
- }
- };
- }
-
protected ClassLoader projectClassLoader() throws MojoExecutionException {
ClassLoader contextClassLoader =
Thread.currentThread().getContextClassLoader();
return MojoUtil.createProjectClassLoader(contextClassLoader,
@@ -153,127 +85,23 @@ public abstract class AbstractKieMojo extends
AbstractMojo {
null);
}
- protected String appPackageName() {
- return DroolsModelBuildContext.DEFAULT_PACKAGE_NAME;
- }
-
- private void additionalProperties(KogitoBuildContext context) {
-
- classToCheckForREST().ifPresent(restClass -> {
- if (!context.hasClassAvailable(restClass)) {
- getLog().info("Disabling REST generation because class '" +
restClass + "' is not available");
-
context.setApplicationProperty(DroolsModelBuildContext.KOGITO_GENERATE_REST,
"false");
- }
- });
- classToCheckForDI().ifPresent(diClass -> {
- if (!context.hasClassAvailable(diClass)) {
- getLog().info("Disabling dependency injection generation
because class '" + diClass + "' is not available");
-
context.setApplicationProperty(DroolsModelBuildContext.KOGITO_GENERATE_DI,
"false");
- }
- });
-
- overwritePropertiesIfNeeded(context);
- }
-
- void overwritePropertiesIfNeeded(KogitoBuildContext context) {
- overwritePropertyIfNeeded(context, RuleCodegen.GENERATOR_NAME,
generateRules);
- overwritePropertyIfNeeded(context, ProcessCodegen.GENERATOR_NAME,
generateProcesses);
- overwritePropertyIfNeeded(context, PredictionCodegen.GENERATOR_NAME,
generatePredictions);
- overwritePropertyIfNeeded(context, DecisionCodegen.GENERATOR_NAME,
generateDecisions);
- overwritePropertyIfNeeded(context,
PersistenceGenerator.GENERATOR_NAME, Boolean.toString(persistence));
- }
-
- static void overwritePropertyIfNeeded(KogitoBuildContext context, String
generatorName, String propertyValue) {
- if (propertyValue != null && !propertyValue.isEmpty()) {
- context.setApplicationProperty(Generator.CONFIG_PREFIX +
generatorName, propertyValue);
- }
- }
-
- private KogitoBuildContext.Builder contextBuilder() {
- switch (discoverFramework()) {
- case QUARKUS:
- return QuarkusKogitoBuildContext.builder();
- case SPRING:
- return SpringBootKogitoBuildContext.builder();
- default:
- return JavaKogitoBuildContext.builder();
- }
- }
-
- private Optional<String> classToCheckForREST() {
- switch (discoverFramework()) {
- case QUARKUS:
- return Optional.of(QuarkusKogitoBuildContext.QUARKUS_REST);
- case SPRING:
- return Optional.of(SpringBootKogitoBuildContext.SPRING_REST);
- default:
- return Optional.empty();
- }
- }
-
- private Optional<String> classToCheckForDI() {
- switch (discoverFramework()) {
- case QUARKUS:
- return Optional.of(QuarkusKogitoBuildContext.QUARKUS_DI);
- case SPRING:
- return Optional.of(SpringBootKogitoBuildContext.SPRING_DI);
- default:
- return Optional.empty();
- }
- }
-
- private enum Framework {
- QUARKUS,
- SPRING,
- NONE
- }
-
- private Framework discoverFramework() {
+ protected CodeGenManagerUtil.Framework discoverFramework() {
if (hasDependency("quarkus")) {
- return Framework.QUARKUS;
+ return CodeGenManagerUtil.Framework.QUARKUS;
}
if (hasDependency("spring")) {
- return Framework.SPRING;
+ return CodeGenManagerUtil.Framework.SPRING;
}
- return Framework.NONE;
+ return CodeGenManagerUtil.Framework.NONE;
}
private boolean hasDependency(String dependency) {
return project.getDependencies().stream().anyMatch(d ->
d.getArtifactId().contains(dependency));
}
- private boolean hasClassOnClasspath(String className) {
- try {
- Set<Artifact> elements = project.getArtifacts();
- URL[] urls = new URL[elements.size()];
-
- int i = 0;
- Iterator<Artifact> it = elements.iterator();
- while (it.hasNext()) {
- Artifact artifact = it.next();
-
- urls[i] = artifact.getFile().toURI().toURL();
- i++;
- }
- try (URLClassLoader cl = new URLClassLoader(urls)) {
- cl.loadClass(className);
- }
- return true;
- } catch (Exception e) {
- return false;
- }
- }
-
- protected File getSourcesPath() {
- // using runtime BT instead of static AppPaths.MAVEN to allow
- // invocation from GRADLE
- return Path.of(baseDir.getAbsolutePath(),
AppPaths.BT.GENERATED_SOURCES_PATH.toString()).toFile();
- }
-
protected GeneratedFileWriter getGeneratedFileWriter() {
- return generatedFileWriterBuilder
- .build(Path.of(baseDir.getAbsolutePath()));
+ 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 50be9c2a7e..62cce9a250 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
@@ -18,22 +18,14 @@
*/
package org.kie.kogito.maven.plugin;
-import java.io.IOException;
-import java.io.UncheckedIOException;
-import java.nio.file.FileSystems;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.PathMatcher;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
-import java.util.stream.Stream;
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.plugin.logging.Log;
import org.apache.maven.plugins.annotations.Component;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
@@ -41,15 +33,18 @@ 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.maven.plugin.util.CompilerHelper;
-import org.kie.kogito.maven.plugin.util.GenerateModelHelper;
-import org.kie.kogito.maven.plugin.util.PersistenceGenerationHelper;
-import org.reflections.Reflections;
+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.maven.plugin.util.CompilerHelper.RESOURCES;
-import static org.kie.kogito.maven.plugin.util.CompilerHelper.SOURCES;
+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,
@@ -58,8 +53,6 @@ import static
org.kie.kogito.maven.plugin.util.CompilerHelper.SOURCES;
threadSafe = true)
public class GenerateModelMojo extends AbstractKieMojo {
- public static final PathMatcher drlFileMatcher =
FileSystems.getDefault().getPathMatcher("glob:**.drl");
-
/**
* Partial generation can be used when reprocessing a pre-compiled project
* for faster code-generation. It only generates code for rules and
processes,
@@ -83,11 +76,17 @@ public class GenerateModelMojo extends AbstractKieMojo {
/**
* The <code>maven-compiler-plugin</code> version to use.
- * Default to <b>3.8.1</b>
+ * Default to <b>3.10.2</b>
*/
- @Parameter(defaultValue = "3.8.1", property = "version.compiler.plugin")
+ @Parameter(defaultValue = "3.10.2", property = "version.compiler.plugin")
private String compilerPluginVersion;
+ @Parameter(defaultValue = "17", property = "maven.compiler.source")
+ private String compilerSourceJavaVersion;
+
+ @Parameter(defaultValue = "17", property = "maven.compiler.target")
+ private String compilerTargetJavaVersion;
+
@Component
private MavenProject mavenProject;
@@ -96,9 +95,12 @@ public class GenerateModelMojo extends AbstractKieMojo {
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
- // TODO to be removed with DROOLS-7090
+ 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;
- getLog().debug("execute -> " + outputDirectory);
if (outputDirectory == null) {
throw new MojoExecutionException("${project.build.directory} is
null");
}
@@ -109,30 +111,44 @@ public class GenerateModelMojo extends AbstractKieMojo {
addCompileSourceRoots();
Map<String, Collection<GeneratedFile>> generatedModelFiles;
ClassLoader projectClassLoader = projectClassLoader();
- KogitoBuildContext kogitoBuildContext =
discoverKogitoRuntimeContext(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);
}
- // TODO to be removed with DROOLS-7090
if (indexFileDirectorySet) {
System.clearProperty(INDEXFILE_DIRECTORY_PROPERTY);
}
// Compile and write model files
- compileAndDump(generatedModelFiles, projectClassLoader, getLog());
+ compileAndDump(generatedModelFiles, projectClassLoader);
- Map<String, Collection<GeneratedFile>> generatedPersistenceFiles =
generatePersistence(kogitoBuildContext, getReflections(projectClassLoader));
+ Map<String, Collection<GeneratedFile>> generatedPersistenceFiles =
generatePersistence(kogitoBuildContext, projectClassLoader);
- compileAndDump(generatedPersistenceFiles, projectClassLoader,
getLog());
+ compileAndDump(generatedPersistenceFiles, projectClassLoader);
if (!keepSources) {
- deleteDrlFiles();
+ 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;
}
@@ -146,30 +162,24 @@ public class GenerateModelMojo extends AbstractKieMojo {
return GenerateModelHelper.generateModelFiles(kogitoBuildContext,
generatePartial);
}
- protected Map<String, Collection<GeneratedFile>>
generatePersistence(KogitoBuildContext kogitoBuildContext, Reflections
reflections) throws MojoExecutionException {
- return
PersistenceGenerationHelper.generatePersistenceFiles(kogitoBuildContext,
reflections, schemaVersion);
- }
-
- protected void compileAndDump(Map<String, Collection<GeneratedFile>>
generatedFiles, ClassLoader classloader, Log log) throws MojoExecutionException
{
- // Compile and write files
-
CompilerHelper.dumpAndCompileGeneratedSources(generatedFiles.get(SOURCES),
classloader, project, baseDir, log);
- // Dump resources
- CompilerHelper.dumpResources(generatedFiles.get(RESOURCES), baseDir,
log);
+ protected Map<String, Collection<GeneratedFile>>
generatePersistence(KogitoBuildContext kogitoBuildContext, ClassLoader
projectClassloader) {
+ return
PersistenceGenerationHelper.generatePersistenceFiles(kogitoBuildContext,
projectClassloader, schemaVersion);
}
- private void deleteDrlFiles() throws MojoExecutionException {
- // Remove drl files
- try (final Stream<Path> drlFiles =
Files.find(outputDirectory.toPath(), Integer.MAX_VALUE,
- (p, f) -> drlFileMatcher.matches(p))) {
- drlFiles.forEach(p -> {
- try {
- Files.delete(p);
- } catch (IOException e) {
- throw new UncheckedIOException(e);
- }
- });
- } catch (IOException e) {
- throw new MojoExecutionException("Unable to find .drl files");
+ 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);
}
}
}
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
index 72c1b3e003..8bdd9d45b2 100644
---
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
@@ -42,7 +42,7 @@ public class ScaffoldMojo extends GenerateModelMojo {
public void execute() throws MojoExecutionException {
addCompileSourceRoots();
ClassLoader projectClassLoader = projectClassLoader();
- KogitoBuildContext kogitoBuildContext =
discoverKogitoRuntimeContext(projectClassLoader);
+ KogitoBuildContext kogitoBuildContext =
getKogitoBuildContext(projectClassLoader);
generateModel(kogitoBuildContext);
}
@@ -51,8 +51,4 @@ public class ScaffoldMojo extends GenerateModelMojo {
return onDemand;
}
- @Override
- protected File getSourcesPath() {
- return customizableSources;
- }
}
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 5700261014..94bc4cee80 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
@@ -39,6 +39,7 @@ import org.drools.compiler.kie.builder.impl.ZipKieModule;
import org.drools.compiler.kproject.models.KieModuleModelImpl;
import org.kie.api.builder.ReleaseId;
import org.kie.api.builder.model.KieModuleModel;
+import org.kie.kogito.codegen.manager.util.CodeGenManagerUtil;
import org.kie.util.maven.support.ReleaseIdImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -107,6 +108,23 @@ public final class MojoUtil {
return null;
}
+ public static boolean hasClassOnClasspath(final MavenProject project,
String className) {
+ try {
+ Set<Artifact> elements = project.getArtifacts();
+ URL[] urls = new URL[elements.size()];
+
+ int i = 0;
+ for (Artifact artifact : elements) {
+ urls[i] = artifact.getFile().toURI().toURL();
+ i++;
+ }
+
+ return CodeGenManagerUtil.isClassNameInUrlClassLoader(urls,
className);
+ } catch (Exception e) {
+ return false;
+ }
+ }
+
private MojoUtil() {
// Creating instances of util classes is forbidden.
}
diff --git
a/kogito-maven-plugin/src/test/java/org/kie/kogito/maven/plugin/AbstractKieMojoTest.java
b/kogito-maven-plugin/src/test/java/org/kie/kogito/maven/plugin/AbstractKieMojoTest.java
deleted file mode 100644
index 4ae94ebf39..0000000000
---
a/kogito-maven-plugin/src/test/java/org/kie/kogito/maven/plugin/AbstractKieMojoTest.java
+++ /dev/null
@@ -1,111 +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.util.ArrayList;
-import java.util.List;
-import java.util.stream.Stream;
-
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.MethodSource;
-import org.kie.kogito.codegen.api.Generator;
-import org.kie.kogito.codegen.api.context.KogitoBuildContext;
-import org.kie.kogito.codegen.decision.DecisionCodegen;
-import org.kie.kogito.codegen.prediction.PredictionCodegen;
-import org.kie.kogito.codegen.process.ProcessCodegen;
-import org.kie.kogito.codegen.process.persistence.PersistenceGenerator;
-import org.kie.kogito.codegen.rules.RuleCodegen;
-
-import static
org.kie.kogito.maven.plugin.AbstractKieMojo.overwritePropertyIfNeeded;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-
-class AbstractKieMojoTest {
-
- private static final List<String> generatorNames;
-
- static {
- generatorNames = new ArrayList<>();
- generatorNames.add(RuleCodegen.GENERATOR_NAME);
- generatorNames.add(ProcessCodegen.GENERATOR_NAME);
- generatorNames.add(PredictionCodegen.GENERATOR_NAME);
- generatorNames.add(DecisionCodegen.GENERATOR_NAME);
- generatorNames.add(PersistenceGenerator.GENERATOR_NAME);
- }
-
- @ParameterizedTest
- @MethodSource("getGeneratorNamesStream")
- void overwritePropertiesIfNeededWithNull(String generatorName) {
- String expectedWrittenProperty = Generator.CONFIG_PREFIX +
generatorName;
- AbstractKieMojo abstractKieMojo = new AbstractKieMojo() {
- @Override
- public void execute() throws MojoExecutionException,
MojoFailureException {
- }
- };
- KogitoBuildContext kogitoBuildContextMocked =
mock(KogitoBuildContext.class);
- abstractKieMojo.overwritePropertiesIfNeeded(kogitoBuildContextMocked);
- if (generatorName.equals(PersistenceGenerator.GENERATOR_NAME)) {
- verify(kogitoBuildContextMocked,
times(1)).setApplicationProperty(expectedWrittenProperty, "false"); // being a
boolean property, it default to false
- } else {
- verify(kogitoBuildContextMocked,
never()).setApplicationProperty(eq(expectedWrittenProperty), any());
- }
- }
-
- @ParameterizedTest
- @MethodSource("getGeneratorNamesStream")
- void overwritePropertyIfNeededWithNotNull(String generatorName) {
- String propertyValue = "notnull";
- String expectedWrittenProperty = Generator.CONFIG_PREFIX +
generatorName;
- KogitoBuildContext kogitoBuildContextMocked =
mock(KogitoBuildContext.class);
- overwritePropertyIfNeeded(kogitoBuildContextMocked, generatorName,
propertyValue);
- verify(kogitoBuildContextMocked,
times(1)).setApplicationProperty(expectedWrittenProperty, propertyValue);
- }
-
- @ParameterizedTest
- @MethodSource("getGeneratorNamesStream")
- void overwritePropertyIfNeededWithEmpty(String generatorName) {
- String propertyValue = "";
- String expectedWrittenProperty = Generator.CONFIG_PREFIX +
generatorName;
- KogitoBuildContext kogitoBuildContextMocked =
mock(KogitoBuildContext.class);
- overwritePropertyIfNeeded(kogitoBuildContextMocked, generatorName,
propertyValue);
- verify(kogitoBuildContextMocked,
never()).setApplicationProperty(expectedWrittenProperty, propertyValue);
- }
-
- @ParameterizedTest
- @MethodSource("getGeneratorNamesStream")
- void overwritePropertyIfNeededWithNull(String generatorName) {
- String propertyValue = null;
- String expectedWrittenProperty = Generator.CONFIG_PREFIX +
generatorName;
- KogitoBuildContext kogitoBuildContextMocked =
mock(KogitoBuildContext.class);
- overwritePropertyIfNeeded(kogitoBuildContextMocked, generatorName,
propertyValue);
- verify(kogitoBuildContextMocked,
never()).setApplicationProperty(expectedWrittenProperty, propertyValue);
- }
-
- static Stream<String> getGeneratorNamesStream() {
- return generatorNames.stream();
- }
-
-}
\ No newline at end of file
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 fb009ed4e3..ddeb07214f 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
@@ -24,21 +24,19 @@ import java.util.HashSet;
import java.util.Map;
import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.logging.Log;
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.maven.plugin.util.CompilerHelper;
-import org.kie.kogito.maven.plugin.util.GenerateModelHelper;
-import org.kie.kogito.maven.plugin.util.PersistenceGenerationHelper;
+import org.kie.kogito.codegen.manager.CompilerHelper;
+import org.kie.kogito.codegen.manager.GenerateModelHelper;
+import org.kie.kogito.codegen.manager.processes.PersistenceGenerationHelper;
import org.mockito.MockedStatic;
-import org.reflections.Reflections;
import static org.assertj.core.api.Fail.fail;
-import static org.kie.kogito.maven.plugin.util.CompilerHelper.RESOURCES;
-import static org.kie.kogito.maven.plugin.util.CompilerHelper.SOURCES;
+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.Mockito.mockStatic;
import static org.mockito.Mockito.times;
@@ -48,8 +46,6 @@ class GenerateModelMojoTest {
private static final KogitoBuildContext kogitoBuildContextMocked =
mock(KogitoBuildContext.class);
private static final ClassLoader classLoaderMocked =
mock(ClassLoader.class);
- private static final Reflections reflectionsMocked =
mock(Reflections.class);
- private static final Log logMocked = mock(Log.class);
@Test
@InjectMojo(goal = "generateModel", pom =
"src/test/resources/unit/generate-model/pom.xml")
@@ -66,9 +62,9 @@ class GenerateModelMojoTest {
void generatePersistence(GenerateModelMojo mojo) {
commonSetup(mojo);
try (MockedStatic<PersistenceGenerationHelper>
persistenceGenerationHelperMockedStatic =
mockStatic(PersistenceGenerationHelper.class)) {
- mojo.generatePersistence(kogitoBuildContextMocked,
reflectionsMocked);
- persistenceGenerationHelperMockedStatic.verify(() ->
PersistenceGenerationHelper.generatePersistenceFiles(kogitoBuildContextMocked,
reflectionsMocked, mojo.schemaVersion), times(1));
- } catch (MojoExecutionException e) {
+ mojo.generatePersistence(kogitoBuildContextMocked,
classLoaderMocked);
+ persistenceGenerationHelperMockedStatic.verify(() ->
PersistenceGenerationHelper.generatePersistenceFiles(kogitoBuildContextMocked,
classLoaderMocked, mojo.schemaVersion), times(1));
+ } catch (Exception e) {
fail(e.getMessage(), e);
}
}
@@ -81,9 +77,11 @@ class GenerateModelMojoTest {
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, logMocked);
- compilerHelperMockedStatic.verify(() ->
CompilerHelper.dumpAndCompileGeneratedSources(generatedSources,
classLoaderMocked, mojo.project, mojo.baseDir, logMocked), times(1));
- compilerHelperMockedStatic.verify(() ->
CompilerHelper.dumpResources(generatedResources, mojo.baseDir, logMocked),
times(1));
+ 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));
} catch (MojoExecutionException e) {
fail(e.getMessage(), e);
}
@@ -92,6 +90,7 @@ class GenerateModelMojoTest {
private void commonSetup(GenerateModelMojo mojo) {
mojo.outputDirectory = new
File(mojo.project.getModel().getBuild().getOutputDirectory());
mojo.baseDir = mojo.project.getBasedir();
- mojo.projectDir = mojo.project.getBasedir();
+ mojo.projectBaseDir = mojo.project.getBasedir();
+ mojo.projectSourceEncoding = "UTF-8";
}
-}
\ No newline at end of file
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]