in inlong-common/src/main/java/org/apache/inlong/common/util/StringUtil.java [56:164]
public static Map<String, String> splitKv(
@Nonnull String text,
@Nonnull Character entryDelimiter,
@Nonnull Character kvDelimiter,
@Nullable Character escapeChar,
@Nullable Character quoteChar) {
Map<String, String> fields = new HashMap<>();
StringBuilder stringBuilder = new StringBuilder();
String key = "";
String value;
int state = STATE_KEY;
/*
* The state when entering escaping and quoting. When we exit escaping or quoting, we should restore this state.
*/
int kvState = STATE_KEY;
for (int i = 0; i < text.length(); ++i) {
char ch = text.charAt(i);
if (ch == kvDelimiter) {
switch (state) {
case STATE_KEY:
key = stringBuilder.toString();
stringBuilder.setLength(0);
state = STATE_VALUE;
break;
case STATE_VALUE:
throw new IllegalArgumentException("Unexpected token " + ch + " at position " + i + ".");
case STATE_ESCAPING:
stringBuilder.append(ch);
state = kvState;
break;
case STATE_QUOTING:
stringBuilder.append(ch);
break;
}
} else if (ch == entryDelimiter) {
switch (state) {
case STATE_KEY:
throw new IllegalArgumentException("Unexpected token " + ch + " at position " + i + ".");
case STATE_VALUE:
value = stringBuilder.toString();
fields.put(key, value);
stringBuilder.setLength(0);
state = STATE_KEY;
break;
case STATE_ESCAPING:
stringBuilder.append(ch);
state = kvState;
break;
case STATE_QUOTING:
stringBuilder.append(ch);
break;
}
} else if (escapeChar != null && ch == escapeChar) {
switch (state) {
case STATE_KEY:
case STATE_VALUE:
kvState = state;
state = STATE_ESCAPING;
break;
case STATE_ESCAPING:
stringBuilder.append(ch);
state = kvState;
break;
case STATE_QUOTING:
stringBuilder.append(ch);
break;
}
} else if (quoteChar != null && ch == quoteChar) {
switch (state) {
case STATE_KEY:
case STATE_VALUE:
kvState = state;
state = STATE_QUOTING;
break;
case STATE_ESCAPING:
stringBuilder.append(ch);
state = kvState;
break;
case STATE_QUOTING:
state = kvState;
break;
}
} else {
stringBuilder.append(ch);
}
}
switch (state) {
case STATE_KEY:
throw new IllegalArgumentException("Dangling key.");
case STATE_VALUE:
value = stringBuilder.toString();
fields.put(key, value);
return fields;
case STATE_ESCAPING:
throw new IllegalArgumentException("Not closed escaping.");
case STATE_QUOTING:
throw new IllegalArgumentException("Not closed quoting.");
default:
throw new IllegalStateException();
}
}