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);

Reply via email to