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

commit f5485981e5ecdcb73099cad3b739a70180f62bca
Author: Claus Ibsen <[email protected]>
AuthorDate: Fri Jul 1 07:38:46 2022 +0200

    CAMEL-18251: camel-jbang - Using microprofile-metrics should setup registry 
if none found
---
 .../java/org/apache/camel/main/KameletMain.java    |   6 +-
 .../download/AutoConfigureDownloadListener.java    | 108 +++++++++++++++++++++
 .../camel/main/download/DependencyDownloader.java  |   6 +-
 .../camel/main/download/DownloadListener.java      |   7 ++
 .../main/download/MavenDependencyDownloader.java   |  40 +++++---
 .../camel-microprofile-metrics.java}               |  30 +++---
 .../camel-microprofile-metrics.properties          |  18 ++++
 7 files changed, 179 insertions(+), 36 deletions(-)

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 48e8e0f0e99..17f8d4552cd 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
@@ -26,6 +26,7 @@ import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.ProducerTemplate;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.main.download.AutoConfigureDownloadListener;
 import org.apache.camel.main.download.CommandLineDependencyDownloader;
 import org.apache.camel.main.download.DependencyDownloaderClassLoader;
 import org.apache.camel.main.download.DependencyDownloaderClassResolver;
@@ -270,7 +271,10 @@ public class KameletMain extends MainCommandLineSupport {
             downloader.setCamelContext(answer);
             downloader.setRepos(repos);
             downloader.setFresh(fresh);
-            downloader.setDownloadListener(downloadListener);
+            if (downloadListener != null) {
+                downloader.addDownloadListener(downloadListener);
+            }
+            downloader.addDownloadListener(new 
AutoConfigureDownloadListener());
 
             // register as extension
             try {
diff --git 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/AutoConfigureDownloadListener.java
 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/AutoConfigureDownloadListener.java
new file mode 100644
index 00000000000..e4fb8fa253c
--- /dev/null
+++ 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/AutoConfigureDownloadListener.java
@@ -0,0 +1,108 @@
+/*
+ * 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.io.InputStream;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.CamelContextAware;
+import org.apache.camel.Expression;
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.spi.Language;
+import org.apache.camel.support.DefaultExchange;
+import org.apache.camel.util.IOHelper;
+import org.apache.camel.util.ObjectHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class AutoConfigureDownloadListener implements DownloadListener, 
CamelContextAware {
+
+    private static final Logger LOG = 
LoggerFactory.getLogger(AutoConfigureDownloadListener.class);
+
+    private CamelContext camelContext;
+
+    @Override
+    public CamelContext getCamelContext() {
+        return camelContext;
+    }
+
+    @Override
+    public void setCamelContext(CamelContext camelContext) {
+        this.camelContext = camelContext;
+    }
+
+    @Override
+    public void onDownloadDependency(String groupId, String artifactId, String 
version) {
+        // noop
+    }
+
+    @Override
+    public void onDownloadedDependency(String groupId, String artifactId, 
String version) {
+        autoConfigureDependencies(groupId, artifactId, version);
+        autoConfigure(groupId, artifactId, version);
+    }
+
+    @Override
+    public void onAlreadyDownloadedDependency(String groupId, String 
artifactId, String version) {
+        // noop
+    }
+
+    protected void autoConfigureDependencies(String groupId, String 
artifactId, String version) {
+        // the auto-configuration may require additional dependencies being 
downloaded first
+        InputStream is = getClass().getResourceAsStream("/auto-configure/" + 
artifactId + ".properties");
+        if (is != null) {
+            try {
+                String script = IOHelper.loadText(is);
+                for (String line : script.split("\n")) {
+                    line = line.trim();
+                    if (line.startsWith("dependency=")) {
+                        MavenGav gav = MavenGav.parseGav(line.substring(11));
+                        DependencyDownloader downloader = 
getCamelContext().hasService(DependencyDownloader.class);
+                        downloader.downloadDependency(gav.getGroupId(), 
gav.getArtifactId(), gav.getVersion());
+                    }
+                }
+            } catch (Exception e) {
+                throw RuntimeCamelException.wrapRuntimeException(e);
+            } finally {
+                IOHelper.close(is);
+            }
+        }
+    }
+
+    protected void autoConfigure(String groupId, String artifactId, String 
version) {
+        // is there any special auto configuration scripts?
+        InputStream is = getClass().getResourceAsStream("/auto-configure/" + 
artifactId + ".java");
+        if (is != null) {
+            try {
+                // execute script via java-joor
+                String script = IOHelper.loadText(is);
+                Language lan = camelContext.resolveLanguage("joor");
+                Expression exp = lan.createExpression(script);
+                exp.init(camelContext);
+                Object out = exp.evaluate(new DefaultExchange(camelContext), 
Object.class);
+                if (ObjectHelper.isNotEmpty(out)) {
+                    LOG.info("{}", out);
+                }
+            } catch (Exception e) {
+                throw RuntimeCamelException.wrapRuntimeException(e);
+            } finally {
+                IOHelper.close(is);
+            }
+        }
+    }
+
+}
diff --git 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloader.java
 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloader.java
index 153ac0d3050..3b898037490 100644
--- 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloader.java
+++ 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloader.java
@@ -24,12 +24,10 @@ import org.apache.camel.StaticService;
  */
 public interface DependencyDownloader extends CamelContextAware, StaticService 
{
 
-    DownloadListener getDownloadListener();
-
     /**
-     * Sets a listener to capture download activity
+     * Adds a listener to capture download activity
      */
-    void setDownloadListener(DownloadListener downloadListener);
+    void addDownloadListener(DownloadListener downloadListener);
 
     String getRepos();
 
diff --git 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DownloadListener.java
 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DownloadListener.java
index 3461965329d..28f62644a7a 100644
--- 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DownloadListener.java
+++ 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DownloadListener.java
@@ -26,6 +26,13 @@ public interface DownloadListener {
      */
     void onDownloadDependency(String groupId, String artifactId, String 
version);
 
+    /**
+     * After the dependency has been downloaded
+     */
+    default void onDownloadedDependency(String groupId, String artifactId, 
String version) {
+        // noop
+    }
+
     /**
      * Uses an existing already downloaded dependency
      */
diff --git 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/MavenDependencyDownloader.java
 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/MavenDependencyDownloader.java
index cb1c5261743..00d8957e27c 100644
--- 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/MavenDependencyDownloader.java
+++ 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/MavenDependencyDownloader.java
@@ -23,10 +23,13 @@ import java.net.URL;
 import java.net.URLClassLoader;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.LinkedHashSet;
 import java.util.List;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.CamelContextAware;
 import org.apache.camel.support.service.ServiceHelper;
 import org.apache.camel.support.service.ServiceSupport;
 import org.slf4j.Logger;
@@ -43,7 +46,7 @@ public class MavenDependencyDownloader extends ServiceSupport 
implements Depende
     private String[] bootClasspath;
     private DownloadThreadPool threadPool;
     private CamelContext camelContext;
-    private DownloadListener downloadListener;
+    private final Set<DownloadListener> downloadListeners = new 
LinkedHashSet<>();
     private String repos;
     private boolean fresh;
 
@@ -58,13 +61,9 @@ public class MavenDependencyDownloader extends 
ServiceSupport implements Depende
     }
 
     @Override
-    public DownloadListener getDownloadListener() {
-        return downloadListener;
-    }
-
-    @Override
-    public void setDownloadListener(DownloadListener downloadListener) {
-        this.downloadListener = downloadListener;
+    public void addDownloadListener(DownloadListener downloadListener) {
+        CamelContextAware.trySetCamelContext(downloadListener, 
getCamelContext());
+        downloadListeners.add(downloadListener);
     }
 
     @Override
@@ -95,8 +94,8 @@ public class MavenDependencyDownloader extends ServiceSupport 
implements Depende
     @Override
     public void downloadDependency(String groupId, String artifactId, String 
version, boolean transitively) {
         // trigger listener
-        if (downloadListener != null) {
-            downloadListener.onDownloadDependency(groupId, artifactId, 
version);
+        for (DownloadListener listener : downloadListeners) {
+            listener.onDownloadDependency(groupId, artifactId, version);
         }
 
         // when running jbang directly then the CP has some existing camel 
components
@@ -142,6 +141,7 @@ public class MavenDependencyDownloader extends 
ServiceSupport implements Depende
 
             DependencyDownloaderClassLoader classLoader
                     = (DependencyDownloaderClassLoader) 
camelContext.getApplicationContextClassLoader();
+
             for (MavenArtifact a : artifacts) {
                 File file = a.getFile();
                 // only add to classpath if not already present (do not 
trigger listener)
@@ -151,6 +151,14 @@ public class MavenDependencyDownloader extends 
ServiceSupport implements Depende
                     LOG.trace("Added classpath: {}", a.getGav());
                 }
             }
+
+            if (!artifacts.isEmpty()) {
+                // trigger listener after downloaded and added to classloader
+                for (DownloadListener listener : downloadListeners) {
+                    listener.onDownloadedDependency(groupId, artifactId, 
version);
+                }
+            }
+
         }, gav);
     }
 
@@ -201,8 +209,10 @@ public class MavenDependencyDownloader extends 
ServiceSupport implements Depende
         if (bootClasspath != null) {
             for (String s : bootClasspath) {
                 if (s.contains(target)) {
-                    if (listener && downloadListener != null) {
-                        downloadListener.onDownloadDependency(groupId, 
artifactId, version);
+                    if (listener) {
+                        for (DownloadListener dl : downloadListeners) {
+                            dl.onDownloadDependency(groupId, artifactId, 
version);
+                        }
                     }
                     // already on classpath
                     return true;
@@ -218,8 +228,10 @@ public class MavenDependencyDownloader extends 
ServiceSupport implements Depende
                     String s = u.toString();
                     if (s.contains(target)) {
                         // trigger listener
-                        if (listener && downloadListener != null) {
-                            downloadListener.onDownloadDependency(groupId, 
artifactId, version);
+                        if (listener) {
+                            for (DownloadListener dl : downloadListeners) {
+                                dl.onDownloadDependency(groupId, artifactId, 
version);
+                            }
                         }
                         // already on classpath
                         return true;
diff --git 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DownloadListener.java
 
b/dsl/camel-kamelet-main/src/main/resources/auto-configure/camel-microprofile-metrics.java
similarity index 52%
copy from 
dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DownloadListener.java
copy to 
dsl/camel-kamelet-main/src/main/resources/auto-configure/camel-microprofile-metrics.java
index 3461965329d..fffeb52edd3 100644
--- 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DownloadListener.java
+++ 
b/dsl/camel-kamelet-main/src/main/resources/auto-configure/camel-microprofile-metrics.java
@@ -14,21 +14,17 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.main.download;
-
-/**
- * Listener for downloading a dependency (can be downloaded from a local cache)
- */
-public interface DownloadListener {
-
-    /**
-     * Downloads a new dependency
-     */
-    void onDownloadDependency(String groupId, String artifactId, String 
version);
-
-    /**
-     * Uses an existing already downloaded dependency
-     */
-    void onAlreadyDownloadedDependency(String groupId, String artifactId, 
String version);
-
+var answer = "";
+var registry = context.getRegistry();
+var mr = registry.lookupByNameAndType("metricRegistry", 
org.eclipse.microprofile.metrics.MetricRegistry.class);
+if (mr == null) {
+    // automatic create metrics registry
+    answer = "Auto-configuring camel-microprofile-metrics: Creating default 
MetricRegistry";
+    mr = new io.smallrye.metrics.MetricRegistries().getApplicationRegistry();
+    registry.bind("metricRegistry", mr);
+    // also setup metrics as route policy factory to capture route level 
details
+    var rpf = new 
org.apache.camel.component.microprofile.metrics.route.policy.MicroProfileMetricsRoutePolicyFactory();
+    rpf.setMetricRegistry(mr);
+    context.addRoutePolicyFactory(rpf);
 }
+return answer;
diff --git 
a/dsl/camel-kamelet-main/src/main/resources/auto-configure/camel-microprofile-metrics.properties
 
b/dsl/camel-kamelet-main/src/main/resources/auto-configure/camel-microprofile-metrics.properties
new file mode 100644
index 00000000000..cee803c34ca
--- /dev/null
+++ 
b/dsl/camel-kamelet-main/src/main/resources/auto-configure/camel-microprofile-metrics.properties
@@ -0,0 +1,18 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+
+dependency=io.smallrye:smallrye-metrics:3.0.5
\ No newline at end of file

Reply via email to