You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by gi...@apache.org on 2023/10/07 03:24:14 UTC

[camel-quarkus] 46/46: Rework Kemelet build time resource processing for #5230

This is an automated email from the ASF dual-hosted git repository.

github-bot pushed a commit to branch camel-main
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git

commit 7ced8877b94b57b5e428a951a7fb347368935792
Author: James Netherton <ja...@gmail.com>
AuthorDate: Fri Oct 6 08:07:51 2023 +0100

    Rework Kemelet build time resource processing for #5230
---
 .../kamelet/deployment/KameletProcessor.java       | 24 +++++++++-----------
 ...pathResource.java => EmptyKameletResource.java} | 26 +++++-----------------
 .../quarkus/component/kamelet/KameletRecorder.java | 24 ++++++++++++++++++++
 3 files changed, 39 insertions(+), 35 deletions(-)

diff --git a/extensions/kamelet/deployment/src/main/java/org/apache/camel/quarkus/component/kamelet/deployment/KameletProcessor.java b/extensions/kamelet/deployment/src/main/java/org/apache/camel/quarkus/component/kamelet/deployment/KameletProcessor.java
index 142a4461ae..1b9ea1f1c1 100644
--- a/extensions/kamelet/deployment/src/main/java/org/apache/camel/quarkus/component/kamelet/deployment/KameletProcessor.java
+++ b/extensions/kamelet/deployment/src/main/java/org/apache/camel/quarkus/component/kamelet/deployment/KameletProcessor.java
@@ -16,7 +16,6 @@
  */
 package org.apache.camel.quarkus.component.kamelet.deployment;
 
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -36,7 +35,7 @@ import org.apache.camel.RoutesBuilder;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.impl.DefaultCamelContext;
 import org.apache.camel.model.RouteTemplateDefinition;
-import org.apache.camel.quarkus.component.kamelet.KameletClasspathResource;
+import org.apache.camel.quarkus.component.kamelet.EmptyKameletResource;
 import org.apache.camel.quarkus.component.kamelet.KameletConfiguration;
 import org.apache.camel.quarkus.component.kamelet.KameletRecorder;
 import org.apache.camel.quarkus.core.deployment.spi.CamelContextCustomizerBuildItem;
@@ -121,19 +120,16 @@ class KameletProcessor {
             }
         }
 
-        // Use Quarkus recorder serialization friendly KameletClasspathResource instead of the default Resource
+        // TODO: Improve / remove this https://github.com/apache/camel-quarkus/issues/5230
+        // Use Quarkus recorder serialization friendly EmptyKameletResource instead of the default Resource.
+        // The resource will get reevaluated at runtime and replaced if it exists
         definitions.forEach(definition -> {
-            try {
-                Resource originalResource = definition.getResource();
-                KameletClasspathResource kameletResource = new KameletClasspathResource();
-                kameletResource.setScheme(originalResource.getScheme());
-                kameletResource.setLocation(originalResource.getLocation());
-                kameletResource.setExists(originalResource.exists());
-                kameletResource.setData(originalResource.getInputStream().readAllBytes());
-                definition.setResource(kameletResource);
-            } catch (IOException e) {
-                throw new RuntimeException(e);
-            }
+            Resource originalResource = definition.getResource();
+            EmptyKameletResource resource = new EmptyKameletResource();
+            resource.setScheme(originalResource.getScheme());
+            resource.setLocation(originalResource.getLocation());
+            resource.setExists(originalResource.exists());
+            definition.setResource(resource);
         });
 
         return new CamelContextCustomizerBuildItem(
diff --git a/extensions/kamelet/runtime/src/main/java/org/apache/camel/quarkus/component/kamelet/KameletClasspathResource.java b/extensions/kamelet/runtime/src/main/java/org/apache/camel/quarkus/component/kamelet/EmptyKameletResource.java
similarity index 77%
rename from extensions/kamelet/runtime/src/main/java/org/apache/camel/quarkus/component/kamelet/KameletClasspathResource.java
rename to extensions/kamelet/runtime/src/main/java/org/apache/camel/quarkus/component/kamelet/EmptyKameletResource.java
index 357e86c0e1..aa17e84ead 100644
--- a/extensions/kamelet/runtime/src/main/java/org/apache/camel/quarkus/component/kamelet/KameletClasspathResource.java
+++ b/extensions/kamelet/runtime/src/main/java/org/apache/camel/quarkus/component/kamelet/EmptyKameletResource.java
@@ -16,7 +16,6 @@
  */
 package org.apache.camel.quarkus.component.kamelet;
 
-import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Objects;
@@ -24,14 +23,14 @@ import java.util.Objects;
 import org.apache.camel.spi.Resource;
 
 /**
- * Mutable & Quarkus recorder serialization friendly implementation for Kamelet classpath resources
+ * TODO: Improve / remove this https://github.com/apache/camel-quarkus/issues/5230
+ * Quarkus build time & serialization friendly implementation for Kamelet resources. This gets replaced at runtime
+ * when the resource is reevaluated.
  */
-public class KameletClasspathResource implements Resource {
+public final class EmptyKameletResource implements Resource {
     private String scheme;
     private String location;
     private boolean exists;
-    private byte[] data;
-    private InputStream inputStream;
 
     @Override
     public String getScheme() {
@@ -60,24 +59,9 @@ public class KameletClasspathResource implements Resource {
         this.exists = exists;
     }
 
-    public byte[] getData() {
-        return this.data;
-    }
-
-    public void setData(byte[] data) {
-        this.inputStream = null;
-        this.data = data;
-    }
-
     @Override
     public InputStream getInputStream() throws IOException {
-        if (this.data == null) {
-            throw new IOException("No resource content was defined");
-        }
-        if (this.inputStream == null) {
-            this.inputStream = new ByteArrayInputStream(this.data);
-        }
-        return inputStream;
+        return InputStream.nullInputStream();
     }
 
     @Override
diff --git a/extensions/kamelet/runtime/src/main/java/org/apache/camel/quarkus/component/kamelet/KameletRecorder.java b/extensions/kamelet/runtime/src/main/java/org/apache/camel/quarkus/component/kamelet/KameletRecorder.java
index eddc8a87a5..98499932ed 100644
--- a/extensions/kamelet/runtime/src/main/java/org/apache/camel/quarkus/component/kamelet/KameletRecorder.java
+++ b/extensions/kamelet/runtime/src/main/java/org/apache/camel/quarkus/component/kamelet/KameletRecorder.java
@@ -25,9 +25,16 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.model.Model;
 import org.apache.camel.model.RouteTemplateDefinition;
 import org.apache.camel.spi.CamelContextCustomizer;
+import org.apache.camel.spi.Resource;
+import org.apache.camel.spi.ResourceLoader;
+import org.apache.camel.support.PluginHelper;
+import org.apache.camel.util.ObjectHelper;
+import org.jboss.logging.Logger;
 
 @Recorder
 public class KameletRecorder {
+    private static final Logger LOG = Logger.getLogger(KameletRecorder.class);
+
     public RuntimeValue<CamelContextCustomizer> createTemplateLoaderCustomizer(
             @RelaxedValidation List<RouteTemplateDefinition> definitions) {
 
@@ -35,6 +42,23 @@ public class KameletRecorder {
             @Override
             public void configure(CamelContext context) {
                 try {
+                    // TODO: Improve / remove this: https://github.com/apache/camel-quarkus/issues/5230
+                    ResourceLoader resourceLoader = PluginHelper.getResourceLoader(context);
+                    for (RouteTemplateDefinition definition : definitions) {
+                        Resource originalResource = definition.getResource();
+                        String location = originalResource.getLocation();
+                        if (originalResource instanceof EmptyKameletResource && !ObjectHelper.isNotEmpty(location)) {
+                            Resource resource = resourceLoader.resolveResource(location);
+                            if (resource != null) {
+                                definition.setResource(resource);
+                            } else {
+                                if (LOG.isDebugEnabled()) {
+                                    LOG.debugf("Failed resolving Kamelet resource %s. Resource dumping will be disabled.",
+                                            definition.getId());
+                                }
+                            }
+                        }
+                    }
                     context.getCamelContextExtension().getContextPlugin(Model.class).addRouteTemplateDefinitions(definitions);
                 } catch (Exception e) {
                     throw new RuntimeException(e);