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;