private static final class FrameworkUtil.FilterImpl extends java.lang.Object implements Filter
The syntax of a filter string is the string representation of LDAP search filters as defined in RFC 1960: A String Representation of LDAP Search Filters (available at http://www.ietf.org/rfc/rfc1960.txt). It should be noted that RFC 2254: A String Representation of LDAP Search Filters (available at http://www.ietf.org/rfc/rfc2254.txt) supersedes RFC 1960 but only adds extensible matching and is not applicable for this API.
The string representation of an LDAP search filter is defined by the following grammar. It uses a prefix format.
<filter> ::= '(' <filtercomp> ')' <filtercomp> ::= <and> | <or> | <not> | <item> <and> ::= '&' <filterlist> <or> ::= '|' <filterlist> <not> ::= '!' <filter> <filterlist> ::= <filter> | <filter> <filterlist> <item> ::= <simple> | <present> | <substring> <simple> ::= <attr> <filtertype> <value> <filtertype> ::= <equal> | <approx> | <greater> | <less> <equal> ::= '=' <approx> ::= '˜=' <greater> ::= '>=' <less> ::= '<=' <present> ::= <attr> '=*' <substring> ::= <attr> '=' <initial> <any> <final> <initial> ::= NULL | <value> <any> ::= '*' <starval> <starval> ::= NULL | <value> '*' <starval> <final> ::= NULL | <value>
<attr>
is a string representing an attribute, or key, in
the properties objects of the registered services. Attribute names are
not case sensitive; that is cn and CN both refer to the same attribute.
<value>
is a string representing the value, or part of one,
of a key in the properties objects of the registered services. If a
<value>
must contain one of the characters ' *
' or
'(
' or ')
', these characters should be escaped by
preceding them with the backslash '\
' character. Note that
although both the <substring>
and <present>
productions can produce the 'attr=*'
construct, this construct is
used only to denote a presence filter.
Examples of LDAP filters are:
"(cn=Babs Jensen)" "(!(cn=Tim Howes))" "(&(" + Constants.OBJECTCLASS + "=Person)(|(sn=Jensen)(cn=Babs J*)))" "(o=univ*of*mich*)"
The approximate match (~=
) is implementation specific but should
at least ignore case and white space differences. Optional are codes like
soundex or other smart "closeness" comparisons.
Comparison of values is not straightforward. Strings are compared differently than numbers and it is possible for a key to have multiple values. Note that that keys in the match argument must always be strings. The comparison is defined by the object type of the key's value. The following rules apply for comparison:
A filter matches a key that has multiple values if it matches at least one of those values. For example,Note: arrays of primitives are also supported.
Property Value Type Comparison Type String String comparison Integer, Long, Float, Double, Byte, Short, BigInteger, BigDecimal numerical comparison Character character comparison Boolean equality comparisons only [] (array) recursively applied to values Collection recursively applied to values
Dictionary d = new Hashtable(); d.put("cn", new String[] {"a", "b", "c"});d will match
(cn=a)
and also (cn=b)
A filter component that references a key having an unrecognizable data
type will evaluate to false
.
Modifier and Type | Class and Description |
---|---|
private static class |
FrameworkUtil.FilterImpl.Parser
Parser class for OSGi filter strings.
|
Modifier and Type | Field and Description |
---|---|
private static int |
AND |
private static int |
APPROX |
private java.lang.String |
attr
filter attribute or null if operation AND, OR or NOT
|
private static int |
EQUAL |
private java.lang.String |
filterString |
private static int |
GREATER |
private static int |
LESS |
private static int |
NOT |
private int |
op
filter operation
|
private static int |
OR |
private static int |
PRESENT |
private static int |
SUBSTRING |
private java.lang.Object |
value
filter operands
|
Constructor and Description |
---|
FilterImpl(int operation,
java.lang.String attr,
java.lang.Object value) |
Modifier and Type | Method and Description |
---|---|
private static java.lang.String |
approxString(java.lang.String input)
Map a string for an APPROX (~=) comparison.
|
private boolean |
compare_Boolean(int operation,
boolean boolval,
java.lang.Object value2) |
private boolean |
compare_Byte(int operation,
byte byteval,
java.lang.Object value2) |
private boolean |
compare_Character(int operation,
char charval,
java.lang.Object value2) |
private boolean |
compare_Collection(int operation,
java.util.Collection<?> collection,
java.lang.Object value2) |
private boolean |
compare_Comparable(int operation,
java.lang.Comparable<java.lang.Object> value1,
java.lang.Object value2) |
private boolean |
compare_Double(int operation,
double doubleval,
java.lang.Object value2) |
private boolean |
compare_Float(int operation,
float floatval,
java.lang.Object value2) |
private boolean |
compare_Integer(int operation,
int intval,
java.lang.Object value2) |
private boolean |
compare_Long(int operation,
long longval,
java.lang.Object value2) |
private boolean |
compare_ObjectArray(int operation,
java.lang.Object[] array,
java.lang.Object value2) |
private boolean |
compare_PrimitiveArray(int operation,
java.lang.Class<?> type,
java.lang.Object primarray,
java.lang.Object value2) |
private boolean |
compare_Short(int operation,
short shortval,
java.lang.Object value2) |
private boolean |
compare_String(int operation,
java.lang.String string,
java.lang.Object value2) |
private boolean |
compare_Unknown(int operation,
java.lang.Object value1,
java.lang.Object value2) |
private boolean |
compare_Version(int operation,
Version value1,
java.lang.Object value2) |
private boolean |
compare(int operation,
java.lang.Object value1,
java.lang.Object value2) |
private static java.lang.String |
encodeValue(java.lang.String value)
Encode the value string such that '(', '*', ')' and '\' are escaped.
|
boolean |
equals(java.lang.Object obj)
Compares this
Filter to another Filter . |
int |
hashCode()
Returns the hashCode for this
Filter . |
boolean |
match(java.util.Dictionary<java.lang.String,?> dictionary)
Filter using a
Dictionary with case insensitive key lookup. |
boolean |
match(ServiceReference<?> reference)
Filter using a service's properties.
|
boolean |
matchCase(java.util.Dictionary<java.lang.String,?> dictionary)
Filter using a
Dictionary . |
boolean |
matches(java.util.Map<java.lang.String,?> map)
Filter using a
Map . |
(package private) static FrameworkUtil.FilterImpl |
newInstance(java.lang.String filterString)
Constructs a
FrameworkUtil.FilterImpl object. |
private java.lang.StringBuilder |
normalize()
Returns this
Filter 's normalized filter string. |
private static void |
setAccessible(java.lang.reflect.AccessibleObject accessible) |
java.lang.String |
toString()
Returns this
Filter 's filter string. |
private static java.lang.Object |
valueOf(java.lang.Class<?> target,
java.lang.String value2) |
private static final int EQUAL
private static final int APPROX
private static final int GREATER
private static final int LESS
private static final int PRESENT
private static final int SUBSTRING
private static final int AND
private static final int OR
private static final int NOT
private final int op
private final java.lang.String attr
private final java.lang.Object value
private transient java.lang.String filterString
FilterImpl(int operation, java.lang.String attr, java.lang.Object value)
static FrameworkUtil.FilterImpl newInstance(java.lang.String filterString) throws InvalidSyntaxException
FrameworkUtil.FilterImpl
object. This filter object may be
used to match a ServiceReference
or a Dictionary.
If the filter cannot be parsed, an InvalidSyntaxException
will be thrown with a human readable message where the filter became
unparsable.
filterString
- the filter string.InvalidSyntaxException
- If the filter parameter contains an
invalid filter string that cannot be parsed.public boolean match(ServiceReference<?> reference)
This Filter
is executed using the keys and values of the
referenced service's properties. The keys are looked up in a case
insensitive manner.
public boolean match(java.util.Dictionary<java.lang.String,?> dictionary)
Dictionary
with case insensitive key lookup.
This Filter
is executed using the specified
Dictionary
's keys and values. The keys are looked up in a
case insensitive manner.match
in interface Filter
dictionary
- The Dictionary
whose key/value pairs are
used in the match.true
if the Dictionary
's values match this
filter; false
otherwise.java.lang.IllegalArgumentException
- If dictionary
contains case
variants of the same key name.public boolean matchCase(java.util.Dictionary<java.lang.String,?> dictionary)
Dictionary
. This Filter
is executed
using the specified Dictionary
's keys and values. The keys
are looked up in a normal manner respecting case.public boolean matches(java.util.Map<java.lang.String,?> map)
Map
. This Filter
is executed using the
specified Map
's keys and values. The keys are looked up in a
normal manner respecting case.public java.lang.String toString()
Filter
's filter string.
The filter string is normalized by removing whitespace which does not affect the meaning of the filter.
private java.lang.StringBuilder normalize()
Filter
's normalized filter string.
The filter string is normalized by removing whitespace which does not affect the meaning of the filter.
Filter
's filter string.public boolean equals(java.lang.Object obj)
Filter
to another Filter
.
This implementation returns the result of calling
this.toString().equals(obj.toString()
.
public int hashCode()
Filter
.
This implementation returns the result of calling
this.toString().hashCode()
.
private static java.lang.String encodeValue(java.lang.String value)
value
- unencoded value string.private boolean compare(int operation, java.lang.Object value1, java.lang.Object value2)
private boolean compare_Collection(int operation, java.util.Collection<?> collection, java.lang.Object value2)
private boolean compare_ObjectArray(int operation, java.lang.Object[] array, java.lang.Object value2)
private boolean compare_PrimitiveArray(int operation, java.lang.Class<?> type, java.lang.Object primarray, java.lang.Object value2)
private boolean compare_String(int operation, java.lang.String string, java.lang.Object value2)
private boolean compare_Integer(int operation, int intval, java.lang.Object value2)
private boolean compare_Long(int operation, long longval, java.lang.Object value2)
private boolean compare_Byte(int operation, byte byteval, java.lang.Object value2)
private boolean compare_Short(int operation, short shortval, java.lang.Object value2)
private boolean compare_Character(int operation, char charval, java.lang.Object value2)
private boolean compare_Boolean(int operation, boolean boolval, java.lang.Object value2)
private boolean compare_Float(int operation, float floatval, java.lang.Object value2)
private boolean compare_Double(int operation, double doubleval, java.lang.Object value2)
private static java.lang.Object valueOf(java.lang.Class<?> target, java.lang.String value2)
private static void setAccessible(java.lang.reflect.AccessibleObject accessible)
private boolean compare_Comparable(int operation, java.lang.Comparable<java.lang.Object> value1, java.lang.Object value2)
private boolean compare_Version(int operation, Version value1, java.lang.Object value2)
private boolean compare_Unknown(int operation, java.lang.Object value1, java.lang.Object value2)
private static java.lang.String approxString(java.lang.String input)
input
- Input string.