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 1169137c893 CAMEL-20419: camel-jbang - Automatic download data-type 
transformer from known camel-catalog
1169137c893 is described below

commit 1169137c89379412703bc9c417cdba27df2497b0
Author: Claus Ibsen <[email protected]>
AuthorDate: Thu Feb 15 13:07:13 2024 +0100

    CAMEL-20419: camel-jbang - Automatic download data-type transformer from 
known camel-catalog
---
 .../catalog/CamelCatalogJSonSchemaResolver.java    | 11 ++-
 .../impl/engine/DefaultTransformerRegistry.java    | 10 ++-
 .../java/org/apache/camel/main/KameletMain.java    |  4 +
 .../DependencyDownloaderTransformerResolver.java   | 87 ++++++++++++++++++++++
 .../apache/camel/main/stub/StubTransformer.java    | 32 ++++++++
 5 files changed, 135 insertions(+), 9 deletions(-)

diff --git 
a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/CamelCatalogJSonSchemaResolver.java
 
b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/CamelCatalogJSonSchemaResolver.java
index ca2d2994081..6175c41d9f0 100644
--- 
a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/CamelCatalogJSonSchemaResolver.java
+++ 
b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/CamelCatalogJSonSchemaResolver.java
@@ -102,14 +102,13 @@ public class CamelCatalogJSonSchemaResolver implements 
JSonSchemaResolver {
         if ("method".equals(name)) {
             name = "bean";
         }
-
         final String file = 
camelCatalog.getRuntimeProvider().getLanguageJSonSchemaDirectory() + "/" + name 
+ EXTENSION;
-
         return loadResourceFromVersionManager(file);
     }
 
     @Override
     public String getTransformerJSonSchema(String name) {
+        name = sanitizeFileName(name);
         final String file = 
camelCatalog.getRuntimeProvider().getTransformerJSonSchemaDirectory() + "/" + 
name + EXTENSION;
         return loadResourceFromVersionManager(file);
     }
@@ -117,21 +116,18 @@ public class CamelCatalogJSonSchemaResolver implements 
JSonSchemaResolver {
     @Override
     public String getModelJSonSchema(String name) {
         final String file = MODEL_DIR + "/" + name + EXTENSION;
-
         return loadResourceFromVersionManager(file);
     }
 
     @Override
     public String getMainJsonSchema() {
         final String file = 
"org/apache/camel/catalog/main/camel-main-configuration-metadata.json";
-
         return loadResourceFromVersionManager(file);
     }
 
     @Override
     public String getOtherJSonSchema(String name) {
         final String file = 
camelCatalog.getRuntimeProvider().getOtherJSonSchemaDirectory() + "/" + name + 
EXTENSION;
-
         return loadResourceFromVersionManager(file);
     }
 
@@ -140,7 +136,6 @@ public class CamelCatalogJSonSchemaResolver implements 
JSonSchemaResolver {
             String packageName = className.substring(0, 
className.lastIndexOf('.'));
             packageName = packageName.replace('.', '/');
             final String path = packageName + "/" + fileName + EXTENSION;
-
             return loadResourceFromVersionManager(path);
         }
 
@@ -167,4 +162,8 @@ public class CamelCatalogJSonSchemaResolver implements 
JSonSchemaResolver {
 
         return null;
     }
+
+    private String sanitizeFileName(String fileName) {
+        return fileName.replaceAll("[^A-Za-z0-9-]", "-");
+    }
 }
diff --git 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultTransformerRegistry.java
 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultTransformerRegistry.java
index cf3f8942e03..1b6293b7562 100644
--- 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultTransformerRegistry.java
+++ 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultTransformerRegistry.java
@@ -142,11 +142,15 @@ public class DefaultTransformerRegistry extends 
AbstractDynamicRegistry<Transfor
 
         if (answer == null) {
             if (transformerResolver == null) {
-                TransformerResolver<?> contextResolver = 
context.getRegistry().findSingleByType(TransformerResolver.class);
-                if (contextResolver != null) {
-                    transformerResolver = 
(TransformerResolver<TransformerKey>) contextResolver;
+                TransformerResolver<?> resolver = 
context.getRegistry().findSingleByType(TransformerResolver.class);
+                if (resolver == null) {
+                    resolver = 
context.getCamelContextExtension().getContextPlugin(TransformerResolver.class);
+                }
+                if (resolver != null) {
+                    transformerResolver = 
(TransformerResolver<TransformerKey>) resolver;
                 } else {
                     transformerResolver = new DefaultTransformerResolver();
+                    LOG.debug("Creating DefaultTransformerResolver");
                 }
             }
 
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 28f8a6825f4..53f73531fa2 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
@@ -50,6 +50,7 @@ import 
org.apache.camel.main.download.DependencyDownloaderPropertyBindingListene
 import org.apache.camel.main.download.DependencyDownloaderResourceLoader;
 import org.apache.camel.main.download.DependencyDownloaderRoutesLoader;
 import org.apache.camel.main.download.DependencyDownloaderStrategy;
+import org.apache.camel.main.download.DependencyDownloaderTransformerResolver;
 import org.apache.camel.main.download.DependencyDownloaderUriFactoryResolver;
 import org.apache.camel.main.download.DownloadListener;
 import org.apache.camel.main.download.DownloadModelineParser;
@@ -83,6 +84,7 @@ import org.apache.camel.spi.PeriodTaskScheduler;
 import org.apache.camel.spi.Registry;
 import org.apache.camel.spi.ResourceLoader;
 import org.apache.camel.spi.RoutesLoader;
+import org.apache.camel.spi.TransformerResolver;
 import org.apache.camel.spi.UriFactoryResolver;
 import org.apache.camel.startup.jfr.FlightRecorderStartupStepRecorder;
 import org.apache.camel.support.DefaultContextReloadStrategy;
@@ -561,6 +563,8 @@ public class KameletMain extends MainCommandLineSupport {
                     new DependencyDownloaderDataFormatResolver(answer, 
stubPattern, silent));
             
answer.getCamelContextExtension().addContextPlugin(LanguageResolver.class,
                     new DependencyDownloaderLanguageResolver(answer, 
stubPattern, silent));
+            
answer.getCamelContextExtension().addContextPlugin(TransformerResolver.class,
+                    new DependencyDownloaderTransformerResolver(answer, 
stubPattern, silent));
             
answer.getCamelContextExtension().addContextPlugin(UriFactoryResolver.class,
                     new DependencyDownloaderUriFactoryResolver(answer));
             
answer.getCamelContextExtension().addContextPlugin(ResourceLoader.class,
diff --git 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderTransformerResolver.java
 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderTransformerResolver.java
new file mode 100644
index 00000000000..57c639aa41d
--- /dev/null
+++ 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderTransformerResolver.java
@@ -0,0 +1,87 @@
+/*
+ * 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.download;
+
+import java.util.List;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.catalog.CamelCatalog;
+import org.apache.camel.catalog.DefaultCamelCatalog;
+import org.apache.camel.impl.engine.DefaultTransformerResolver;
+import org.apache.camel.impl.engine.TransformerKey;
+import org.apache.camel.main.stub.StubTransformer;
+import org.apache.camel.main.util.SuggestSimilarHelper;
+import org.apache.camel.spi.Transformer;
+import org.apache.camel.tooling.model.TransformerModel;
+
+/**
+ * Auto downloaded needed JARs when resolving transformer.
+ */
+public final class DependencyDownloaderTransformerResolver extends 
DefaultTransformerResolver {
+
+    private final CamelCatalog catalog = new DefaultCamelCatalog();
+    private final DependencyDownloader downloader;
+    private final String stubPattern;
+    private final boolean silent;
+
+    public DependencyDownloaderTransformerResolver(CamelContext camelContext, 
String stubPattern, boolean silent) {
+        this.downloader = camelContext.hasService(DependencyDownloader.class);
+        this.stubPattern = stubPattern;
+        this.silent = silent;
+    }
+
+    @Override
+    public Transformer resolve(TransformerKey key, CamelContext context) {
+        String name = key.toString();
+        TransformerModel model = catalog.transformerModel(name);
+        if (model != null) {
+            downloadLoader(model.getGroupId(), model.getArtifactId(), 
model.getVersion());
+        }
+
+        Transformer answer;
+        boolean accept = accept(name);
+        if (accept) {
+            answer = super.resolve(key, context);
+        } else {
+            answer = new StubTransformer();
+        }
+
+        if (answer == null) {
+            List<String> suggestion = 
SuggestSimilarHelper.didYouMean(catalog.findTransformerNames(), name);
+            if (suggestion != null && !suggestion.isEmpty()) {
+                String s = String.join(", ", suggestion);
+                throw new IllegalArgumentException("Cannot find transformer 
with name: " + name + ". Did you mean: " + s);
+            }
+        }
+        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) {
+        if (stubPattern == null) {
+            return true;
+        }
+        // we are stubbing
+        return false;
+    }
+
+}
diff --git 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/stub/StubTransformer.java
 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/stub/StubTransformer.java
new file mode 100644
index 00000000000..65ed8ce9629
--- /dev/null
+++ 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/stub/StubTransformer.java
@@ -0,0 +1,32 @@
+/*
+ * 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.Message;
+import org.apache.camel.spi.DataType;
+import org.apache.camel.spi.Transformer;
+
+/**
+ * A transformer that does nothing
+ */
+public class StubTransformer extends Transformer {
+
+    @Override
+    public void transform(Message message, DataType from, DataType to) throws 
Exception {
+        // noop
+    }
+}

Reply via email to