in utils/src/main/java/org/apache/felix/utils/resource/ResourceBuilder.java [1006:1122]
private static List<ParsedHeaderClause> parseStandardHeader(String header) {
List<ParsedHeaderClause> clauses = new ArrayList<>();
if (header == null) {
return clauses;
}
ParsedHeaderClause clause = null;
String key = null;
Map targetMap = null;
int state = CLAUSE_START;
int currentPosition = 0;
int startPosition = 0;
int length = header.length();
boolean quoted = false;
boolean escaped = false;
char currentChar;
do {
currentChar = charAt(currentPosition, header, length);
switch (state) {
case CLAUSE_START:
clause = new ParsedHeaderClause();
clauses.add(clause);
// Fall through
case PARAMETER_START:
startPosition = currentPosition;
state = KEY;
// Fall through
case KEY:
switch (currentChar) {
case ':':
case '=':
key = header.substring(startPosition, currentPosition).trim();
startPosition = currentPosition + 1;
targetMap = clause.attrs;
state = currentChar == ':' ? DIRECTIVE_OR_TYPEDATTRIBUTE : ARGUMENT;
break;
case EOF:
case ',':
case ';':
clause.paths.add(header.substring(startPosition, currentPosition).trim());
state = currentChar == ',' ? CLAUSE_START : PARAMETER_START;
break;
default:
break;
}
currentPosition++;
break;
case DIRECTIVE_OR_TYPEDATTRIBUTE:
switch (currentChar) {
case '=':
if (startPosition != currentPosition) {
clause.types.put(key, header.substring(startPosition, currentPosition).trim());
} else {
targetMap = clause.dirs;
}
state = ARGUMENT;
startPosition = currentPosition + 1;
break;
default:
break;
}
currentPosition++;
break;
case ARGUMENT:
if (currentChar == '\"') {
quoted = true;
currentPosition++;
} else {
quoted = false;
}
if (!Character.isWhitespace(currentChar)) {
state = VALUE;
} else {
currentPosition++;
}
break;
case VALUE:
if (escaped) {
escaped = false;
} else {
if (currentChar == '\\') {
escaped = true;
} else if (quoted && currentChar == '\"') {
quoted = false;
} else if (!quoted) {
String value;
switch (currentChar) {
case EOF:
case ';':
case ',':
value = header.substring(startPosition, currentPosition).trim();
if (value.startsWith("\"") && value.endsWith("\"")) {
value = value.substring(1, value.length() - 1);
}
if (targetMap.put(key, value) != null) {
throw new IllegalArgumentException(
"Duplicate '" + key + "' in: " + header);
}
state = currentChar == ';' ? PARAMETER_START : CLAUSE_START;
break;
default:
break;
}
}
}
currentPosition++;
break;
default:
break;
}
} while (currentChar != EOF);
if (state > PARAMETER_START) {
throw new IllegalArgumentException("Unable to parse header: " + header);
}
return clauses;
}