Copilot commented on code in PR #4058:
URL:
https://github.com/apache/incubator-kie-kogito-runtimes/pull/4058#discussion_r2351697066
##########
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>
Review Comment:
[nitpick] Consider using a property reference like
`${maven.compiler.release}` instead of hardcoding the Java version, to maintain
consistency with the parent POM and allow easier version management across the
project.
```suggestion
```
##########
kogito-codegen-modules/kogito-codegen-manager/src/main/java/org/kie/kogito/codegen/manager/GenerateModelHelper.java:
##########
@@ -20,28 +20,108 @@
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");
Review Comment:
The error message should be more descriptive. Consider: 'Output directory
cannot be null. Please ensure the project build output directory is properly
configured.'
```suggestion
throw new IllegalStateException("Output directory cannot be
null. Please ensure the project build output directory is properly
configured.");
```
##########
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
Review Comment:
Remove the TODO comment or address it. If this parameter should remain
optional, document why; if it needs validation, implement proper checks.
```suggestion
/**
* Optional: Allows users to specify a custom JSON Schema version for
code generation.
* If not set, the default version will be used.
*/
@Parameter(property = "kogito.jsonSchema.version", required = false)
```
##########
kogito-codegen-modules/kogito-codegen-manager/src/main/java/org/kie/kogito/codegen/manager/util/CodeGenManagerUtil.java:
##########
@@ -158,7 +197,8 @@ static Predicate<Class<?>>
classSubTypeAvailabilityResolver(ClassLoader projectC
.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;
Review Comment:
Creating a new URLClassLoader for each class lookup is inefficient. Consider
caching the URLClassLoader or using a different approach for class existence
checking, especially if this method is called frequently.
##########
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");
Review Comment:
The log message 'execute' is not informative. Consider using a more
descriptive message like 'Starting Kogito model generation' or remove the
redundant logging since buildProject() already logs appropriately.
```suggestion
```
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]