/* * Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com * The software in this package is published under the terms of the CPAL v1.0 * license, a copy of which has been included with this distribution in the * LICENSE.txt file. */ package org.mule.runtime.core.util; import java.util.LinkedList; import java.util.List; /** * Provides a simple table implementation useful to log information in a tabular form. */ public class SimpleLoggingTable { protected static final String NEW_LINE = String.format("%n"); private static final char SEPARATOR_CHAR = '*'; private List<TableColumn> columns = new LinkedList<TableColumn>(); private final List<String[]> data = new LinkedList<String[]>(); private int width; /** * Adds a new column to the table. * * @param title column title that will be displayed in the table header * @param size the size of the column */ public void addColumn(String title, int size) { columns.add(new TableColumn(title, size)); width = calculateTableWidth(); } /** * Adds a new row of data into the table. * * @param dataRow the data to be added. DataRow must contain a value for each declared column. */ public void addDataRow(String[] dataRow) { if (dataRow.length != columns.size()) { throw new IllegalArgumentException("Data does not contain enough elements"); } data.add(dataRow.clone()); } @Override public String toString() { StringBuilder builder = new StringBuilder(); addHeaders(builder); addRows(builder); return builder.toString(); } private void addHeaders(StringBuilder builder) { addSeparatorLine(builder); for (TableColumn column : columns) { builder.append(String.format("%c %s ", SEPARATOR_CHAR, formatHeaderValue(column.name, column.width))); } builder.append(SEPARATOR_CHAR).append(NEW_LINE); addSeparatorLine(builder); } private void addRows(StringBuilder builder) { for (String[] row : data) { for (int i = 0; i < row.length; i++) { builder.append(String.format("%c %s ", SEPARATOR_CHAR, formatValue(row[i], columns.get(i).width))); } builder.append(SEPARATOR_CHAR).append(NEW_LINE); } addSeparatorLine(builder); } private void addSeparatorLine(StringBuilder builder) { builder.append(StringUtils.repeat(SEPARATOR_CHAR, width)); builder.append(NEW_LINE); } /** * Calculates the real table width based on the column sizes and the extra characters used to separate them. * * @return the real table width. */ private int calculateTableWidth() { int result = 0; for (TableColumn column : columns) { // Count three chars more per column: a separator char + 2 white spaces result = result + column.width + 3; } // Counts another separator at the right end result++; return result; } private String formatValue(String value, int size) { String result = StringUtils.substring(value, 0, size); result = StringUtils.rightPad(result, size, ' '); return result; } private String formatHeaderValue(String value, int size) { String result = StringUtils.substring(value, 0, size); result = StringUtils.center(String.format("- - + %s + - -", result), size, ' '); return result; } private class TableColumn { protected final String name; protected final int width; public TableColumn(String name, int width) { this.name = name; this.width = width; } } }