blob: bd88679723cbf0e6e8e5960883154a7da35e6710 [file] [log] [blame]
/*
* 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.logging.log4j.core.pattern;
import org.apache.logging.log4j.util.PerformanceSensitive;
/**
* Modifies the output of a pattern converter for a specified minimum and maximum width and alignment.
*/
@PerformanceSensitive("allocation")
public final class FormattingInfo {
/**
* Array of spaces.
*/
private static final char[] SPACES = new char[] { ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' };
/**
* Array of zeros.
*/
private static final char[] ZEROS = new char[] { '0', '0', '0', '0', '0', '0', '0', '0' };
/**
* Default instance.
*/
private static final FormattingInfo DEFAULT = new FormattingInfo(false, 0, Integer.MAX_VALUE, true);
/**
* Minimum length.
*/
private final int minLength;
/**
* Maximum length.
*/
private final int maxLength;
/**
* Alignment.
*/
private final boolean leftAlign;
/**
* Left vs. right-hand side truncation.
*/
private final boolean leftTruncate;
/**
* Use zero-padding instead whitespace padding
*/
private final boolean zeroPad;
/**
* Creates new instance.
*
* @param leftAlign
* left align if true.
* @param minLength
* minimum length.
* @param maxLength
* maximum length.
* @param leftTruncate
* truncates to the left if true
*/
public FormattingInfo(final boolean leftAlign, final int minLength, final int maxLength, final boolean leftTruncate) {
this(leftAlign, minLength, maxLength, leftTruncate, false);
}
/**
* Creates new instance.
*
* @param leftAlign
* left align if true.
* @param minLength
* minimum length.
* @param maxLength
* maximum length.
* @param leftTruncate
* truncates to the left if true
* @param zeroPad
* use zero-padding instead of whitespace-padding
*/
public FormattingInfo(final boolean leftAlign, final int minLength, final int maxLength, final boolean leftTruncate, final boolean zeroPad) {
this.leftAlign = leftAlign;
this.minLength = minLength;
this.maxLength = maxLength;
this.leftTruncate = leftTruncate;
this.zeroPad = zeroPad;
}
/**
* Gets default instance.
*
* @return default instance.
*/
public static FormattingInfo getDefault() {
return DEFAULT;
}
/**
* Determine if left aligned.
*
* @return true if left aligned.
*/
public boolean isLeftAligned() {
return leftAlign;
}
/**
* Determine if left truncated.
*
* @return true if left truncated.
*/
public boolean isLeftTruncate() {
return leftTruncate;
}
/**
* Determine if zero-padded.
*
* @return true if zero-padded.
*/
public boolean isZeroPad() {
return zeroPad;
}
/**
* Get minimum length.
*
* @return minimum length.
*/
public int getMinLength() {
return minLength;
}
/**
* Get maximum length.
*
* @return maximum length.
*/
public int getMaxLength() {
return maxLength;
}
/**
* Adjust the content of the buffer based on the specified lengths and alignment.
*
* @param fieldStart
* start of field in buffer.
* @param buffer
* buffer to be modified.
*/
public void format(final int fieldStart, final StringBuilder buffer) {
final int rawLength = buffer.length() - fieldStart;
if (rawLength > maxLength) {
if (leftTruncate) {
buffer.delete(fieldStart, buffer.length() - maxLength);
} else {
buffer.delete(fieldStart + maxLength, fieldStart + buffer.length());
}
} else if (rawLength < minLength) {
if (leftAlign) {
final int fieldEnd = buffer.length();
buffer.setLength(fieldStart + minLength);
for (int i = fieldEnd; i < buffer.length(); i++) {
buffer.setCharAt(i, ' ');
}
} else {
int padLength = minLength - rawLength;
final char[] paddingArray= zeroPad ? ZEROS : SPACES;
for (; padLength > paddingArray.length; padLength -= paddingArray.length) {
buffer.insert(fieldStart, paddingArray);
}
buffer.insert(fieldStart, paddingArray, 0, padLength);
}
}
}
/**
* Returns a String suitable for debugging.
*
* @return a String suitable for debugging.
*/
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append(super.toString());
sb.append("[leftAlign=");
sb.append(leftAlign);
sb.append(", maxLength=");
sb.append(maxLength);
sb.append(", minLength=");
sb.append(minLength);
sb.append(", leftTruncate=");
sb.append(leftTruncate);
sb.append(", zeroPad=");
sb.append(zeroPad);
sb.append(']');
return sb.toString();
}
}