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ülcü 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 }