You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2023/12/21 12:20:55 UTC

(camel) branch main updated: CAMEL-20273: camel-jbang - Stub dataformat and language during export (#12529)

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

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new a9057ab6d74 CAMEL-20273: camel-jbang - Stub dataformat and language during export (#12529)
a9057ab6d74 is described below

commit a9057ab6d74401fd471eb120cbabe953b5bb1f5b
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Thu Dec 21 13:20:49 2023 +0100

    CAMEL-20273: camel-jbang - Stub dataformat and language during export (#12529)
    
    * CAMEL-20273: camel-jbang - Stub dataformat and language during export
    
    * CAMEL-20273: camel-jbang - Stub dataformat and language during export
---
 .../camel/dsl/jbang/core/commands/Export.java      |  1 +
 .../dsl/jbang/core/commands/ExportBaseCommand.java |  5 +++
 .../java/org/apache/camel/main/KameletMain.java    |  8 ++---
 .../DependencyDownloaderComponentResolver.java     | 12 ++++---
 .../DependencyDownloaderDataFormatResolver.java    | 37 +++++++++++++++----
 .../DependencyDownloaderLanguageResolver.java      | 42 +++++++++++++++++-----
 .../org/apache/camel/main/stub/StubDataFormat.java | 41 +++++++++++++++++++++
 .../org/apache/camel/main/stub/StubLanguage.java   | 40 +++++++++++++++++++++
 8 files changed, 163 insertions(+), 23 deletions(-)

diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Export.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Export.java
index 777863106dd..419e9da8a93 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Export.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Export.java
@@ -102,6 +102,7 @@ public class Export extends ExportBaseCommand {
         cmd.mavenSettingsSecurity = this.mavenSettingsSecurity;
         cmd.exportDir = this.exportDir;
         cmd.fresh = this.fresh;
+        cmd.download = this.download;
         cmd.javaVersion = this.javaVersion;
         cmd.camelVersion = this.camelVersion;
         cmd.kameletsVersion = this.kameletsVersion;
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java
index d538fd4adce..9a5290cb6c2 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java
@@ -189,6 +189,10 @@ abstract class ExportBaseCommand extends CamelCommand {
     @CommandLine.Option(names = { "--fresh" }, description = "Make sure we use fresh (i.e. non-cached) resources")
     protected boolean fresh;
 
+    @CommandLine.Option(names = { "--download" }, defaultValue = "true",
+                        description = "Whether to allow automatic downloading JAR dependencies (over the internet)")
+    protected boolean download = true;
+
     @CommandLine.Option(names = { "--additional-properties" },
                         description = "Additional maven properties, ex. --additional-properties=prop1=foo,prop2=bar")
     protected String additionalProperties;
@@ -286,6 +290,7 @@ abstract class ExportBaseCommand extends CamelCommand {
         run.files = files;
         run.exclude = exclude;
         run.openapi = openapi;
+        run.download = download;
         return run.runSilent(ignoreLoadingError);
     }
 
diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java
index 10ccaae091f..ac0c743e291 100644
--- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java
+++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java
@@ -554,12 +554,12 @@ public class KameletMain extends MainCommandLineSupport {
 
             answer.getCamelContextExtension().addContextPlugin(ComponentResolver.class,
                     new DependencyDownloaderComponentResolver(answer, stubPattern, silent));
-            answer.getCamelContextExtension().addContextPlugin(UriFactoryResolver.class,
-                    new DependencyDownloaderUriFactoryResolver(answer));
             answer.getCamelContextExtension().addContextPlugin(DataFormatResolver.class,
-                    new DependencyDownloaderDataFormatResolver(answer));
+                    new DependencyDownloaderDataFormatResolver(answer, stubPattern, silent));
             answer.getCamelContextExtension().addContextPlugin(LanguageResolver.class,
-                    new DependencyDownloaderLanguageResolver(answer));
+                    new DependencyDownloaderLanguageResolver(answer, stubPattern, silent));
+            answer.getCamelContextExtension().addContextPlugin(UriFactoryResolver.class,
+                    new DependencyDownloaderUriFactoryResolver(answer));
             answer.getCamelContextExtension().addContextPlugin(ResourceLoader.class,
                     new DependencyDownloaderResourceLoader(answer));
 
diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderComponentResolver.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderComponentResolver.java
index 029b6ee9e8b..edd1bd469d5 100644
--- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderComponentResolver.java
+++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderComponentResolver.java
@@ -59,10 +59,8 @@ public final class DependencyDownloaderComponentResolver extends DefaultComponen
     @Override
     public Component resolveComponent(String name, CamelContext context) {
         ComponentModel model = catalog.componentModel(name);
-        if (model != null && !downloader.alreadyOnClasspath(model.getGroupId(), model.getArtifactId(),
-                model.getVersion())) {
-            downloader.downloadDependency(model.getGroupId(), model.getArtifactId(),
-                    model.getVersion());
+        if (model != null) {
+            downloadLoader(model.getGroupId(), model.getArtifactId(), model.getVersion());
         }
 
         Component answer;
@@ -107,6 +105,12 @@ public final class DependencyDownloaderComponentResolver extends DefaultComponen
         return answer;
     }
 
+    private void downloadLoader(String groupId, String artifactId, String version) {
+        if (!downloader.alreadyOnClasspath(groupId, artifactId, version)) {
+            downloader.downloadDependency(groupId, artifactId, version);
+        }
+    }
+
     private boolean accept(String name) {
         // kamelet component must not be stubbed
         if (stubPattern == null) {
diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderDataFormatResolver.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderDataFormatResolver.java
index 6e599f8e797..c8154e73e88 100644
--- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderDataFormatResolver.java
+++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderDataFormatResolver.java
@@ -22,6 +22,7 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.catalog.CamelCatalog;
 import org.apache.camel.catalog.DefaultCamelCatalog;
 import org.apache.camel.impl.engine.DefaultDataFormatResolver;
+import org.apache.camel.main.stub.StubDataFormat;
 import org.apache.camel.main.util.SuggestSimilarHelper;
 import org.apache.camel.spi.DataFormat;
 import org.apache.camel.tooling.model.DataFormatModel;
@@ -33,20 +34,30 @@ public final class DependencyDownloaderDataFormatResolver extends DefaultDataFor
 
     private final CamelCatalog catalog = new DefaultCamelCatalog();
     private final DependencyDownloader downloader;
+    private final String stubPattern;
+    private final boolean silent;
 
-    public DependencyDownloaderDataFormatResolver(CamelContext camelContext) {
+    public DependencyDownloaderDataFormatResolver(CamelContext camelContext, String stubPattern, boolean silent) {
         this.downloader = camelContext.hasService(DependencyDownloader.class);
+        this.stubPattern = stubPattern;
+        this.silent = silent;
     }
 
     @Override
     public DataFormat createDataFormat(String name, CamelContext context) {
         DataFormatModel model = catalog.dataFormatModel(name);
-        if (model != null && !downloader.alreadyOnClasspath(model.getGroupId(), model.getArtifactId(),
-                model.getVersion())) {
-            downloader.downloadDependency(model.getGroupId(), model.getArtifactId(),
-                    model.getVersion());
+        if (model != null) {
+            downloadLoader(model.getGroupId(), model.getArtifactId(), model.getVersion());
         }
-        DataFormat answer = super.createDataFormat(name, context);
+
+        DataFormat answer;
+        boolean accept = accept(name);
+        if (accept) {
+            answer = super.createDataFormat(name, context);
+        } else {
+            answer = new StubDataFormat();
+        }
+
         if (answer == null) {
             List<String> suggestion = SuggestSimilarHelper.didYouMean(catalog.findDataFormatNames(), name);
             if (suggestion != null && !suggestion.isEmpty()) {
@@ -57,4 +68,18 @@ public final class DependencyDownloaderDataFormatResolver extends DefaultDataFor
         return answer;
     }
 
+    private void downloadLoader(String groupId, String artifactId, String version) {
+        if (!downloader.alreadyOnClasspath(groupId, artifactId, version)) {
+            downloader.downloadDependency(groupId, artifactId, version);
+        }
+    }
+
+    private boolean accept(String name) {
+        // kamelet component must not be stubbed
+        if (stubPattern == null) {
+            return true;
+        }
+        return false;
+    }
+
 }
diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderLanguageResolver.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderLanguageResolver.java
index 19a081b93b0..1d5b8a7758a 100644
--- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderLanguageResolver.java
+++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderLanguageResolver.java
@@ -22,6 +22,7 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.catalog.CamelCatalog;
 import org.apache.camel.catalog.DefaultCamelCatalog;
 import org.apache.camel.impl.engine.DefaultLanguageResolver;
+import org.apache.camel.main.stub.StubLanguage;
 import org.apache.camel.main.util.SuggestSimilarHelper;
 import org.apache.camel.spi.Language;
 import org.apache.camel.tooling.model.LanguageModel;
@@ -31,24 +32,39 @@ import org.apache.camel.tooling.model.LanguageModel;
  */
 public final class DependencyDownloaderLanguageResolver extends DefaultLanguageResolver {
 
+    private static final String ACCEPTED_STUB_NAMES
+            = "constant,exchangeProperty,header,ref,simple";
+
     private final CamelCatalog catalog = new DefaultCamelCatalog();
     private final DependencyDownloader downloader;
+    private final String stubPattern;
+    private final boolean silent;
 
-    public DependencyDownloaderLanguageResolver(CamelContext camelContext) {
+    public DependencyDownloaderLanguageResolver(CamelContext camelContext, String stubPattern, boolean silent) {
         this.downloader = camelContext.hasService(DependencyDownloader.class);
+        this.stubPattern = stubPattern;
+        this.silent = silent;
     }
 
     @Override
     public Language resolveLanguage(String name, CamelContext context) {
         LanguageModel model = catalog.languageModel(name);
         if (model != null) {
-            downloadLoader(model.getArtifactId(), model.getVersion());
+            downloadLoader(model.getGroupId(), model.getArtifactId(), model.getVersion());
             if ("csimple".equals(name)) {
                 // need to include joor compiler also
-                downloadLoader("camel-csimple-joor", model.getVersion());
+                downloadLoader(model.getGroupId(), "camel-csimple-joor", model.getVersion());
             }
         }
-        Language answer = super.resolveLanguage(name, context);
+
+        Language answer;
+        boolean accept = accept(name);
+        if (accept) {
+            answer = super.resolveLanguage(name, context);
+        } else {
+            answer = new StubLanguage();
+        }
+
         if (answer == null) {
             List<String> suggestion = SuggestSimilarHelper.didYouMean(catalog.findDataFormatNames(), name);
             if (suggestion != null && !suggestion.isEmpty()) {
@@ -59,12 +75,20 @@ public final class DependencyDownloaderLanguageResolver extends DefaultLanguageR
         return answer;
     }
 
-    private void downloadLoader(String artifactId, String version) {
-        if (!downloader.alreadyOnClasspath("org.apache.camel", artifactId,
-                version)) {
-            downloader.downloadDependency("org.apache.camel", artifactId,
-                    version);
+    private void downloadLoader(String groupId, String artifactId, String version) {
+        if (!downloader.alreadyOnClasspath(groupId, artifactId, version)) {
+            downloader.downloadDependency(groupId, artifactId, version);
         }
     }
 
+    private boolean accept(String name) {
+        // kamelet component must not be stubbed
+        if (stubPattern == null) {
+            return true;
+        }
+
+        // we are stubbing but need to accept the following
+        return ACCEPTED_STUB_NAMES.contains(name);
+    }
+
 }
diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/stub/StubDataFormat.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/stub/StubDataFormat.java
new file mode 100644
index 00000000000..d4f60f57318
--- /dev/null
+++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/stub/StubDataFormat.java
@@ -0,0 +1,41 @@
+/*
+ * 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.apache.camel.main.stub;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.spi.DataFormat;
+import org.apache.camel.support.service.ServiceSupport;
+
+/**
+ * A data format that does nothing
+ */
+public class StubDataFormat extends ServiceSupport implements DataFormat {
+
+    @Override
+    public void marshal(Exchange exchange, Object graph, OutputStream stream) throws Exception {
+        // noop
+    }
+
+    @Override
+    public Object unmarshal(Exchange exchange, InputStream stream) throws Exception {
+        return null;
+    }
+
+}
diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/stub/StubLanguage.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/stub/StubLanguage.java
new file mode 100644
index 00000000000..3130bee188d
--- /dev/null
+++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/stub/StubLanguage.java
@@ -0,0 +1,40 @@
+/*
+ * 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.apache.camel.main.stub;
+
+import org.apache.camel.Expression;
+import org.apache.camel.Predicate;
+import org.apache.camel.builder.ExpressionBuilder;
+import org.apache.camel.builder.PredicateBuilder;
+import org.apache.camel.spi.Language;
+import org.apache.camel.support.service.ServiceSupport;
+
+/**
+ * A language that does nothing
+ */
+public class StubLanguage extends ServiceSupport implements Language {
+
+    @Override
+    public Predicate createPredicate(String expression) {
+        return PredicateBuilder.constant(true);
+    }
+
+    @Override
+    public Expression createExpression(String expression) {
+        return ExpressionBuilder.constantExpression(expression);
+    }
+}