diff --git a/drools/kogito-scenario-simulation/src/main/java/org/kogito/scenariosimulation/runner/KogitoDMNScenarioRunnerHelper.java b/drools/kogito-scenario-simulation/src/main/java/org/kogito/scenariosimulation/runner/KogitoDMNScenarioRunnerHelper.java index 9d6f96ef9eb..2babf303133 100644 --- a/drools/kogito-scenario-simulation/src/main/java/org/kogito/scenariosimulation/runner/KogitoDMNScenarioRunnerHelper.java +++ b/drools/kogito-scenario-simulation/src/main/java/org/kogito/scenariosimulation/runner/KogitoDMNScenarioRunnerHelper.java @@ -28,6 +28,7 @@ import java.util.Map; import java.util.stream.Stream; +import org.drools.codegen.common.AppPaths; import org.drools.io.FileSystemResource; import org.drools.scenariosimulation.api.model.ScenarioSimulationModel; import org.drools.scenariosimulation.api.model.ScesimModelDescriptor; @@ -53,7 +54,7 @@ public class KogitoDMNScenarioRunnerHelper extends DMNScenarioRunnerHelper { private DMNRuntime dmnRuntime = initDmnRuntime(); - private static final String targetFolder = File.separator + "target" + File.separator; + private static final String targetFolder = File.separator + AppPaths.TARGET_DIR + File.separator; private static final String generatedResourcesFolder = targetFolder + "generated-resources" + File.separator; @Override diff --git a/kogito-codegen-modules/kogito-codegen-api/src/main/java/org/kie/kogito/codegen/api/context/impl/AbstractKogitoBuildContext.java b/kogito-codegen-modules/kogito-codegen-api/src/main/java/org/kie/kogito/codegen/api/context/impl/AbstractKogitoBuildContext.java index 25a0e8794da..d46cfdb118a 100644 --- a/kogito-codegen-modules/kogito-codegen-api/src/main/java/org/kie/kogito/codegen/api/context/impl/AbstractKogitoBuildContext.java +++ b/kogito-codegen-modules/kogito-codegen-api/src/main/java/org/kie/kogito/codegen/api/context/impl/AbstractKogitoBuildContext.java @@ -21,7 +21,6 @@ import java.io.File; import java.io.FileReader; import java.io.IOException; -import java.nio.file.Path; import java.text.MessageFormat; import java.util.Collection; import java.util.Collections; @@ -258,7 +257,7 @@ protected abstract static class AbstractBuilder implements Builder { protected Predicate classAvailabilityResolver = this::hasClass; protected Predicate> classSubTypeAvailabilityResolver = c -> false; // default fallback value (usually overridden) - protected AppPaths appPaths = AppPaths.fromProjectDir(new File(".").toPath(), Path.of(".", AppPaths.TARGET_DIR)); + protected AppPaths appPaths = AppPaths.fromProjectDir(new File(".").toPath()); protected KogitoGAV gav; protected AbstractBuilder() { diff --git a/kogito-codegen-modules/kogito-codegen-core/src/main/java/org/kie/kogito/codegen/core/utils/GeneratedFileWriter.java b/kogito-codegen-modules/kogito-codegen-core/src/main/java/org/kie/kogito/codegen/core/utils/GeneratedFileWriter.java deleted file mode 100644 index d596702592a..00000000000 --- a/kogito-codegen-modules/kogito-codegen-core/src/main/java/org/kie/kogito/codegen/core/utils/GeneratedFileWriter.java +++ /dev/null @@ -1,153 +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.codegen.core.utils; - -import java.io.IOException; -import java.io.UncheckedIOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.Collection; - -import org.drools.codegen.common.GeneratedFile; -import org.drools.codegen.common.GeneratedFileType; - -/** - * Writes {@link GeneratedFile} to the right directory, depending on its - * {@link GeneratedFileType.Category} - */ -public class GeneratedFileWriter { - - public static class Builder { - - private final String classesDir; - private final String sourcesDir; - private final String resourcePath; - private final String scaffoldedSourcesDir; - - /** - * - * @param classesDir usually target/classes/ - * @param sourcesDir usually target/generated-sources/kogito/ - * @param resourcesDir usually target/generated-resources/kogito/ - * @param scaffoldedSourcesDir usually src/main/java/ - */ - public Builder(String classesDir, String sourcesDir, String resourcesDir, String scaffoldedSourcesDir) { - this.classesDir = classesDir; - this.sourcesDir = sourcesDir; - this.resourcePath = resourcesDir; - this.scaffoldedSourcesDir = scaffoldedSourcesDir; - } - - /** - * @param basePath the path to which the given subdirectories will be written - * e.g. ${basePath}/${classesDir}/myfile.ext - * - */ - public GeneratedFileWriter build(Path basePath) { - return new GeneratedFileWriter( - basePath.resolve(classesDir), - basePath.resolve(sourcesDir), - basePath.resolve(resourcePath), - basePath.resolve(scaffoldedSourcesDir)); - } - } - - private final Path classesDir; - private final Path sourcesDir; - private final Path resourcePath; - private final Path scaffoldedSourcesDir; - - public static final String DEFAULT_SOURCES_DIR = "generated-sources/kogito/"; - public static final String DEFAULT_RESOURCE_PATH = "generated-resources/kogito/"; - public static final String DEFAULT_SCAFFOLDED_SOURCES_DIR = "src/main/java/"; - public static final String DEFAULT_CLASSES_DIR = "target/classes"; - - /** - * - * @param classesDir usually {@link #DEFAULT_CLASSES_DIR} - * @param sourcesDir usually target/generated-sources/kogito/. See {@link #DEFAULT_SOURCES_DIR} - * @param resourcePath usually target/generated-resources/kogito/ {@link #DEFAULT_RESOURCE_PATH} - * @param scaffoldedSourcesDir usually {@link #DEFAULT_SCAFFOLDED_SOURCES_DIR} - */ - public GeneratedFileWriter(Path classesDir, Path sourcesDir, Path resourcePath, Path scaffoldedSourcesDir) { - this.classesDir = classesDir; - this.sourcesDir = sourcesDir; - this.resourcePath = resourcePath; - this.scaffoldedSourcesDir = scaffoldedSourcesDir; - } - - public void writeAll(Collection generatedFiles) { - generatedFiles.forEach(this::write); - } - - public void write(GeneratedFile f) throws UncheckedIOException { - try { - GeneratedFileType.Category category = f.category(); - switch (category) { - case INTERNAL_RESOURCE: // since codegen happens after maven-resource-plugin (both in Quarkus and SB), need to manually place in the correct (CP) location - case STATIC_HTTP_RESOURCE: - case COMPILED_CLASS: - writeGeneratedFile(f, classesDir); - break; - case SOURCE: - if (f.type().isCustomizable()) { - writeGeneratedFile(f, scaffoldedSourcesDir); - } else { - writeGeneratedFile(f, sourcesDir); - } - break; - default: - throw new IllegalArgumentException("Unknown Category " + category.name()); - } - } catch (IOException e) { - throw new UncheckedIOException(e); - } - } - - public Path getClassesDir() { - return classesDir; - } - - public Path getSourcesDir() { - return sourcesDir; - } - - public Path getResourcePath() { - return resourcePath; - } - - public Path getScaffoldedSourcesDir() { - return scaffoldedSourcesDir; - } - - private void writeGeneratedFile(GeneratedFile f, Path location) throws IOException { - if (location == null) { - return; - } - Files.write( - pathOf(location, f.path()), - f.contents()); - } - - private Path pathOf(Path location, Path end) throws IOException { - Path path = location.resolve(end); - Files.createDirectories(path.getParent()); - return path; - } -} diff --git a/kogito-codegen-modules/kogito-codegen-predictions/src/test/java/org/kie/kogito/codegen/prediction/PMMLRestResourceGeneratorTest.java b/kogito-codegen-modules/kogito-codegen-predictions/src/test/java/org/kie/kogito/codegen/prediction/PMMLRestResourceGeneratorTest.java index 8fe6c0dd94b..b69a9aa614e 100644 --- a/kogito-codegen-modules/kogito-codegen-predictions/src/test/java/org/kie/kogito/codegen/prediction/PMMLRestResourceGeneratorTest.java +++ b/kogito-codegen-modules/kogito-codegen-predictions/src/test/java/org/kie/kogito/codegen/prediction/PMMLRestResourceGeneratorTest.java @@ -22,6 +22,7 @@ import java.util.NoSuchElementException; import java.util.Optional; +import org.drools.codegen.common.AppPaths; import org.drools.codegen.common.di.impl.CDIDependencyInjectionAnnotator; import org.drools.util.StringUtils; import org.junit.jupiter.api.AfterAll; @@ -80,7 +81,7 @@ public static void setup() { String filePrefix = URLEncoder.encode(getSanitizedClassName(KIE_PMML_MODEL.getFileName().replace(".pmml", ""))); String classPrefix = URLEncoder.encode(getSanitizedClassName(KIE_PMML_MODEL.getName())); expectedUrl = String.format("/%s/%s", filePrefix, classPrefix); - System.setProperty(INDEXFILE_DIRECTORY_PROPERTY, "target/test-classes"); + System.setProperty(INDEXFILE_DIRECTORY_PROPERTY, String.format("%s/test-classes", AppPaths.TARGET_DIR)); } @AfterAll diff --git a/kogito-codegen-modules/kogito-codegen-predictions/src/test/java/org/kie/kogito/codegen/prediction/PredictionCodegenFactoryTest.java b/kogito-codegen-modules/kogito-codegen-predictions/src/test/java/org/kie/kogito/codegen/prediction/PredictionCodegenFactoryTest.java index 1c14e042a6f..d378b501f70 100644 --- a/kogito-codegen-modules/kogito-codegen-predictions/src/test/java/org/kie/kogito/codegen/prediction/PredictionCodegenFactoryTest.java +++ b/kogito-codegen-modules/kogito-codegen-predictions/src/test/java/org/kie/kogito/codegen/prediction/PredictionCodegenFactoryTest.java @@ -21,6 +21,7 @@ import java.util.Collections; import java.util.List; +import org.drools.codegen.common.AppPaths; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.params.ParameterizedTest; @@ -46,7 +47,7 @@ class PredictionCodegenFactoryTest { @BeforeAll public static void setup() { - System.setProperty(INDEXFILE_DIRECTORY_PROPERTY, "target/test-classes"); + System.setProperty(INDEXFILE_DIRECTORY_PROPERTY, String.format("%s/test-classes", AppPaths.TARGET_DIR)); } @AfterAll 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 b26c7bbef86..c563288e284 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 @@ -29,6 +29,7 @@ import java.util.function.Function; import java.util.stream.Stream; +import org.drools.codegen.common.AppPaths; import org.drools.codegen.common.GeneratedFile; import org.drools.codegen.common.GeneratedFileType; import org.junit.jupiter.api.AfterAll; @@ -68,7 +69,7 @@ class PredictionCodegenGenerateTest { @BeforeAll public static void setup() { - System.setProperty(INDEXFILE_DIRECTORY_PROPERTY, "target/test-classes"); + System.setProperty(INDEXFILE_DIRECTORY_PROPERTY, String.format("%s/test-classes", AppPaths.TARGET_DIR)); } @AfterAll diff --git a/kogito-codegen-modules/kogito-codegen-predictions/src/test/java/org/kie/kogito/codegen/prediction/PredictionCodegenInternalGenerateTest.java b/kogito-codegen-modules/kogito-codegen-predictions/src/test/java/org/kie/kogito/codegen/prediction/PredictionCodegenInternalGenerateTest.java index 27b91deb5b7..6f6229c4dee 100644 --- a/kogito-codegen-modules/kogito-codegen-predictions/src/test/java/org/kie/kogito/codegen/prediction/PredictionCodegenInternalGenerateTest.java +++ b/kogito-codegen-modules/kogito-codegen-predictions/src/test/java/org/kie/kogito/codegen/prediction/PredictionCodegenInternalGenerateTest.java @@ -25,6 +25,7 @@ import java.util.function.Function; import java.util.stream.Stream; +import org.drools.codegen.common.AppPaths; import org.drools.codegen.common.GeneratedFile; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; @@ -51,7 +52,7 @@ class PredictionCodegenInternalGenerateTest { @BeforeAll public static void setup() { - System.setProperty(INDEXFILE_DIRECTORY_PROPERTY, "target/test-classes"); + System.setProperty(INDEXFILE_DIRECTORY_PROPERTY, String.format("%s/test-classes", AppPaths.TARGET_DIR)); } @AfterAll 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 81eb6a6c262..b279c5eafc1 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 @@ -22,6 +22,7 @@ import java.lang.reflect.Modifier; import java.net.URL; import java.net.URLClassLoader; +import java.nio.file.Path; import java.util.Collection; import java.util.Iterator; import java.util.Map; @@ -37,13 +38,13 @@ import org.drools.codegen.common.AppPaths; import org.drools.codegen.common.DroolsModelBuildContext; import org.drools.codegen.common.GeneratedFile; +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.core.utils.GeneratedFileWriter; import org.kie.kogito.codegen.decision.DecisionCodegen; import org.kie.kogito.codegen.prediction.PredictionCodegen; import org.kie.kogito.codegen.process.ProcessCodegen; @@ -55,6 +56,8 @@ public abstract class AbstractKieMojo extends AbstractMojo { + protected static final GeneratedFileWriter.Builder generatedFileWriterBuilder = GeneratedFileWriter.builder("kogito", "kogito.codegen.resources.directory", "kogito.codegen.sources.directory"); + @Parameter(required = true, defaultValue = "${project.basedir}") protected File projectDir; @@ -67,11 +70,8 @@ public abstract class AbstractKieMojo extends AbstractMojo { @Parameter(required = true, defaultValue = "${project.build.outputDirectory}") protected File outputDirectory; - @Parameter(defaultValue = "${project.build.directory}/" + GeneratedFileWriter.DEFAULT_SOURCES_DIR) - protected File generatedSources; - - @Parameter(defaultValue = "${project.build.directory}/" + GeneratedFileWriter.DEFAULT_RESOURCE_PATH) - protected File generatedResources; + @Parameter(required = true, defaultValue = "${project.basedir}") + protected File baseDir; @Parameter(property = "kogito.codegen.persistence", defaultValue = "true") protected boolean persistence; @@ -102,7 +102,7 @@ protected void setSystemProperties(Map properties) { } protected KogitoBuildContext discoverKogitoRuntimeContext(ClassLoader classLoader) { - AppPaths appPaths = AppPaths.fromProjectDir(projectDir.toPath(), outputDirectory.toPath()); + AppPaths appPaths = AppPaths.fromProjectDir(projectDir.toPath()); KogitoBuildContext context = contextBuilder() .withClassAvailabilityResolver(this::hasClassOnClasspath) .withClassSubTypeAvailabilityResolver(classSubTypeAvailabilityResolver()) @@ -250,20 +250,27 @@ private boolean hasClassOnClasspath(String className) { } protected void writeGeneratedFiles(Collection generatedFiles) { - generatedFiles.forEach(this::writeGeneratedFile); + GeneratedFileWriter writer = getGeneratedFileWriter(); + generatedFiles.forEach(generatedFile -> writeGeneratedFile(generatedFile, writer)); } protected void writeGeneratedFile(GeneratedFile generatedFile) { - GeneratedFileWriter writer = new GeneratedFileWriter(outputDirectory.toPath(), - generatedSources.toPath(), - generatedResources.toPath(), - getSourcesPath().toPath()); + writeGeneratedFile(generatedFile, getGeneratedFileWriter()); + } + protected void writeGeneratedFile(GeneratedFile generatedFile, GeneratedFileWriter writer) { getLog().info("Generating: " + generatedFile.relativePath()); writer.write(generatedFile); } protected File getSourcesPath() { - return generatedSources; + // 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())); } } 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 9b101d390d4..b1c3c675102 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 @@ -54,9 +54,6 @@ public class GenerateModelMojo extends AbstractKieMojo { public static final PathMatcher drlFileMatcher = FileSystems.getDefault().getPathMatcher("glob:**.drl"); - @Parameter(property = "kogito.codegen.sources.directory", defaultValue = "${project.build.directory}/generated-sources/kogito") - private File customizableSourcesPath; - /** * Partial generation can be used when reprocessing a pre-compiled project * for faster code-generation. It only generates code for rules and processes, @@ -72,19 +69,16 @@ public class GenerateModelMojo extends AbstractKieMojo { @Parameter(property = "kogito.sources.keep", defaultValue = "false") private boolean keepSources; - @Parameter(property = "build.output.directory", readonly = true, defaultValue = "${project.build.directory}/classes/") - private String buildOutputDirectory; - @Override public void execute() throws MojoExecutionException { // TODO to be removed with DROOLS-7090 boolean indexFileDirectorySet = false; - getLog().debug("execute -> " + buildOutputDirectory); - if (buildOutputDirectory == null) { + getLog().debug("execute -> " + outputDirectory); + if (outputDirectory == null) { throw new MojoExecutionException("${project.build.directory} is null"); } if (System.getProperty(INDEXFILE_DIRECTORY_PROPERTY) == null) { - System.setProperty(INDEXFILE_DIRECTORY_PROPERTY, buildOutputDirectory); + System.setProperty(INDEXFILE_DIRECTORY_PROPERTY, outputDirectory.toString()); indexFileDirectorySet = true; } addCompileSourceRoots(); @@ -103,14 +97,8 @@ protected boolean isOnDemand() { return onDemand; } - @Override - protected File getSourcesPath() { - return customizableSourcesPath; - } - protected void addCompileSourceRoots() { - project.addCompileSourceRoot(getSourcesPath().getPath()); - project.addCompileSourceRoot(generatedSources.getPath()); + project.addCompileSourceRoot(getGeneratedFileWriter().getScaffoldedSourcesDir().toString()); } protected void generateModel() throws MojoExecutionException { @@ -129,9 +117,11 @@ protected void generateModel() throws MojoExecutionException { Map> mappedGeneratedFiles = generatedFiles.stream() .collect(Collectors.groupingBy(GeneratedFile::type)); - mappedGeneratedFiles.entrySet().stream() + List generatedUncompiledFiles = mappedGeneratedFiles.entrySet().stream() .filter(entry -> !entry.getKey().equals(COMPILED_CLASS)) - .forEach(entry -> writeGeneratedFiles(entry.getValue())); + .flatMap(entry -> entry.getValue().stream()) + .toList(); + writeGeneratedFiles(generatedUncompiledFiles); List generatedCompiledFiles = mappedGeneratedFiles.getOrDefault(COMPILED_CLASS, Collections.emptyList()) diff --git a/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/ProcessClassesMojo.java b/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/ProcessClassesMojo.java index f5ffd9b3d85..ef491c7eca3 100644 --- a/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/ProcessClassesMojo.java +++ b/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/ProcessClassesMojo.java @@ -98,14 +98,14 @@ public void execute() throws MojoExecutionException { compileAndWriteClasses(generatedClasses, classLoader, settings); // Dump resources - generatedResources.forEach(this::writeGeneratedFile); + this.writeGeneratedFiles(generatedResources); // Json schema generation Stream> processClassStream = getReflections().getTypesAnnotatedWith(ProcessInput.class).stream(); - generateJsonSchema(processClassStream).forEach(this::writeGeneratedFile); + writeGeneratedFiles(generateJsonSchema(processClassStream)); Stream> userTaskClassStream = getReflections().getTypesAnnotatedWith(UserTask.class).stream(); - generateJsonSchema(userTaskClassStream).forEach(this::writeGeneratedFile); + writeGeneratedFiles(generateJsonSchema(userTaskClassStream)); } catch (Exception e) { throw new MojoExecutionException("Error during processing model classes", e); } 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 ab63a083fdb..346a0f5a40d 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 @@ -34,6 +34,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import org.drools.codegen.common.AppPaths; import org.drools.codegen.common.DroolsModelBuildContext; import org.drools.codegen.common.GeneratedFile; import org.drools.codegen.common.GeneratedFileType; @@ -107,10 +108,9 @@ public class KogitoAssetsProcessor { @BuildStep public KogitoBuildContextBuildItem generateKogitoBuildContext(List attributes) { // configure the application generator - PathCollection rootPaths = getRootPaths(root.getResolvedPaths()); + PathCollection rootPaths = getRootPaths(root.getResolvedPaths(), AppPaths.BT); KogitoBuildContext context = - kogitoBuildContext(outputTargetBuildItem.getOutputDirectory(), - rootPaths, + kogitoBuildContext(rootPaths, combinedIndexBuildItem.getIndex(), curateOutcomeBuildItem.getApplicationModel().getAppArtifact()); attributes.forEach(attribute -> context.addContextAttribute(attribute.getName(), attribute.getValue())); @@ -218,26 +218,26 @@ public EfestoGeneratedClassBuildItem reflectiveEfestoGeneratedClassBuildItem(Kog return new EfestoGeneratedClassBuildItem(kogitoGeneratedSourcesBuildItem.getGeneratedFiles()); } - static PathCollection getRootPaths(PathCollection resolvedPaths) { - AtomicReference toReturnRef = new AtomicReference<>(resolvedPaths); - if (resolvedPaths.stream().noneMatch(path -> path.endsWith(File.separator + "generated-resources"))) { - Optional optClassesPath = - resolvedPaths.stream().filter(path -> { - String fullPath = path.toString(); - String dir = fullPath.substring(fullPath.lastIndexOf(File.separator) + 1); - return dir.equals("classes"); - }).findFirst(); - optClassesPath.ifPresent(classesPath -> { - Path toAdd = Path.of(classesPath.toString().replace(File.separator + "classes", - File.separator + - "generated" + - "-resources")); - List prevPaths = toReturnRef.get().stream().collect(Collectors.toList()); - prevPaths.add(toAdd); - toReturnRef.set(PathList.from(prevPaths)); - }); + static PathCollection getRootPaths(PathCollection resolvedPaths, AppPaths.BuildTool bt) { + // Needed hack because during MAVEN build, resolvedPaths point to root of project, + // while during GRADLE build, resolved paths contains {root_project}/build/classes/java/main and + // {root_project}/build/resources/main + switch (bt) { + case GRADLE -> { + AtomicReference toReturnRef = new AtomicReference<>(resolvedPaths); + Optional optClassesPath = + resolvedPaths.stream().filter(path -> { + String fullPath = path.toString(); + String lookingFor = "build/classes/java/main".replace("/", File.separator); + return fullPath.endsWith(lookingFor); + }).findFirst(); + optClassesPath.ifPresent(classesPath -> toReturnRef.set(PathList.of(classesPath))); + return toReturnRef.get(); + } + default -> { + return resolvedPaths; + } } - return toReturnRef.get(); } private Collection collectGeneratedFiles(KogitoGeneratedSourcesBuildItem sources, List preSources, diff --git a/quarkus/extensions/kogito-quarkus-extension-common/kogito-quarkus-common-deployment/src/main/java/org/kie/kogito/quarkus/common/deployment/KogitoQuarkusResourceUtils.java b/quarkus/extensions/kogito-quarkus-extension-common/kogito-quarkus-common-deployment/src/main/java/org/kie/kogito/quarkus/common/deployment/KogitoQuarkusResourceUtils.java index 3b10caeaa95..6a83445f27e 100644 --- a/quarkus/extensions/kogito-quarkus-extension-common/kogito-quarkus-common-deployment/src/main/java/org/kie/kogito/quarkus/common/deployment/KogitoQuarkusResourceUtils.java +++ b/quarkus/extensions/kogito-quarkus-extension-common/kogito-quarkus-common-deployment/src/main/java/org/kie/kogito/quarkus/common/deployment/KogitoQuarkusResourceUtils.java @@ -34,6 +34,7 @@ import org.drools.codegen.common.DroolsModelBuildContext; import org.drools.codegen.common.GeneratedFile; import org.drools.codegen.common.GeneratedFileType; +import org.drools.codegen.common.GeneratedFileWriter; import org.drools.quarkus.util.deployment.QuarkusAppPaths; import org.drools.util.PortablePath; import org.eclipse.microprofile.config.ConfigProvider; @@ -44,7 +45,6 @@ import org.kie.kogito.codegen.api.SourceFileCodegenBindNotifier; import org.kie.kogito.codegen.api.context.KogitoBuildContext; import org.kie.kogito.codegen.api.context.impl.QuarkusKogitoBuildContext; -import org.kie.kogito.codegen.core.utils.GeneratedFileWriter; import org.kie.memorycompiler.resources.ResourceReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -76,16 +76,11 @@ private KogitoQuarkusResourceUtils() { // since quarkus-maven-plugin is later phase of maven-resources-plugin, // need to manually late-provide the resource in the expected location for quarkus:dev phase --so not: writeGeneratedFile( f, resourcePath ) - private static final GeneratedFileWriter.Builder generatedFileWriterBuilder = - new GeneratedFileWriter.Builder( - "target/classes", - System.getProperty("kogito.codegen.sources.directory", "target/generated-sources/kogito/"), - System.getProperty("kogito.codegen.resources.directory", "target/generated-resources/kogito/"), - "target/generated-sources/kogito/"); - - public static KogitoBuildContext kogitoBuildContext(Path outputTarget, Iterable paths, IndexView index, Dependency appArtifact) { + private static final GeneratedFileWriter.Builder generatedFileWriterBuilder = GeneratedFileWriter.builder("kogito", "kogito.codegen.resources.directory", "kogito.codegen.sources.directory"); + + public static KogitoBuildContext kogitoBuildContext(Iterable paths, IndexView index, Dependency appArtifact) { // scan and parse paths - AppPaths appPaths = QuarkusAppPaths.from(outputTarget, paths, AppPaths.BuildTool.findBuildTool()); + AppPaths appPaths = QuarkusAppPaths.from(paths); ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); KogitoBuildContext context = QuarkusKogitoBuildContext.builder() .withApplicationPropertyProvider(new KogitoQuarkusApplicationPropertiesProvider()) @@ -111,9 +106,7 @@ public static KogitoBuildContext kogitoBuildContext(Path outputTarget, Iterable< private static Predicate> classSubTypeAvailabilityResolver(IndexView index) { return clazz -> index.getAllKnownImplementors(DotName.createSimple(clazz.getCanonicalName())) .stream() - .filter(c -> !Modifier.isInterface(c.flags()) && !Modifier.isAbstract(c.flags())) - .findFirst() - .isPresent(); + .anyMatch(c -> !Modifier.isInterface(c.flags()) && !Modifier.isAbstract(c.flags())); } /** diff --git a/quarkus/extensions/kogito-quarkus-extension-common/kogito-quarkus-common-deployment/src/test/java/org/kie/kogito/quarkus/common/deployment/KogitoAssetsProcessorTest.java b/quarkus/extensions/kogito-quarkus-extension-common/kogito-quarkus-common-deployment/src/test/java/org/kie/kogito/quarkus/common/deployment/KogitoAssetsProcessorTest.java index f641e28af93..fd7483bb677 100644 --- a/quarkus/extensions/kogito-quarkus-extension-common/kogito-quarkus-common-deployment/src/test/java/org/kie/kogito/quarkus/common/deployment/KogitoAssetsProcessorTest.java +++ b/quarkus/extensions/kogito-quarkus-extension-common/kogito-quarkus-common-deployment/src/test/java/org/kie/kogito/quarkus/common/deployment/KogitoAssetsProcessorTest.java @@ -22,7 +22,9 @@ import java.nio.file.Path; import java.util.Arrays; -import org.junit.jupiter.api.Test; +import org.drools.codegen.common.AppPaths; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import io.quarkus.bootstrap.model.PathsCollection; import io.quarkus.paths.PathCollection; @@ -32,34 +34,45 @@ class KogitoAssetsProcessorTest { - @Test - void getRootPathsWithoutClasses() { + @ParameterizedTest + @ValueSource(booleans = { true, false }) + void getRootPathsWithoutClasses(boolean withGradle) { String projectDirPath = "projectDir"; - String outputTargetPath = "outputTarget"; Path projectDir = Path.of(projectDirPath); - Path outputTarget = Path.of(outputTargetPath); + AppPaths.BuildTool bt; + if (withGradle) { + bt = AppPaths.BuildTool.GRADLE; + } else { + bt = AppPaths.BuildTool.MAVEN; + } + Path outputTarget = Path.of(bt.OUTPUT_DIRECTORY); Iterable paths = Arrays.asList(projectDir, outputTarget); - PathCollection resolvedPaths = PathsCollection.from(paths); - PathCollection retrieved = KogitoAssetsProcessor.getRootPaths(resolvedPaths); + PathCollection retrieved = KogitoAssetsProcessor.getRootPaths(resolvedPaths, bt); assertEquals(resolvedPaths.size(), retrieved.size()); paths.forEach(expected -> assertTrue(retrieved.contains(expected))); } - @Test - void getRootPathsWithClasses() { + @ParameterizedTest + @ValueSource(booleans = { true, false }) + void getRootPathsWithClasses(boolean withGradle) { String projectDirPath = "projectDir"; - String outputTargetPath = "outputTarget"; - String outputTargetPathClasses = String.format("%s/%s/classes", projectDirPath, outputTargetPath).replace("/", File.separator); + AppPaths.BuildTool bt; + if (withGradle) { + bt = AppPaths.BuildTool.GRADLE; + } else { + bt = AppPaths.BuildTool.MAVEN; + } + String outputTargetPathClasses = String.format("%s/%s", projectDirPath, bt.CLASSES_PATH.toString()).replace("./", "").replace("/", File.separator); Path projectDir = Path.of(projectDirPath); Path outputTarget = Path.of(outputTargetPathClasses); Iterable paths = Arrays.asList(projectDir, outputTarget); PathCollection resolvedPaths = PathsCollection.from(paths); - PathCollection retrieved = KogitoAssetsProcessor.getRootPaths(resolvedPaths); - assertEquals(resolvedPaths.size() + 1, retrieved.size()); - paths.forEach(expected -> assertTrue(retrieved.contains(expected))); - String expectedPath = String.format("%s/%s/generated-resources", projectDirPath, outputTargetPath).replace("/", File.separator); + PathCollection retrieved = KogitoAssetsProcessor.getRootPaths(resolvedPaths, bt); + int expectedSize = withGradle ? 1 : resolvedPaths.size(); + assertEquals(expectedSize, retrieved.size()); + String expectedPath = String.format("%s/%s", projectDirPath, bt.CLASSES_PATH).replace("/", File.separator); assertTrue(retrieved.contains(Path.of(expectedPath))); } }