in util/src/main/java/org/apache/aries/util/manifest/ManifestHeaderProcessor.java [686:758]
private static Map<String, String> parseFilterList(String filter) {
Map<String, String> result = new HashMap<String, String>();
Set<String> negatedVersions = new HashSet<String>();
Set<String> negatedBundleVersions = new HashSet<String>();
String lowerVersion = null;
String upperVersion = null;
String lowerBundleVersion = null;
String upperBundleVersion = null;
Matcher m = FILTER_ATTR.matcher(filter);
while (m.find()) {
boolean negation = m.group(1) != null;
String attr = m.group(2);
String op = m.group(3);
String value = m.group(4);
if (Constants.VERSION_ATTRIBUTE.equals(attr)) {
if (negation) {
negatedVersions.add(value);
} else {
if (GREATER_EQ_OP.equals(op))
lowerVersion = value;
else if (LESS_EQ_OP.equals(op))
upperVersion = value;
else
throw new IllegalArgumentException();
}
} else if (Constants.BUNDLE_VERSION_ATTRIBUTE.equals(attr)) {
// bundle-version is like version, but may be specified at the
// same time
// therefore we have similar code with separate variables
if (negation) {
negatedBundleVersions.add(value);
} else {
if (GREATER_EQ_OP.equals(op))
lowerBundleVersion = value;
else if (LESS_EQ_OP.equals(op))
upperBundleVersion = value;
else
throw new IllegalArgumentException();
}
} else {
result.put(attr, value);
}
}
if (lowerVersion != null) {
StringBuilder versionAttr = new StringBuilder(lowerVersion);
if (upperVersion != null) {
versionAttr.append(",").append(upperVersion).insert(0,
negatedVersions.contains(lowerVersion) ? '(' : '[').append(
negatedVersions.contains(upperVersion) ? ')' : ']');
}
result.put(Constants.VERSION_ATTRIBUTE, versionAttr.toString());
}
// Do it again for bundle-version
if (lowerBundleVersion != null) {
StringBuilder versionAttr = new StringBuilder(lowerBundleVersion);
if (upperBundleVersion != null) {
versionAttr.append(",").append(upperBundleVersion).insert(0,
negatedBundleVersions.contains(lowerBundleVersion) ? '(' : '[')
.append(
negatedBundleVersions.contains(upperBundleVersion) ? ')' : ']');
}
result.put(Constants.BUNDLE_VERSION_ATTRIBUTE, versionAttr.toString());
}
return result;
}