in dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/util/RestUtils.java [56:187]
public static String replacePlaceholder(String text, Function<String, String> resolver) {
if (text == null) {
return null;
}
int len = text.length();
if (len < 2) {
return text;
}
int p = 0, nameStart = 0, nameEnd = 0, valueStart = 0, valueEnd = 0;
String value;
StringBuilder buf = null;
int state = State.START;
for (int i = 0; i < len; i++) {
char c = text.charAt(i);
switch (c) {
case '$':
if (state == State.START) {
if (buf == null) {
buf = new StringBuilder(len);
}
buf.append(text, p, i);
p = i;
state = State.DOLLAR;
} else if (state == State.DOLLAR) {
if (buf == null) {
buf = new StringBuilder(len);
}
buf.append(text, p, i - 1);
p = i;
state = State.START;
}
break;
case '{':
state = state == State.DOLLAR ? State.BRACE_OPEN : State.START;
break;
case ':':
state = state == State.NAME_START ? State.COLON : State.START;
break;
case '}':
switch (state) {
case State.DOLLAR:
case State.BRACE_OPEN:
state = State.START;
break;
case State.COLON:
state = State.START;
valueStart = i;
break;
case State.DOLLAR_NAME_START:
case State.NAME_START:
case State.VALUE_START:
value = resolver.apply(text.substring(nameStart, nameEnd));
if (buf == null) {
buf = new StringBuilder(len);
}
if (value == null) {
if (state == State.VALUE_START) {
buf.append(text, valueStart, valueEnd);
} else {
buf.append(text, p, i + 1);
}
} else {
buf.append(value);
}
p = i + 1;
state = State.START;
break;
default:
}
break;
case ' ':
case '\t':
case '\n':
case '\r':
if (state == State.DOLLAR_NAME_START) {
state = State.START;
value = resolver.apply(text.substring(nameStart, nameEnd));
if (buf == null) {
buf = new StringBuilder(len);
}
if (value == null) {
buf.append(text, p, i);
} else {
buf.append(value);
}
p = i;
}
break;
default:
switch (state) {
case State.DOLLAR:
state = State.DOLLAR_NAME_START;
nameStart = i;
break;
case State.BRACE_OPEN:
state = State.NAME_START;
nameStart = i;
break;
case State.COLON:
state = State.VALUE_START;
valueStart = i;
break;
case State.DOLLAR_NAME_START:
case State.NAME_START:
nameEnd = i + 1;
break;
case State.VALUE_START:
valueEnd = i + 1;
break;
default:
}
}
}
if (state == State.DOLLAR_NAME_START) {
value = resolver.apply(text.substring(nameStart, nameEnd));
if (buf == null) {
buf = new StringBuilder(len);
}
if (value == null) {
buf.append(text, p, len);
} else {
buf.append(value);
}
} else {
if (buf == null) {
return text;
}
buf.append(text, p, len);
}
return buf.toString();
}