| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. 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.jackrabbit.command.info; |
| |
| import java.io.PrintWriter; |
| import java.util.Collection; |
| import java.util.Iterator; |
| |
| import org.apache.commons.chain.Context; |
| import org.apache.jackrabbit.command.CommandHelper; |
| import org.apache.jackrabbit.command.CommandException; |
| |
| /** |
| * Utility class for printing |
| */ |
| final class PrintHelper { |
| |
| /** |
| * private constructor |
| */ |
| private PrintHelper() { |
| super(); |
| } |
| |
| /** |
| * @param ctx |
| * the <code>Context</code> |
| * @param width |
| * the columns width |
| * @param text |
| * the text |
| */ |
| public static void printRow(Context ctx, int[] width, String[] text) { |
| if (width.length != text.length) { |
| throw new IllegalArgumentException( |
| "width[] and text[] haven't the same length"); |
| } |
| |
| PrintWriter out = CommandHelper.getOutput(ctx); |
| |
| int rows = 1; |
| |
| // Calculate rows |
| for (int i = 0; i < text.length; i++) { |
| int textLength = text[i].length(); |
| if (textLength == 0) { |
| textLength = 1; |
| } |
| int columnWidth = width[i]; |
| int neededRows = (int) Math.ceil((double) textLength |
| / (double) columnWidth); |
| if (neededRows > rows) { |
| rows = neededRows; |
| } |
| } |
| |
| // Write table |
| for (int row = 0; row < rows; row++) { |
| for (int column = 0; column < width.length; column++) { |
| for (int pointer = 0; pointer < width[column]; pointer++) { |
| int pos = row * width[column] + pointer; |
| if (pos < text[column].length()) { |
| out.print(text[column].charAt(pos)); |
| } else { |
| out.print(' '); |
| } |
| } |
| out.print(' '); |
| } |
| out.println(); |
| } |
| } |
| |
| /** |
| * @param ctx |
| * the <code>Context</code> |
| * @param width |
| * the column width |
| * @param separator |
| * the separator chr |
| */ |
| public static void printSeparatorRow( |
| Context ctx, |
| int[] width, |
| char separator) { |
| PrintWriter out = CommandHelper.getOutput(ctx); |
| for (int i = 0; i < width.length; i++) { |
| for (int j = 0; j <= width[i]; j++) { |
| if (j < width[i]) { |
| out.print(separator); |
| } else { |
| out.print(' '); |
| } |
| } |
| } |
| out.println(); |
| } |
| |
| /** |
| * @param ctx |
| * the <code>Context</code> |
| * @param width |
| * the column width |
| * @param texts |
| * the texts |
| * @throws CommandException |
| */ |
| public static void printRow(Context ctx, int[] width, Collection texts) |
| throws CommandException { |
| String[] text = new String[width.length]; |
| Iterator iter = texts.iterator(); |
| int column = 0; |
| while (iter.hasNext()) { |
| Object o = iter.next(); |
| if (o == null) { |
| text[column] = ""; |
| } else if (o instanceof String) { |
| text[column] = (String) o; |
| } else if (o instanceof Collection) { |
| StringBuffer sb = new StringBuffer(); |
| Iterator i = ((Collection) o).iterator(); |
| while (i.hasNext()) { |
| String str = (String) i.next(); |
| int rows = (int) Math.ceil((double) str.length() |
| / (double) width[column]); |
| if (rows == 0) { |
| rows = 1; |
| } |
| sb.append(str); |
| for (int j = 0; j < rows * width[column] - str.length(); j++) { |
| sb.append(' '); |
| } |
| } |
| text[column] = sb.toString(); |
| } else { |
| throw new CommandException("exception.illegalargument"); |
| } |
| column++; |
| } |
| printRow(ctx, width, text); |
| } |
| |
| /** |
| * @param ctx |
| * the <code>Context</code> |
| * @param widths |
| * the column width |
| * @param texts |
| * the texts |
| * @throws CommandException |
| */ |
| public static void printRow(Context ctx, Collection widths, Collection texts) |
| throws CommandException { |
| printRow(ctx, convertWidth(widths), texts); |
| } |
| |
| /** |
| * @param widths |
| * the column width |
| * @return the column width |
| * @throws CommandException |
| */ |
| private static int[] convertWidth(Collection widths) |
| throws CommandException { |
| int[] width = new int[widths.size()]; |
| int index = 0; |
| Iterator iter = widths.iterator(); |
| while (iter.hasNext()) { |
| Integer i = (Integer) iter.next(); |
| width[index] = i.intValue(); |
| index++; |
| } |
| return width; |
| } |
| |
| /** |
| * @param ctx |
| * the <code>Context</code> |
| * @param widths |
| * the columns widths |
| * @param separator |
| * the separator char |
| * @throws CommandException |
| */ |
| public static void printSeparatorRow( |
| Context ctx, |
| Collection widths, |
| char separator) throws CommandException { |
| printSeparatorRow(ctx, convertWidth(widths), separator); |
| } |
| |
| } |