You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by "Richard S. Hall" <he...@ungoverned.org> on 2010/03/25 09:22:04 UTC
Re: svn commit: r927298 - /felix/trunk/utils/src/main/java/org/apache/felix/utils/filter/FilterImpl.java
I'm not sure it's a great idea to continue to extend the Filter impl.
From my point of view it is better to stick to the standard filter
where possible...I understand that the subset operator is necessary for
time being to support mandatory attributes, but eventually we should be
able to avoid that too.
-> richard
On 3/25/10 16:18, gnodet@apache.org wrote:
> Author: gnodet
> Date: Thu Mar 25 08:18:26 2010
> New Revision: 927298
>
> URL: http://svn.apache.org/viewvc?rev=927298&view=rev
> Log:
> [utils] add support for< and> on the filter
>
> Modified:
> felix/trunk/utils/src/main/java/org/apache/felix/utils/filter/FilterImpl.java
>
> Modified: felix/trunk/utils/src/main/java/org/apache/felix/utils/filter/FilterImpl.java
> URL: http://svn.apache.org/viewvc/felix/trunk/utils/src/main/java/org/apache/felix/utils/filter/FilterImpl.java?rev=927298&r1=927297&r2=927298&view=diff
> ==============================================================================
> --- felix/trunk/utils/src/main/java/org/apache/felix/utils/filter/FilterImpl.java (original)
> +++ felix/trunk/utils/src/main/java/org/apache/felix/utils/filter/FilterImpl.java Thu Mar 25 08:18:26 2010
> @@ -40,29 +40,31 @@ import org.osgi.framework.Version;
> public class FilterImpl implements Filter {
>
> /* filter operators */
> - private static final int EQUAL = 1;
> - private static final int APPROX = 2;
> - private static final int GREATER = 3;
> - private static final int LESS = 4;
> - private static final int PRESENT = 5;
> - private static final int SUBSTRING = 6;
> - private static final int AND = 7;
> - private static final int OR = 8;
> - private static final int NOT = 9;
> - private static final int SUBSET = 10;
> - private static final int SUPERSET = 11;
> + private static final int EQUAL = 1;
> + private static final int APPROX = 2;
> + private static final int GTEQ = 3;
> + private static final int LTEQ = 4;
> + private static final int GT = 5;
> + private static final int LT = 6;
> + private static final int PRESENT = 7;
> + private static final int SUBSTRING = 8;
> + private static final int AND = 9;
> + private static final int OR = 10;
> + private static final int NOT = 11;
> + private static final int SUBSET = 12;
> + private static final int SUPERSET = 13;
>
> /** filter operation */
> - private final int op;
> + private final int op;
> /** filter attribute or null if operation AND, OR or NOT */
> - private final String attr;
> + private final String attr;
> /** filter operands */
> - private final Object value;
> + private final Object value;
> /** optim in case of version */
> private final Object converted;
>
> /* normalized filter string for Filter object */
> - private transient volatile String filterString;
> + private transient volatile String filterString;
>
> /**
> * Constructs a {@link FilterImpl} object. This filter object may be
> @@ -263,20 +265,34 @@ public class FilterImpl implements Filte
>
> break;
> }
> - case GREATER : {
> + case GTEQ: {
> sb.append(attr);
> sb.append(">=");
> sb.append(encodeValue((String) value));
>
> break;
> }
> - case LESS : {
> + case LTEQ: {
> sb.append(attr);
> sb.append("<=");
> sb.append(encodeValue((String) value));
>
> break;
> }
> + case GT: {
> + sb.append(attr);
> + sb.append(">");
> + sb.append(encodeValue((String) value));
> +
> + break;
> + }
> + case LT: {
> + sb.append(attr);
> + sb.append("<");
> + sb.append(encodeValue((String) value));
> +
> + break;
> + }
> case APPROX : {
> sb.append(attr);
> sb.append("~=");
> @@ -389,8 +405,10 @@ public class FilterImpl implements Filte
>
> case SUBSTRING :
> case EQUAL :
> - case GREATER :
> - case LESS :
> + case GTEQ:
> + case LTEQ:
> + case GT:
> + case LT:
> case APPROX :
> case SUBSET :
> case SUPERSET : {
> @@ -443,8 +461,10 @@ public class FilterImpl implements Filte
>
> case SUBSTRING :
> case EQUAL :
> - case GREATER :
> - case LESS :
> + case GTEQ:
> + case LTEQ:
> + case GT:
> + case LT:
> case APPROX :
> case SUBSET :
> case SUPERSET : {
> @@ -577,12 +597,18 @@ public class FilterImpl implements Filte
> case EQUAL : {
> return ((Version) value1).compareTo(converted) == 0;
> }
> - case GREATER : {
> + case GTEQ: {
> return ((Version) value1).compareTo(converted)>= 0;
> }
> - case LESS : {
> + case LTEQ: {
> return ((Version) value1).compareTo(converted)<= 0;
> }
> + case GT: {
> + return ((Version) value1).compareTo(converted)> 0;
> + }
> + case LT: {
> + return ((Version) value1).compareTo(converted)< 0;
> + }
> }
> } else {
> return compare_Comparable(operation, (Version) value1, value2);
> @@ -808,12 +834,18 @@ public class FilterImpl implements Filte
>
> return string.equalsIgnoreCase(string2);
> }
> - case GREATER : {
> + case GTEQ: {
> return string.compareTo((String) value2)>= 0;
> }
> - case LESS : {
> + case LTEQ: {
> return string.compareTo((String) value2)<= 0;
> }
> + case GT: {
> + return string.compareTo((String) value2)> 0;
> + }
> + case LT: {
> + return string.compareTo((String) value2)< 0;
> + }
> }
> return false;
> }
> @@ -834,12 +866,18 @@ public class FilterImpl implements Filte
> case EQUAL : {
> return intval == intval2;
> }
> - case GREATER : {
> + case GTEQ: {
> return intval>= intval2;
> }
> - case LESS : {
> + case LTEQ: {
> return intval<= intval2;
> }
> + case GT: {
> + return intval> intval2;
> + }
> + case LT: {
> + return intval< intval2;
> + }
> }
> return false;
> }
> @@ -861,12 +899,18 @@ public class FilterImpl implements Filte
> case EQUAL : {
> return longval == longval2;
> }
> - case GREATER : {
> + case GTEQ: {
> return longval>= longval2;
> }
> - case LESS : {
> + case LTEQ: {
> return longval<= longval2;
> }
> + case GT: {
> + return longval> longval2;
> + }
> + case LT: {
> + return longval< longval2;
> + }
> }
> return false;
> }
> @@ -888,12 +932,18 @@ public class FilterImpl implements Filte
> case EQUAL : {
> return byteval == byteval2;
> }
> - case GREATER : {
> + case GTEQ: {
> return byteval>= byteval2;
> }
> - case LESS : {
> + case LTEQ: {
> return byteval<= byteval2;
> }
> + case GT: {
> + return byteval> byteval2;
> + }
> + case LT: {
> + return byteval< byteval2;
> + }
> }
> return false;
> }
> @@ -916,12 +966,18 @@ public class FilterImpl implements Filte
> case EQUAL : {
> return shortval == shortval2;
> }
> - case GREATER : {
> + case GTEQ: {
> return shortval>= shortval2;
> }
> - case LESS : {
> + case LTEQ: {
> return shortval<= shortval2;
> }
> + case GT: {
> + return shortval> shortval2;
> + }
> + case LT: {
> + return shortval< shortval2;
> + }
> }
> return false;
> }
> @@ -950,12 +1006,18 @@ public class FilterImpl implements Filte
> || (Character.toLowerCase(charval) == Character
> .toLowerCase(charval2));
> }
> - case GREATER : {
> + case GTEQ: {
> return charval>= charval2;
> }
> - case LESS : {
> + case LTEQ: {
> return charval<= charval2;
> }
> + case GT: {
> + return charval> charval2;
> + }
> + case LT: {
> + return charval< charval2;
> + }
> }
> return false;
> }
> @@ -970,8 +1032,8 @@ public class FilterImpl implements Filte
> switch (operation) {
> case APPROX :
> case EQUAL :
> - case GREATER :
> - case LESS : {
> + case GTEQ:
> + case LTEQ: {
> return boolval == boolval2;
> }
> }
> @@ -996,12 +1058,18 @@ public class FilterImpl implements Filte
> case EQUAL : {
> return Float.compare(floatval, floatval2) == 0;
> }
> - case GREATER : {
> + case GTEQ: {
> return Float.compare(floatval, floatval2)>= 0;
> }
> - case LESS : {
> + case LTEQ: {
> return Float.compare(floatval, floatval2)<= 0;
> }
> + case GT: {
> + return Float.compare(floatval, floatval2)> 0;
> + }
> + case LT: {
> + return Float.compare(floatval, floatval2)< 0;
> + }
> }
> return false;
> }
> @@ -1024,12 +1092,18 @@ public class FilterImpl implements Filte
> case EQUAL : {
> return Double.compare(doubleval, doubleval2) == 0;
> }
> - case GREATER : {
> + case GTEQ: {
> return Double.compare(doubleval, doubleval2)>= 0;
> }
> - case LESS : {
> + case LTEQ: {
> return Double.compare(doubleval, doubleval2)<= 0;
> }
> + case GT: {
> + return Double.compare(doubleval, doubleval2)> 0;
> + }
> + case LT: {
> + return Double.compare(doubleval, doubleval2)< 0;
> + }
> }
> return false;
> }
> @@ -1070,12 +1144,18 @@ public class FilterImpl implements Filte
> case EQUAL : {
> return value1.compareTo(value2) == 0;
> }
> - case GREATER : {
> + case GTEQ: {
> return value1.compareTo(value2)>= 0;
> }
> - case LESS : {
> + case LTEQ: {
> return value1.compareTo(value2)<= 0;
> }
> + case GT: {
> + return value1.compareTo(value2)> 0;
> + }
> + case LT: {
> + return value1.compareTo(value2)< 0;
> + }
> }
> return false;
> }
> @@ -1112,8 +1192,8 @@ public class FilterImpl implements Filte
> switch (operation) {
> case APPROX :
> case EQUAL :
> - case GREATER :
> - case LESS : {
> + case GTEQ:
> + case LTEQ: {
> return value1.equals(value2);
> }
> }
> @@ -1312,23 +1392,29 @@ public class FilterImpl implements Filte
> case '>' : {
> if (filterChars[pos + 1] == '=') {
> pos += 2;
> - return new FilterImpl(FilterImpl.GREATER, attr,
> + return new FilterImpl(FilterImpl.GTEQ, attr,
> + parse_value());
> + }
> + else {
> + pos += 1;
> + return new FilterImpl(FilterImpl.GT, attr,
> parse_value());
> }
> - break;
> }
> case '<' : {
> if (filterChars[pos + 1] == '=') {
> pos += 2;
> - return new FilterImpl(FilterImpl.LESS, attr,
> + return new FilterImpl(FilterImpl.LTEQ, attr,
> parse_value());
> - }
> - if (filterChars[pos + 1] == '*') {
> + } else if (filterChars[pos + 1] == '*') {
> pos += 2;
> return new FilterImpl(FilterImpl.SUBSET, attr,
> parse_value());
> + } else {
> + pos += 1;
> + return new FilterImpl(FilterImpl.LT, attr,
> + parse_value());
> }
> - break;
> }
> case '=' : {
> if (filterChars[pos + 1] == '*') {
>
>
>
Re: svn commit: r927298 - /felix/trunk/utils/src/main/java/org/apache/felix/utils/filter/FilterImpl.java
Posted by "Richard S. Hall" <he...@ungoverned.org>.
On 3/25/10 16:36, Guillaume Nodet wrote:
> Yeah, I know. That was my idea originally. The problem is that some obr
> repositories out there still use the '<' and'>' operator, so i'd like to
> support those anyway.
> I'll see if a better way would be to transform the filter expressions using
> regexp before parsing them and turn '(x<a)' into '(!(x>=a))'
>
Yeah, ok, that makes sense.
-> richard
> On Thu, Mar 25, 2010 at 09:22, Richard S. Hall<he...@ungoverned.org> wrote:
>
>
>> I'm not sure it's a great idea to continue to extend the Filter impl. From
>> my point of view it is better to stick to the standard filter where
>> possible...I understand that the subset operator is necessary for time being
>> to support mandatory attributes, but eventually we should be able to avoid
>> that too.
>>
>> -> richard
>>
>>
>> On 3/25/10 16:18, gnodet@apache.org wrote:
>>
>>
>>> Author: gnodet
>>> Date: Thu Mar 25 08:18:26 2010
>>> New Revision: 927298
>>>
>>> URL: http://svn.apache.org/viewvc?rev=927298&view=rev
>>> Log:
>>> [utils] add support for< and> on the filter
>>>
>>> Modified:
>>>
>>> felix/trunk/utils/src/main/java/org/apache/felix/utils/filter/FilterImpl.java
>>>
>>> Modified:
>>> felix/trunk/utils/src/main/java/org/apache/felix/utils/filter/FilterImpl.java
>>> URL:
>>> http://svn.apache.org/viewvc/felix/trunk/utils/src/main/java/org/apache/felix/utils/filter/FilterImpl.java?rev=927298&r1=927297&r2=927298&view=diff
>>>
>>> ==============================================================================
>>> ---
>>> felix/trunk/utils/src/main/java/org/apache/felix/utils/filter/FilterImpl.java
>>> (original)
>>> +++
>>> felix/trunk/utils/src/main/java/org/apache/felix/utils/filter/FilterImpl.java
>>> Thu Mar 25 08:18:26 2010
>>> @@ -40,29 +40,31 @@ import org.osgi.framework.Version;
>>> public class FilterImpl implements Filter {
>>>
>>> /* filter operators */
>>> - private static final int EQUAL = 1;
>>> - private static final int APPROX = 2;
>>> - private static final int GREATER = 3;
>>> - private static final int LESS = 4;
>>> - private static final int PRESENT = 5;
>>> - private static final int SUBSTRING = 6;
>>> - private static final int AND =
>>> 7;
>>> - private static final int OR =
>>> 8;
>>> - private static final int NOT =
>>> 9;
>>> - private static final int SUBSET = 10;
>>> - private static final int SUPERSET = 11;
>>> + private static final int EQUAL = 1;
>>> + private static final int APPROX = 2;
>>> + private static final int GTEQ = 3;
>>> + private static final int LTEQ = 4;
>>> + private static final int GT = 5;
>>> + private static final int LT = 6;
>>> + private static final int PRESENT = 7;
>>> + private static final int SUBSTRING = 8;
>>> + private static final int AND = 9;
>>> + private static final int OR = 10;
>>> + private static final int NOT = 11;
>>> + private static final int SUBSET = 12;
>>> + private static final int SUPERSET = 13;
>>>
>>> /** filter operation */
>>> - private final int op;
>>> + private final int op;
>>> /** filter attribute or null if operation AND, OR or NOT */
>>> - private final String attr;
>>> + private final String attr;
>>> /** filter operands */
>>> - private final Object value;
>>> + private final Object value;
>>> /** optim in case of version */
>>> private final Object converted;
>>>
>>> /* normalized filter string for Filter object */
>>> - private transient volatile String filterString;
>>> + private transient volatile String filterString;
>>>
>>> /**
>>> * Constructs a {@link FilterImpl} object. This filter object may be
>>> @@ -263,20 +265,34 @@ public class FilterImpl implements Filte
>>>
>>> break;
>>> }
>>> - case GREATER : {
>>> + case GTEQ: {
>>> sb.append(attr);
>>> sb.append(">=");
>>> sb.append(encodeValue((String) value));
>>>
>>> break;
>>> }
>>> - case LESS : {
>>> + case LTEQ: {
>>> sb.append(attr);
>>> sb.append("<=");
>>> sb.append(encodeValue((String) value));
>>>
>>> break;
>>> }
>>> + case GT: {
>>> + sb.append(attr);
>>> + sb.append(">");
>>> + sb.append(encodeValue((String) value));
>>> +
>>> + break;
>>> + }
>>> + case LT: {
>>> + sb.append(attr);
>>> + sb.append("<");
>>> + sb.append(encodeValue((String) value));
>>> +
>>> + break;
>>> + }
>>> case APPROX : {
>>> sb.append(attr);
>>> sb.append("~=");
>>> @@ -389,8 +405,10 @@ public class FilterImpl implements Filte
>>>
>>> case SUBSTRING :
>>> case EQUAL :
>>> - case GREATER :
>>> - case LESS :
>>> + case GTEQ:
>>> + case LTEQ:
>>> + case GT:
>>> + case LT:
>>> case APPROX :
>>> case SUBSET :
>>> case SUPERSET : {
>>> @@ -443,8 +461,10 @@ public class FilterImpl implements Filte
>>>
>>> case SUBSTRING :
>>> case EQUAL :
>>> - case GREATER :
>>> - case LESS :
>>> + case GTEQ:
>>> + case LTEQ:
>>> + case GT:
>>> + case LT:
>>> case APPROX :
>>> case SUBSET :
>>> case SUPERSET : {
>>> @@ -577,12 +597,18 @@ public class FilterImpl implements Filte
>>> case EQUAL : {
>>> return ((Version) value1).compareTo(converted) ==
>>> 0;
>>> }
>>> - case GREATER : {
>>> + case GTEQ: {
>>> return ((Version) value1).compareTo(converted)>=
>>> 0;
>>> }
>>> - case LESS : {
>>> + case LTEQ: {
>>> return ((Version) value1).compareTo(converted)<=
>>> 0;
>>> }
>>> + case GT: {
>>> + return ((Version) value1).compareTo(converted)>
>>> 0;
>>> + }
>>> + case LT: {
>>> + return ((Version) value1).compareTo(converted)<
>>> 0;
>>> + }
>>> }
>>> } else {
>>> return compare_Comparable(operation, (Version) value1,
>>> value2);
>>> @@ -808,12 +834,18 @@ public class FilterImpl implements Filte
>>>
>>> return string.equalsIgnoreCase(string2);
>>> }
>>> - case GREATER : {
>>> + case GTEQ: {
>>> return string.compareTo((String) value2)>= 0;
>>> }
>>> - case LESS : {
>>> + case LTEQ: {
>>> return string.compareTo((String) value2)<= 0;
>>> }
>>> + case GT: {
>>> + return string.compareTo((String) value2)> 0;
>>> + }
>>> + case LT: {
>>> + return string.compareTo((String) value2)< 0;
>>> + }
>>> }
>>> return false;
>>> }
>>> @@ -834,12 +866,18 @@ public class FilterImpl implements Filte
>>> case EQUAL : {
>>> return intval == intval2;
>>> }
>>> - case GREATER : {
>>> + case GTEQ: {
>>> return intval>= intval2;
>>> }
>>> - case LESS : {
>>> + case LTEQ: {
>>> return intval<= intval2;
>>> }
>>> + case GT: {
>>> + return intval> intval2;
>>> + }
>>> + case LT: {
>>> + return intval< intval2;
>>> + }
>>> }
>>> return false;
>>> }
>>> @@ -861,12 +899,18 @@ public class FilterImpl implements Filte
>>> case EQUAL : {
>>> return longval == longval2;
>>> }
>>> - case GREATER : {
>>> + case GTEQ: {
>>> return longval>= longval2;
>>> }
>>> - case LESS : {
>>> + case LTEQ: {
>>> return longval<= longval2;
>>> }
>>> + case GT: {
>>> + return longval> longval2;
>>> + }
>>> + case LT: {
>>> + return longval< longval2;
>>> + }
>>> }
>>> return false;
>>> }
>>> @@ -888,12 +932,18 @@ public class FilterImpl implements Filte
>>> case EQUAL : {
>>> return byteval == byteval2;
>>> }
>>> - case GREATER : {
>>> + case GTEQ: {
>>> return byteval>= byteval2;
>>> }
>>> - case LESS : {
>>> + case LTEQ: {
>>> return byteval<= byteval2;
>>> }
>>> + case GT: {
>>> + return byteval> byteval2;
>>> + }
>>> + case LT: {
>>> + return byteval< byteval2;
>>> + }
>>> }
>>> return false;
>>> }
>>> @@ -916,12 +966,18 @@ public class FilterImpl implements Filte
>>> case EQUAL : {
>>> return shortval == shortval2;
>>> }
>>> - case GREATER : {
>>> + case GTEQ: {
>>> return shortval>= shortval2;
>>> }
>>> - case LESS : {
>>> + case LTEQ: {
>>> return shortval<= shortval2;
>>> }
>>> + case GT: {
>>> + return shortval> shortval2;
>>> + }
>>> + case LT: {
>>> + return shortval< shortval2;
>>> + }
>>> }
>>> return false;
>>> }
>>> @@ -950,12 +1006,18 @@ public class FilterImpl implements Filte
>>> || (Character.toLowerCase(charval) == Character
>>> .toLowerCase(charval2));
>>> }
>>> - case GREATER : {
>>> + case GTEQ: {
>>> return charval>= charval2;
>>> }
>>> - case LESS : {
>>> + case LTEQ: {
>>> return charval<= charval2;
>>> }
>>> + case GT: {
>>> + return charval> charval2;
>>> + }
>>> + case LT: {
>>> + return charval< charval2;
>>> + }
>>> }
>>> return false;
>>> }
>>> @@ -970,8 +1032,8 @@ public class FilterImpl implements Filte
>>> switch (operation) {
>>> case APPROX :
>>> case EQUAL :
>>> - case GREATER :
>>> - case LESS : {
>>> + case GTEQ:
>>> + case LTEQ: {
>>> return boolval == boolval2;
>>> }
>>> }
>>> @@ -996,12 +1058,18 @@ public class FilterImpl implements Filte
>>> case EQUAL : {
>>> return Float.compare(floatval, floatval2) == 0;
>>> }
>>> - case GREATER : {
>>> + case GTEQ: {
>>> return Float.compare(floatval, floatval2)>= 0;
>>> }
>>> - case LESS : {
>>> + case LTEQ: {
>>> return Float.compare(floatval, floatval2)<= 0;
>>> }
>>> + case GT: {
>>> + return Float.compare(floatval, floatval2)> 0;
>>> + }
>>> + case LT: {
>>> + return Float.compare(floatval, floatval2)< 0;
>>> + }
>>> }
>>> return false;
>>> }
>>> @@ -1024,12 +1092,18 @@ public class FilterImpl implements Filte
>>> case EQUAL : {
>>> return Double.compare(doubleval, doubleval2) == 0;
>>> }
>>> - case GREATER : {
>>> + case GTEQ: {
>>> return Double.compare(doubleval, doubleval2)>= 0;
>>> }
>>> - case LESS : {
>>> + case LTEQ: {
>>> return Double.compare(doubleval, doubleval2)<= 0;
>>> }
>>> + case GT: {
>>> + return Double.compare(doubleval, doubleval2)> 0;
>>> + }
>>> + case LT: {
>>> + return Double.compare(doubleval, doubleval2)< 0;
>>> + }
>>> }
>>> return false;
>>> }
>>> @@ -1070,12 +1144,18 @@ public class FilterImpl implements Filte
>>> case EQUAL : {
>>> return value1.compareTo(value2) == 0;
>>> }
>>> - case GREATER : {
>>> + case GTEQ: {
>>> return value1.compareTo(value2)>= 0;
>>> }
>>> - case LESS : {
>>> + case LTEQ: {
>>> return value1.compareTo(value2)<= 0;
>>> }
>>> + case GT: {
>>> + return value1.compareTo(value2)> 0;
>>> + }
>>> + case LT: {
>>> + return value1.compareTo(value2)< 0;
>>> + }
>>> }
>>> return false;
>>> }
>>> @@ -1112,8 +1192,8 @@ public class FilterImpl implements Filte
>>> switch (operation) {
>>> case APPROX :
>>> case EQUAL :
>>> - case GREATER :
>>> - case LESS : {
>>> + case GTEQ:
>>> + case LTEQ: {
>>> return value1.equals(value2);
>>> }
>>> }
>>> @@ -1312,23 +1392,29 @@ public class FilterImpl implements Filte
>>> case '>' : {
>>> if (filterChars[pos + 1] == '=') {
>>> pos += 2;
>>> - return new FilterImpl(FilterImpl.GREATER, attr,
>>> + return new FilterImpl(FilterImpl.GTEQ, attr,
>>> + parse_value());
>>> + }
>>> + else {
>>> + pos += 1;
>>> + return new FilterImpl(FilterImpl.GT, attr,
>>> parse_value());
>>> }
>>> - break;
>>> }
>>> case '<' : {
>>> if (filterChars[pos + 1] == '=') {
>>> pos += 2;
>>> - return new FilterImpl(FilterImpl.LESS, attr,
>>> + return new FilterImpl(FilterImpl.LTEQ, attr,
>>> parse_value());
>>> - }
>>> - if (filterChars[pos + 1] == '*') {
>>> + } else if (filterChars[pos + 1] == '*') {
>>> pos += 2;
>>> return new FilterImpl(FilterImpl.SUBSET, attr,
>>> parse_value());
>>> + } else {
>>> + pos += 1;
>>> + return new FilterImpl(FilterImpl.LT, attr,
>>> + parse_value());
>>> }
>>> - break;
>>> }
>>> case '=' : {
>>> if (filterChars[pos + 1] == '*') {
>>>
>>>
>>>
>>>
>>>
>>
>
>
Re: svn commit: r927298 - /felix/trunk/utils/src/main/java/org/apache/felix/utils/filter/FilterImpl.java
Posted by Guillaume Nodet <gn...@gmail.com>.
Yeah, I know. That was my idea originally. The problem is that some obr
repositories out there still use the '<' and '>' operator, so i'd like to
support those anyway.
I'll see if a better way would be to transform the filter expressions using
regexp before parsing them and turn '(x<a)' into '(!(x>=a))'
On Thu, Mar 25, 2010 at 09:22, Richard S. Hall <he...@ungoverned.org> wrote:
> I'm not sure it's a great idea to continue to extend the Filter impl. From
> my point of view it is better to stick to the standard filter where
> possible...I understand that the subset operator is necessary for time being
> to support mandatory attributes, but eventually we should be able to avoid
> that too.
>
> -> richard
>
>
> On 3/25/10 16:18, gnodet@apache.org wrote:
>
>> Author: gnodet
>> Date: Thu Mar 25 08:18:26 2010
>> New Revision: 927298
>>
>> URL: http://svn.apache.org/viewvc?rev=927298&view=rev
>> Log:
>> [utils] add support for< and> on the filter
>>
>> Modified:
>>
>> felix/trunk/utils/src/main/java/org/apache/felix/utils/filter/FilterImpl.java
>>
>> Modified:
>> felix/trunk/utils/src/main/java/org/apache/felix/utils/filter/FilterImpl.java
>> URL:
>> http://svn.apache.org/viewvc/felix/trunk/utils/src/main/java/org/apache/felix/utils/filter/FilterImpl.java?rev=927298&r1=927297&r2=927298&view=diff
>>
>> ==============================================================================
>> ---
>> felix/trunk/utils/src/main/java/org/apache/felix/utils/filter/FilterImpl.java
>> (original)
>> +++
>> felix/trunk/utils/src/main/java/org/apache/felix/utils/filter/FilterImpl.java
>> Thu Mar 25 08:18:26 2010
>> @@ -40,29 +40,31 @@ import org.osgi.framework.Version;
>> public class FilterImpl implements Filter {
>>
>> /* filter operators */
>> - private static final int EQUAL = 1;
>> - private static final int APPROX = 2;
>> - private static final int GREATER = 3;
>> - private static final int LESS = 4;
>> - private static final int PRESENT = 5;
>> - private static final int SUBSTRING = 6;
>> - private static final int AND =
>> 7;
>> - private static final int OR =
>> 8;
>> - private static final int NOT =
>> 9;
>> - private static final int SUBSET = 10;
>> - private static final int SUPERSET = 11;
>> + private static final int EQUAL = 1;
>> + private static final int APPROX = 2;
>> + private static final int GTEQ = 3;
>> + private static final int LTEQ = 4;
>> + private static final int GT = 5;
>> + private static final int LT = 6;
>> + private static final int PRESENT = 7;
>> + private static final int SUBSTRING = 8;
>> + private static final int AND = 9;
>> + private static final int OR = 10;
>> + private static final int NOT = 11;
>> + private static final int SUBSET = 12;
>> + private static final int SUPERSET = 13;
>>
>> /** filter operation */
>> - private final int op;
>> + private final int op;
>> /** filter attribute or null if operation AND, OR or NOT */
>> - private final String attr;
>> + private final String attr;
>> /** filter operands */
>> - private final Object value;
>> + private final Object value;
>> /** optim in case of version */
>> private final Object converted;
>>
>> /* normalized filter string for Filter object */
>> - private transient volatile String filterString;
>> + private transient volatile String filterString;
>>
>> /**
>> * Constructs a {@link FilterImpl} object. This filter object may be
>> @@ -263,20 +265,34 @@ public class FilterImpl implements Filte
>>
>> break;
>> }
>> - case GREATER : {
>> + case GTEQ: {
>> sb.append(attr);
>> sb.append(">=");
>> sb.append(encodeValue((String) value));
>>
>> break;
>> }
>> - case LESS : {
>> + case LTEQ: {
>> sb.append(attr);
>> sb.append("<=");
>> sb.append(encodeValue((String) value));
>>
>> break;
>> }
>> + case GT: {
>> + sb.append(attr);
>> + sb.append(">");
>> + sb.append(encodeValue((String) value));
>> +
>> + break;
>> + }
>> + case LT: {
>> + sb.append(attr);
>> + sb.append("<");
>> + sb.append(encodeValue((String) value));
>> +
>> + break;
>> + }
>> case APPROX : {
>> sb.append(attr);
>> sb.append("~=");
>> @@ -389,8 +405,10 @@ public class FilterImpl implements Filte
>>
>> case SUBSTRING :
>> case EQUAL :
>> - case GREATER :
>> - case LESS :
>> + case GTEQ:
>> + case LTEQ:
>> + case GT:
>> + case LT:
>> case APPROX :
>> case SUBSET :
>> case SUPERSET : {
>> @@ -443,8 +461,10 @@ public class FilterImpl implements Filte
>>
>> case SUBSTRING :
>> case EQUAL :
>> - case GREATER :
>> - case LESS :
>> + case GTEQ:
>> + case LTEQ:
>> + case GT:
>> + case LT:
>> case APPROX :
>> case SUBSET :
>> case SUPERSET : {
>> @@ -577,12 +597,18 @@ public class FilterImpl implements Filte
>> case EQUAL : {
>> return ((Version) value1).compareTo(converted) ==
>> 0;
>> }
>> - case GREATER : {
>> + case GTEQ: {
>> return ((Version) value1).compareTo(converted)>=
>> 0;
>> }
>> - case LESS : {
>> + case LTEQ: {
>> return ((Version) value1).compareTo(converted)<=
>> 0;
>> }
>> + case GT: {
>> + return ((Version) value1).compareTo(converted)>
>> 0;
>> + }
>> + case LT: {
>> + return ((Version) value1).compareTo(converted)<
>> 0;
>> + }
>> }
>> } else {
>> return compare_Comparable(operation, (Version) value1,
>> value2);
>> @@ -808,12 +834,18 @@ public class FilterImpl implements Filte
>>
>> return string.equalsIgnoreCase(string2);
>> }
>> - case GREATER : {
>> + case GTEQ: {
>> return string.compareTo((String) value2)>= 0;
>> }
>> - case LESS : {
>> + case LTEQ: {
>> return string.compareTo((String) value2)<= 0;
>> }
>> + case GT: {
>> + return string.compareTo((String) value2)> 0;
>> + }
>> + case LT: {
>> + return string.compareTo((String) value2)< 0;
>> + }
>> }
>> return false;
>> }
>> @@ -834,12 +866,18 @@ public class FilterImpl implements Filte
>> case EQUAL : {
>> return intval == intval2;
>> }
>> - case GREATER : {
>> + case GTEQ: {
>> return intval>= intval2;
>> }
>> - case LESS : {
>> + case LTEQ: {
>> return intval<= intval2;
>> }
>> + case GT: {
>> + return intval> intval2;
>> + }
>> + case LT: {
>> + return intval< intval2;
>> + }
>> }
>> return false;
>> }
>> @@ -861,12 +899,18 @@ public class FilterImpl implements Filte
>> case EQUAL : {
>> return longval == longval2;
>> }
>> - case GREATER : {
>> + case GTEQ: {
>> return longval>= longval2;
>> }
>> - case LESS : {
>> + case LTEQ: {
>> return longval<= longval2;
>> }
>> + case GT: {
>> + return longval> longval2;
>> + }
>> + case LT: {
>> + return longval< longval2;
>> + }
>> }
>> return false;
>> }
>> @@ -888,12 +932,18 @@ public class FilterImpl implements Filte
>> case EQUAL : {
>> return byteval == byteval2;
>> }
>> - case GREATER : {
>> + case GTEQ: {
>> return byteval>= byteval2;
>> }
>> - case LESS : {
>> + case LTEQ: {
>> return byteval<= byteval2;
>> }
>> + case GT: {
>> + return byteval> byteval2;
>> + }
>> + case LT: {
>> + return byteval< byteval2;
>> + }
>> }
>> return false;
>> }
>> @@ -916,12 +966,18 @@ public class FilterImpl implements Filte
>> case EQUAL : {
>> return shortval == shortval2;
>> }
>> - case GREATER : {
>> + case GTEQ: {
>> return shortval>= shortval2;
>> }
>> - case LESS : {
>> + case LTEQ: {
>> return shortval<= shortval2;
>> }
>> + case GT: {
>> + return shortval> shortval2;
>> + }
>> + case LT: {
>> + return shortval< shortval2;
>> + }
>> }
>> return false;
>> }
>> @@ -950,12 +1006,18 @@ public class FilterImpl implements Filte
>> || (Character.toLowerCase(charval) == Character
>> .toLowerCase(charval2));
>> }
>> - case GREATER : {
>> + case GTEQ: {
>> return charval>= charval2;
>> }
>> - case LESS : {
>> + case LTEQ: {
>> return charval<= charval2;
>> }
>> + case GT: {
>> + return charval> charval2;
>> + }
>> + case LT: {
>> + return charval< charval2;
>> + }
>> }
>> return false;
>> }
>> @@ -970,8 +1032,8 @@ public class FilterImpl implements Filte
>> switch (operation) {
>> case APPROX :
>> case EQUAL :
>> - case GREATER :
>> - case LESS : {
>> + case GTEQ:
>> + case LTEQ: {
>> return boolval == boolval2;
>> }
>> }
>> @@ -996,12 +1058,18 @@ public class FilterImpl implements Filte
>> case EQUAL : {
>> return Float.compare(floatval, floatval2) == 0;
>> }
>> - case GREATER : {
>> + case GTEQ: {
>> return Float.compare(floatval, floatval2)>= 0;
>> }
>> - case LESS : {
>> + case LTEQ: {
>> return Float.compare(floatval, floatval2)<= 0;
>> }
>> + case GT: {
>> + return Float.compare(floatval, floatval2)> 0;
>> + }
>> + case LT: {
>> + return Float.compare(floatval, floatval2)< 0;
>> + }
>> }
>> return false;
>> }
>> @@ -1024,12 +1092,18 @@ public class FilterImpl implements Filte
>> case EQUAL : {
>> return Double.compare(doubleval, doubleval2) == 0;
>> }
>> - case GREATER : {
>> + case GTEQ: {
>> return Double.compare(doubleval, doubleval2)>= 0;
>> }
>> - case LESS : {
>> + case LTEQ: {
>> return Double.compare(doubleval, doubleval2)<= 0;
>> }
>> + case GT: {
>> + return Double.compare(doubleval, doubleval2)> 0;
>> + }
>> + case LT: {
>> + return Double.compare(doubleval, doubleval2)< 0;
>> + }
>> }
>> return false;
>> }
>> @@ -1070,12 +1144,18 @@ public class FilterImpl implements Filte
>> case EQUAL : {
>> return value1.compareTo(value2) == 0;
>> }
>> - case GREATER : {
>> + case GTEQ: {
>> return value1.compareTo(value2)>= 0;
>> }
>> - case LESS : {
>> + case LTEQ: {
>> return value1.compareTo(value2)<= 0;
>> }
>> + case GT: {
>> + return value1.compareTo(value2)> 0;
>> + }
>> + case LT: {
>> + return value1.compareTo(value2)< 0;
>> + }
>> }
>> return false;
>> }
>> @@ -1112,8 +1192,8 @@ public class FilterImpl implements Filte
>> switch (operation) {
>> case APPROX :
>> case EQUAL :
>> - case GREATER :
>> - case LESS : {
>> + case GTEQ:
>> + case LTEQ: {
>> return value1.equals(value2);
>> }
>> }
>> @@ -1312,23 +1392,29 @@ public class FilterImpl implements Filte
>> case '>' : {
>> if (filterChars[pos + 1] == '=') {
>> pos += 2;
>> - return new FilterImpl(FilterImpl.GREATER, attr,
>> + return new FilterImpl(FilterImpl.GTEQ, attr,
>> + parse_value());
>> + }
>> + else {
>> + pos += 1;
>> + return new FilterImpl(FilterImpl.GT, attr,
>> parse_value());
>> }
>> - break;
>> }
>> case '<' : {
>> if (filterChars[pos + 1] == '=') {
>> pos += 2;
>> - return new FilterImpl(FilterImpl.LESS, attr,
>> + return new FilterImpl(FilterImpl.LTEQ, attr,
>> parse_value());
>> - }
>> - if (filterChars[pos + 1] == '*') {
>> + } else if (filterChars[pos + 1] == '*') {
>> pos += 2;
>> return new FilterImpl(FilterImpl.SUBSET, attr,
>> parse_value());
>> + } else {
>> + pos += 1;
>> + return new FilterImpl(FilterImpl.LT, attr,
>> + parse_value());
>> }
>> - break;
>> }
>> case '=' : {
>> if (filterChars[pos + 1] == '*') {
>>
>>
>>
>>
>
--
Cheers,
Guillaume Nodet
------------------------
Blog: http://gnodet.blogspot.com/
------------------------
Open Source SOA
http://fusesource.com