blob: b7af41b3f11352feafcfe386d2560d5e34432cc6 [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.log4j.pattern;
import org.apache.log4j.spi.LoggingEvent;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
* The class implements the pre log4j 1.3 org.apache.log4j.helpers.PatternConverter
* contract by delegating to the log4j 1.3 pattern implementation.
*
*
* @author Curt Arnold
* @since 1.3
*
*/
public final class BridgePatternConverter
extends org.apache.log4j.helpers.PatternConverter {
/**
* Pattern converters.
*/
private LoggingEventPatternConverter[] patternConverters;
/**
* Field widths and alignment corresponding to pattern converters.
*/
private FormattingInfo[] patternFields;
/**
* Does pattern process exceptions.
*/
private boolean handlesExceptions;
/**
* Create a new instance.
* @param pattern pattern, may not be null.
*/
public BridgePatternConverter(
final String pattern) {
next = null;
handlesExceptions = false;
List converters = new ArrayList();
List fields = new ArrayList();
Map converterRegistry = null;
PatternParser.parse(
pattern, converters, fields, converterRegistry,
PatternParser.getPatternLayoutRules());
patternConverters = new LoggingEventPatternConverter[converters.size()];
patternFields = new FormattingInfo[converters.size()];
int i = 0;
Iterator converterIter = converters.iterator();
Iterator fieldIter = fields.iterator();
while (converterIter.hasNext()) {
Object converter = converterIter.next();
if (converter instanceof LoggingEventPatternConverter) {
patternConverters[i] = (LoggingEventPatternConverter) converter;
handlesExceptions |= patternConverters[i].handlesThrowable();
} else {
patternConverters[i] =
new org.apache.log4j.pattern.LiteralPatternConverter("");
}
if (fieldIter.hasNext()) {
patternFields[i] = (FormattingInfo) fieldIter.next();
} else {
patternFields[i] = FormattingInfo.getDefault();
}
i++;
}
}
/**
* {@inheritDoc}
*/
protected String convert(final LoggingEvent event) {
//
// code should be unreachable.
//
StringBuffer sbuf = new StringBuffer();
format(sbuf, event);
return sbuf.toString();
}
/**
Format event to string buffer.
@param sbuf string buffer to receive formatted event, may not be null.
@param e event to format, may not be null.
*/
public void format(final StringBuffer sbuf, final LoggingEvent e) {
for (int i = 0; i < patternConverters.length; i++) {
int startField = sbuf.length();
patternConverters[i].format(e, sbuf);
patternFields[i].format(startField, sbuf);
}
}
/**
* Will return false if any of the conversion specifiers in the pattern
* handles {@link Exception Exceptions}.
* @return true if the pattern formats any information from exceptions.
*/
public boolean ignoresThrowable() {
return !handlesExceptions;
}
}