package com.hwlcn.ldap.util;
import com.hwlcn.core.annotation.NotMutable;
import com.hwlcn.core.annotation.ThreadSafety;
import java.io.Serializable;
@NotMutable()
@ThreadSafety(level=ThreadSafetyLevel.COMPLETELY_THREADSAFE)
public final class FormattableColumn
implements Serializable
{
private static final long serialVersionUID = -67186391702592665L;
private final HorizontalAlignment alignment;
private final int width;
private final String[] labelLines;
public FormattableColumn(final int width, final HorizontalAlignment alignment,
final String... labelLines)
{
Validator.ensureTrue(width >= 1);
Validator.ensureNotNull(alignment, labelLines);
this.width = width;
this.alignment = alignment;
this.labelLines = labelLines;
}
public int getWidth()
{
return width;
}
public HorizontalAlignment getAlignment()
{
return alignment;
}
public String[] getLabelLines()
{
return labelLines;
}
public String getSingleLabelLine()
{
switch (labelLines.length)
{
case 0:
return "";
case 1:
return labelLines[0];
default:
final StringBuilder buffer = new StringBuilder();
buffer.append(labelLines[0]);
for (int i=1; i < labelLines.length; i++)
{
buffer.append(' ');
buffer.append(labelLines[i]);
}
return buffer.toString();
}
}
public void format(final StringBuilder buffer, final String text,
final OutputFormat format)
{
switch (format)
{
case TAB_DELIMITED_TEXT:
buffer.append(text);
break;
case CSV:
boolean quotesNeeded = false;
final int length = text.length();
final int startPos = buffer.length();
for (int i=0; i < length; i++)
{
final char c = text.charAt(i);
if (c == ',')
{
buffer.append(',');
quotesNeeded = true;
}
else if (c == '"')
{
buffer.append("\"\"");
quotesNeeded = true;
}
else if ((c >= ' ') && (c <= '~'))
{
buffer.append(c);
}
}
if (quotesNeeded)
{
buffer.insert(startPos, '"');
buffer.append('"');
}
break;
case COLUMNS:
alignment.format(buffer, text, width);
break;
}
}
@Override()
public String toString()
{
final StringBuilder buffer = new StringBuilder();
toString(buffer);
return buffer.toString();
}
public void toString(final StringBuilder buffer)
{
buffer.append("FormattableColumn(width=");
buffer.append(width);
buffer.append(", alignment=");
buffer.append(alignment);
buffer.append(", label=\"");
buffer.append(getSingleLabelLine());
buffer.append("\")");
}
}