This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch jt in repository https://gitbox.apache.org/repos/asf/camel.git
commit d5f8dc26f7272c09a1e1160506375a58d8f6ff0e Author: Claus Ibsen <[email protected]> AuthorDate: Thu Aug 14 07:54:31 2025 +0200 CAMEL-22205: camel-jbang: Document all camel.jbang options for tooling --- .../org/apache/camel/catalog/CamelCatalog.java | 5 ++ .../apache/camel/catalog/DefaultCamelCatalog.java | 9 ++ .../org/apache/camel/catalog/CamelCatalogTest.java | 11 +++ .../org/apache/camel/tooling/model/JBangModel.java | 95 ++++++++++++++++++++++ .../org/apache/camel/tooling/model/JsonMapper.java | 75 +++++++++++++++++ 5 files changed, 195 insertions(+) diff --git a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/CamelCatalog.java b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/CamelCatalog.java index 0d4d8a87694..21cee685ce0 100644 --- a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/CamelCatalog.java +++ b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/CamelCatalog.java @@ -538,6 +538,11 @@ public interface CamelCatalog { */ String listOthersAsJson(); + /** + * Lists all the pojo beans summary details in JSon + */ + String listBeansAsJson(); + /** * Reports a summary what the catalog contains in JSon */ diff --git a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java index 45f9dd2db0b..b32c80eb9f2 100644 --- a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java +++ b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java @@ -535,6 +535,15 @@ public class DefaultCamelCatalog extends AbstractCachingCamelCatalog implements .toList())); } + @Override + public String listBeansAsJson() { + return cache(LIST_BEANS_AS_JSON, () -> JsonMapper.serialize(findBeansNames().stream() + .map(this::pojoBeanJSonSchema) + .map(JsonMapper::deserialize) + .map(o -> o.get("bean")) + .toList())); + } + @Override public String summaryAsJson() { return cache(SUMMARY_AS_JSON, () -> { diff --git a/catalog/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java b/catalog/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java index b77669fb290..68ebdad6a82 100644 --- a/catalog/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java +++ b/catalog/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java @@ -923,6 +923,17 @@ public class CamelCatalogTest { assertNotNull(tree); } + @Test + public void testListBeansAsJson() throws Exception { + String json = catalog.listBeansAsJson(); + assertNotNull(json); + + // validate we can parse the json + ObjectMapper mapper = new ObjectMapper(); + JsonNode tree = mapper.readTree(json); + assertNotNull(tree); + } + @Test public void testSummaryAsJson() throws Exception { String json = catalog.summaryAsJson(); diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JBangModel.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JBangModel.java new file mode 100644 index 00000000000..a48a99d825e --- /dev/null +++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JBangModel.java @@ -0,0 +1,95 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.tooling.model; + +import java.util.ArrayList; +import java.util.List; + +public class JBangModel { + + protected final List<JBangGroupModel> groups = new ArrayList<>(); + protected final List<JBangOptionModel> options = new ArrayList<>(); + + public List<JBangGroupModel> getGroups() { + return groups; + } + + public void addGroup(JBangGroupModel group) { + groups.add(group); + } + + public List<JBangOptionModel> getOptions() { + return options; + } + + public void addOption(JBangOptionModel option) { + options.add(option); + } + + public static class JBangGroupModel { + + private String name; + private String description; + private String sourceType; + + public JBangGroupModel() { + } + + public JBangGroupModel(String name, String description, String sourceType) { + this.name = name; + this.description = description; + this.sourceType = sourceType; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getSourceType() { + return sourceType; + } + + public void setSourceType(String sourceType) { + this.sourceType = sourceType; + } + } + + public static class JBangOptionModel extends BaseOptionModel { + + private String sourceType; + + public String getSourceType() { + return sourceType; + } + + public void setSourceType(String sourceType) { + this.sourceType = sourceType; + } + } +} diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JsonMapper.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JsonMapper.java index 26dc20cb597..f8ab96fb3cd 100644 --- a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JsonMapper.java +++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JsonMapper.java @@ -30,6 +30,8 @@ import org.apache.camel.tooling.model.ComponentModel.EndpointHeaderModel; import org.apache.camel.tooling.model.ComponentModel.EndpointOptionModel; import org.apache.camel.tooling.model.DataFormatModel.DataFormatOptionModel; import org.apache.camel.tooling.model.EipModel.EipOptionModel; +import org.apache.camel.tooling.model.JBangModel.JBangGroupModel; +import org.apache.camel.tooling.model.JBangModel.JBangOptionModel; import org.apache.camel.tooling.model.LanguageModel.LanguageOptionModel; import org.apache.camel.tooling.model.MainModel.MainGroupModel; import org.apache.camel.tooling.model.MainModel.MainOptionModel; @@ -604,6 +606,12 @@ public final class JsonMapper { option.setSourceType(mp.getString("sourceType")); } + private static void parseGroup(JsonObject mp, JBangGroupModel option) { + option.setName(mp.getString("name")); + option.setDescription(mp.getString("description")); + option.setSourceType(mp.getString("sourceType")); + } + private static void parseFunction(JsonObject mp, LanguageModel.LanguageFunctionModel func, String name) { func.setName(name); func.setConstantName(name); @@ -768,6 +776,31 @@ public final class JsonMapper { return model; } + public static JBangModel generateJBangModel(String json) { + JsonObject obj = deserialize(json); + return generateJBangModel(obj); + } + + public static JBangModel generateJBangModel(JsonObject obj) { + JBangModel model = new JBangModel(); + JsonArray mgrp = (JsonArray) obj.get("groups"); + for (Object entry : mgrp) { + JsonObject mg = (JsonObject) entry; + JBangGroupModel group = new JBangGroupModel(); + parseGroup(mg, group); + model.addGroup(group); + } + JsonArray mprp = (JsonArray) obj.get("properties"); + for (Object entry : mprp) { + JsonObject mp = (JsonObject) entry; + JBangOptionModel option = new JBangOptionModel(); + parseOption(mp, option, mp.getString("name")); + option.setSourceType(mp.getString("sourceType")); + model.addOption(option); + } + return model; + } + public static JsonObject asJsonObject(MainModel model) { JsonObject json = new JsonObject(); JsonArray groups = new JsonArray(); @@ -805,6 +838,43 @@ public final class JsonMapper { return json; } + public static JsonObject asJsonObject(JBangModel model) { + JsonObject json = new JsonObject(); + JsonArray groups = new JsonArray(); + for (JBangGroupModel group : model.getGroups()) { + JsonObject j = new JsonObject(); + j.put("name", group.getName()); + j.put("description", group.getDescription()); + j.put("sourceType", group.getSourceType()); + groups.add(j); + } + json.put("groups", groups); + JsonArray props = new JsonArray(); + for (JBangOptionModel prop : model.getOptions()) { + JsonObject j = new JsonObject(); + j.put("name", prop.getName()); + j.put("description", prop.getDescription()); + j.put("sourceType", prop.getSourceType()); + j.put("type", prop.getType()); + j.put("javaType", prop.getJavaType()); + if (prop.getDefaultValue() != null) { + j.put("defaultValue", prop.getDefaultValue()); + } + if (prop.getEnums() != null) { + j.put("enum", prop.getEnums()); + } + if (prop.isDeprecated()) { + j.put("deprecated", prop.isDeprecated()); + } + if (prop.isAutowired()) { + j.put("autowired", prop.isAutowired()); + } + props.add(j); + } + json.put("properties", props); + return json; + } + public static JsonObject asJsonObject(ReleaseModel model) { JsonObject json = new JsonObject(); json.put("version", model.getVersion()); @@ -836,6 +906,11 @@ public final class JsonMapper { return serialize(wrapper); } + public static String createJsonSchema(JBangModel model) { + JsonObject wrapper = asJsonObject(model); + return serialize(wrapper); + } + public static JsonObject deserialize(String json) { try { return (JsonObject) Jsoner.deserialize(json);
