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 f0dda3ecb0c297a0458b8b84d5ad08791599ff1e
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Sat Sep 17 10:17:07 2022 +0200

    CAMEL-18515: camel-jbang - Command to list components from the catalog.
---
 .../dsl/jbang/core/commands/CamelJBangMain.java    |   2 +
 .../core/commands/catalog/CatalogBaseCommand.java  | 103 +++++++++++++++++++++
 .../core/commands/catalog/CatalogComponent.java    |  49 ++++++++++
 .../core/commands/catalog/CatalogKamelet.java      |   3 +-
 4 files changed, 156 insertions(+), 1 deletion(-)

diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMain.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMain.java
index 5b049d6ebaa..281aa9b330e 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMain.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMain.java
@@ -29,6 +29,7 @@ import 
org.apache.camel.dsl.jbang.core.commands.action.CamelRouteStopAction;
 import org.apache.camel.dsl.jbang.core.commands.action.CamelSourceTop;
 import org.apache.camel.dsl.jbang.core.commands.action.CamelThreadDump;
 import org.apache.camel.dsl.jbang.core.commands.catalog.CatalogCommand;
+import org.apache.camel.dsl.jbang.core.commands.catalog.CatalogComponent;
 import org.apache.camel.dsl.jbang.core.commands.catalog.CatalogKamelet;
 import org.apache.camel.dsl.jbang.core.commands.process.CamelContextStatus;
 import org.apache.camel.dsl.jbang.core.commands.process.CamelContextTop;
@@ -77,6 +78,7 @@ public class CamelJBangMain implements Callable<Integer> {
                 .addSubcommand("generate", new CommandLine(new 
CodeGenerator(main))
                         .addSubcommand("rest", new CommandLine(new 
CodeRestGenerator(main))))
                 .addSubcommand("catalog", new CommandLine(new 
CatalogCommand(main))
+                        .addSubcommand("component", new CommandLine(new 
CatalogComponent(main)))
                         .addSubcommand("kamelet", new CommandLine(new 
CatalogKamelet(main))))
                 .addSubcommand("jolokia", new CommandLine(new Jolokia(main)))
                 .addSubcommand("hawtio", new CommandLine(new Hawtio(main)))
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogBaseCommand.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogBaseCommand.java
new file mode 100644
index 00000000000..0969aaa7bcc
--- /dev/null
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogBaseCommand.java
@@ -0,0 +1,103 @@
+/*
+ * 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.util.Arrays;
+import java.util.List;
+import java.util.Locale;
+import java.util.stream.Collectors;
+
+import com.github.freva.asciitable.AsciiTable;
+import com.github.freva.asciitable.Column;
+import com.github.freva.asciitable.HorizontalAlign;
+import org.apache.camel.catalog.CamelCatalog;
+import org.apache.camel.catalog.DefaultCamelCatalog;
+import org.apache.camel.dsl.jbang.core.commands.CamelCommand;
+import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
+import picocli.CommandLine;
+
+public abstract class CatalogBaseCommand extends CamelCommand {
+
+    @CommandLine.Option(names = { "--sort" },
+                        description = "Sort by name, support-level, or 
description", defaultValue = "name")
+    String sort;
+
+    @CommandLine.Option(names = { "--filter" },
+                        description = "Filter by name or description")
+    String filterName;
+
+    final CamelCatalog catalog = new DefaultCamelCatalog(true);
+
+    public CatalogBaseCommand(CamelJBangMain main) {
+        super(main);
+    }
+
+    abstract List<Row> collectRows();
+
+    @Override
+    public Integer call() throws Exception {
+        List<Row> rows = collectRows();
+
+        if (filterName != null) {
+            filterName = filterName.toLowerCase(Locale.ROOT);
+            rows = rows.stream().filter(
+                    r -> r.name.equalsIgnoreCase(filterName) || 
r.description.toLowerCase(Locale.ROOT).contains(filterName)
+                            || 
r.label.toLowerCase(Locale.ROOT).contains(filterName))
+                    .collect(Collectors.toList());
+        }
+
+        // sort rows
+        rows.sort(this::sortRow);
+
+        if (!rows.isEmpty()) {
+            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("LEVEL").dataAlign(HorizontalAlign.LEFT).with(r -> r.level),
+                    new 
Column().header("DESCRIPTION").dataAlign(HorizontalAlign.LEFT).with(r -> 
r.description))));
+        }
+
+        return 0;
+    }
+
+    int sortRow(Row o1, Row o2) {
+        String s = sort;
+        int negate = 1;
+        if (s.startsWith("-")) {
+            s = s.substring(1);
+            negate = -1;
+        }
+        switch (s) {
+            case "name":
+                return o1.name.compareToIgnoreCase(o2.name) * negate;
+            case "level":
+            case "support-level":
+                return o1.level.compareToIgnoreCase(o2.level) * negate;
+            case "description":
+                return o1.description.compareToIgnoreCase(o2.description) * 
negate;
+            default:
+                return 0;
+        }
+    }
+
+    static class Row {
+        String name;
+        String level;
+        String description;
+        String label;
+    }
+
+}
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogComponent.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogComponent.java
new file mode 100644
index 00000000000..44ca415a726
--- /dev/null
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogComponent.java
@@ -0,0 +1,49 @@
+/*
+ * 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.util.ArrayList;
+import java.util.List;
+
+import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
+import org.apache.camel.tooling.model.ComponentModel;
+import picocli.CommandLine;
+
+@CommandLine.Command(name = "component", aliases = { "component", "components" 
},
+                     description = "List Component from the Camel Catalog")
+public class CatalogComponent extends CatalogBaseCommand {
+
+    public CatalogComponent(CamelJBangMain main) {
+        super(main);
+    }
+
+    @Override
+    List<CatalogBaseCommand.Row> collectRows() {
+        List<Row> rows = new ArrayList<>();
+        for (String name : catalog.findComponentNames()) {
+            ComponentModel model = catalog.componentModel(name);
+            Row row = new Row();
+            row.name = model.getName();
+            row.level = model.getSupportLevel().name();
+            row.description = model.getDescription();
+            row.label = model.getLabel() != null ? model.getLabel() : "";
+            rows.add(row);
+        }
+        return rows;
+    }
+
+}
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 31767a59a35..5eea7104708 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
@@ -40,7 +40,7 @@ import picocli.CommandLine;
 public class CatalogKamelet extends CamelCommand {
 
     @CommandLine.Option(names = { "--sort" },
-                        description = "Sort by name, type, level, or 
description", defaultValue = "name")
+                        description = "Sort by name, type, support-level, or 
description", defaultValue = "name")
     String sort;
 
     @CommandLine.Option(names = { "--type", "--filter-type" },
@@ -127,6 +127,7 @@ public class CatalogKamelet extends CamelCommand {
             case "type":
                 return o1.type.compareToIgnoreCase(o2.type) * negate;
             case "level":
+            case "support-level":
                 return o1.level.compareToIgnoreCase(o2.level) * negate;
             case "description":
                 return o1.description.compareToIgnoreCase(o2.description) * 
negate;

Reply via email to