Author: davsclaus Date: Fri Jul 6 11:53:40 2012 New Revision: 1358148 URL: http://svn.apache.org/viewvc?rev=1358148&view=rev Log: CAMEL-4931: Improved camel karaf command to compute max length of columns to look nicer in display. Thanks to Reuben for the patch.
Modified: camel/trunk/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/ContextList.java Modified: camel/trunk/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/ContextList.java URL: http://svn.apache.org/viewvc/camel/trunk/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/ContextList.java?rev=1358148&r1=1358147&r2=1358148&view=diff ============================================================================== --- camel/trunk/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/ContextList.java (original) +++ camel/trunk/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/ContextList.java Fri Jul 6 11:53:40 2012 @@ -16,20 +16,34 @@ */ package org.apache.camel.karaf.commands; +import java.io.PrintStream; +import java.util.Hashtable; import java.util.List; +import java.util.Map; import org.apache.camel.CamelContext; import org.apache.felix.gogo.commands.Command; import org.apache.karaf.shell.console.OsgiCommandSupport; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + /** * List the Camel contexts available in the Karaf instance. */ @Command(scope = "camel", name = "context-list", description = "Lists all Camel contexts.") public class ContextList extends OsgiCommandSupport { - protected static final String HEADER_FORMAT = "%-20s %-20s %-20s"; - protected static final String OUTPUT_FORMAT = "[%-18s] [%-18s] [%-18s]"; + private static final String NAME_COLUMN_LABEL = "Name"; + private static final String STATUS_COLUMN_LABEL = "Status"; + private static final String UPTIME_COLUMN_LABEL = "Uptime"; + private static final int DEFAULT_FORMAT_BUFFER_LENGTH = 24; + private static final String DEFAULT_FIELD_PREAMBLE = "[ "; + private static final String DEFAULT_FIELD_POSTAMBLE = " ]"; + private static final String DEFAULT_HEADER_PREAMBLE = " "; + private static final String DEFAULT_HEADER_POSTAMBLE = " "; + private static final int DEFAULT_COLUMN_WIDTH_INCREMENT = 0; + private static final int MAX_COLUMN_WIDTH = Integer.MAX_VALUE; private CamelController camelController; @@ -38,14 +52,74 @@ public class ContextList extends OsgiCom } protected Object doExecute() throws Exception { - System.out.println(String.format(HEADER_FORMAT, "Name", "Status", "Uptime")); + final List<CamelContext> camelContexts = camelController.getCamelContexts(); - List<CamelContext> camelContexts = camelController.getCamelContexts(); - for (CamelContext camelContext : camelContexts) { - System.out.println(String.format(OUTPUT_FORMAT, camelContext.getName(), camelContext.getStatus(), camelContext.getUptime())); + final Map<String, Integer> columnWidths = computeColumnWidths(camelContexts); + final String headerFormat = buildFormatString(columnWidths, true); + final String rowFormat = buildFormatString(columnWidths, false); + final PrintStream out = System.out; + + if (camelContexts.size() > 0) { + out.println(String.format(headerFormat, NAME_COLUMN_LABEL, STATUS_COLUMN_LABEL, UPTIME_COLUMN_LABEL)); + for (final CamelContext camelContext : camelContexts) { + out.println(String.format(rowFormat, camelContext.getName(), camelContext.getStatus(), camelContext.getUptime())); + } } return null; } + private static Map<String, Integer> computeColumnWidths(final Iterable<CamelContext> camelContexts) throws Exception { + if (camelContexts == null) { + throw new IllegalArgumentException("unable to determine column widths from null Iterable<CamelContext>"); + } else { + int maxNameLen = 0; + int maxStatusLen = 0; + int maxUptimeLen = 0; + + for (final CamelContext camelContext : camelContexts) { + final String name = camelContext.getName(); + maxNameLen = java.lang.Math.max(maxNameLen, name == null ? 0 : name.length()); + + final String status = camelContext.getStatus().toString(); + maxStatusLen = java.lang.Math.max(maxStatusLen, status == null ? 0 : status.length()); + + final String uptime = camelContext.getUptime(); + maxUptimeLen = java.lang.Math.max(maxUptimeLen, uptime == null ? 0 : uptime.length()); + } + + final Map<String, Integer> retval = new Hashtable(3); + retval.put(NAME_COLUMN_LABEL, maxNameLen); + retval.put(STATUS_COLUMN_LABEL, maxStatusLen); + retval.put(UPTIME_COLUMN_LABEL, maxUptimeLen); + + return retval; + } + } + + private static String buildFormatString(final Map<String, Integer> columnWidths, final boolean isHeader) { + final String fieldPreamble; + final String fieldPostamble; + final int columnWidthIncrement; + + if (isHeader) { + fieldPreamble = DEFAULT_HEADER_PREAMBLE; + fieldPostamble = DEFAULT_HEADER_POSTAMBLE; + } else { + fieldPreamble = DEFAULT_FIELD_PREAMBLE; + fieldPostamble = DEFAULT_FIELD_POSTAMBLE; + } + columnWidthIncrement = DEFAULT_COLUMN_WIDTH_INCREMENT; + + final int nameLen = java.lang.Math.min(columnWidths.get(NAME_COLUMN_LABEL) + columnWidthIncrement, MAX_COLUMN_WIDTH); + final int statusLen = java.lang.Math.min(columnWidths.get(STATUS_COLUMN_LABEL) + columnWidthIncrement, MAX_COLUMN_WIDTH); + final int uptimeLen = java.lang.Math.min(columnWidths.get(UPTIME_COLUMN_LABEL) + columnWidthIncrement, MAX_COLUMN_WIDTH); + + final StringBuilder retval = new StringBuilder(DEFAULT_FORMAT_BUFFER_LENGTH); + retval.append(fieldPreamble).append("%-").append(nameLen).append('.').append(nameLen).append('s').append(fieldPostamble).append(' '); + retval.append(fieldPreamble).append("%-").append(statusLen).append('.').append(statusLen).append('s').append(fieldPostamble).append(' '); + retval.append(fieldPreamble).append("%-").append(uptimeLen).append('.').append(uptimeLen).append('s').append(fieldPostamble).append(' '); + + return retval.toString(); + } }