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
