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());
+    }
 }