in connectfeaturelauncher/src/main/java/org/osgi/framework/FrameworkUtil.java [1824:1886]
private static List<Object> parseDNchainPattern(String pattern) {
if (pattern == null) {
throw new IllegalArgumentException("The pattern must not be null.");
}
List<Object> parsed = new ArrayList<Object>();
final int length = pattern.length();
char c = ';'; // start with semi-colon to detect empty pattern
for (int startIndex = skipSpaces(pattern, 0); startIndex < length;) {
int cursor = startIndex;
int endIndex = startIndex;
out: for (boolean inQuote = false; cursor < length; cursor++) {
c = pattern.charAt(cursor);
switch (c) {
case '"' :
inQuote = !inQuote;
break;
case '\\' :
cursor++; // skip the escaped char
if (cursor == length) {
throw new IllegalArgumentException("unterminated escape");
}
break;
case ';' :
if (!inQuote) {
break out; // end of pattern
}
break;
}
if (c != ' ') { // ignore trailing whitespace
endIndex = cursor + 1;
}
}
parsed.add(pattern.substring(startIndex, endIndex));
startIndex = skipSpaces(pattern, cursor + 1);
}
if (c == ';') { // last non-whitespace character was a semi-colon
throw new IllegalArgumentException("empty pattern");
}
// Now we have parsed into a list of strings, lets make List of rdn
// out of them
for (int i = 0; i < parsed.size(); i++) {
String dn = (String) parsed.get(i);
if (dn.equals(STAR_WILDCARD) || dn.equals(MINUS_WILDCARD)) {
continue;
}
List<Object> rdns = new ArrayList<Object>();
if (dn.charAt(0) == '*') {
int index = skipSpaces(dn, 1);
if (dn.charAt(index) != ',') {
throw new IllegalArgumentException("invalid wildcard prefix");
}
rdns.add(STAR_WILDCARD);
dn = new X500Principal(dn.substring(index + 1)).getName(X500Principal.CANONICAL);
} else {
dn = new X500Principal(dn).getName(X500Principal.CANONICAL);
}
// Now dn is a nice CANONICAL DN
parseDN(dn, rdns);
parsed.set(i, rdns);
}
return parsed;
}