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 21 /** 22 * Formats messages according to very simple rules. 23 * See {@link #format(String,Object)} and 24 * {@link #format(String,Object,Object)} for more details. 25 * 26 * @author Ceki Gülcü 27 */ 28 public final class MessageFormatter { 29 /** 30 * Private formatter since all methods and members are static. 31 */ 32 private MessageFormatter() { 33 super(); 34 } 35 36 /** 37 * Start of replacement block. 38 */ 39 private static final char DELIM_START = '{'; 40 /** 41 * End of replacement block. 42 */ 43 private static final char DELIM_STOP = '}'; 44 45 /** 46 * Performs single argument substitution for the 'messagePattern' passed as 47 * parameter. 48 * 49 * <p>For example, <code>MessageFormatter.format("Hi {}.", "there");</code> 50 * will return the string "Hi there.". 51 * </p> 52 * The {} pair is called the formatting element. It serves to designate the 53 * location where the argument needs to be inserted within the pattern. 54 * 55 * @param messagePattern 56 * The message pattern which will be parsed and formatted 57 * @param argument 58 * The argument to be inserted instead of the formatting element 59 * @return The formatted message 60 */ 61 public static String format(final String messagePattern, 62 final Object argument) { 63 int j = messagePattern.indexOf(DELIM_START); 64 int len = messagePattern.length(); 65 char escape = 'x'; 66 67 // if there are no { characters or { is the last character 68 // then we just return messagePattern 69 if (j == -1 || (j + 1 == len)) { 70 return messagePattern; 71 } else { 72 char delimStop = messagePattern.charAt(j + 1); 73 if (j > 0) { 74 escape = messagePattern.charAt(j - 1); 75 } 76 if ((delimStop != DELIM_STOP) || (escape == '\\')) { 77 // invalid DELIM_START/DELIM_STOP pair or espace character is 78 // present 79 return messagePattern; 80 } else { 81 StringBuffer sbuf = new StringBuffer(len + 20); 82 sbuf.append(messagePattern.substring(0, j)); 83 sbuf.append(argument); 84 sbuf.append(messagePattern.substring(j + 2)); 85 return sbuf.toString(); 86 } 87 } 88 } 89 90 /** 91 * /** 92 * Performs a two argument substitution for the 'messagePattern' passed as 93 * parameter. 94 * 95 * <p>For example, <code>MessageFormatter.format("Hi {}. My name is {}.", 96 * "there", "David");</code> will return the string 97 * "Hi there. My name is David.". 98 * </p> 99 * The '{}' pair is called a formatting element. It serves to designate the 100 * location where the arguments need to be inserted within 101 * the message pattern. 102 * 103 * @param messagePattern 104 * The message pattern which will be parsed and formatted 105 * @param arg1 106 * The first argument to replace the first formatting element 107 * @param arg2 108 * The second argument to replace the second formatting element 109 * @return The formatted message 110 */ 111 public static String format(final String messagePattern, 112 final Object arg1, 113 final Object arg2) { 114 int i = 0; 115 int len = messagePattern.length(); 116 117 StringBuffer sbuf = new StringBuffer(messagePattern.length() + 50); 118 119 for (int l = 0; l < 2; l++) { 120 int j = messagePattern.indexOf(DELIM_START, i); 121 122 if (j == -1 || (j + 1 == len)) { 123 // no more variables 124 if (i == 0) { // this is a simple string 125 return messagePattern; 126 } else { 127 // add the tail string which contains no variables 128 // and return the result. 129 sbuf.append(messagePattern.substring(i, 130 messagePattern.length())); 131 return sbuf.toString(); 132 } 133 } else { 134 char delimStop = messagePattern.charAt(j + 1); 135 if ((delimStop != DELIM_STOP)) { 136 // invalid DELIM_START/DELIM_STOP pair 137 sbuf.append(messagePattern.substring(i, 138 messagePattern.length())); 139 return sbuf.toString(); 140 } 141 sbuf.append(messagePattern.substring(i, j)); 142 if (l == 0) { 143 sbuf.append(arg1); 144 } else { 145 sbuf.append(arg2); 146 } 147 i = j + 2; 148 } 149 } 150 // append the characters following the second {} pair. 151 sbuf.append(messagePattern.substring(i, messagePattern.length())); 152 return sbuf.toString(); 153 } 154 }