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/11/09 11:23:22 UTC
(camel) 01/02: CAMEL-20082: camel-jbang - Export to support javaagents
This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch jb-agent
in repository https://gitbox.apache.org/repos/asf/camel.git
commit 9285aa0c0d1bf8eb0ebd95fff1de55ad5399f83d
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Thu Nov 9 12:19:08 2023 +0100
CAMEL-20082: camel-jbang - Export to support javaagents
---
.../dsl/jbang/core/commands/ExportBaseCommand.java | 51 ++++++++++++++++++++++
.../dsl/jbang/core/commands/ExportCamelMain.java | 3 ++
.../org/apache/camel/tooling/maven/MavenGav.java | 4 ++
.../apache/camel/tooling/maven/MavenGavTest.java | 10 +++++
4 files changed, 68 insertions(+)
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 dbf055cc107..fcadf188cb0 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
@@ -23,6 +23,7 @@ import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
+import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.ArrayList;
import java.util.Arrays;
@@ -48,7 +49,11 @@ import org.apache.camel.catalog.DefaultCamelCatalog;
import org.apache.camel.dsl.jbang.core.common.RuntimeCompletionCandidates;
import org.apache.camel.dsl.jbang.core.common.RuntimeUtil;
import org.apache.camel.dsl.jbang.core.common.VersionHelper;
+import org.apache.camel.tooling.maven.MavenArtifact;
+import org.apache.camel.tooling.maven.MavenDownloader;
+import org.apache.camel.tooling.maven.MavenDownloaderImpl;
import org.apache.camel.tooling.maven.MavenGav;
+import org.apache.camel.tooling.maven.MavenResolutionException;
import org.apache.camel.util.CamelCaseOrderedProperties;
import org.apache.camel.util.FileUtil;
import org.apache.camel.util.IOHelper;
@@ -71,6 +76,10 @@ abstract class ExportBaseCommand extends CamelCommand {
private static final Pattern PACKAGE_PATTERN = Pattern.compile(
"^\\s*package\\s+([a-zA-Z][.\\w]*)\\s*;.*$", Pattern.MULTILINE);
+ private static final Set<String> EXCLUDED_GROUP_IDS = Set.of("org.fusesource.jansi", "org.apache.logging.log4j");
+
+ private MavenDownloader downloader;
+
@CommandLine.Parameters(description = "The Camel file(s) to export. If no files is specified then what was last run will be exported.",
arity = "0..9", paramLabel = "<files>", parameterConsumer = FilesConsumer.class)
protected Path[] filePaths; // Defined only for file path completion; the field never used
@@ -810,6 +819,48 @@ abstract class ExportBaseCommand extends CamelCommand {
}
}
+ protected void copyAgentDependencies(Set<String> deps) throws Exception {
+ for (String d : deps) {
+ if (d.startsWith("agent:")) {
+ File libDir = new File(BUILD_DIR, "agent");
+ libDir.mkdirs();
+ String n = d.substring(6);
+ MavenGav gav = MavenGav.parseGav(n);
+ copyAgentLibDependencies(gav);
+ }
+ }
+ }
+
+ private void copyAgentLibDependencies(MavenGav gav) {
+ try {
+ List<MavenArtifact> artifacts = getDownloader().resolveArtifacts(
+ List.of(gav.toString()), Set.of(), true, gav.getVersion().contains("SNAPSHOT"));
+ for (MavenArtifact artifact : artifacts) {
+ Path target = Paths.get(BUILD_DIR, "agent", artifact.getFile().getName());
+ if (Files.exists(target) || EXCLUDED_GROUP_IDS.contains(artifact.getGav().getGroupId())) {
+ continue;
+ }
+ Files.copy(artifact.getFile().toPath(), target);
+ }
+ } catch (MavenResolutionException e) {
+ System.err.println("Error resolving the artifact: " + gav + " due to: " + e.getMessage());
+ } catch (IOException e) {
+ System.err.println("Error copying the artifact: " + gav + " due to: " + e.getMessage());
+ }
+ }
+
+ private MavenDownloader getDownloader() {
+ if (downloader == null) {
+ init();
+ }
+ return downloader;
+ }
+
+ private void init() {
+ this.downloader = new MavenDownloaderImpl();
+ ((MavenDownloaderImpl) downloader).build();
+ }
+
static class FilesConsumer extends ParameterConsumer<Export> {
@Override
protected void doConsumeParameters(Stack<String> args, Export cmd) {
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportCamelMain.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportCamelMain.java
index bb9110b3ff0..e39290f0f9a 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportCamelMain.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportCamelMain.java
@@ -130,6 +130,9 @@ class ExportCamelMain extends Export {
Set<String> deps = resolveDependencies(settings, profile);
// copy local lib JARs
copyLocalLibDependencies(deps);
+ // copy agent JARs and remove as dependency
+ copyAgentDependencies(deps);
+ deps.removeIf(d -> d.startsWith("agent:"));
if ("maven".equals(buildTool)) {
createMavenPom(settings, profile, new File(BUILD_DIR, "pom.xml"), deps, srcPackageName);
if (mavenWrapper) {
diff --git a/tooling/camel-tooling-maven/src/main/java/org/apache/camel/tooling/maven/MavenGav.java b/tooling/camel-tooling-maven/src/main/java/org/apache/camel/tooling/maven/MavenGav.java
index 3e0127b0c9d..1fe0be511be 100644
--- a/tooling/camel-tooling-maven/src/main/java/org/apache/camel/tooling/maven/MavenGav.java
+++ b/tooling/camel-tooling-maven/src/main/java/org/apache/camel/tooling/maven/MavenGav.java
@@ -97,6 +97,10 @@ public final class MavenGav {
} else if (defaultVersion != null) {
answer.setVersion(defaultVersion);
}
+ } else if (gav.startsWith("agent:")) {
+ // special for java agent JARs
+ answer = parseGav(gav.substring(6));
+ answer.setPackaging("agent");
} else {
// for those used to OSGi's pax-url-aether syntax
String[] parts = gav.startsWith("mvn:") ? gav.substring(4).split(":") : gav.split(":");
diff --git a/tooling/camel-tooling-maven/src/test/java/org/apache/camel/tooling/maven/MavenGavTest.java b/tooling/camel-tooling-maven/src/test/java/org/apache/camel/tooling/maven/MavenGavTest.java
index 7ead04cc8c6..aaa02a45151 100644
--- a/tooling/camel-tooling-maven/src/test/java/org/apache/camel/tooling/maven/MavenGavTest.java
+++ b/tooling/camel-tooling-maven/src/test/java/org/apache/camel/tooling/maven/MavenGavTest.java
@@ -49,4 +49,14 @@ class MavenGavTest {
assertEquals("junit-api", gav.getArtifactId());
assertEquals("99.99", gav.getVersion());
}
+
+ @Test
+ void parseAgentGav() {
+ MavenGav gav = MavenGav.parseGav("agent:io.opentelemetry.javaagent:opentelemetry-javaagent:1.31.0");
+
+ assertEquals("io.opentelemetry.javaagent", gav.getGroupId());
+ assertEquals("opentelemetry-javaagent", gav.getArtifactId());
+ assertEquals("1.31.0", gav.getVersion());
+ assertEquals("agent", gav.getPackaging());
+ }
}