/*
* 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.cassandra.tools.nodetool.formatter;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import javax.annotation.Nonnull;
Build and print table.
usage:
TableBuilder table = new TableBuilder();
for (String[] row : data)
{
table.add(row);
}
table.print(System.out);
/**
* Build and print table.
*
* usage:
* <pre>
* {@code
* TableBuilder table = new TableBuilder();
* for (String[] row : data)
* {
* table.add(row);
* }
* table.print(System.out);
* }
* </pre>
*/
public class TableBuilder
{
// column delimiter char
private final char columnDelimiter;
private int[] maximumColumnWidth;
private final List<String[]> rows = new ArrayList<>();
public TableBuilder()
{
this(' ');
}
public TableBuilder(char columnDelimiter)
{
this.columnDelimiter = columnDelimiter;
}
public void add(@Nonnull String... row)
{
Objects.requireNonNull(row);
if (rows.isEmpty())
{
maximumColumnWidth = new int[row.length];
}
// expand max column widths if given row has more columns
if (row.length > maximumColumnWidth.length)
{
int[] tmp = new int[row.length];
System.arraycopy(maximumColumnWidth, 0, tmp, 0, maximumColumnWidth.length);
maximumColumnWidth = tmp;
}
// calculate maximum column width
int i = 0;
for (String col : row)
{
maximumColumnWidth[i] = Math.max(maximumColumnWidth[i], col != null ? col.length() : 1);
i++;
}
rows.add(row);
}
public void printTo(PrintStream out)
{
if (rows.isEmpty())
return;
for (String[] row : rows)
{
for (int i = 0; i < maximumColumnWidth.length; i++)
{
String col = i < row.length ? row[i] : "";
out.print(String.format("%-" + maximumColumnWidth[i] + 's', col != null ? col : ""));
if (i < maximumColumnWidth.length - 1)
out.print(columnDelimiter);
}
out.println();
}
}
}