[utils] add support for < and > on the filter

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@927298 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/utils/src/main/java/org/apache/felix/utils/filter/FilterImpl.java b/utils/src/main/java/org/apache/felix/utils/filter/FilterImpl.java
index d2c2359..6b7b63c 100644
--- a/utils/src/main/java/org/apache/felix/utils/filter/FilterImpl.java
+++ b/utils/src/main/java/org/apache/felix/utils/filter/FilterImpl.java
@@ -40,29 +40,31 @@
 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 @@
 
                 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 @@
 
             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 @@
 
             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 @@
                     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 @@
 
                 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 @@
             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 @@
             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 @@
             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 @@
             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 @@
                         || (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 @@
         switch (operation) {
             case APPROX :
             case EQUAL :
-            case GREATER :
-            case LESS : {
+            case GTEQ:
+            case LTEQ: {
                 return boolval == boolval2;
             }
         }
@@ -996,12 +1058,18 @@
             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 @@
             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 @@
             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 @@
         switch (operation) {
             case APPROX :
             case EQUAL :
-            case GREATER :
-            case LESS : {
+            case GTEQ:
+            case LTEQ: {
                 return value1.equals(value2);
             }
         }
@@ -1312,23 +1392,29 @@
                 case '>' : {
                     if (filterChars[pos + 1] == '=') {
                         pos += 2;
-                        return new FilterImpl(FilterImpl.GREATER, attr,
+                        return new FilterImpl(FilterImpl.GTEQ, attr,
                                 parse_value());
                     }
-                    break;
+                    else {
+                        pos += 1;
+                        return new FilterImpl(FilterImpl.GT, attr,
+                                parse_value());
+                    }
                 }
                 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] == '*') {