
spring.turbo.util.StringFormatter Maven / Gradle / Ivy
package spring.turbo.util;
import java.util.HashMap;
import java.util.Map;
/**
* @author 应卓
* @since 1.0.0
*/
public final class StringFormatter {
private static final char DELIM_START = '{';
private static final String DELIM_STR = "{}";
private static final char ESCAPE_CHAR = '\\';
private StringFormatter() {
}
// -----------------------------------------------------------------------------------------------------------------
public static String format(String messagePattern) {
return messagePattern;
}
public static String format(String messagePattern, Object arg) {
return format(messagePattern, new Object[]{arg});
}
public static String format(String messagePattern, Object... argArray) {
Throwable throwableCandidate = StringFormatter.getThrowableCandidate(argArray);
Object[] args = argArray;
if (throwableCandidate != null) {
args = StringFormatter.trimmedCopy(argArray);
}
return format(messagePattern, args, throwableCandidate);
}
private static String format(final String messagePattern, final Object[] argArray, Throwable throwable) {
if (messagePattern == null) {
return null;
}
if (argArray == null) {
return messagePattern;
}
int i = 0;
int j;
StringBuilder builder = new StringBuilder(messagePattern.length() + 50);
int L;
for (L = 0; L < argArray.length; L++) {
j = messagePattern.indexOf(DELIM_STR, i);
if (j == -1) {
if (i == 0) { // this is a simple string
return messagePattern;
} else {
builder.append(messagePattern, i, messagePattern.length());
return messagePattern;
}
} else {
if (isEscapedDelimiter(messagePattern, j)) {
if (!isDoubleEscaped(messagePattern, j)) {
L--;
builder.append(messagePattern, i, j - 1);
builder.append(DELIM_START);
i = j + 1;
} else {
builder.append(messagePattern, i, j - 1);
deeplyAppendParameter(builder, argArray[L], new HashMap<>());
i = j + 2;
}
} else {
builder.append(messagePattern, i, j);
deeplyAppendParameter(builder, argArray[L], new HashMap<>());
i = j + 2;
}
}
}
builder.append(messagePattern, i, messagePattern.length());
return builder.toString();
}
private static boolean isEscapedDelimiter(String messagePattern, int delimiterStartIndex) {
if (delimiterStartIndex == 0) {
return false;
}
char potentialEscape = messagePattern.charAt(delimiterStartIndex - 1);
return potentialEscape == ESCAPE_CHAR;
}
private static boolean isDoubleEscaped(String messagePattern, int delimiterStartIndex) {
return delimiterStartIndex >= 2 && messagePattern.charAt(delimiterStartIndex - 2) == ESCAPE_CHAR;
}
private static void deeplyAppendParameter(StringBuilder builder, Object o, Map
© 2015 - 2025 Weber Informatics LLC | Privacy Policy