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.helpers;
    19
    20  import org.apache.log4j.spi.LoggingEvent;
    21
    22  /**
    23
    24     <p>PatternConverter is an abtract class that provides the
    25     formatting functionality that derived classes need.
    26
    27     <p>Conversion specifiers in a conversion patterns are parsed to
    28     individual PatternConverters. Each of which is responsible for
    29     converting a logging event in a converter specific manner.
    30
    31     @author <a href="mailto:cakalijp@Maritz.com">James P. Cakalic</a>
    32     @author Ceki G&uuml;lc&uuml;
    33
    34     @since 0.8.2
    35   */
    36  public abstract class PatternConverter {
    37    public PatternConverter next;
    38    int min = -1;
    39    int max = 0x7FFFFFFF;
    40    boolean leftAlign = false;
    41
    42    protected
    43    PatternConverter() {  }
    44
    45    protected
    46    PatternConverter(FormattingInfo fi) {
    47      min = fi.min;
    48      max = fi.max;
    49      leftAlign = fi.leftAlign;
    50    }
    51
    52    /**
    53       Derived pattern converters must override this method in order to
    54       convert conversion specifiers in the correct way.
    55    */
    56    abstract
    57    protected
    58    String convert(LoggingEvent event);
    59
    60    /**
    61       A template method for formatting in a converter specific way.
    62     */
    63    public
    64    void format(StringBuffer sbuf, LoggingEvent e) {
    65      String s = convert(e);
    66
    67      if(s == null) {
    68        if(0 < min)
    69  	spacePad(sbuf, min);
    70        return;
    71      }
    72
    73      int len = s.length();
    74
    75      if(len > max)
    76        sbuf.append(s.substring(len-max));
    77      else if(len < min) {
    78        if(leftAlign) {
    79  	sbuf.append(s);
    80  	spacePad(sbuf, min-len);
    81        }
    82        else {
    83  	spacePad(sbuf, min-len);
    84  	sbuf.append(s);
    85        }
    86      }
    87      else
    88        sbuf.append(s);
    89    }
    90
    91    static String[] SPACES = {" ", "  ", "    ", "        ", //1,2,4,8 spaces
    92  			    "                ", // 16 spaces
    93  			    "                                " }; // 32 spaces
    94
    95    /**
    96       Fast space padding method.
    97    */
    98    public
    99    void spacePad(StringBuffer sbuf, int length) {
    100     while(length >= 32) {
    101       sbuf.append(SPACES[5]);
    102       length -= 32;
    103     }
    104
    105     for(int i = 4; i >= 0; i--) {
    106       if((length & (1<<i)) != 0) {
    107 	sbuf.append(SPACES[i]);
    108       }
    109     }
    110   }
    111 }