You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2022/09/19 09:00:45 UTC

[camel] branch main updated (b318b6e0912 -> d03b27a4128)

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a change to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


    from b318b6e0912 Regen
     new 685bf7b1625 camel-jbang - Helper to load kamelet model
     new d03b27a4128 camel-jbang - doc kamelet

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../jbang/core/commands/catalog/CatalogDoc.java    |  66 ++++++-
 .../core/commands/catalog/CatalogKamelet.java      |  61 +-----
 .../commands/catalog/KameletCatalogHelper.java     | 204 +++++++++++++++++++++
 .../jbang/core/commands/catalog/KameletModel.java  |  10 +-
 .../core/commands/catalog/KameletOptionModel.java  |  16 +-
 5 files changed, 291 insertions(+), 66 deletions(-)
 create mode 100644 dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/KameletCatalogHelper.java
 copy components/camel-splunk/src/main/java/org/apache/camel/component/splunk/SplunkConfigurationFactory.java => dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/KameletModel.java (79%)
 copy components/camel-grape/src/main/java/org/apache/camel/component/grape/PatchesRepository.java => dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/KameletOptionModel.java (77%)


[camel] 01/02: camel-jbang - Helper to load kamelet model

Posted by da...@apache.org.
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

commit 685bf7b16258bef4f132d6ea7e83d6127dd26e2b
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Mon Sep 19 10:05:58 2022 +0200

    camel-jbang - Helper to load kamelet model
---
 .../jbang/core/commands/catalog/CatalogDoc.java    |  15 +++
 .../core/commands/catalog/CatalogKamelet.java      |  61 ++----------
 .../commands/catalog/KameletCatalogHelper.java     | 107 +++++++++++++++++++++
 .../jbang/core/commands/catalog/KameletModel.java  |  26 +++++
 4 files changed, 154 insertions(+), 55 deletions(-)

diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogDoc.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogDoc.java
index 296b7dc0c92..c840bf82277 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogDoc.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogDoc.java
@@ -53,6 +53,10 @@ public class CatalogDoc extends CamelCommand {
                         description = "Whether to display component message headers", defaultValue = "true")
     boolean headers;
 
+    @CommandLine.Option(names = {
+            "--kamelets-version" }, description = "Apache Camel Kamelets version", defaultValue = "0.9.0")
+    String kameletsVersion;
+
     // TODO: kamelet
     // TODO: endpoint uri to document the uri only
 
@@ -69,6 +73,13 @@ public class CatalogDoc extends CamelCommand {
             name = StringHelper.after(name, ":");
         }
 
+        if (prefix == null || "kamelet".equals(prefix)) {
+            KameletModel km = KameletCatalogHelper.loadKameletModel(name, kameletsVersion);
+            if (km != null) {
+                docKamelet(km);
+                return 0;
+            }
+        }
         if (prefix == null || "component".equals(prefix)) {
             ComponentModel cm = catalog.componentModel(name);
             if (cm != null) {
@@ -106,6 +117,10 @@ public class CatalogDoc extends CamelCommand {
         return 1;
     }
 
+    private void docKamelet(KameletModel model) {
+
+    }
+
     private void docComponent(ComponentModel cm) {
         if (cm.isDeprecated()) {
             System.out.printf("Component Name: %s (deprecated)%n", cm.getName());
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogKamelet.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogKamelet.java
index 5eea7104708..7651c5650bf 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogKamelet.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogKamelet.java
@@ -61,7 +61,7 @@ public class CatalogKamelet extends CamelCommand {
 
     @Override
     public Integer call() throws Exception {
-        List<Row> rows = new ArrayList<>();
+        List<KameletModel> rows = new ArrayList<>();
 
         Map<String, Object> kamelets;
         try {
@@ -82,11 +82,7 @@ public class CatalogKamelet extends CamelCommand {
         }
 
         for (Object o : kamelets.values()) {
-            Row row = new Row();
-            row.name = getName(o);
-            row.type = getType(o);
-            row.level = getLevel(o);
-            row.description = getDescription(o);
+            KameletModel row = KameletCatalogHelper.createModel(o);
             rows.add(row);
         }
 
@@ -107,14 +103,14 @@ public class CatalogKamelet extends CamelCommand {
             System.out.println(AsciiTable.getTable(AsciiTable.NO_BORDERS, rows, Arrays.asList(
                     new Column().header("NAME").dataAlign(HorizontalAlign.LEFT).with(r -> r.name),
                     new Column().header("TYPE").dataAlign(HorizontalAlign.LEFT).with(r -> r.type),
-                    new Column().header("LEVEL").dataAlign(HorizontalAlign.LEFT).with(r -> r.level),
+                    new Column().header("LEVEL").dataAlign(HorizontalAlign.LEFT).with(r -> r.supportLevel),
                     new Column().header("DESCRIPTION").dataAlign(HorizontalAlign.LEFT).with(this::getDescription))));
         }
 
         return 0;
     }
 
-    protected int sortRow(Row o1, Row o2) {
+    protected int sortRow(KameletModel o1, KameletModel o2) {
         String s = sort;
         int negate = 1;
         if (s.startsWith("-")) {
@@ -128,7 +124,7 @@ public class CatalogKamelet extends CamelCommand {
                 return o1.type.compareToIgnoreCase(o2.type) * negate;
             case "level":
             case "support-level":
-                return o1.level.compareToIgnoreCase(o2.level) * negate;
+                return o1.supportLevel.compareToIgnoreCase(o2.supportLevel) * negate;
             case "description":
                 return o1.description.compareToIgnoreCase(o2.description) * negate;
             default:
@@ -141,52 +137,7 @@ public class CatalogKamelet extends CamelCommand {
         return new DependencyDownloaderClassLoader(parentCL);
     }
 
-    private String getName(Object kamelet) throws Exception {
-        Method m = kamelet.getClass().getMethod("getMetadata");
-        Object meta = ObjectHelper.invokeMethod(m, kamelet);
-        m = meta.getClass().getMethod("getName");
-        return (String) ObjectHelper.invokeMethod(m, meta);
-    }
-
-    private String getType(Object kamelet) throws Exception {
-        Method m = kamelet.getClass().getMethod("getMetadata");
-        Object meta = ObjectHelper.invokeMethod(m, kamelet);
-        m = meta.getClass().getMethod("getLabels");
-        Map labels = (Map) ObjectHelper.invokeMethod(m, meta);
-        if (labels != null) {
-            return (String) labels.get("camel.apache.org/kamelet.type");
-        }
-        return null;
-    }
-
-    private String getLevel(Object kamelet) throws Exception {
-        Method m = kamelet.getClass().getMethod("getMetadata");
-        Object meta = ObjectHelper.invokeMethod(m, kamelet);
-        m = meta.getClass().getMethod("getAnnotations");
-        Map anns = (Map) ObjectHelper.invokeMethod(m, meta);
-        if (anns != null) {
-            return (String) anns.get("camel.apache.org/kamelet.support.level");
-        }
-        return null;
-    }
-
-    private String getDescription(Object kamelet) throws Exception {
-        Method m = kamelet.getClass().getMethod("getSpec");
-        Object spec = ObjectHelper.invokeMethod(m, kamelet);
-        m = spec.getClass().getMethod("getDefinition");
-        Object def = ObjectHelper.invokeMethod(m, spec);
-        m = def.getClass().getMethod("getDescription");
-        return (String) ObjectHelper.invokeMethod(m, def);
-    }
-
-    private static class Row {
-        private String name;
-        private String type;
-        private String level;
-        private String description;
-    }
-
-    private String getDescription(Row r) {
+    private String getDescription(KameletModel r) {
         String d = r.description;
         if (d != null && d.contains(".")) {
             // grab first sentence
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/KameletCatalogHelper.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/KameletCatalogHelper.java
new file mode 100644
index 00000000000..97a05e87a06
--- /dev/null
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/KameletCatalogHelper.java
@@ -0,0 +1,107 @@
+/*
+ * 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.dsl.jbang.core.commands.catalog;
+
+import java.lang.reflect.Method;
+import java.util.Map;
+
+import org.apache.camel.main.download.DependencyDownloaderClassLoader;
+import org.apache.camel.main.download.MavenDependencyDownloader;
+import org.apache.camel.support.ObjectHelper;
+
+public final class KameletCatalogHelper {
+
+    private KameletCatalogHelper() {
+    }
+
+    public static KameletModel createModel(Object kamelet) throws Exception {
+        KameletModel km = new KameletModel();
+        km.name = getName(kamelet);
+        km.type = getType(kamelet);
+        km.supportLevel = getSupportLevel(kamelet);
+        km.description = getDescription(kamelet);
+        return km;
+    }
+
+    private static String getName(Object kamelet) throws Exception {
+        Method m = kamelet.getClass().getMethod("getMetadata");
+        Object meta = ObjectHelper.invokeMethod(m, kamelet);
+        m = meta.getClass().getMethod("getName");
+        return (String) ObjectHelper.invokeMethod(m, meta);
+    }
+
+    public static Map<String, Object> loadKamelets(String version) throws Exception {
+        ClassLoader cl = createClassLoader();
+        MavenDependencyDownloader downloader = new MavenDependencyDownloader();
+        downloader.setClassLoader(cl);
+        downloader.start();
+        downloader.downloadDependency("org.apache.camel.kamelets", "camel-kamelets-catalog", version);
+
+        Thread.currentThread().setContextClassLoader(cl);
+        Class<?> clazz = cl.loadClass("org.apache.camel.kamelets.catalog.KameletsCatalog");
+        Object catalog = clazz.getDeclaredConstructor().newInstance();
+        Method m = clazz.getMethod("getKamelets");
+        return (Map<String, Object>) ObjectHelper.invokeMethod(m, catalog);
+    }
+
+    public static KameletModel loadKameletModel(String name, String version) throws Exception {
+        Map<String, Object> kamelets = loadKamelets(version);
+        if (kamelets != null) {
+            Object k = kamelets.get(name);
+            if (k != null) {
+                return createModel(k);
+            }
+        }
+        return null;
+    }
+
+    private static ClassLoader createClassLoader() {
+        ClassLoader parentCL = CatalogKamelet.class.getClassLoader();
+        return new DependencyDownloaderClassLoader(parentCL);
+    }
+
+    private static String getType(Object kamelet) throws Exception {
+        Method m = kamelet.getClass().getMethod("getMetadata");
+        Object meta = ObjectHelper.invokeMethod(m, kamelet);
+        m = meta.getClass().getMethod("getLabels");
+        Map labels = (Map) ObjectHelper.invokeMethod(m, meta);
+        if (labels != null) {
+            return (String) labels.get("camel.apache.org/kamelet.type");
+        }
+        return null;
+    }
+
+    private static String getSupportLevel(Object kamelet) throws Exception {
+        Method m = kamelet.getClass().getMethod("getMetadata");
+        Object meta = ObjectHelper.invokeMethod(m, kamelet);
+        m = meta.getClass().getMethod("getAnnotations");
+        Map anns = (Map) ObjectHelper.invokeMethod(m, meta);
+        if (anns != null) {
+            return (String) anns.get("camel.apache.org/kamelet.support.level");
+        }
+        return null;
+    }
+
+    private static String getDescription(Object kamelet) throws Exception {
+        Method m = kamelet.getClass().getMethod("getSpec");
+        Object spec = ObjectHelper.invokeMethod(m, kamelet);
+        m = spec.getClass().getMethod("getDefinition");
+        Object def = ObjectHelper.invokeMethod(m, spec);
+        m = def.getClass().getMethod("getDescription");
+        return (String) ObjectHelper.invokeMethod(m, def);
+    }
+}
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/KameletModel.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/KameletModel.java
new file mode 100644
index 00000000000..949df5d0af8
--- /dev/null
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/KameletModel.java
@@ -0,0 +1,26 @@
+/*
+ * 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.dsl.jbang.core.commands.catalog;
+
+public class KameletModel {
+
+    String name;
+    String type;
+    String supportLevel;
+    String description;
+
+}


[camel] 02/02: camel-jbang - doc kamelet

Posted by da...@apache.org.
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

commit d03b27a4128f636ae982ad050b77aa5fc2c17d6a
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Mon Sep 19 11:00:25 2022 +0200

    camel-jbang - doc kamelet
---
 .../jbang/core/commands/catalog/CatalogDoc.java    |  53 ++++++++++-
 .../core/commands/catalog/CatalogKamelet.java      |   2 +-
 .../commands/catalog/KameletCatalogHelper.java     | 101 ++++++++++++++++++++-
 .../jbang/core/commands/catalog/KameletModel.java  |   3 +
 .../{KameletModel.java => KameletOptionModel.java} |  11 ++-
 5 files changed, 162 insertions(+), 8 deletions(-)

diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogDoc.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogDoc.java
index c840bf82277..0371ecc780c 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogDoc.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogDoc.java
@@ -17,6 +17,7 @@
 package org.apache.camel.dsl.jbang.core.commands.catalog;
 
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.List;
 import java.util.Locale;
 import java.util.stream.Collectors;
@@ -57,7 +58,6 @@ public class CatalogDoc extends CamelCommand {
             "--kamelets-version" }, description = "Apache Camel Kamelets version", defaultValue = "0.9.0")
     String kameletsVersion;
 
-    // TODO: kamelet
     // TODO: endpoint uri to document the uri only
 
     final CamelCatalog catalog = new DefaultCamelCatalog(true);
@@ -117,7 +117,34 @@ public class CatalogDoc extends CamelCommand {
         return 1;
     }
 
-    private void docKamelet(KameletModel model) {
+    private void docKamelet(KameletModel km) {
+        System.out.printf("Kamelet Name: %s%n", km.name);
+        System.out.printf("Kamelet Type: %s%n", km.type);
+        System.out.println("Support Level: " + km.supportLevel);
+        System.out.println("");
+        System.out.printf("%s%n", km.description);
+        System.out.println("");
+        if (km.properties != null && !km.properties.isEmpty()) {
+            var filtered = filterKameletOptions(filter, km.properties.values());
+            int total1 = km.properties.size();
+            var total2 = filtered.size();
+            if (total1 == total2) {
+                System.out.printf("The %s kamelet supports (total: %s) options, which are listed below.%n%n", km.name, total1);
+            } else {
+                System.out.printf("The %s kamelet supports (total: %s match-filter: %s) options, which are listed below.%n%n",
+                        km.name, total1, total2);
+            }
+            System.out.println(AsciiTable.getTable(AsciiTable.FANCY_ASCII, filtered, Arrays.asList(
+                    new Column().header("NAME").dataAlign(HorizontalAlign.LEFT).minWidth(20)
+                            .maxWidth(30, OverflowBehaviour.NEWLINE)
+                            .with(r -> r.name),
+                    new Column().header("DESCRIPTION").dataAlign(HorizontalAlign.LEFT).with(this::getDescription),
+                    new Column().header("DEFAULT").dataAlign(HorizontalAlign.LEFT).maxWidth(30, OverflowBehaviour.NEWLINE)
+                            .with(r -> r.defaultValue),
+                    new Column().header("TYPE").dataAlign(HorizontalAlign.LEFT).with(r -> r.type),
+                    new Column().header("EXAMPLE").dataAlign(HorizontalAlign.LEFT).with(r -> r.example))));
+            System.out.println("");
+        }
 
     }
 
@@ -306,6 +333,18 @@ public class CatalogDoc extends CamelCommand {
         return prefix + o.getDescription() + suffix;
     }
 
+    String getDescription(KameletOptionModel o) {
+        String prefix = "";
+        String suffix = "";
+        if (o.required) {
+            prefix = "REQUIRED: " + prefix;
+        }
+        if (o.enumValues != null) {
+            suffix = "\n\nEnum values:\n- " + String.join("\n- ", o.enumValues);
+        }
+        return prefix + o.description + suffix;
+    }
+
     List<? extends BaseOptionModel> filter(String name, List<? extends BaseOptionModel> options) {
         if (name == null || name.isEmpty()) {
             return options;
@@ -317,4 +356,14 @@ public class CatalogDoc extends CamelCommand {
                 .collect(Collectors.toList());
     }
 
+    Collection<KameletOptionModel> filterKameletOptions(String name, Collection<KameletOptionModel> options) {
+        if (name == null || name.isEmpty()) {
+            return options;
+        }
+        String target = name.toLowerCase(Locale.ROOT);
+        return options.stream().filter(
+                r -> r.name.equalsIgnoreCase(target) || r.description.toLowerCase(Locale.ROOT).contains(target))
+                .collect(Collectors.toList());
+    }
+
 }
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogKamelet.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogKamelet.java
index 7651c5650bf..5c35c5b1d35 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogKamelet.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogKamelet.java
@@ -82,7 +82,7 @@ public class CatalogKamelet extends CamelCommand {
         }
 
         for (Object o : kamelets.values()) {
-            KameletModel row = KameletCatalogHelper.createModel(o);
+            KameletModel row = KameletCatalogHelper.createModel(o, false);
             rows.add(row);
         }
 
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/KameletCatalogHelper.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/KameletCatalogHelper.java
index 97a05e87a06..cce7b7e0ac4 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/KameletCatalogHelper.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/KameletCatalogHelper.java
@@ -17,26 +17,114 @@
 package org.apache.camel.dsl.jbang.core.commands.catalog;
 
 import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
 import java.util.Map;
 
 import org.apache.camel.main.download.DependencyDownloaderClassLoader;
 import org.apache.camel.main.download.MavenDependencyDownloader;
 import org.apache.camel.support.ObjectHelper;
+import org.apache.camel.util.StringHelper;
 
 public final class KameletCatalogHelper {
 
     private KameletCatalogHelper() {
     }
 
-    public static KameletModel createModel(Object kamelet) throws Exception {
+    public static KameletModel createModel(Object kamelet, boolean all) throws Exception {
         KameletModel km = new KameletModel();
         km.name = getName(kamelet);
         km.type = getType(kamelet);
         km.supportLevel = getSupportLevel(kamelet);
         km.description = getDescription(kamelet);
+        if (all) {
+            Map<String, Object> props = getProperties(kamelet);
+            if (props != null) {
+                km.properties = new LinkedHashMap<>();
+                for (var es : props.entrySet()) {
+                    KameletOptionModel om = createOptionModel(es.getKey(), es.getValue());
+                    km.properties.put(om.name, om);
+                }
+                // some options are required
+                List<String> required = getRequired(kamelet);
+                if (required != null && !required.isEmpty()) {
+                    for (var r : required) {
+                        KameletOptionModel om = km.properties.get(r);
+                        if (om != null) {
+                            om.required = true;
+                        }
+                    }
+                }
+            }
+        }
         return km;
     }
 
+    private static KameletOptionModel createOptionModel(String name, Object prop) throws Exception {
+        KameletOptionModel om = new KameletOptionModel();
+        om.name = name;
+        om.description = getPropertyDescription(prop);
+        om.type = getPropertyType(prop);
+        om.defaultValue = getPropertyDefaultValue(prop);
+        om.example = getPropertyExample(prop);
+        om.enumValues = getPropertyEnum(prop);
+        return om;
+    }
+
+    private static List<String> getRequired(Object kamelet) throws Exception {
+        Method m = kamelet.getClass().getMethod("getSpec");
+        Object spec = ObjectHelper.invokeMethod(m, kamelet);
+        m = spec.getClass().getMethod("getDefinition");
+        Object def = ObjectHelper.invokeMethod(m, spec);
+        m = def.getClass().getMethod("getRequired");
+        return (List<String>) ObjectHelper.invokeMethod(m, def);
+    }
+
+    private static String getPropertyDescription(Object prop) throws Exception {
+        Method m = prop.getClass().getMethod("getDescription");
+        return (String) ObjectHelper.invokeMethod(m, prop);
+    }
+
+    private static String getPropertyType(Object prop) throws Exception {
+        Method m = prop.getClass().getMethod("getType");
+        return (String) ObjectHelper.invokeMethod(m, prop);
+    }
+
+    private static String getPropertyExample(Object prop) throws Exception {
+        Method m = prop.getClass().getMethod("getExample");
+        Object en = ObjectHelper.invokeMethod(m, prop);
+        if (en != null) {
+            String t = en.toString();
+            return StringHelper.removeLeadingAndEndingQuotes(t);
+        }
+        return null;
+    }
+
+    private static String getPropertyDefaultValue(Object prop) throws Exception {
+        Method m = prop.getClass().getMethod("getDefault");
+        Object dn = ObjectHelper.invokeMethod(m, prop);
+        if (dn != null) {
+            String t = dn.toString();
+            return StringHelper.removeLeadingAndEndingQuotes(t);
+        }
+        return null;
+    }
+
+    private static List<String> getPropertyEnum(Object prop) throws Exception {
+        List<String> answer = new ArrayList<>();
+        Method m = prop.getClass().getMethod("getEnum");
+        List<Object> list = (List<Object>) ObjectHelper.invokeMethod(m, prop);
+        if (list != null && !list.isEmpty()) {
+            for (var en : list) {
+                String t = en.toString();
+                t = StringHelper.removeLeadingAndEndingQuotes(t);
+                answer.add(t);
+            }
+        }
+        return answer.isEmpty() ? null : answer;
+    }
+
     private static String getName(Object kamelet) throws Exception {
         Method m = kamelet.getClass().getMethod("getMetadata");
         Object meta = ObjectHelper.invokeMethod(m, kamelet);
@@ -63,7 +151,7 @@ public final class KameletCatalogHelper {
         if (kamelets != null) {
             Object k = kamelets.get(name);
             if (k != null) {
-                return createModel(k);
+                return createModel(k, true);
             }
         }
         return null;
@@ -104,4 +192,13 @@ public final class KameletCatalogHelper {
         m = def.getClass().getMethod("getDescription");
         return (String) ObjectHelper.invokeMethod(m, def);
     }
+
+    private static Map<String, Object> getProperties(Object kamelet) throws Exception {
+        Method m = kamelet.getClass().getMethod("getSpec");
+        Object spec = ObjectHelper.invokeMethod(m, kamelet);
+        m = spec.getClass().getMethod("getDefinition");
+        Object def = ObjectHelper.invokeMethod(m, spec);
+        m = def.getClass().getMethod("getProperties");
+        return (Map<String, Object>) ObjectHelper.invokeMethod(m, def);
+    }
 }
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/KameletModel.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/KameletModel.java
index 949df5d0af8..cbf7f03a948 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/KameletModel.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/KameletModel.java
@@ -16,11 +16,14 @@
  */
 package org.apache.camel.dsl.jbang.core.commands.catalog;
 
+import java.util.Map;
+
 public class KameletModel {
 
     String name;
     String type;
     String supportLevel;
     String description;
+    Map<String, KameletOptionModel> properties;
 
 }
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/KameletModel.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/KameletOptionModel.java
similarity index 85%
copy from dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/KameletModel.java
copy to dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/KameletOptionModel.java
index 949df5d0af8..a0a7837a036 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/KameletModel.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/KameletOptionModel.java
@@ -16,11 +16,16 @@
  */
 package org.apache.camel.dsl.jbang.core.commands.catalog;
 
-public class KameletModel {
+import java.util.List;
+
+public class KameletOptionModel {
 
     String name;
-    String type;
-    String supportLevel;
+    boolean required;
     String description;
+    String type;
+    String defaultValue;
+    String example;
+    List<String> enumValues;
 
 }