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
The following commit(s) were added to refs/heads/main by this push: new 10d9e95b515 CAMEL-20419: Add get transformer jbang command 10d9e95b515 is described below commit 10d9e95b515ac860a18247ef782a08204b786139 Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Wed Feb 14 15:49:40 2024 +0100 CAMEL-20419: Add get transformer jbang command --- .../camel/cli/connector/LocalCliConnector.java | 7 + .../dsl/jbang/core/commands/CamelJBangMain.java | 1 + .../core/commands/process/ListTransformer.java | 145 +++++++++++++++++++++ 3 files changed, 153 insertions(+) diff --git a/dsl/camel-cli-connector/src/main/java/org/apache/camel/cli/connector/LocalCliConnector.java b/dsl/camel-cli-connector/src/main/java/org/apache/camel/cli/connector/LocalCliConnector.java index 84183c072c3..df051eb3318 100644 --- a/dsl/camel-cli-connector/src/main/java/org/apache/camel/cli/connector/LocalCliConnector.java +++ b/dsl/camel-cli-connector/src/main/java/org/apache/camel/cli/connector/LocalCliConnector.java @@ -950,6 +950,13 @@ public class LocalCliConnector extends ServiceSupport implements CliConnector, C root.put("variables", json); } } + DevConsole dc16 = dcr.resolveById("transformers"); + if (dc16 != null) { + JsonObject json = (JsonObject) dc16.call(DevConsole.MediaType.JSON); + if (json != null && !json.isEmpty()) { + root.put("transformers", json); + } + } } // various details JsonObject services = collectServices(); 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 bce20df06d9..79c6b90dfe8 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 @@ -83,6 +83,7 @@ public class CamelJBangMain implements Callable<Integer> { .addSubcommand("inflight", new CommandLine(new ListInflight(main))) .addSubcommand("blocked", new CommandLine(new ListBlocked(main))) .addSubcommand("route-controller", new CommandLine(new RouteControllerAction(main))) + .addSubcommand("transformer", new CommandLine(new ListTransformer(main))) .addSubcommand("circuit-breaker", new CommandLine(new ListCircuitBreaker(main))) .addSubcommand("metric", new CommandLine(new ListMetric(main))) .addSubcommand("service", new CommandLine(new ListService(main))) diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListTransformer.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListTransformer.java new file mode 100644 index 00000000000..921f032507a --- /dev/null +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListTransformer.java @@ -0,0 +1,145 @@ +/* + * 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.process; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; + +import com.github.freva.asciitable.AsciiTable; +import com.github.freva.asciitable.Column; +import com.github.freva.asciitable.HorizontalAlign; +import com.github.freva.asciitable.OverflowBehaviour; +import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain; +import org.apache.camel.dsl.jbang.core.common.ProcessHelper; +import org.apache.camel.util.TimeUtils; +import org.apache.camel.util.json.JsonArray; +import org.apache.camel.util.json.JsonObject; +import picocli.CommandLine; +import picocli.CommandLine.Command; + +@Command(name = "transformer", description = "Get list of data type transformers", sortOptions = false) +public class ListTransformer extends ProcessBaseCommand { + + public static class PidNameAgeTotalCompletionCandidates implements Iterable<String> { + + public PidNameAgeTotalCompletionCandidates() { + } + + @Override + public Iterator<String> iterator() { + return List.of("pid", "name", "age", "total").iterator(); + } + + } + + @CommandLine.Parameters(description = "Name or pid of running Camel integration", arity = "0..1") + String name = "*"; + + @CommandLine.Option(names = { "--sort" }, completionCandidates = PidNameAgeTotalCompletionCandidates.class, + description = "Sort by pid, name, age or total", defaultValue = "pid") + String sort; + + public ListTransformer(CamelJBangMain main) { + super(main); + } + + @Override + public Integer doCall() throws Exception { + List<Row> rows = new ArrayList<>(); + + List<Long> pids = findPids(name); + ProcessHandle.allProcesses() + .filter(ph -> pids.contains(ph.pid())) + .forEach(ph -> { + JsonObject root = loadStatus(ph.pid()); + if (root != null) { + JsonObject context = (JsonObject) root.get("context"); + JsonObject jo = (JsonObject) root.get("transformers"); + if (context != null && jo != null) { + JsonArray array = (JsonArray) jo.get("transformers"); + for (int i = 0; i < array.size(); i++) { + JsonObject o = (JsonObject) array.get(i); + Row row = new Row(); + row.name = context.getString("name"); + if ("CamelJBang".equals(row.name)) { + row.name = ProcessHelper.extractName(root, ph); + } + row.pid = Long.toString(ph.pid()); + row.dataTypeName = o.getString("name"); + row.dataTypeFrom = o.getString("from"); + row.dataTypeTo = o.getString("to"); + row.uptime = extractSince(ph); + row.age = TimeUtils.printSince(row.uptime); + rows.add(row); + } + } + } + }); + + // sort rows + rows.sort(this::sortRow); + + if (!rows.isEmpty()) { + printTable(rows); + } + + return 0; + } + + protected void printTable(List<Row> rows) { + printer().println(AsciiTable.getTable(AsciiTable.NO_BORDERS, rows, Arrays.asList( + new Column().header("PID").headerAlign(HorizontalAlign.CENTER).with(r -> r.pid), + new Column().header("NAME").dataAlign(HorizontalAlign.LEFT).maxWidth(30, OverflowBehaviour.ELLIPSIS_RIGHT) + .with(r -> r.name), + new Column().header("AGE").headerAlign(HorizontalAlign.CENTER).with(r -> r.age), + new Column().header("DATA-TYPE").dataAlign(HorizontalAlign.LEFT).with(r -> r.dataTypeName), + new Column().header("FROM").dataAlign(HorizontalAlign.LEFT).with(r -> r.dataTypeFrom), + new Column().header("TO").dataAlign(HorizontalAlign.LEFT).with(r -> r.dataTypeTo)))); + } + + protected int sortRow(Row o1, Row o2) { + String s = sort; + int negate = 1; + if (s.startsWith("-")) { + s = s.substring(1); + negate = -1; + } + switch (s) { + case "pid": + return Long.compare(Long.parseLong(o1.pid), Long.parseLong(o2.pid)) * negate; + case "name": + return o1.name.compareToIgnoreCase(o2.name) * negate; + case "age": + return Long.compare(o1.uptime, o2.uptime) * negate; + default: + return 0; + } + } + + static class Row { + String pid; + String name; + long uptime; + String age; + String dataTypeName; + String dataTypeFrom; + String dataTypeTo; + } + +}