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,