package aQute.bnd.deployer.repository.providers; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.osgi.service.log.LogService; public class ObrUtil { // Pattern to remove naked less-than operators and replace with // not-greater-or-equal private static final Pattern REMOVE_LT = Pattern .compile("\\(([^<>=~()]*)<([^*=]([^\\\\\\*\\(\\)]|\\\\|\\*|\\(|\\))*)\\)"); private static final String NOT_GREATER_THAN_OR_EQUAL = "(!($1>=$2))"; // Pattern to remove naked greater-than operators and replace with // not-less-than-or-equal private static final Pattern REMOVE_GT = Pattern .compile("\\(([^<>=~()]*)>([^*=]([^\\\\\\*\\(\\)]|\\\\|\\*|\\(|\\))*)\\)"); private static final String NOT_LESS_THAN_OR_EQUAL = "(!($1<=$2))"; // Patterns to search for OBR's extension "Set Arithmetic" operations private static final Pattern REMOVE_SUBSET = Pattern.compile("\\([^<>=~()]*<\\*[^)]*\\)"); private static final Pattern REMOVE_SUPERSET = Pattern.compile("\\([^<>=~()]*\\*>[^)]*\\)"); public static final String processFilter(String filter, LogService log) { filter = removeMatches(filter, REMOVE_SUBSET, log, "Removed unsupported subset clause: %s"); filter = removeMatches(filter, REMOVE_SUPERSET, log, "Removed unsupported superset clause: %s"); filter = REMOVE_LT.matcher(filter).replaceAll(NOT_GREATER_THAN_OR_EQUAL); filter = REMOVE_GT.matcher(filter).replaceAll(NOT_LESS_THAN_OR_EQUAL); return filter; } private static final String removeMatches(String string, Pattern pattern, LogService log, String messageTemplate) { Matcher matcher = pattern.matcher(string); while (matcher.find()) { String offending = matcher.group(); String before = string.substring(0, matcher.start()); String after = matcher.end() < string.length() ? string.substring(matcher.end()) : ""; string = before + after; if (log != null) log.log(LogService.LOG_INFO, String.format(messageTemplate, offending), null); matcher.reset(string); } return string; } }