This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch vault-auto in repository https://gitbox.apache.org/repos/asf/camel.git
commit 64e8d84ba9b000c4938ecb2b5b7f34053595d593 Author: Claus Ibsen <[email protected]> AuthorDate: Sat Nov 16 12:49:36 2024 +0100 camel-jbang - Auto detect vault dependencies --- .../java/org/apache/camel/main/KameletMain.java | 9 ++ .../DependencyDownloaderPeriodTaskResolver.java | 96 ++++++++++++++++++++++ 2 files changed, 105 insertions(+) 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 c61362bf779..1ea24edca95 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 @@ -48,6 +48,7 @@ import org.apache.camel.main.download.DependencyDownloaderComponentResolver; import org.apache.camel.main.download.DependencyDownloaderDataFormatResolver; import org.apache.camel.main.download.DependencyDownloaderKamelet; import org.apache.camel.main.download.DependencyDownloaderLanguageResolver; +import org.apache.camel.main.download.DependencyDownloaderPeriodTaskResolver; import org.apache.camel.main.download.DependencyDownloaderPropertiesComponent; import org.apache.camel.main.download.DependencyDownloaderPropertiesFunctionResolver; import org.apache.camel.main.download.DependencyDownloaderPropertyBindingListener; @@ -612,6 +613,14 @@ public class KameletMain extends MainCommandLineSupport { ff = ffr.resolveDefaultFactoryFinder(classResolver); answer.getCamelContextExtension().setDefaultFactoryFinder(ff); + // period task resolver that can download needed dependencies + if (!export) { + Object camelVersion = getInitialProperties().get(getInstanceType() + ".camelVersion"); + PeriodTaskResolver ptr = new DependencyDownloaderPeriodTaskResolver( + ff, answer, Optional.ofNullable(camelVersion).map(Object::toString).orElse(null)); + answer.getCamelContextExtension().addContextPlugin(PeriodTaskResolver.class, ptr); + } + answer.getCamelContextExtension().addContextPlugin(ComponentResolver.class, new DependencyDownloaderComponentResolver(answer, stubPattern, silent)); answer.getCamelContextExtension().addContextPlugin(DataFormatResolver.class, diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderPeriodTaskResolver.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderPeriodTaskResolver.java new file mode 100644 index 00000000000..274735532ac --- /dev/null +++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderPeriodTaskResolver.java @@ -0,0 +1,96 @@ +/* + * 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.Optional; + +import org.apache.camel.CamelContext; +import org.apache.camel.impl.engine.DefaultPeriodTaskResolver; +import org.apache.camel.spi.FactoryFinder; +import org.apache.camel.spi.PeriodTaskResolver; +import org.apache.camel.support.ResolverHelper; +import org.apache.camel.util.ObjectHelper; + +public class DependencyDownloaderPeriodTaskResolver extends DefaultPeriodTaskResolver { + + private final DependencyDownloader downloader; + private final CamelContext camelContext; + private final String camelVersion; + + public DependencyDownloaderPeriodTaskResolver(FactoryFinder finder, CamelContext camelContext, String camelVersion) { + super(finder); + this.camelContext = camelContext; + this.camelVersion = camelVersion; + this.downloader = camelContext.hasService(DependencyDownloader.class); + } + + @Override + public Optional<Object> newInstance(String key) { + maybeDownload(key); + + Optional<Object> answer = super.newInstance(key); + if (answer.isEmpty()) { + // need to use regular factory finder as bootstrap has already marked the loader as a miss + final FactoryFinder finder + = camelContext.getCamelContextExtension().getFactoryFinder(PeriodTaskResolver.RESOURCE_PATH); + Object obj = ResolverHelper.resolveService(camelContext, finder, key, PeriodTaskResolver.class).orElse(null); + return Optional.ofNullable(obj); + } + return answer; + } + + @Override + public <T> Optional<T> newInstance(String key, Class<T> type) { + maybeDownload(key); + + Optional<T> answer = super.newInstance(key, type); + if (answer.isEmpty()) { + // need to use regular factory finder as bootstrap has already marked the loader as a miss + final FactoryFinder finder + = camelContext.getCamelContextExtension().getFactoryFinder(PeriodTaskResolver.RESOURCE_PATH); + T obj = ResolverHelper.resolveService(camelContext, finder, key, type).orElse(null); + return Optional.ofNullable(obj); + } + return answer; + } + + private void maybeDownload(String key) { + if ("aws-secret-refresh".equals(key)) { + downloadLoader("camel-aws-secrets-manager"); + } else if ("gcp-secret-refresh".equals(key)) { + downloadLoader("camel-google-secret-manager"); + } else if ("azure-secret-refresh".equals(key)) { + downloadLoader("camel-azure-key-vault"); + } else if ("kubernetes-secret-refresh".equals(key)) { + downloadLoader("camel-kubernetes"); + } else if ("kubernetes-configmaps-refresh".equals(key)) { + downloadLoader("camel-kubernetes"); + } + } + + private void downloadLoader(String artifactId) { + String resolvedCamelVersion = camelContext.getVersion(); + if (ObjectHelper.isEmpty(resolvedCamelVersion)) { + resolvedCamelVersion = camelVersion; + } + + if (!downloader.alreadyOnClasspath("org.apache.camel", artifactId, resolvedCamelVersion)) { + downloader.downloadDependency("org.apache.camel", artifactId, resolvedCamelVersion); + } + } + +}
