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;
+    }
+
+}

Reply via email to