blob: f12e7c807aec5874fb34fad31707c74e3db34d24 [file] [log] [blame]
package aQute.bnd.osgi.resource;
import org.osgi.framework.namespace.*;
import aQute.bnd.version.*;
import aQute.libg.filters.*;
public class Filters {
public static final String DEFAULT_VERSION_ATTR = IdentityNamespace.CAPABILITY_VERSION_ATTRIBUTE;
/**
* Generate an LDAP-style version filter from a version range, e.g.
* {@code [1.0,2.0)} generates {@code (&(version>=1.0)(!(version>=2.0))}
*
* @param range
* @return The generated filter.
* @throws IllegalArgumentException
* If the supplied range is invalid.
*/
public static String fromVersionRange(String range) throws IllegalArgumentException {
return fromVersionRange(range, DEFAULT_VERSION_ATTR);
}
/**
* Generate an LDAP-style version filter from a version range, using a
* specific attribute name for the version; for example can be used to
* generate a range using the {@code bundle-version} attribute such as
* {@code (&(bundle-version>=1.0)(!(bundle-version>=2.0))}.
*
* @param range
* @param versionAttr
* @return The generated filter
* @throws IllegalArgumentException
* If the supplied range is invalid.
*/
public static String fromVersionRange(String range, String versionAttr) throws IllegalArgumentException {
if (range == null)
return null;
VersionRange parsedRange = new VersionRange(range);
Filter left;
if (parsedRange.includeLow())
left = new SimpleFilter(versionAttr, Operator.GreaterThanOrEqual, parsedRange.getLow().toString());
else
left = new NotFilter(new SimpleFilter(versionAttr, Operator.LessThanOrEqual, parsedRange.getLow().toString()));
Filter right;
if (!parsedRange.isRange())
right = null;
else if (parsedRange.includeHigh())
right = new SimpleFilter(versionAttr, Operator.LessThanOrEqual, parsedRange.getHigh().toString());
else
right = new NotFilter(new SimpleFilter(versionAttr, Operator.GreaterThanOrEqual, parsedRange.getHigh().toString()));
Filter result;
if (right != null)
result = new AndFilter().addChild(left).addChild(right);
else
result = left;
return result.toString();
}
}