diff --git a/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/validation/ValidationDecorator.java b/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/validation/ValidationDecorator.java index ee654455615..60798fbf572 100644 --- a/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/validation/ValidationDecorator.java +++ b/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/validation/ValidationDecorator.java @@ -19,9 +19,9 @@ public abstract class ValidationDecorator { - protected final Map exceptions; + protected final Map exceptions; - protected ValidationDecorator(Map exceptions) { + protected ValidationDecorator(Map exceptions) { this.exceptions = exceptions; } diff --git a/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/validation/ValidationLogDecorator.java b/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/validation/ValidationLogDecorator.java index dddd7fdd736..8f4812028af 100644 --- a/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/validation/ValidationLogDecorator.java +++ b/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/validation/ValidationLogDecorator.java @@ -24,7 +24,7 @@ public class ValidationLogDecorator extends ValidationDecorator { private static final Logger LOGGER = LoggerFactory.getLogger(ValidationLogDecorator.class); - public ValidationLogDecorator(Map exceptions) { + public ValidationLogDecorator(Map exceptions) { super(exceptions); } diff --git a/kogito-build/kogito-dependencies-bom/pom.xml b/kogito-build/kogito-dependencies-bom/pom.xml index 7257ecc1b3c..3ea218f8492 100644 --- a/kogito-build/kogito-dependencies-bom/pom.xml +++ b/kogito-build/kogito-dependencies-bom/pom.xml @@ -30,7 +30,7 @@ 1.0.0-preview.20220705 1.1.0 1.3.8 - 0.0.3 + 0.0.6 1.1.5 0.0.8 1.5.2 diff --git a/kogito-codegen-modules/kogito-codegen-processes/src/main/java/org/kie/kogito/codegen/process/ProcessCodegen.java b/kogito-codegen-modules/kogito-codegen-processes/src/main/java/org/kie/kogito/codegen/process/ProcessCodegen.java index 946edbac927..08961779f25 100644 --- a/kogito-codegen-modules/kogito-codegen-processes/src/main/java/org/kie/kogito/codegen/process/ProcessCodegen.java +++ b/kogito-codegen-modules/kogito-codegen-processes/src/main/java/org/kie/kogito/codegen/process/ProcessCodegen.java @@ -106,7 +106,7 @@ public class ProcessCodegen extends AbstractGenerator { public static ProcessCodegen ofCollectedResources(KogitoBuildContext context, Collection resources) { Map processSVGMap = new HashMap<>(); - Map processesErrors = new HashMap<>(); + Map processesErrors = new HashMap<>(); boolean useSvgAddon = context.getAddonsConfig().useProcessSVG(); final List> processes = resources.stream() .map(CollectedResource::resource) @@ -123,13 +123,13 @@ public static ProcessCodegen ofCollectedResources(KogitoBuildContext context, Co GeneratedInfo generatedInfo = parseWorkflowFile(resource, WorkflowFormat.fromFileName(resource.getSourcePath()), context); notifySourceFileCodegenBindListeners(context, resource, Collections.singletonList(generatedInfo.info())); return Stream.of(addResource(generatedInfo, resource)); - } else { - return Stream.empty(); } - } catch (ValidationException | ProcessParsingException e) { + } catch (ValidationException e) { processesErrors.put(resource.getSourcePath(), e); - return Stream.empty(); + } catch (ProcessParsingException e) { + processesErrors.put(resource.getSourcePath(), e.getCause()); } + return Stream.empty(); }) //Validate parsed processes .map(processInfo -> validate(processInfo, processesErrors)) @@ -154,7 +154,7 @@ private static void notifySourceFileCodegenBindListeners(KogitoBuildContext cont .ifPresent(notifier -> processes.forEach(p -> notifier.notify(new SourceFileCodegenBindEvent(p.getId(), resource.getSourcePath())))); } - private static void handleValidation(KogitoBuildContext context, Map processesErrors) { + private static void handleValidation(KogitoBuildContext context, Map processesErrors) { if (!processesErrors.isEmpty()) { ValidationLogDecorator decorator = new ValidationLogDecorator(processesErrors); decorator.decorate(); @@ -165,7 +165,7 @@ private static void handleValidation(KogitoBuildContext context, Map validate(GeneratedInfo processInfo, Map processesErrors) { + private static GeneratedInfo validate(GeneratedInfo processInfo, Map processesErrors) { Process process = processInfo.info(); try { ProcessValidatorRegistry.getInstance().getValidator(process, process.getResource()).validate(process); @@ -215,8 +215,8 @@ private static ProcessCodegen ofProcesses(KogitoBuildContext context, List parseWorkflowFile(Resource r, WorkflowFormat format, KogitoBuildContext context) { try (Reader reader = r.getReader()) { return ServerlessWorkflowParser.of(reader, format, context).getProcessInfo(); - } catch (IOException | RuntimeException e) { - throw new ProcessParsingException("Could not parse file " + r.getSourcePath(), e); + } catch (Exception e) { + throw new ProcessParsingException(e); } } @@ -227,7 +227,7 @@ protected static Collection parseProcessFile(Resource r) { Thread.currentThread().getContextClassLoader()); return xmlReader.read(reader); } catch (SAXException | IOException e) { - throw new ProcessParsingException("Could not parse file " + r.getSourcePath(), e); + throw new ProcessParsingException(e); } } diff --git a/kogito-codegen-modules/kogito-codegen-processes/src/main/java/org/kie/kogito/codegen/process/ProcessParsingException.java b/kogito-codegen-modules/kogito-codegen-processes/src/main/java/org/kie/kogito/codegen/process/ProcessParsingException.java index 9df885d01b6..33ac45f8d51 100644 --- a/kogito-codegen-modules/kogito-codegen-processes/src/main/java/org/kie/kogito/codegen/process/ProcessParsingException.java +++ b/kogito-codegen-modules/kogito-codegen-processes/src/main/java/org/kie/kogito/codegen/process/ProcessParsingException.java @@ -17,11 +17,9 @@ public class ProcessParsingException extends RuntimeException { + private static final long serialVersionUID = 1L; + public ProcessParsingException(Throwable cause) { super(cause); } - - public ProcessParsingException(String s, Throwable e) { - super(s, e); - } } diff --git a/quarkus/addons/messaging/deployment/src/main/java/org/kie/kogito/addon/cloudevents/quarkus/deployment/ChannelMappingStrategy.java b/quarkus/addons/messaging/deployment/src/main/java/org/kie/kogito/addon/cloudevents/quarkus/deployment/ChannelMappingStrategy.java index c4e41e87494..3f9bfcc657f 100644 --- a/quarkus/addons/messaging/deployment/src/main/java/org/kie/kogito/addon/cloudevents/quarkus/deployment/ChannelMappingStrategy.java +++ b/quarkus/addons/messaging/deployment/src/main/java/org/kie/kogito/addon/cloudevents/quarkus/deployment/ChannelMappingStrategy.java @@ -50,17 +50,16 @@ private ChannelMappingStrategy() { private static final String OVERFLOW_STRATEGY_PROP = "overflow-strategy"; private static final String BUFFER_SIZE_PROP = "buffer-size"; - private static Config config = ConfigProvider.getConfig(); - public static Collection getChannelMapping() { + Config config = ConfigProvider.getConfig(); Map> inTriggers = new HashMap<>(); Map> outTriggers = new HashMap<>(); for (String property : config.getPropertyNames()) { if (property.startsWith(INCOMING_TRIGGER)) { - addTrigger(INCOMING_TRIGGER, property, inTriggers); + addTrigger(config, INCOMING_TRIGGER, property, inTriggers); } else if (property.startsWith(OUTGOING_TRIGGER)) { - addTrigger(OUTGOING_TRIGGER, property, outTriggers); + addTrigger(config, OUTGOING_TRIGGER, property, outTriggers); } } @@ -69,15 +68,15 @@ public static Collection getChannelMapping() { final String defaultOutgoingChannel = config.getOptionalValue(OUTGOING_DEFAULT_CHANNEL, String.class).orElse(KogitoEventStreams.OUTGOING); for (String property : config.getPropertyNames()) { if (property.startsWith(INCOMING_PREFIX) && property.endsWith(".connector")) { - result.add(getChannelInfo(property, INCOMING_PREFIX, true, defaultIncomingChannel, inTriggers)); + result.add(getChannelInfo(config, property, INCOMING_PREFIX, true, defaultIncomingChannel, inTriggers)); } else if (property.startsWith(OUTGOING_PREFIX) && property.endsWith(".connector")) { - result.add(getChannelInfo(property, OUTGOING_PREFIX, false, defaultOutgoingChannel, outTriggers)); + result.add(getChannelInfo(config, property, OUTGOING_PREFIX, false, defaultOutgoingChannel, outTriggers)); } } return result; } - private static void addTrigger(String prefix, String property, Map> triggers) { + private static void addTrigger(Config config, String prefix, String property, Map> triggers) { String channelName = config.getValue(property, String.class); String triggerName = property.substring(prefix.length()); triggers.computeIfAbsent(channelName, ChannelMappingStrategy::initTriggers).add(triggerName); @@ -89,15 +88,15 @@ private static Collection initTriggers(String channelName) { return result; } - private static ChannelInfo getChannelInfo(String property, String prefix, boolean isInput, String defaultChannelName, Map> triggers) { + private static ChannelInfo getChannelInfo(Config config, String property, String prefix, boolean isInput, String defaultChannelName, Map> triggers) { String name = property.substring(prefix.length(), property.lastIndexOf('.')); return new ChannelInfo(name, triggers.getOrDefault(name, Collections.singleton(name)), getClassName(config.getOptionalValue(getPropertyName(prefix, name, "value." + (isInput ? "deserializer" : "serializer")), String.class)), isInput, name.equals(defaultChannelName), config.getOptionalValue((isInput ? UNMARSHALLLER_PREFIX : MARSHALLER_PREFIX) + name, String.class), - isInput ? Optional.empty() : onOverflowInfo(name)); + isInput ? Optional.empty() : onOverflowInfo(config, name)); } - private static Optional onOverflowInfo(String name) { + private static Optional onOverflowInfo(Config config, String name) { final String namePrefix = KOGITO_EMITTER_PREFIX + name + "."; Optional strategy = config.getOptionalValue(namePrefix + OVERFLOW_STRATEGY_PROP, String.class).map(Strategy::valueOf); Optional bufferSize = config.getOptionalValue(namePrefix + BUFFER_SIZE_PROP, Long.class); diff --git a/quarkus/extensions/kogito-quarkus-extension-common/kogito-quarkus-common-deployment/src/main/java/org/kie/kogito/quarkus/common/deployment/LiveReloadExecutionBuildItem.java b/quarkus/extensions/kogito-quarkus-extension-common/kogito-quarkus-common-deployment/src/main/java/org/kie/kogito/quarkus/common/deployment/LiveReloadExecutionBuildItem.java index 13b0e29d705..2acd5dba91f 100644 --- a/quarkus/extensions/kogito-quarkus-extension-common/kogito-quarkus-common-deployment/src/main/java/org/kie/kogito/quarkus/common/deployment/LiveReloadExecutionBuildItem.java +++ b/quarkus/extensions/kogito-quarkus-extension-common/kogito-quarkus-common-deployment/src/main/java/org/kie/kogito/quarkus/common/deployment/LiveReloadExecutionBuildItem.java @@ -15,6 +15,8 @@ */ package org.kie.kogito.quarkus.common.deployment; +import java.util.Optional; + import org.jboss.jandex.IndexView; import io.quarkus.builder.item.SimpleBuildItem; @@ -22,12 +24,22 @@ public final class LiveReloadExecutionBuildItem extends SimpleBuildItem { private final IndexView indexView; + private final ClassLoader classLoader; public LiveReloadExecutionBuildItem(IndexView indexView) { + this(indexView, null); + } + + public LiveReloadExecutionBuildItem(IndexView indexView, ClassLoader classLoader) { this.indexView = indexView; + this.classLoader = classLoader; } public IndexView getIndexView() { return indexView; } + + public Optional getClassLoader() { + return Optional.ofNullable(classLoader); + } } diff --git a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-deployment/src/main/java/org/kie/kogito/quarkus/serverless/workflow/WorkflowCodeGenUtils.java b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-deployment/src/main/java/org/kie/kogito/quarkus/serverless/workflow/WorkflowCodeGenUtils.java index 36f0955dbea..c3b9c11926a 100644 --- a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-deployment/src/main/java/org/kie/kogito/quarkus/serverless/workflow/WorkflowCodeGenUtils.java +++ b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-deployment/src/main/java/org/kie/kogito/quarkus/serverless/workflow/WorkflowCodeGenUtils.java @@ -17,7 +17,6 @@ import java.io.IOException; import java.io.Reader; -import java.io.UncheckedIOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.Map; @@ -28,7 +27,6 @@ import org.drools.codegen.common.GeneratedFile; import org.drools.codegen.common.GeneratedFileType; -import org.eclipse.microprofile.config.ConfigProvider; import org.kie.kogito.codegen.api.context.KogitoBuildContext; import org.kie.kogito.internal.SupportedExtensions; import org.kie.kogito.serverless.workflow.io.URIContentLoaderFactory; @@ -46,8 +44,6 @@ import io.serverlessworkflow.api.Workflow; import io.serverlessworkflow.api.functions.FunctionDefinition; -import static org.kie.kogito.serverless.workflow.utils.ServerlessWorkflowUtils.FAIL_ON_ERROR_PROPERTY; - public class WorkflowCodeGenUtils { private static final Logger logger = LoggerFactory.getLogger(WorkflowCodeGenUtils.class); @@ -96,20 +92,16 @@ private static WorkflowOperationResource getResource(Workflow workflow, Function } private static Optional getWorkflow(Path path) { - return workflowCache.computeIfAbsent(path, p -> SupportedExtensions.getSWFExtensions() - .stream() - .filter(e -> p.getFileName().toString().endsWith(e)) - .map(e -> { - try (Reader r = Files.newBufferedReader(p)) { - return Optional.of(ServerlessWorkflowUtils.getWorkflow(r, WorkflowFormat.fromFileName(p.getFileName()))); - } catch (IOException ex) { - if (ConfigProvider.getConfig().getOptionalValue(FAIL_ON_ERROR_PROPERTY, Boolean.class).orElse(true)) { - throw new UncheckedIOException(ex); - } else { - logger.error("Error reading workflow file {}", p, ex); - return Optional. empty(); - } - } - }).flatMap(Optional::stream).findFirst()); + if (SupportedExtensions.getSWFExtensions().stream().anyMatch(ext -> path.toString().endsWith(ext))) { + return workflowCache.computeIfAbsent(path, p -> { + try (Reader r = Files.newBufferedReader(p)) { + return Optional.of(ServerlessWorkflowUtils.getWorkflow(r, WorkflowFormat.fromFileName(p.getFileName()))); + } catch (IOException ex) { + logger.info("Error reading workflow file {}. Ignoring exception {}", p, ex); + return Optional. empty(); + } + }); + } + return Optional.empty(); } } diff --git a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-deployment/src/main/java/org/kie/kogito/quarkus/serverless/workflow/asyncapi/AsyncAPIProcessor.java b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-deployment/src/main/java/org/kie/kogito/quarkus/serverless/workflow/asyncapi/AsyncAPIProcessor.java index e59e9b3dcca..61b88efad31 100644 --- a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-deployment/src/main/java/org/kie/kogito/quarkus/serverless/workflow/asyncapi/AsyncAPIProcessor.java +++ b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-deployment/src/main/java/org/kie/kogito/quarkus/serverless/workflow/asyncapi/AsyncAPIProcessor.java @@ -15,21 +15,23 @@ */ package org.kie.kogito.quarkus.serverless.workflow.asyncapi; -import java.util.List; -import java.util.stream.Collectors; +import java.util.ServiceLoader; -import org.kie.kogito.quarkus.common.deployment.KogitoBuildContextAttributeBuildItem; +import org.kie.kogito.quarkus.common.deployment.KogitoAddonsPreGeneratedSourcesBuildItem; +import org.kie.kogito.quarkus.common.deployment.KogitoBuildContextBuildItem; +import org.kie.kogito.quarkus.common.deployment.LiveReloadExecutionBuildItem; import org.kie.kogito.serverless.workflow.parser.ParserContext; +import io.quarkiverse.asyncapi.config.AsyncAPISupplier; import io.quarkiverse.asyncapi.config.MapAsyncAPIRegistry; -import io.quarkiverse.asyncapi.generator.AsyncAPIBuildItem; +import io.quarkus.deployment.annotations.BuildProducer; import io.quarkus.deployment.annotations.BuildStep; public class AsyncAPIProcessor { @BuildStep - KogitoBuildContextAttributeBuildItem asyncAPIContext(List asyncAPIBuildItem) { - return new KogitoBuildContextAttributeBuildItem(ParserContext.ASYNC_CONVERTER_KEY, new AsyncAPIInfoConverter( - new MapAsyncAPIRegistry(asyncAPIBuildItem.stream().map(AsyncAPIBuildItem::getAsyncAPI).collect(Collectors.toList())))); + void asyncAPIContext(LiveReloadExecutionBuildItem reload, KogitoBuildContextBuildItem context, BuildProducer sources) throws ClassNotFoundException { + context.getKogitoBuildContext().addContextAttribute(ParserContext.ASYNC_CONVERTER_KEY, new AsyncAPIInfoConverter( + new MapAsyncAPIRegistry(ServiceLoader.load(AsyncAPISupplier.class, reload.getClassLoader().orElse(Thread.currentThread().getContextClassLoader()))))); } } diff --git a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-deployment/src/main/java/org/kie/kogito/quarkus/serverless/workflow/deployment/livereload/LiveReloadProcessor.java b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-deployment/src/main/java/org/kie/kogito/quarkus/serverless/workflow/deployment/livereload/LiveReloadProcessor.java index 398cb4257e8..4940e8a2468 100644 --- a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-deployment/src/main/java/org/kie/kogito/quarkus/serverless/workflow/deployment/livereload/LiveReloadProcessor.java +++ b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-deployment/src/main/java/org/kie/kogito/quarkus/serverless/workflow/deployment/livereload/LiveReloadProcessor.java @@ -24,6 +24,7 @@ import java.util.HashSet; import java.util.List; import java.util.ServiceLoader; +import java.util.stream.Collectors; import java.util.stream.Stream; import javax.inject.Inject; @@ -40,8 +41,12 @@ import org.kie.kogito.quarkus.common.deployment.KogitoBuildContextBuildItem; import org.kie.kogito.quarkus.common.deployment.KogitoQuarkusResourceUtils; import org.kie.kogito.quarkus.common.deployment.LiveReloadExecutionBuildItem; +import org.kie.kogito.quarkus.serverless.workflow.config.LiveReloadConfigBuilder; import io.quarkus.arc.deployment.GeneratedBeanBuildItem; +import io.quarkus.bootstrap.classloading.MemoryClassPathElement; +import io.quarkus.bootstrap.classloading.PathTreeClassPathElement; +import io.quarkus.bootstrap.classloading.QuarkusClassLoader; import io.quarkus.bootstrap.model.ApplicationModel; import io.quarkus.bootstrap.prebuild.CodeGenException; import io.quarkus.deployment.CodeGenContext; @@ -49,10 +54,15 @@ import io.quarkus.deployment.annotations.BuildProducer; import io.quarkus.deployment.annotations.BuildStep; import io.quarkus.deployment.builditem.CombinedIndexBuildItem; +import io.quarkus.deployment.builditem.GeneratedResourceBuildItem; import io.quarkus.deployment.builditem.LiveReloadBuildItem; +import io.quarkus.deployment.builditem.RunTimeConfigBuilderBuildItem; import io.quarkus.deployment.index.IndexingUtil; import io.quarkus.deployment.pkg.builditem.CurateOutcomeBuildItem; import io.quarkus.deployment.pkg.builditem.OutputTargetBuildItem; +import io.quarkus.paths.PathTree; +import io.quarkus.runtime.configuration.ConfigUtils; +import io.quarkus.runtime.configuration.QuarkusConfigFactory; /** * This class adds live reload support for {@link io.quarkus.deployment.CodeGenProvider} objects. @@ -71,6 +81,8 @@ public class LiveReloadProcessor { private final KogitoBuildContext kogitoBuildContext; + private final QuarkusClassLoader.Builder classLoader; + @Inject public LiveReloadProcessor( CombinedIndexBuildItem combinedIndexBuildItem, @@ -84,10 +96,12 @@ public LiveReloadProcessor( computingIndex = combinedIndexBuildItem.getComputingIndex(); index = combinedIndexBuildItem.getIndex(); kogitoBuildContext = contextBuildItem.getKogitoBuildContext(); + classLoader = QuarkusClassLoader.builder("liveReload", kogitoBuildContext.getClassLoader(), false); } @BuildStep(onlyIf = IsDevelopment.class) - public LiveReloadExecutionBuildItem liveReload(BuildProducer sourcesProducer) { + public LiveReloadExecutionBuildItem liveReload(BuildProducer sourcesProducer, BuildProducer genResBI, + BuildProducer configBuilder) { Collection generatedFiles = new ArrayList<>(); List indexViews = new ArrayList<>(); if (liveReloadBuildItem.isLiveReload()) { @@ -103,10 +117,13 @@ public LiveReloadExecutionBuildItem liveReload(BuildProducer generatedFiles = new ArrayList<>(generateSources(codeGenProvider)); - return !generatedFiles.isEmpty() ? new CodeGenerationResult(generatedFiles, indexCompiledSources(compileGeneratedSources(generatedFiles))) + Collection generatedBeans = compileGeneratedSources(generatedFiles); + if (!generatedBeans.isEmpty()) { + classLoader.addElement(new MemoryClassPathElement( + generatedBeans.stream().collect(Collectors.toMap(x -> x.getName().replace('.', '/').concat(".class"), GeneratedBeanBuildItem::getData)), true)); + } + return !generatedFiles.isEmpty() ? new CodeGenerationResult(generatedFiles, indexCompiledSources(generatedBeans)) : new CodeGenerationResult(List.of(), computingIndex); } catch (CodeGenException e) { throw new IllegalStateException(e); @@ -159,23 +181,28 @@ private Collection generateSources(LiveReloadableCodeGenProvider CodeGenContext codeGenContext = new CodeGenContext(applicationModel, outDir, workDir, inputDir, false, config, false); if (codeGenProvider.shouldRun(inputDir, config) && codeGenProvider.trigger(codeGenContext)) { try (Stream sources = Files.walk(outDir)) { - sources.filter(Files::isRegularFile) - .filter(path -> path.toString().endsWith(".java")) - .map(path -> { - try { - return new GeneratedFile(GeneratedFileType.SOURCE, outDir.relativize(path), Files.readAllBytes(path)); - } catch (IOException e) { - throw new UncheckedIOException(e); - } - }) - .forEach(generatedFiles::add); + sources.filter(Files::isRegularFile).forEach(p -> processSource(p, outDir, generatedFiles)); + } + Path classPath = outDir.getParent().getParent().resolve("classes"); + Path serviceLoaderPath = classPath.resolve("META-INF/services"); + if (Files.isDirectory(classPath) && Files.isDirectory(serviceLoaderPath)) { + classLoader.addElement(new PathTreeClassPathElement(PathTree.ofDirectoryOrFile(classPath), true)); } } } - return generatedFiles; } + private void processSource(Path path, Path outDir, Collection generatedFiles) { + if (path.toString().endsWith(".java")) { + try { + generatedFiles.add(new GeneratedFile(GeneratedFileType.SOURCE, outDir.relativize(path), Files.readAllBytes(path))); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } + } + private void skipNextLiveReload() { liveReloadBuildItem.setContextObject(SkipLiveReload.class, SkipLiveReload.TRUE); } diff --git a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-extension-live-reload-test/pom.xml b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-extension-live-reload-test/pom.xml index 8c0fe4812e9..ef8ab961040 100644 --- a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-extension-live-reload-test/pom.xml +++ b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-extension-live-reload-test/pom.xml @@ -43,27 +43,16 @@ io.grpc grpc-netty-shaded - ${version.io.grpc} runtime io.grpc grpc-protobuf - ${version.io.grpc} io.grpc grpc-stub - ${version.io.grpc} - - - org.apache.tomcat - annotations-api - 6.0.53 - provided - - io.quarkus quarkus-junit5 diff --git a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-extension-live-reload-test/src/test/java/org/kie/kogito/quarkus/serverless/workflow/deployment/livereload/LiveReloadProcessorTest.java b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-extension-live-reload-test/src/test/java/org/kie/kogito/quarkus/serverless/workflow/deployment/livereload/LiveReloadProcessorTest.java index 7d8a4793aa3..a9909433baf 100644 --- a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-extension-live-reload-test/src/test/java/org/kie/kogito/quarkus/serverless/workflow/deployment/livereload/LiveReloadProcessorTest.java +++ b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-extension-live-reload-test/src/test/java/org/kie/kogito/quarkus/serverless/workflow/deployment/livereload/LiveReloadProcessorTest.java @@ -28,7 +28,6 @@ import org.jboss.shrinkwrap.api.asset.StringAsset; import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; import org.kie.kogito.test.utils.SocketUtils; @@ -163,7 +162,6 @@ void testGrpc() throws InterruptedException, IOException { } @Test - @Disabled("Disabled until https://issues.redhat.com/browse/KOGITO-9614 is resolved") void testAsyncApi() throws IOException { given() .contentType(ContentType.JSON) diff --git a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow/src/main/java/org/kie/kogito/quarkus/serverless/workflow/config/LiveReloadConfigBuilder.java b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow/src/main/java/org/kie/kogito/quarkus/serverless/workflow/config/LiveReloadConfigBuilder.java new file mode 100644 index 00000000000..f7a558d30ac --- /dev/null +++ b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow/src/main/java/org/kie/kogito/quarkus/serverless/workflow/config/LiveReloadConfigBuilder.java @@ -0,0 +1,27 @@ +/* + * Copyright 2023 Red Hat, Inc. and/or its affiliates. + * + * Licensed 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.quarkus.serverless.workflow.config; + +import io.quarkus.runtime.configuration.ConfigBuilder; +import io.smallrye.config.SmallRyeConfigBuilder; + +public class LiveReloadConfigBuilder implements ConfigBuilder { + + @Override + public SmallRyeConfigBuilder configBuilder(SmallRyeConfigBuilder builder) { + return builder.addDiscoveredSources(); + } +}