package org.springframework.roo.addon.cloud.foundry; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Listener for Shell events to support automatic Git repository commits. * * @author James Tyrrell * @since 1.1.3 */ public class ShellTableRenderer { private static final int COLUMN_PADDING = 5; private final Map<Integer, List<String>> columnMap = new HashMap<Integer, List<String>>(); private final String title; /** * Constructor * * @param title * @param headings */ public ShellTableRenderer(final String title, final String... headings) { this.title = title; for (final String heading : headings) { addColumn(heading); } } public void addColumn(final String heading) { final int position = columnMap.isEmpty() ? 0 : columnMap.size(); final List<String> list = new ArrayList<String>(); list.add(heading); list.add(getUnderline(heading.length())); columnMap.put(position, list); } public void addRow(final String... values) { for (int i = 0; i < columnMap.size(); i++) { final String value = values[i]; final List<String> list = columnMap.get(i); list.add(value); } } public int getColumnWidth(final int columnNumber) { final List<String> stringList = columnMap.get(columnNumber); if (stringList == null) { return 0; } int largestValue = 0; for (final String value : stringList) { if (value.length() > largestValue) { largestValue = value.length(); } } return largestValue + COLUMN_PADDING; } public String getOutput() { final StringBuilder table = new StringBuilder(); int i = 0; int longestRow = 0; while (true) { final StringBuilder entry = new StringBuilder(); boolean timeToStop = false; for (int j = 0; j < columnMap.size(); j++) { final List<String> list = columnMap.get(j); if (i >= list.size()) { timeToStop = true; continue; } final int columnWidth = getColumnWidth(j); final String text = columnMap.get(j).get(i); entry.append(text); if (j < columnMap.size() - 1) { entry.append(getPadding(columnWidth - text.length())); } } i++; if (entry.length() > longestRow) { longestRow = entry.length(); } entry.append("\n"); table.append(entry); if (timeToStop) { break; } } final StringBuilder titleBuilder = new StringBuilder(); titleBuilder.append("\n"); if (longestRow > title.length() + 2) { final int titleLengthPlusPadding = title.length() + 2; final String padding = " "; final String emphasis = getRepeatingChars('=', (longestRow - titleLengthPlusPadding) / 2); String extra = ""; if (titleLengthPlusPadding % 2 != 0) { extra = "="; } titleBuilder.append(emphasis).append(padding).append(title) .append(padding).append(emphasis).append(extra) .append("\n\n"); } else { titleBuilder.append("= ").append(title).append(" =").append("\n\n"); } titleBuilder.append(table); return titleBuilder.toString(); } private String getPadding(final int paddingRequired) { return getRepeatingChars(' ', paddingRequired); } private String getRepeatingChars(final char c, final int repeat) { final StringBuilder sb = new StringBuilder(); for (int i = 0; i < repeat; i++) { sb.append(c); } return sb.toString(); } private String getUnderline(final int underlineRequired) { return getRepeatingChars('-', underlineRequired); } }