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


The following commit(s) were added to refs/heads/main by this push:
     new 796df2d895f2 CAMEL-24898: camel-jbang - camel_catalog_doc resolves the 
YAML names of data formats and says the YAML shape
796df2d895f2 is described below

commit 796df2d895f2bce452629e51efbf1f13a525ca72
Author: Claus Ibsen <[email protected]>
AuthorDate: Tue Sep 22 14:54:37 2026 +0200

    CAMEL-24898: camel-jbang - camel_catalog_doc resolves the YAML names of 
data formats and says the YAML shape
    
    Fixes https://issues.apache.org/jira/browse/CAMEL-24898 (part of 
CAMEL-24886)
    
    The YAML DSL names the JSON data format `json:` with `library: Jackson`; 
the catalog names it by artifact, `jackson`. `camel_catalog_doc json` answered 
"Data format not found: json" with the suggestions fastjson, fhirJson, 
groovyJson, gson, jackson, and `camel_catalog_doc jackson` showed the options 
without the YAML shape. In the camel-jbang-mcp stepwise benchmark 
(connect/stock-api) the local model looped six calls between `json`, `jackson` 
and `json-jackson` and ran out of its budge [...]
    
    `CatalogDocs` now maps the YAML and everyday names to the artifact (`json`, 
`json-jackson` -> `jackson`; `yaml` -> `snakeYaml`; `xml` -> `jacksonXml`; 
`avro-jackson`, `protobuf-jackson`, and the gson/fastjson/jsonb spellings), and 
the answer for a data format whose YAML key differs from its artifact carries a 
`yaml` field with the shape: `marshal: {json: {library: Jackson}} or unmarshal: 
{...}`. The `name` parameter description says a data format is found by either 
name. Test in `Cata [...]
---
 .../dsl/jbang/core/commands/ai/AuthoringTools.java |  4 ++-
 .../dsl/jbang/core/commands/ai/CatalogDocs.java    | 33 ++++++++++++++++++++--
 .../jbang/core/commands/ai/CatalogDocsTest.java    | 16 +++++++++++
 .../jbang/core/commands/mcp/AuthoringTools.java    |  2 +-
 4 files changed, 50 insertions(+), 5 deletions(-)

diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ai/AuthoringTools.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ai/AuthoringTools.java
index 04b622cc58f7..cad7f2a5433e 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ai/AuthoringTools.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ai/AuthoringTools.java
@@ -82,7 +82,9 @@ public final class AuthoringTools {
     static void register(Consumer<ToolDescriptor> registry) {
         registry.accept(tool("camel_catalog_doc",
                 "Catalog documentation of a component, data format, language, 
EIP, built-in bean or the Java API: description, options, Maven coordinates, 
the URI rules of a component; for simple its functions and operators 
(optionsFilter narrows them). endpoint validates a URI.")
-                .param("name", "string", "Name, e.g. kafka, json-jackson, 
simple, timer, choice, split, Exchange", false)
+                .param("name", "string",
+                        "Name, e.g. kafka, json (a data format by its YAML 
name or artifact), simple, timer, choice, split, Exchange",
+                        false)
                 .param("endpoint", "string", "Endpoint URI to check, e.g. 
kafka:orders?brokers=host:9092", false)
                 .param("kind", "string",
                         "component, dataformat, language, eip, bean or api 
(auto-detected; a bean is a built-in class such as StringAggregationStrategy, 
with how to declare and use it; api is the Java API to call from a bean or 
script before writing it: Exchange, Message, CamelContext, Registry, 
ProducerTemplate, Processor, AggregationStrategy, Predicate, Expression, 
TypeConverter, or the variables of groovy, js, python, java scripts)",
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ai/CatalogDocs.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ai/CatalogDocs.java
index 717e5bb60732..31a8a57878e2 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ai/CatalogDocs.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ai/CatalogDocs.java
@@ -66,6 +66,24 @@ public final class CatalogDocs {
     private CatalogDocs() {
     }
 
+    /** The names the YAML DSL and its users give a data format, and the 
catalog artifact each is (CAMEL-24898). */
+    static final Map<String, String> YAML_DATAFORMAT_NAMES = Map.ofEntries(
+            Map.entry("json", "jackson"), Map.entry("json-jackson", 
"jackson"), Map.entry("jsonjackson", "jackson"),
+            Map.entry("json-gson", "gson"), Map.entry("json-fastjson", 
"fastjson"), Map.entry("json-jsonb", "jsonb"),
+            Map.entry("yaml", "snakeYaml"), Map.entry("snakeyaml", 
"snakeYaml"), Map.entry("yaml-snakeyaml", "snakeYaml"),
+            Map.entry("avro-jackson", "avroJackson"), Map.entry("avrojackson", 
"avroJackson"),
+            Map.entry("protobuf-jackson", "protobufJackson"), 
Map.entry("protobufjackson", "protobufJackson"),
+            Map.entry("xml", "jacksonXml"), Map.entry("jackson-xml", 
"jacksonXml"), Map.entry("jacksonxml", "jacksonXml"));
+
+    /** The YAML DSL shape of the data formats whose key is not the artifact 
name. */
+    static final Map<String, String> YAML_DATAFORMAT_SHAPES = Map.ofEntries(
+            Map.entry("jackson", "json: {library: Jackson}"), 
Map.entry("gson", "json: {library: Gson}"),
+            Map.entry("fastjson", "json: {library: Fastjson}"), 
Map.entry("jsonb", "json: {library: Jsonb}"),
+            Map.entry("snakeYaml", "yaml: {library: SnakeYAML}"),
+            Map.entry("avroJackson", "avro: {library: Jackson}"), 
Map.entry("avro", "avro: {library: ApacheAvro}"),
+            Map.entry("protobufJackson", "protobuf: {library: Jackson}"),
+            Map.entry("protobuf", "protobuf: {library: GoogleProtobuf}"));
+
     /**
      * The documentation of a catalog artifact, or the check of an endpoint 
URI when {@code endpoint} is given.
      *
@@ -115,10 +133,19 @@ public final class CatalogDocs {
             }
         }
         if (kind == null || "dataformat".equals(kind)) {
-            DataFormatModel dm = catalog.dataFormatModel(name);
+            // the YAML DSL names a data format by its key and library (json + 
Jackson), the catalog by artifact
+            // (jackson): both are answered, with the YAML shape in the answer 
(CAMEL-24898)
+            String artifact = 
YAML_DATAFORMAT_NAMES.getOrDefault(name.toLowerCase(), name);
+            DataFormatModel dm = catalog.dataFormatModel(artifact);
             if (dm != null) {
-                String doc = includeDoc ? catalog.asciiDoc(name + 
"-dataformat") : null;
-                return dataFormatDoc(dm, lowerFilter, scope, doc);
+                String doc = includeDoc ? catalog.asciiDoc(artifact + 
"-dataformat") : null;
+                JsonObject result = dataFormatDoc(dm, lowerFilter, scope, doc);
+                String shape = YAML_DATAFORMAT_SHAPES.get(artifact);
+                if (shape != null) {
+                    result.put("yaml", "marshal: {" + shape + "} or unmarshal: 
{" + shape + "}"
+                                       + " (the YAML DSL key with its library, 
not the artifact name " + artifact + ")");
+                }
+                return result;
             }
             if (kind != null) {
                 return notFound("Data format", name, 
catalog.suggestDataFormatNames(name, 5));
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ai/CatalogDocsTest.java
 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ai/CatalogDocsTest.java
index a715af758295..10279c813afc 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ai/CatalogDocsTest.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ai/CatalogDocsTest.java
@@ -64,6 +64,22 @@ class CatalogDocsTest {
         assertNull(schema.get("required"), "name or endpoint, neither alone is 
required");
     }
 
+    /** CAMEL-24898: the YAML names of the data formats are answered, with the 
YAML shape. */
+    @Test
+    void theYamlNameOfADataFormatIsAnsweredWithItsShape() throws Exception {
+        for (String name : List.of("json", "json-jackson", "jackson")) {
+            JsonObject json = catalogDoc(Map.of("name", name));
+            assertEquals("jackson", json.getString("name"), name);
+            assertEquals("dataformat", json.getString("kind"), name);
+            assertTrue(json.getString("yaml").startsWith("marshal: {json: 
{library: Jackson}}"), name);
+        }
+        JsonObject yaml = catalogDoc(Map.of("name", "yaml", "kind", 
"dataformat"));
+        assertEquals("snakeYaml", yaml.getString("name"));
+        assertTrue(yaml.getString("yaml").contains("yaml: {library: 
SnakeYAML}"));
+        JsonObject xml = catalogDoc(Map.of("name", "xml"));
+        assertEquals("jacksonXml", xml.getString("name"));
+    }
+
     @Test
     void simpleLanguageListsItsFunctionsAndOperatorsCompactly() throws 
Exception {
         JsonObject result = catalogDoc(Map.of("name", "simple", "kind", 
"language"));
diff --git 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/AuthoringTools.java
 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/AuthoringTools.java
index 12e642b061a6..954bd4f04877 100644
--- 
a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/AuthoringTools.java
+++ 
b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/AuthoringTools.java
@@ -57,7 +57,7 @@ public class AuthoringTools {
                         + "includeHeaders=true adds the message headers of a 
component, includeDoc=true the AsciiDoc "
                         + "page.")
     public JsonObject camel_catalog_doc(
-            @ToolArg(description = "Name, e.g. kafka, json-jackson, simple, 
timer, choice, split, Exchange",
+            @ToolArg(description = "Name, e.g. kafka, json (a data format by 
its YAML name or artifact), simple, timer, choice, split, Exchange",
                      required = false) String name,
             @ToolArg(description = "Endpoint URI to check, e.g. 
kafka:orders?brokers=host:9092",
                      required = false) String endpoint,

Reply via email to