diff --git a/src/main/java/se/progic/javalab/AmqClient.java b/src/main/java/se/progic/javalab/AmqClient.java new file mode 100644 index 0000000..2c60e45 --- /dev/null +++ b/src/main/java/se/progic/javalab/AmqClient.java @@ -0,0 +1,58 @@ +package se.progic.javalab; + +import java.util.Optional; +import org.apache.activemq.artemis.api.core.client.ActiveMQClient; +import org.apache.activemq.artemis.api.core.client.ClientMessage; +import org.apache.activemq.artemis.api.core.client.ClientRequestor; +import org.apache.activemq.artemis.api.core.client.ClientSession; +import org.apache.activemq.artemis.api.core.client.ClientSessionFactory; +import org.apache.activemq.artemis.api.core.client.ServerLocator; +import org.apache.activemq.artemis.api.core.management.ManagementHelper; +import org.apache.activemq.artemis.api.core.management.ResourceNames; + +public class AmqClient { + + public static final String REQUEST_ADDRESS = "activemq.management"; + public static final String LIST_QUEUES_OPERATION = "listQueues"; + + + public String createConnectionString(final String... urls) { + + return Optional.ofNullable(urls) + .filter(ss -> ss.length > 0) + .map(ss -> String.format("(%s)", String.join(",", ss))) + .orElseThrow(() -> new CliException("URL's must not be empty")); + } + + public String listQueues(final String connectionString, final String username, final String password) { + + try (final ServerLocator locator = ActiveMQClient.createServerLocator(connectionString); + final ClientSessionFactory sessionFactory = locator.createSessionFactory(); + final ClientSession session = sessionFactory.createSession(username, + password, + false, + true, + true, + false, + 0); + final ClientRequestor requestor = new ClientRequestor(session, REQUEST_ADDRESS)) { + + session.start(); + + final ClientMessage queueInfoReq = session.createMessage(false); + ManagementHelper.putOperationInvocation(queueInfoReq, + ResourceNames.BROKER, + LIST_QUEUES_OPERATION, + null, + 1, + Long.MAX_VALUE); + + final ClientMessage response = requestor.request(queueInfoReq); + + return (String) ManagementHelper.getResult(response); + + } catch (final Exception e) { + throw new CliException(e); + } + } +} diff --git a/src/main/java/se/progic/javalab/AmqClient.java b/src/main/java/se/progic/javalab/AmqClient.java new file mode 100644 index 0000000..2c60e45 --- /dev/null +++ b/src/main/java/se/progic/javalab/AmqClient.java @@ -0,0 +1,58 @@ +package se.progic.javalab; + +import java.util.Optional; +import org.apache.activemq.artemis.api.core.client.ActiveMQClient; +import org.apache.activemq.artemis.api.core.client.ClientMessage; +import org.apache.activemq.artemis.api.core.client.ClientRequestor; +import org.apache.activemq.artemis.api.core.client.ClientSession; +import org.apache.activemq.artemis.api.core.client.ClientSessionFactory; +import org.apache.activemq.artemis.api.core.client.ServerLocator; +import org.apache.activemq.artemis.api.core.management.ManagementHelper; +import org.apache.activemq.artemis.api.core.management.ResourceNames; + +public class AmqClient { + + public static final String REQUEST_ADDRESS = "activemq.management"; + public static final String LIST_QUEUES_OPERATION = "listQueues"; + + + public String createConnectionString(final String... urls) { + + return Optional.ofNullable(urls) + .filter(ss -> ss.length > 0) + .map(ss -> String.format("(%s)", String.join(",", ss))) + .orElseThrow(() -> new CliException("URL's must not be empty")); + } + + public String listQueues(final String connectionString, final String username, final String password) { + + try (final ServerLocator locator = ActiveMQClient.createServerLocator(connectionString); + final ClientSessionFactory sessionFactory = locator.createSessionFactory(); + final ClientSession session = sessionFactory.createSession(username, + password, + false, + true, + true, + false, + 0); + final ClientRequestor requestor = new ClientRequestor(session, REQUEST_ADDRESS)) { + + session.start(); + + final ClientMessage queueInfoReq = session.createMessage(false); + ManagementHelper.putOperationInvocation(queueInfoReq, + ResourceNames.BROKER, + LIST_QUEUES_OPERATION, + null, + 1, + Long.MAX_VALUE); + + final ClientMessage response = requestor.request(queueInfoReq); + + return (String) ManagementHelper.getResult(response); + + } catch (final Exception e) { + throw new CliException(e); + } + } +} diff --git a/src/main/java/se/progic/javalab/App.java b/src/main/java/se/progic/javalab/App.java index 32c4309..84a154f 100644 --- a/src/main/java/se/progic/javalab/App.java +++ b/src/main/java/se/progic/javalab/App.java @@ -1,8 +1,14 @@ package se.progic.javalab; +import picocli.CommandLine; + public class App { - public static void main(String... args) throws Exception { - System.out.println("Hello Messaging!"); + public static void main(String... args) { + + final CommandLine commandLine = new CommandLine(new Cli()); + final int returnCode = commandLine.execute(args); + + System.exit(returnCode); } } \ No newline at end of file diff --git a/src/main/java/se/progic/javalab/AmqClient.java b/src/main/java/se/progic/javalab/AmqClient.java new file mode 100644 index 0000000..2c60e45 --- /dev/null +++ b/src/main/java/se/progic/javalab/AmqClient.java @@ -0,0 +1,58 @@ +package se.progic.javalab; + +import java.util.Optional; +import org.apache.activemq.artemis.api.core.client.ActiveMQClient; +import org.apache.activemq.artemis.api.core.client.ClientMessage; +import org.apache.activemq.artemis.api.core.client.ClientRequestor; +import org.apache.activemq.artemis.api.core.client.ClientSession; +import org.apache.activemq.artemis.api.core.client.ClientSessionFactory; +import org.apache.activemq.artemis.api.core.client.ServerLocator; +import org.apache.activemq.artemis.api.core.management.ManagementHelper; +import org.apache.activemq.artemis.api.core.management.ResourceNames; + +public class AmqClient { + + public static final String REQUEST_ADDRESS = "activemq.management"; + public static final String LIST_QUEUES_OPERATION = "listQueues"; + + + public String createConnectionString(final String... urls) { + + return Optional.ofNullable(urls) + .filter(ss -> ss.length > 0) + .map(ss -> String.format("(%s)", String.join(",", ss))) + .orElseThrow(() -> new CliException("URL's must not be empty")); + } + + public String listQueues(final String connectionString, final String username, final String password) { + + try (final ServerLocator locator = ActiveMQClient.createServerLocator(connectionString); + final ClientSessionFactory sessionFactory = locator.createSessionFactory(); + final ClientSession session = sessionFactory.createSession(username, + password, + false, + true, + true, + false, + 0); + final ClientRequestor requestor = new ClientRequestor(session, REQUEST_ADDRESS)) { + + session.start(); + + final ClientMessage queueInfoReq = session.createMessage(false); + ManagementHelper.putOperationInvocation(queueInfoReq, + ResourceNames.BROKER, + LIST_QUEUES_OPERATION, + null, + 1, + Long.MAX_VALUE); + + final ClientMessage response = requestor.request(queueInfoReq); + + return (String) ManagementHelper.getResult(response); + + } catch (final Exception e) { + throw new CliException(e); + } + } +} diff --git a/src/main/java/se/progic/javalab/App.java b/src/main/java/se/progic/javalab/App.java index 32c4309..84a154f 100644 --- a/src/main/java/se/progic/javalab/App.java +++ b/src/main/java/se/progic/javalab/App.java @@ -1,8 +1,14 @@ package se.progic.javalab; +import picocli.CommandLine; + public class App { - public static void main(String... args) throws Exception { - System.out.println("Hello Messaging!"); + public static void main(String... args) { + + final CommandLine commandLine = new CommandLine(new Cli()); + final int returnCode = commandLine.execute(args); + + System.exit(returnCode); } } \ No newline at end of file diff --git a/src/main/java/se/progic/javalab/Cli.java b/src/main/java/se/progic/javalab/Cli.java new file mode 100644 index 0000000..50ccbfb --- /dev/null +++ b/src/main/java/se/progic/javalab/Cli.java @@ -0,0 +1,47 @@ +package se.progic.javalab; + +import java.util.List; +import java.util.concurrent.Callable; +import picocli.CommandLine.Command; +import picocli.CommandLine.Option; +import se.progic.javalab.QueueInfo.DataRow; + +@Command( + name = "dstat", + mixinStandardHelpOptions = true, + version = "1.0.0" +) +public class Cli implements Callable { + + @Option(names = {"-u", "--url"}, required = true) + private String[] urls; + + @Option(names = {"-n", "--username"}, required = true) + private String username; + + @Option(names = {"-p", "--password"}, required = true) + private String password; + + @Option(names = {"-f", "--filter"}) + private String filter; + + @Override + public Integer call() { + + try { + final AmqClient amqClient = new AmqClient(); + final String connectionString = amqClient.createConnectionString(urls); + final String result = amqClient.listQueues(connectionString, username, password); + + final OutputParser outputParser = new OutputParser(); + final List dataRows = outputParser.parseJson(result, filter); + outputParser.printOutput(dataRows); + + return 0; + + } catch (CliException e) { + System.err.println("Command failed with message: " + e.getMessage()); + return 1; + } + } +} diff --git a/src/main/java/se/progic/javalab/AmqClient.java b/src/main/java/se/progic/javalab/AmqClient.java new file mode 100644 index 0000000..2c60e45 --- /dev/null +++ b/src/main/java/se/progic/javalab/AmqClient.java @@ -0,0 +1,58 @@ +package se.progic.javalab; + +import java.util.Optional; +import org.apache.activemq.artemis.api.core.client.ActiveMQClient; +import org.apache.activemq.artemis.api.core.client.ClientMessage; +import org.apache.activemq.artemis.api.core.client.ClientRequestor; +import org.apache.activemq.artemis.api.core.client.ClientSession; +import org.apache.activemq.artemis.api.core.client.ClientSessionFactory; +import org.apache.activemq.artemis.api.core.client.ServerLocator; +import org.apache.activemq.artemis.api.core.management.ManagementHelper; +import org.apache.activemq.artemis.api.core.management.ResourceNames; + +public class AmqClient { + + public static final String REQUEST_ADDRESS = "activemq.management"; + public static final String LIST_QUEUES_OPERATION = "listQueues"; + + + public String createConnectionString(final String... urls) { + + return Optional.ofNullable(urls) + .filter(ss -> ss.length > 0) + .map(ss -> String.format("(%s)", String.join(",", ss))) + .orElseThrow(() -> new CliException("URL's must not be empty")); + } + + public String listQueues(final String connectionString, final String username, final String password) { + + try (final ServerLocator locator = ActiveMQClient.createServerLocator(connectionString); + final ClientSessionFactory sessionFactory = locator.createSessionFactory(); + final ClientSession session = sessionFactory.createSession(username, + password, + false, + true, + true, + false, + 0); + final ClientRequestor requestor = new ClientRequestor(session, REQUEST_ADDRESS)) { + + session.start(); + + final ClientMessage queueInfoReq = session.createMessage(false); + ManagementHelper.putOperationInvocation(queueInfoReq, + ResourceNames.BROKER, + LIST_QUEUES_OPERATION, + null, + 1, + Long.MAX_VALUE); + + final ClientMessage response = requestor.request(queueInfoReq); + + return (String) ManagementHelper.getResult(response); + + } catch (final Exception e) { + throw new CliException(e); + } + } +} diff --git a/src/main/java/se/progic/javalab/App.java b/src/main/java/se/progic/javalab/App.java index 32c4309..84a154f 100644 --- a/src/main/java/se/progic/javalab/App.java +++ b/src/main/java/se/progic/javalab/App.java @@ -1,8 +1,14 @@ package se.progic.javalab; +import picocli.CommandLine; + public class App { - public static void main(String... args) throws Exception { - System.out.println("Hello Messaging!"); + public static void main(String... args) { + + final CommandLine commandLine = new CommandLine(new Cli()); + final int returnCode = commandLine.execute(args); + + System.exit(returnCode); } } \ No newline at end of file diff --git a/src/main/java/se/progic/javalab/Cli.java b/src/main/java/se/progic/javalab/Cli.java new file mode 100644 index 0000000..50ccbfb --- /dev/null +++ b/src/main/java/se/progic/javalab/Cli.java @@ -0,0 +1,47 @@ +package se.progic.javalab; + +import java.util.List; +import java.util.concurrent.Callable; +import picocli.CommandLine.Command; +import picocli.CommandLine.Option; +import se.progic.javalab.QueueInfo.DataRow; + +@Command( + name = "dstat", + mixinStandardHelpOptions = true, + version = "1.0.0" +) +public class Cli implements Callable { + + @Option(names = {"-u", "--url"}, required = true) + private String[] urls; + + @Option(names = {"-n", "--username"}, required = true) + private String username; + + @Option(names = {"-p", "--password"}, required = true) + private String password; + + @Option(names = {"-f", "--filter"}) + private String filter; + + @Override + public Integer call() { + + try { + final AmqClient amqClient = new AmqClient(); + final String connectionString = amqClient.createConnectionString(urls); + final String result = amqClient.listQueues(connectionString, username, password); + + final OutputParser outputParser = new OutputParser(); + final List dataRows = outputParser.parseJson(result, filter); + outputParser.printOutput(dataRows); + + return 0; + + } catch (CliException e) { + System.err.println("Command failed with message: " + e.getMessage()); + return 1; + } + } +} diff --git a/src/main/java/se/progic/javalab/CliException.java b/src/main/java/se/progic/javalab/CliException.java new file mode 100644 index 0000000..1b359ae --- /dev/null +++ b/src/main/java/se/progic/javalab/CliException.java @@ -0,0 +1,12 @@ +package se.progic.javalab; + +public class CliException extends RuntimeException { + + public CliException(Throwable cause) { + super(cause); + } + + public CliException(String message) { + super(message); + } +} diff --git a/src/main/java/se/progic/javalab/AmqClient.java b/src/main/java/se/progic/javalab/AmqClient.java new file mode 100644 index 0000000..2c60e45 --- /dev/null +++ b/src/main/java/se/progic/javalab/AmqClient.java @@ -0,0 +1,58 @@ +package se.progic.javalab; + +import java.util.Optional; +import org.apache.activemq.artemis.api.core.client.ActiveMQClient; +import org.apache.activemq.artemis.api.core.client.ClientMessage; +import org.apache.activemq.artemis.api.core.client.ClientRequestor; +import org.apache.activemq.artemis.api.core.client.ClientSession; +import org.apache.activemq.artemis.api.core.client.ClientSessionFactory; +import org.apache.activemq.artemis.api.core.client.ServerLocator; +import org.apache.activemq.artemis.api.core.management.ManagementHelper; +import org.apache.activemq.artemis.api.core.management.ResourceNames; + +public class AmqClient { + + public static final String REQUEST_ADDRESS = "activemq.management"; + public static final String LIST_QUEUES_OPERATION = "listQueues"; + + + public String createConnectionString(final String... urls) { + + return Optional.ofNullable(urls) + .filter(ss -> ss.length > 0) + .map(ss -> String.format("(%s)", String.join(",", ss))) + .orElseThrow(() -> new CliException("URL's must not be empty")); + } + + public String listQueues(final String connectionString, final String username, final String password) { + + try (final ServerLocator locator = ActiveMQClient.createServerLocator(connectionString); + final ClientSessionFactory sessionFactory = locator.createSessionFactory(); + final ClientSession session = sessionFactory.createSession(username, + password, + false, + true, + true, + false, + 0); + final ClientRequestor requestor = new ClientRequestor(session, REQUEST_ADDRESS)) { + + session.start(); + + final ClientMessage queueInfoReq = session.createMessage(false); + ManagementHelper.putOperationInvocation(queueInfoReq, + ResourceNames.BROKER, + LIST_QUEUES_OPERATION, + null, + 1, + Long.MAX_VALUE); + + final ClientMessage response = requestor.request(queueInfoReq); + + return (String) ManagementHelper.getResult(response); + + } catch (final Exception e) { + throw new CliException(e); + } + } +} diff --git a/src/main/java/se/progic/javalab/App.java b/src/main/java/se/progic/javalab/App.java index 32c4309..84a154f 100644 --- a/src/main/java/se/progic/javalab/App.java +++ b/src/main/java/se/progic/javalab/App.java @@ -1,8 +1,14 @@ package se.progic.javalab; +import picocli.CommandLine; + public class App { - public static void main(String... args) throws Exception { - System.out.println("Hello Messaging!"); + public static void main(String... args) { + + final CommandLine commandLine = new CommandLine(new Cli()); + final int returnCode = commandLine.execute(args); + + System.exit(returnCode); } } \ No newline at end of file diff --git a/src/main/java/se/progic/javalab/Cli.java b/src/main/java/se/progic/javalab/Cli.java new file mode 100644 index 0000000..50ccbfb --- /dev/null +++ b/src/main/java/se/progic/javalab/Cli.java @@ -0,0 +1,47 @@ +package se.progic.javalab; + +import java.util.List; +import java.util.concurrent.Callable; +import picocli.CommandLine.Command; +import picocli.CommandLine.Option; +import se.progic.javalab.QueueInfo.DataRow; + +@Command( + name = "dstat", + mixinStandardHelpOptions = true, + version = "1.0.0" +) +public class Cli implements Callable { + + @Option(names = {"-u", "--url"}, required = true) + private String[] urls; + + @Option(names = {"-n", "--username"}, required = true) + private String username; + + @Option(names = {"-p", "--password"}, required = true) + private String password; + + @Option(names = {"-f", "--filter"}) + private String filter; + + @Override + public Integer call() { + + try { + final AmqClient amqClient = new AmqClient(); + final String connectionString = amqClient.createConnectionString(urls); + final String result = amqClient.listQueues(connectionString, username, password); + + final OutputParser outputParser = new OutputParser(); + final List dataRows = outputParser.parseJson(result, filter); + outputParser.printOutput(dataRows); + + return 0; + + } catch (CliException e) { + System.err.println("Command failed with message: " + e.getMessage()); + return 1; + } + } +} diff --git a/src/main/java/se/progic/javalab/CliException.java b/src/main/java/se/progic/javalab/CliException.java new file mode 100644 index 0000000..1b359ae --- /dev/null +++ b/src/main/java/se/progic/javalab/CliException.java @@ -0,0 +1,12 @@ +package se.progic.javalab; + +public class CliException extends RuntimeException { + + public CliException(Throwable cause) { + super(cause); + } + + public CliException(String message) { + super(message); + } +} diff --git a/src/main/java/se/progic/javalab/OutputParser.java b/src/main/java/se/progic/javalab/OutputParser.java new file mode 100644 index 0000000..2ca88b0 --- /dev/null +++ b/src/main/java/se/progic/javalab/OutputParser.java @@ -0,0 +1,59 @@ +package se.progic.javalab; + +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import java.io.IOException; +import java.util.List; +import se.progic.javalab.QueueInfo.DataRow; + +public class OutputParser { + + private final ObjectMapper mapper; + + public static final String ROW_FORMAT = "%-90s %-15s %-15s %-15s %-15s %-15s %-15s %-15s\n"; + + + public OutputParser() { + this.mapper = new ObjectMapper(); + this.mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + } + + public List parseJson(final String json, final String filter) { + + try { + final QueueInfo queueInfo = mapper.readValue(json, QueueInfo.class); + + final List result = queueInfo.data().stream() + .filter(row -> filter == null ? true : row.name().toUpperCase().contains(filter.toUpperCase())) + .toList(); + + return result; + } catch (IOException e) { + throw new CliException(e); + } + } + + public void printOutput(final List data) { + System.out.printf(ROW_FORMAT, + "Queue Name", + "Routing Type", + "Message Cnt", + "Consumer Cnt", + "Messages Added", + "Messages Acked", + "Delivering Cnt", + "Scheduled Cnt"); + + data.stream() + .sorted() + .forEach(row -> System.out.printf(ROW_FORMAT, + row.name(), + row.routingType(), + row.messageCount(), + row.consumerCount(), + row.messagesAdded(), + row.messagesAcknowledged(), + row.deliveringCount(), + row.scheduledCount())); + } +} diff --git a/src/main/java/se/progic/javalab/AmqClient.java b/src/main/java/se/progic/javalab/AmqClient.java new file mode 100644 index 0000000..2c60e45 --- /dev/null +++ b/src/main/java/se/progic/javalab/AmqClient.java @@ -0,0 +1,58 @@ +package se.progic.javalab; + +import java.util.Optional; +import org.apache.activemq.artemis.api.core.client.ActiveMQClient; +import org.apache.activemq.artemis.api.core.client.ClientMessage; +import org.apache.activemq.artemis.api.core.client.ClientRequestor; +import org.apache.activemq.artemis.api.core.client.ClientSession; +import org.apache.activemq.artemis.api.core.client.ClientSessionFactory; +import org.apache.activemq.artemis.api.core.client.ServerLocator; +import org.apache.activemq.artemis.api.core.management.ManagementHelper; +import org.apache.activemq.artemis.api.core.management.ResourceNames; + +public class AmqClient { + + public static final String REQUEST_ADDRESS = "activemq.management"; + public static final String LIST_QUEUES_OPERATION = "listQueues"; + + + public String createConnectionString(final String... urls) { + + return Optional.ofNullable(urls) + .filter(ss -> ss.length > 0) + .map(ss -> String.format("(%s)", String.join(",", ss))) + .orElseThrow(() -> new CliException("URL's must not be empty")); + } + + public String listQueues(final String connectionString, final String username, final String password) { + + try (final ServerLocator locator = ActiveMQClient.createServerLocator(connectionString); + final ClientSessionFactory sessionFactory = locator.createSessionFactory(); + final ClientSession session = sessionFactory.createSession(username, + password, + false, + true, + true, + false, + 0); + final ClientRequestor requestor = new ClientRequestor(session, REQUEST_ADDRESS)) { + + session.start(); + + final ClientMessage queueInfoReq = session.createMessage(false); + ManagementHelper.putOperationInvocation(queueInfoReq, + ResourceNames.BROKER, + LIST_QUEUES_OPERATION, + null, + 1, + Long.MAX_VALUE); + + final ClientMessage response = requestor.request(queueInfoReq); + + return (String) ManagementHelper.getResult(response); + + } catch (final Exception e) { + throw new CliException(e); + } + } +} diff --git a/src/main/java/se/progic/javalab/App.java b/src/main/java/se/progic/javalab/App.java index 32c4309..84a154f 100644 --- a/src/main/java/se/progic/javalab/App.java +++ b/src/main/java/se/progic/javalab/App.java @@ -1,8 +1,14 @@ package se.progic.javalab; +import picocli.CommandLine; + public class App { - public static void main(String... args) throws Exception { - System.out.println("Hello Messaging!"); + public static void main(String... args) { + + final CommandLine commandLine = new CommandLine(new Cli()); + final int returnCode = commandLine.execute(args); + + System.exit(returnCode); } } \ No newline at end of file diff --git a/src/main/java/se/progic/javalab/Cli.java b/src/main/java/se/progic/javalab/Cli.java new file mode 100644 index 0000000..50ccbfb --- /dev/null +++ b/src/main/java/se/progic/javalab/Cli.java @@ -0,0 +1,47 @@ +package se.progic.javalab; + +import java.util.List; +import java.util.concurrent.Callable; +import picocli.CommandLine.Command; +import picocli.CommandLine.Option; +import se.progic.javalab.QueueInfo.DataRow; + +@Command( + name = "dstat", + mixinStandardHelpOptions = true, + version = "1.0.0" +) +public class Cli implements Callable { + + @Option(names = {"-u", "--url"}, required = true) + private String[] urls; + + @Option(names = {"-n", "--username"}, required = true) + private String username; + + @Option(names = {"-p", "--password"}, required = true) + private String password; + + @Option(names = {"-f", "--filter"}) + private String filter; + + @Override + public Integer call() { + + try { + final AmqClient amqClient = new AmqClient(); + final String connectionString = amqClient.createConnectionString(urls); + final String result = amqClient.listQueues(connectionString, username, password); + + final OutputParser outputParser = new OutputParser(); + final List dataRows = outputParser.parseJson(result, filter); + outputParser.printOutput(dataRows); + + return 0; + + } catch (CliException e) { + System.err.println("Command failed with message: " + e.getMessage()); + return 1; + } + } +} diff --git a/src/main/java/se/progic/javalab/CliException.java b/src/main/java/se/progic/javalab/CliException.java new file mode 100644 index 0000000..1b359ae --- /dev/null +++ b/src/main/java/se/progic/javalab/CliException.java @@ -0,0 +1,12 @@ +package se.progic.javalab; + +public class CliException extends RuntimeException { + + public CliException(Throwable cause) { + super(cause); + } + + public CliException(String message) { + super(message); + } +} diff --git a/src/main/java/se/progic/javalab/OutputParser.java b/src/main/java/se/progic/javalab/OutputParser.java new file mode 100644 index 0000000..2ca88b0 --- /dev/null +++ b/src/main/java/se/progic/javalab/OutputParser.java @@ -0,0 +1,59 @@ +package se.progic.javalab; + +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import java.io.IOException; +import java.util.List; +import se.progic.javalab.QueueInfo.DataRow; + +public class OutputParser { + + private final ObjectMapper mapper; + + public static final String ROW_FORMAT = "%-90s %-15s %-15s %-15s %-15s %-15s %-15s %-15s\n"; + + + public OutputParser() { + this.mapper = new ObjectMapper(); + this.mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + } + + public List parseJson(final String json, final String filter) { + + try { + final QueueInfo queueInfo = mapper.readValue(json, QueueInfo.class); + + final List result = queueInfo.data().stream() + .filter(row -> filter == null ? true : row.name().toUpperCase().contains(filter.toUpperCase())) + .toList(); + + return result; + } catch (IOException e) { + throw new CliException(e); + } + } + + public void printOutput(final List data) { + System.out.printf(ROW_FORMAT, + "Queue Name", + "Routing Type", + "Message Cnt", + "Consumer Cnt", + "Messages Added", + "Messages Acked", + "Delivering Cnt", + "Scheduled Cnt"); + + data.stream() + .sorted() + .forEach(row -> System.out.printf(ROW_FORMAT, + row.name(), + row.routingType(), + row.messageCount(), + row.consumerCount(), + row.messagesAdded(), + row.messagesAcknowledged(), + row.deliveringCount(), + row.scheduledCount())); + } +} diff --git a/src/main/java/se/progic/javalab/QueueInfo.java b/src/main/java/se/progic/javalab/QueueInfo.java new file mode 100644 index 0000000..cc025a8 --- /dev/null +++ b/src/main/java/se/progic/javalab/QueueInfo.java @@ -0,0 +1,24 @@ +package se.progic.javalab; + +import java.util.List; + +public record QueueInfo(List data) { + + public record DataRow(String name, + String routingType, + long messageCount, + long consumerCount, + long messagesAdded, + long messagesAcknowledged, + long deliveringCount, + long scheduledCount) implements Comparable { + + @Override + public int compareTo(DataRow that) { + + return this.routingType().compareTo(that.routingType()) == 0 ? + this.name().compareTo(that.name()) : this.routingType().compareTo(that.routingType()); + + } + } +}