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 <[email protected]> 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()); + } }
