[prev in list] [next in list] [prev in thread] [next in thread] 

List:       activemq-commits
Subject:    (activemq-artemis) branch main updated: ARTEMIS-4743 Improve CLI Queue Stat Output: Split lines and 
From:       clebertsuconic () apache ! org
Date:       2024-04-24 14:26:47
Message-ID: 171396880757.1377508.2590216425390687916 () gitbox2-he-fi ! apache ! org
[Download RAW message or body]

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

clebertsuconic pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git


The following commit(s) were added to refs/heads/main by this push:
     new 379515382e ARTEMIS-4743 Improve CLI Queue Stat Output: Split lines and \
include internal queue attribute 379515382e is described below

commit 379515382e07dd7c1d6e6aa7bf69b163858a58f5
Author: Clebert Suconic <clebertsuconic@apache.org>
AuthorDate: Mon Apr 22 19:16:28 2024 -0400

    ARTEMIS-4743 Improve CLI Queue Stat Output: Split lines and include internal \
                queue attribute
---
 .../artemis/cli/commands/queue/StatQueue.java      |  58 +++++++---
 .../org/apache/activemq/cli/test/ArtemisTest.java  |  55 +++++-----
 .../activemq/cli/test/MessageSerializerTest.java   |   2 +-
 .../apache/activemq/artemis/utils/TableOut.java    | 122 +++++++++++++++++++++
 .../activemq/artemis/utils/TableOutTest.java       |  58 ++++++++++
 docs/user-manual/versions.adoc                     |   2 +
 6 files changed, 250 insertions(+), 47 deletions(-)

diff --git a/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/queue/StatQueue.java \
b/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/queue/StatQueue.java
 index 17ddfdcf1c..a7d3816bba 100644
--- a/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/queue/StatQueue.java
                
+++ b/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/queue/StatQueue.java
 @@ -16,6 +16,7 @@
  */
 package org.apache.activemq.artemis.cli.commands.queue;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
@@ -29,14 +30,17 @@ import org.apache.activemq.artemis.cli.commands.ActionContext;
 import org.apache.activemq.artemis.cli.commands.messages.ConnectionAbstract;
 import org.apache.activemq.artemis.json.JsonArray;
 import org.apache.activemq.artemis.json.JsonObject;
+import org.apache.activemq.artemis.utils.TableOut;
 import picocli.CommandLine.Command;
 import picocli.CommandLine.Option;
 
 @Command(name = "stat", description = "Print basic stats of a queue. Output includes \
CONSUMER_COUNT (number of consumers), MESSAGE_COUNT (current message count on the \
queue, including scheduled, paged and in-delivery messages), MESSAGES_ADDED (messages \
added to the queue), DELIVERING_COUNT (messages broker is currently delivering to \
consumer(s)), MESSAGES_ACKED (messages acknowledged from the consumer(s))." + " \
Queues can be filtered using EITHER '--queueName X' where X is contained in t [...]  \
public class StatQueue extends ConnectionAbstract {  
+   private static final String MANAGEMENT_QUEUE = "activemq.management";
+
    public enum FIELD {
-      NAME("name"), ADDRESS("address"), CONSUMER_COUNT("consumerCount"), \
MESSAGE_COUNT("messageCount"), MESSAGES_ADDED("messagesAdded"), \
DELIVERING_COUNT("deliveringCount"), MESSAGES_ACKED("messagesAcked"), \
SCHEDULED_COUNT("scheduledCount"), ROUTING_TYPE("routingType"); +      NAME("name", \
false), ADDRESS("address", false), CONSUMER_COUNT("consumerCount", true), \
MESSAGE_COUNT("messageCount", true), MESSAGES_ADDED("messagesAdded", true), \
DELIVERING_COUNT("deliveringCount", true), MESSAGES_ACKED("messagesAcked", true), \
SCHEDULED_COUNT("scheduledCount", true), ROUTING_TYPE("routingType", true), \
INTERNAL("internalQueue", true);  
       private static final Map<String, FIELD> lookup = new \
TreeMap<>(String.CASE_INSENSITIVE_ORDER);  
@@ -47,9 +51,11 @@ public class StatQueue extends ConnectionAbstract {
       }
 
       private String jsonId;
+      private boolean center;
 
-      FIELD(String jsonId) {
+      FIELD(String jsonId, boolean center) {
          this.jsonId = jsonId;
+         this.center = center;
       }
 
       String getJsonId() {
@@ -90,6 +96,9 @@ public class StatQueue extends ConnectionAbstract {
    @Option(names = "--clustered", description = "Expands the report for all nodes on \
the topology")  private boolean clustered = false;
 
+   @Option(names = "--include-management", description = "Include queues created for \
notification management in the output") +   private boolean includeManagement = \
false; +
    private int statCount = 0;
 
    //easier for testing
@@ -216,20 +225,36 @@ public class StatQueue extends ConnectionAbstract {
       JsonArray array = queuesAsJsonObject.getJsonArray("data");
 
       int[] columnSizes = new int[FIELD.values().length];
+      boolean[] centralize = new boolean[columnSizes.length];
+
+      ArrayList<String>[] fieldTitles = new ArrayList[columnSizes.length];
 
       FIELD[] fields = FIELD.values();
       for (int i = 0; i < fields.length; i++) {
-         columnSizes[i] = fields[i].toString().length();
+         ArrayList<String> splitTitleArrayList = new ArrayList<>();
+         String[]  splitTitleStringArray = fields[i].toString().split("_");
+         centralize[i] = fields[i].center;
+
+         for (String s : splitTitleStringArray) {
+            splitTitleArrayList.add(s);
+            columnSizes[i] = Math.max(columnSizes[i], s.length());
+         }
+
+         fieldTitles[i] = splitTitleArrayList;
       }
 
       for (int i = 0; i < array.size(); i++) {
          getColumnSizes(array.getJsonObject(i), columnSizes);
       }
 
-      printHeadings(columnSizes);
+      TableOut tableOut = new TableOut("|", 2, columnSizes);
+      tableOut.print(getActionContext().out, fieldTitles, centralize);
 
       for (int i = 0; i < array.size(); i++) {
-         printQueueStats(array.getJsonObject(i), columnSizes);
+         if (!includeManagement && \
array.getJsonObject(i).getString("name").contains(MANAGEMENT_QUEUE)) { +            \
continue; +         }
+         printQueueStats(array.getJsonObject(i), columnSizes, centralize, tableOut);
          statCount++;
       }
 
@@ -240,6 +265,9 @@ public class StatQueue extends ConnectionAbstract {
 
    private void getColumnSizes(JsonObject jsonObject, int[] columnSizes) {
       int i = 0;
+      if (!includeManagement && \
jsonObject.getString("name").startsWith(MANAGEMENT_QUEUE)) { +         return;
+      }
       for (FIELD e: FIELD.values()) {
          if (jsonObject.getString(e.jsonId).length() > columnSizes[i]) {
             columnSizes[i] = jsonObject.getString(e.jsonId).length();
@@ -252,19 +280,18 @@ public class StatQueue extends ConnectionAbstract {
       }
    }
 
-   private void printHeadings(int[] columnSizes) {
-      // add 10 for the various '|' characters
-      StringBuilder stringBuilder = new \
StringBuilder(Arrays.stream(columnSizes).sum() + FIELD.values().length + \
1).append('|'); +   private void printHeadings(int[] columnSizes, TableOut tableOut) \
{ +      String[] columns = new String[columnSizes.length];
 
       int i = 0;
       for (FIELD e: FIELD.values()) {
-         stringBuilder.append(paddingString(new StringBuilder(e.toString()), \
columnSizes[i++])).append('|'); +         columns[i++] = e.toString();
       }
 
-      getActionContext().out.println(stringBuilder);
+      tableOut.print(getActionContext().out, columns);
    }
 
-   private void printQueueStats(JsonObject jsonObject, int[] columnSizes) {
+   private void printQueueStats(JsonObject jsonObject, int[] columnSizes, boolean[] \
center, TableOut tableOut) {  
       //should not happen but just in case..
       if (jsonObject == null) {
@@ -274,15 +301,12 @@ public class StatQueue extends ConnectionAbstract {
          return;
       }
 
-      // add 10 for the various '|' characters
-      StringBuilder stringBuilder = new \
StringBuilder(Arrays.stream(columnSizes).sum() + FIELD.values().length + \
                1).append('|');
-
       int i = 0;
+      String[] columns = new String[columnSizes.length];
       for (FIELD e: FIELD.values()) {
-         stringBuilder.append(paddingString(new \
StringBuilder(jsonObject.getString(e.jsonId)), columnSizes[i++])).append('|'); +      \
columns[i++] = jsonObject.getString(e.jsonId);  }
-
-      getActionContext().out.println(stringBuilder);
+      tableOut.print(getActionContext().out, columns, center);
    }
 
    private StringBuilder paddingString(StringBuilder value, int maxColumnSize) {
diff --git a/artemis-cli/src/test/java/org/apache/activemq/cli/test/ArtemisTest.java \
b/artemis-cli/src/test/java/org/apache/activemq/cli/test/ArtemisTest.java index \
                b4ee3f75b8..68ced3ce6e 100644
--- a/artemis-cli/src/test/java/org/apache/activemq/cli/test/ArtemisTest.java
+++ b/artemis-cli/src/test/java/org/apache/activemq/cli/test/ArtemisTest.java
@@ -1583,7 +1583,7 @@ public class ArtemisTest extends CliTestBase {
          statQueue.execute(context);
          ArrayList<String> lines = getOutputLines(context, false);
          // Header line + 3 queues
-         Assert.assertEquals("rows returned using queueName=Test1", 4, \
lines.size()); +         Assert.assertEquals("rows returned using queueName=Test1", \
5, lines.size());  
          //check all queues are displayed when no Filter set
          context = new TestActionContext();
@@ -1606,7 +1606,7 @@ public class ArtemisTest extends CliTestBase {
          statQueue.execute(context);
          lines = getOutputLines(context, false);
          // Header line + 3 queues
-         Assert.assertEquals("rows returned filtering by NAME ", 4, lines.size());
+         Assert.assertEquals("rows returned filtering by NAME ", 5, lines.size());
 
          //check all queues NOT containing "management" are displayed using Filter \
field NAME  context = new TestActionContext();
@@ -1619,7 +1619,7 @@ public class ArtemisTest extends CliTestBase {
          statQueue.execute(context);
          lines = getOutputLines(context, false);
          // Header line + 6 queues (Test1/11/12/20+DLQ+ExpiryQueue, but not \
                activemq.management.d6dbba78-d76f-43d6-a2c9-fc0575ed6f5d)
-         Assert.assertEquals("rows returned filtering by NAME operation \
NOT_CONTAINS", 7, lines.size()); +         Assert.assertEquals("rows returned \
filtering by NAME operation NOT_CONTAINS", 8, lines.size());  
          //check only queue named "Test1" is displayed using Filter field NAME and \
operation EQUALS  context = new TestActionContext();
@@ -1632,9 +1632,9 @@ public class ArtemisTest extends CliTestBase {
          statQueue.execute(context);
          lines = getOutputLines(context, false);
          //Header line + 1 queue only
-         Assert.assertEquals("rows returned filtering by NAME operation EQUALS", 2, \
lines.size()); +         Assert.assertEquals("rows returned filtering by NAME \
operation EQUALS", 3, lines.size());  //verify contents of queue stat line is correct
-         String queueTest1 = lines.get(1);
+         String queueTest1 = lines.get(2);
          String[] parts = queueTest1.split("\\|");
          Assert.assertEquals("queue name", "Test1", parts[1].trim());
          Assert.assertEquals("address name", "Test1", parts[2].trim());
@@ -1657,7 +1657,7 @@ public class ArtemisTest extends CliTestBase {
          statQueue.execute(context);
          lines = getOutputLines(context, false);
          // Header line + 3 queues
-         Assert.assertEquals("rows returned filtering by ADDRESS", 4, lines.size());
+         Assert.assertEquals("rows returned filtering by ADDRESS", 5, lines.size());
 
          //check all queues containing address "Test1" are displayed using Filter \
field MESSAGE_COUNT  context = new TestActionContext();
@@ -1671,7 +1671,7 @@ public class ArtemisTest extends CliTestBase {
          lines = getOutputLines(context, false);
 
          // Header line + 0 queues
-         Assert.assertEquals("rows returned filtering by MESSAGE_COUNT", 1, \
lines.size()); +         Assert.assertEquals("rows returned filtering by \
MESSAGE_COUNT", 2, lines.size());  
          //check all queues containing address "Test1" are displayed using Filter \
field MESSAGE_ADDED  context = new TestActionContext();
@@ -1684,7 +1684,7 @@ public class ArtemisTest extends CliTestBase {
          statQueue.execute(context);
          lines = getOutputLines(context, false);
          // Header line + 0 queues
-         Assert.assertEquals("rows returned filtering by MESSAGES_ADDED", 1, \
lines.size()); +         Assert.assertEquals("rows returned filtering by \
MESSAGES_ADDED", 2, lines.size());  
          //check  queues with greater_than 19 MESSAGE_ADDED  displayed
          context = new TestActionContext();
@@ -1698,8 +1698,8 @@ public class ArtemisTest extends CliTestBase {
          lines = getOutputLines(context, false);
 
          // Header line + 1 queues
-         Assert.assertEquals("rows returned filtering by MESSAGES_ADDED", 2, \
                lines.size());
-         String[] columns = lines.get(1).split("\\|");
+         Assert.assertEquals("rows returned filtering by MESSAGES_ADDED", 3, \
lines.size()); +         String[] columns = lines.get(2).split("\\|");
          Assert.assertEquals("queue name filtered by MESSAGES_ADDED GREATER_THAN ", \
"Test20", columns[2].trim());  
          //check queues with less_than 2 MESSAGE_ADDED displayed
@@ -1733,9 +1733,9 @@ public class ArtemisTest extends CliTestBase {
          statQueue.setValue("10");
          statQueue.execute(context);
          lines = getOutputLines(context, false);
-         columns = lines.get(1).split("\\|");
+         columns = lines.get(2).split("\\|");
          // Header line + 1 queues
-         Assert.assertEquals("rows returned filtering by DELIVERING_COUNT", 2, \
lines.size()); +         Assert.assertEquals("rows returned filtering by \
                DELIVERING_COUNT", 3, lines.size());
          Assert.assertEquals("queue name filtered by DELIVERING_COUNT ", "Test1", \
columns[2].trim());  
          //check all queues containing address "Test1" are displayed using Filter \
field CONSUMER_COUNT @@ -1748,9 +1748,9 @@ public class ArtemisTest extends \
CliTestBase {  statQueue.setValue("2");
          statQueue.execute(context);
          lines = getOutputLines(context, false);
-         columns = lines.get(1).split("\\|");
+         columns = lines.get(2).split("\\|");
          // Header line + 1 queues
-         Assert.assertEquals("rows returned filtering by CONSUMER_COUNT ", 2, \
lines.size()); +         Assert.assertEquals("rows returned filtering by \
                CONSUMER_COUNT ", 3, lines.size());
          Assert.assertEquals("queue name filtered by CONSUMER_COUNT ", "Test1", \
columns[2].trim());  
          //check all queues containing address "Test1" are displayed using Filter \
field MESSAGE_ACKED @@ -1763,9 +1763,9 @@ public class ArtemisTest extends \
CliTestBase {  statQueue.setValue("5");
          statQueue.execute(context);
          lines = getOutputLines(context, false);
-         columns = lines.get(1).split("\\|");
+         columns = lines.get(2).split("\\|");
          // Header line + 1 queues
-         Assert.assertEquals("rows returned filtering by MESSAGE_ACKED ", 2, \
lines.size()); +         Assert.assertEquals("rows returned filtering by \
                MESSAGE_ACKED ", 3, lines.size());
          Assert.assertEquals("queue name filtered by MESSAGE_ACKED", "Test1", \
columns[2].trim());  
          //check no queues  are displayed when name does not match
@@ -1777,7 +1777,7 @@ public class ArtemisTest extends CliTestBase {
          statQueue.execute(context);
          lines = getOutputLines(context, false);
          // Header line + 0 queues
-         Assert.assertEquals("rows returned by queueName for no Matching queue ", 1, \
lines.size()); +         Assert.assertEquals("rows returned by queueName for no \
Matching queue ", 2, lines.size());  
          //check maxrows is taking effect"
          context = new TestActionContext();
@@ -1789,7 +1789,7 @@ public class ArtemisTest extends CliTestBase {
          statQueue.execute(context);
          lines = getOutputLines(context, false);
          // Header line + 1 queue only + warning line
-         Assert.assertEquals("rows returned by maxRows=1", 3, lines.size());
+         Assert.assertEquals("rows returned by maxRows=1", 4, lines.size());
 
       } finally {
          stopServer();
@@ -1850,7 +1850,7 @@ public class ArtemisTest extends CliTestBase {
          statQueue.setQueueName(NAME);
          statQueue.execute(context);
          ArrayList<String> lines = getOutputLines(context, false);
-         Assert.assertEquals("rows returned", 2, lines.size());
+         Assert.assertEquals("rows returned", 4, lines.size());
          String[] split = lines.get(1).split("\\|");
          Assert.assertEquals(StatQueue.DEFAULT_MAX_COLUMN_SIZE, split[1].length());
 
@@ -1862,7 +1862,7 @@ public class ArtemisTest extends CliTestBase {
          statQueue.setMaxColumnSize(15);
          statQueue.execute(context);
          lines = getOutputLines(context, false);
-         Assert.assertEquals("rows returned", 2, lines.size());
+         Assert.assertEquals("rows returned", 5, lines.size());
          split = lines.get(1).split("\\|");
          Assert.assertEquals(15, split[1].length());
 
@@ -1874,7 +1874,7 @@ public class ArtemisTest extends CliTestBase {
          statQueue.setMaxColumnSize(50);
          statQueue.execute(context);
          lines = getOutputLines(context, false);
-         Assert.assertEquals("rows returned", 2, lines.size());
+         Assert.assertEquals("rows returned", 3, lines.size());
          split = lines.get(1).split("\\|");
          Assert.assertEquals(NAME.length(), split[1].length());
 
@@ -1889,10 +1889,7 @@ public class ArtemisTest extends CliTestBase {
          for (String line : lines) {
             System.out.println(line);
          }
-         Assert.assertEquals("rows returned", 2, lines.size());
-         split = lines.get(1).split("\\|");
-         Assert.assertEquals(NAME.length(), split[1].length());
-         Assert.assertEquals("CONSUMER_COUNT".length(), split[3].length());
+         Assert.assertEquals("rows returned", 3, lines.size());
       } finally {
          stopServer();
       }
@@ -2035,7 +2032,7 @@ public class ArtemisTest extends CliTestBase {
          statQueue.execute(context);
          lines = getOutputLines(context, false);
          // Header line + DEFAULT_MAX_ROWS queues + warning line
-         Assert.assertEquals("rows returned using queueName=Test", 1 + \
StatQueue.DEFAULT_MAX_ROWS, lines.size()); +         Assert.assertEquals("rows \
                returned using queueName=Test", 2 + StatQueue.DEFAULT_MAX_ROWS, \
                lines.size());
          Assert.assertFalse(lines.get(lines.size() - 1).startsWith("WARNING"));
 
          //check all queues containing "Test" are displayed
@@ -2048,7 +2045,7 @@ public class ArtemisTest extends CliTestBase {
          statQueue.execute(context);
          lines = getOutputLines(context, false);
          // Header line + DEFAULT_MAX_ROWS queues
-         Assert.assertEquals("rows returned using queueName=Test", 1 + \
StatQueue.DEFAULT_MAX_ROWS, lines.size()); +         Assert.assertEquals("rows \
                returned using queueName=Test", 2 + StatQueue.DEFAULT_MAX_ROWS, \
                lines.size());
          Assert.assertFalse(lines.get(lines.size() - 1).startsWith("WARNING"));
 
          sendMessages(session, "Test" + StatQueue.DEFAULT_MAX_ROWS, 1);
@@ -2062,7 +2059,7 @@ public class ArtemisTest extends CliTestBase {
          statQueue.execute(context);
          lines = getOutputLines(context, false);
          // Header line + DEFAULT_MAX_ROWS queues + warning line
-         Assert.assertEquals("rows returned using queueName=Test", 1 + \
StatQueue.DEFAULT_MAX_ROWS + 1, lines.size()); +         Assert.assertEquals("rows \
                returned using queueName=Test", 2 + StatQueue.DEFAULT_MAX_ROWS + 1, \
                lines.size());
          Assert.assertTrue(lines.get(lines.size() - 1).startsWith("WARNING"));
 
          //check all queues containing "Test" are displayed
@@ -2075,7 +2072,7 @@ public class ArtemisTest extends CliTestBase {
          statQueue.execute(context);
          lines = getOutputLines(context, false);
          // Header line + DEFAULT_MAX_ROWS queues + warning line
-         Assert.assertEquals("rows returned using queueName=Test", 1 + \
StatQueue.DEFAULT_MAX_ROWS + 1, lines.size()); +         Assert.assertEquals("rows \
                returned using queueName=Test", 2 + StatQueue.DEFAULT_MAX_ROWS + 1, \
                lines.size());
          Assert.assertTrue(lines.get(lines.size() - 1).startsWith("WARNING"));
 
       } finally {
diff --git a/artemis-cli/src/test/java/org/apache/activemq/cli/test/MessageSerializerTest.java \
b/artemis-cli/src/test/java/org/apache/activemq/cli/test/MessageSerializerTest.java \
                index 9d78e51297..293df4d2a6 100644
--- a/artemis-cli/src/test/java/org/apache/activemq/cli/test/MessageSerializerTest.java
                
+++ b/artemis-cli/src/test/java/org/apache/activemq/cli/test/MessageSerializerTest.java
 @@ -133,7 +133,7 @@ public class MessageSerializerTest extends CliTestBase {
       int currentMessageCount;
       try {
          // parse the value for MESSAGE_COUNT from the output
-         currentMessageCount = Integer.parseInt(getOutputLines(context, \
false).get(1).split("\\|")[4].trim()); +         currentMessageCount = \
Integer.parseInt(getOutputLines(context, false).get(2).split("\\|")[4].trim());  } \
catch (Exception e) {  currentMessageCount = 0;
       }
diff --git a/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/TableOut.java \
b/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/TableOut.java new \
file mode 100644 index 0000000000..d095685f32
--- /dev/null
+++ b/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/TableOut.java
@@ -0,0 +1,122 @@
+/*
+ * 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.activemq.artemis.utils;
+
+import java.io.PrintStream;
+import java.util.ArrayList;
+
+public class TableOut {
+
+   final String separator;
+   final int[] columnSizes;
+   final int indentation;
+   final String indentationString;
+
+   public TableOut(String separator, int indentation, int[] columnSizes) {
+      this.separator = separator;
+      this.columnSizes = columnSizes;
+      this.indentation = indentation;
+
+      // building the indentation String to be reused
+      StringBuilder indentBuilder = new StringBuilder();
+      for (int i = 0; i < indentation; i++) {
+         indentBuilder.append(' ');
+      }
+      indentationString = indentBuilder.toString();
+   }
+
+   public void print(PrintStream stream, String[] columns) {
+      print(stream, columns, null);
+   }
+
+   public void print(PrintStream stream, String[] columns, boolean[] center) {
+      ArrayList<String>[] splitColumns = new ArrayList[columns.length];
+      for (int i = 0; i < columns.length; i++) {
+         splitColumns[i] = splitLine(columns[i], columnSizes[i]);
+      }
+
+      print(stream, splitColumns, center);
+   }
+
+   public void print(PrintStream stream, ArrayList<String>[] splitColumns) {
+      print(stream, splitColumns, null);
+   }
+
+   public void print(PrintStream stream, ArrayList<String>[] splitColumns, boolean[] \
centralize) { +      boolean hasMoreLines;
+      int lineNumber = 0;
+      do {
+         hasMoreLines = false;
+         stream.print(separator);
+         for (int column = 0; column < splitColumns.length; column++) {
+            StringBuilder cell = new StringBuilder();
+
+            String cellString;
+
+            if (lineNumber < splitColumns[column].size()) {
+               cellString = splitColumns[column].get(lineNumber);
+            } else {
+               cellString = "";
+            }
+
+            if (centralize != null && centralize[column] && cellString.length() > 0) \
{ +               int centralAdd = (columnSizes[column] - cellString.length()) / 2;
+               for (int i = 0; i < centralAdd; i++) {
+                  cell.append(' ');
+               }
+            }
+
+            cell.append(cellString);
+
+            if (lineNumber + 1 < splitColumns[column].size()) {
+               hasMoreLines = true;
+            }
+            while (cell.length() < columnSizes[column]) {
+               cell.append(" ");
+            }
+            stream.print(cell);
+            stream.print(separator);
+         }
+         stream.println();
+         lineNumber++;
+      }
+      while (hasMoreLines);
+   }
+
+   public ArrayList<String> splitLine(final String column, int size) {
+      ArrayList<String> cells = new ArrayList<>();
+
+      for (int position = 0; position < column.length();) {
+         int identationUsed;
+         String identationStringUsed;
+         if (position == 0 || indentation == 0) {
+            identationUsed = 0;
+            identationStringUsed = "";
+         } else {
+            identationUsed = indentation;
+            identationStringUsed = this.indentationString;
+         }
+         int maxPosition = Math.min(size - identationUsed, column.length() - \
position); +         cells.add(identationStringUsed + column.substring(position, \
position + maxPosition)); +         position += maxPosition;
+      }
+
+      return cells;
+   }
+
+}
diff --git a/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/TableOutTest.java \
b/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/TableOutTest.java \
new file mode 100644 index 0000000000..01dafa2c36
--- /dev/null
+++ b/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/TableOutTest.java
 @@ -0,0 +1,58 @@
+/*
+ * 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.activemq.artemis.utils;
+
+import java.util.ArrayList;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class TableOutTest {
+
+   @Test
+   public void testSplitString() {
+      String bigCell = "1234554321321";
+      TableOut tableOut = new TableOut("|", 0, new int[] {10, 3, 3});
+      ArrayList<String> lines = tableOut.splitLine(bigCell, 5);
+      Assert.assertEquals(3, lines.size());
+      Assert.assertEquals("12345", lines.get(0));
+      Assert.assertEquals("54321", lines.get(1));
+      Assert.assertEquals("321", lines.get(2));
+   }
+
+   @Test
+   public void testSplitStringIdented() {
+      String bigCell = "1234532132";
+      TableOut tableOut = new TableOut("|", 2, new int[] {10, 3, 3});
+      ArrayList<String> lines = tableOut.splitLine(bigCell, 5);
+      Assert.assertEquals(3, lines.size());
+      Assert.assertEquals("12345", lines.get(0));
+      Assert.assertEquals("  321", lines.get(1));
+      Assert.assertEquals("  32", lines.get(2));
+   }
+
+   @Test
+   public void testOutLine() {
+      // the output is visual, however this test is good to make sure the output at \
least works without any issues +      TableOut tableOut = new TableOut("|", 2, new \
int[] {5, 20, 20}); +      tableOut.print(System.out, new String[]{"This is a big \
title", "1234567", "1234"}); +      tableOut = new TableOut("|", 0, new int[] {10, \
20, 20}); +      tableOut.print(System.out, new String[]{"This is a big title", \
"1234567", "1234"}, new boolean[] {true, true, true}); +   }
+
+}
diff --git a/docs/user-manual/versions.adoc b/docs/user-manual/versions.adoc
index 4f0272b3c9..e2c3822648 100644
--- a/docs/user-manual/versions.adoc
+++ b/docs/user-manual/versions.adoc
@@ -32,6 +32,8 @@ However, connections will no longer be pooled regardless of the \
                configuration.
   ** This was done in an attempt to allow administrators to act when things are not \
working as expected, to get metrics on these objects and allow more transparency for \
                the broker.
   ** this includes all Openwire Advisor queues and addresses, MQTT internal objects, \
                Cluster Store and Forward (SNF) Queues, Mirror SNF.
   ** You may want to revisit authorizations if you mean to control access to certain \
users on the web console. +* The CLI operation `./artemis queue stat` has its output \
improved and updated. If you parse the previous output you will see differences in \
the output. +  ** It is not recommended to parse the output of a CLI Operation. You \
may use jolokia calls over management instead.  
 == 2.33.0
 


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic