org.apache.log4j.internal.MessageFormatter Maven / Gradle / Ivy
Show all versions of pax-logging-api Show documentation
/*
* Copyright 1999,2005 The Apache Software Foundation.
*
* Licensed 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.internal;
/**
* Formats messages according to very simple rules.
* See {@link #format(String, Object)} and
* {@link #format(String, Object, Object)} for more details.
*
* @author Ceki Gülcü
*/
public class MessageFormatter
{
static final char DELIM_START = '{';
static final char DELIM_STOP = '}';
/**
* Performs single argument substitution for the 'messagePattern' passed as
* parameter.
*
* For example, MessageFormatter.format("Hi {}.", "there");
will
* return the string "Hi there.".
*
* The {} pair is called the formatting element. It serves to designate the
* location where the argument needs to be inserted within the pattern.
*
* @param messagePattern The message pattern which will be parsed and formatted
* @param argument The argument to be inserted instead of the formatting element
*
* @return The formatted message
*/
public static String format( String messagePattern, Object argument )
{
int j = messagePattern.indexOf( DELIM_START );
int len = messagePattern.length();
char escape = 'x';
// if there are no { characters or { is the last character of the messsage
// then we just return messagePattern
if( j == -1 || ( j + 1 == len ) )
{
return messagePattern;
}
else
{
if( j + 1 == len )
{
}
char delimStop = messagePattern.charAt( j + 1 );
if( j > 0 )
{
escape = messagePattern.charAt( j - 1 );
}
if( ( delimStop != DELIM_STOP ) || ( escape == '\\' ) )
{
// invalid DELIM_START/DELIM_STOP pair or espace character is
// present
return messagePattern;
}
else
{
StringBuffer sbuf = new StringBuffer( len + 20 );
sbuf.append( messagePattern.substring( 0, j ) );
sbuf.append( argument );
sbuf.append( messagePattern.substring( j + 2 ) );
return sbuf.toString();
}
}
}
/**
* /**
* Performs a two argument substitution for the 'messagePattern' passed as
* parameter.
*
* For example, MessageFormatter.format("Hi {}. My name is {}.",
* "there", "David");
will return the string "Hi there. My name is David.".
*
* The '{}' pair is called a formatting element. It serves to designate the
* location where the arguments need to be inserted within the message pattern.
*
* @param messagePattern The message pattern which will be parsed and formatted
* @param arg1 The first argument to replace the first formatting element
* @param arg2 The second argument to replace the second formatting element
*
* @return The formatted message
*/
public static String format( final String messagePattern, Object arg1, Object arg2 )
{
int i = 0;
int patternLength = messagePattern.length();
StringBuffer sbuf = new StringBuffer( patternLength + 50 );
for( int L = 0; L < 2; L++ )
{
int j = messagePattern.indexOf( DELIM_START, i );
if( j == -1 || ( j + 1 == patternLength ) )
{
// no more variables
if( i == 0 )
{ // this is a simple string
return messagePattern;
}
else
{ // add the tail string which contains no variables and return the result.
sbuf.append( messagePattern.substring( i, patternLength ) );
return sbuf.toString();
}
}
else
{
char delimStop = messagePattern.charAt( j + 1 );
if( delimStop != DELIM_STOP )
{
// invalid DELIM_START/DELIM_STOP pair
sbuf.append( messagePattern.substring( i, patternLength ) );
return sbuf.toString();
}
sbuf.append( messagePattern.substring( i, j ) );
if( L == 0 )
{
sbuf.append( arg1 );
}
else
{
sbuf.append( arg2 );
}
i = j + 2;
}
}
// append the characters following the second {} pair.
String remainder = messagePattern.substring( i, patternLength );
sbuf.append( remainder );
return sbuf.toString();
}
}