View Javadoc

    1   /*
    2    * Licensed to the Apache Software Foundation (ASF) under one or more
    3    * contributor license agreements.  See the NOTICE file distributed with
    4    * this work for additional information regarding copyright ownership.
    5    * The ASF licenses this file to You under the Apache License, Version 2.0
    6    * (the "License"); you may not use this file except in compliance with
    7    * the License.  You may obtain a copy of the License at
    8    *
    9    *      http://www.apache.org/licenses/LICENSE-2.0
    10   *
    11   * Unless required by applicable law or agreed to in writing, software
    12   * distributed under the License is distributed on an "AS IS" BASIS,
    13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14   * See the License for the specific language governing permissions and
    15   * limitations under the License.
    16   */
    17
    18  package org.apache.log4j.pattern;
    19
    20
    21  /**
    22   * Modifies the output of a pattern converter for a specified minimum
    23   * and maximum width and alignment.
    24   *
    25   *
    26   *  @author <a href=mailto:jim_cakalic@na.biomerieux.com>Jim Cakalic</a>
    27   *  @author Ceki G&uuml;lc&uuml;
    28   *  @author Curt Arnold
    29   *
    30   */
    31  public final class FormattingInfo {
    32    /**
    33     *  Array of spaces.
    34     */
    35    private static final char[] SPACES =
    36      new char[] { ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' };
    37
    38    /**
    39     * Default instance.
    40     */
    41    private static final FormattingInfo DEFAULT =
    42      new FormattingInfo(false, 0, Integer.MAX_VALUE);
    43
    44    /**
    45     * Minimum length.
    46     */
    47    private final int minLength;
    48
    49    /**
    50     * Maximum length.
    51     */
    52    private final int maxLength;
    53
    54    /**
    55     * Alignment.
    56     */
    57    private final boolean leftAlign;
    58
    59    /**
    60     * Creates new instance.
    61     * @param leftAlign left align if true.
    62     * @param minLength minimum length.
    63     * @param maxLength maximum length.
    64     */
    65    public FormattingInfo(
    66      final boolean leftAlign, final int minLength, final int maxLength) {
    67      this.leftAlign = leftAlign;
    68      this.minLength = minLength;
    69      this.maxLength = maxLength;
    70    }
    71
    72    /**
    73     * Gets default instance.
    74     * @return default instance.
    75     */
    76    public static FormattingInfo getDefault() {
    77      return DEFAULT;
    78    }
    79
    80    /**
    81     * Determine if left aligned.
    82     * @return true if left aligned.
    83     */
    84    public boolean isLeftAligned() {
    85      return leftAlign;
    86    }
    87
    88    /**
    89     * Get minimum length.
    90     * @return minimum length.
    91     */
    92    public int getMinLength() {
    93      return minLength;
    94    }
    95
    96    /**
    97     * Get maximum length.
    98     * @return maximum length.
    99     */
    100   public int getMaxLength() {
    101     return maxLength;
    102   }
    103
    104   /**
    105    * Adjust the content of the buffer based on the specified lengths and alignment.
    106    *
    107    * @param fieldStart start of field in buffer.
    108    * @param buffer buffer to be modified.
    109    */
    110   public void format(final int fieldStart, final StringBuffer buffer) {
    111     final int rawLength = buffer.length() - fieldStart;
    112
    113     if (rawLength > maxLength) {
    114       buffer.delete(fieldStart, buffer.length() - maxLength);
    115     } else if (rawLength < minLength) {
    116       if (leftAlign) {
    117         final int fieldEnd = buffer.length();
    118         buffer.setLength(fieldStart + minLength);
    119
    120         for (int i = fieldEnd; i < buffer.length(); i++) {
    121           buffer.setCharAt(i, ' ');
    122         }
    123       } else {
    124         int padLength = minLength - rawLength;
    125
    126         for (; padLength > 8; padLength -= 8) {
    127           buffer.insert(fieldStart, SPACES);
    128         }
    129
    130         buffer.insert(fieldStart, SPACES, 0, padLength);
    131       }
    132     }
    133   }
    134 }