You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by ri...@apache.org on 2010/03/04 18:49:37 UTC

svn commit: r919090 - /felix/trunk/framework/src/main/java/org/apache/felix/framework/capabilityset/SimpleFilter.java

Author: rickhall
Date: Thu Mar  4 17:49:37 2010
New Revision: 919090

URL: http://svn.apache.org/viewvc?rev=919090&view=rev
Log:
More improvements to new filter impl. (FELIX-2039)

Modified:
    felix/trunk/framework/src/main/java/org/apache/felix/framework/capabilityset/SimpleFilter.java

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/capabilityset/SimpleFilter.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/capabilityset/SimpleFilter.java?rev=919090&r1=919089&r2=919090&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/capabilityset/SimpleFilter.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/capabilityset/SimpleFilter.java Thu Mar  4 17:49:37 2010
@@ -74,13 +74,13 @@
                 s = "(!" + toString((List) m_value) + ")";
                 break;
             case EQ:
-                s = "(" + m_name + "=" + m_value + ")";
+                s = "(" + m_name + "=" + toEncodedString(m_value) + ")";
                 break;
             case LTE:
-                s = "(" + m_name + "<=" + m_value + ")";
+                s = "(" + m_name + "<=" + toEncodedString(m_value) + ")";
                 break;
             case GTE:
-                s = "(" + m_name + ">=" + m_value + ")";
+                s = "(" + m_name + ">=" + toEncodedString(m_value) + ")";
                 break;
             case SUBSTRING:
                 s = "(" + m_name + "=" + unparseSubstring((List<String>) m_value) + ")";
@@ -89,7 +89,7 @@
         return s;
     }
 
-    private String toString(List list)
+    private static String toString(List list)
     {
         StringBuffer sb = new StringBuffer();
         for (int i = 0; i < list.size(); i++)
@@ -99,6 +99,33 @@
         return sb.toString();
     }
 
+    private static String toEncodedString(Object o)
+    {
+        if (o instanceof String)
+        {
+            String s = (String) o;
+            if ((s.indexOf('\\') >= 0)
+                || (s.indexOf('(') >= 0)
+                || (s.indexOf(')') >= 0))
+            {
+                StringBuffer sb = new StringBuffer();
+                for (int i = 0; i < s.length(); i++)
+                {
+                    char c = s.charAt(i);
+                    if ((c == '\\') || (c == '(') || (c == ')'))
+                    {
+                        sb.append('\\');
+                    }
+                    sb.append(c);
+                }
+
+                o = sb.toString();
+            }
+        }
+
+        return o.toString();
+    }
+
     public static SimpleFilter parse(String filter)
     {
         int idx = skipWhitespace(filter, 0);
@@ -114,6 +141,7 @@
 
         SimpleFilter sf = null;
         List stack = new ArrayList();
+        boolean isEscaped = false;
         while (idx < filter.length())
         {
             if (sf != null)
@@ -121,7 +149,8 @@
                 throw new IllegalArgumentException(
                     "Only one top-level operation allowed: " + filter);
             }
-            if (filter.charAt(idx) == '(')
+
+            if (!isEscaped && (filter.charAt(idx) == '('))
             {
                 // Skip paren and following whitespace.
                 idx = skipWhitespace(filter, idx + 1);
@@ -170,7 +199,7 @@
                     stack.add(0, new Integer(idx));
                 }
             }
-            else if (filter.charAt(idx) == ')')
+            else if (!isEscaped && (filter.charAt(idx) == ')'))
             {
                 Object top = stack.remove(0);
                 if (top instanceof SimpleFilter)
@@ -194,6 +223,14 @@
                     sf = SimpleFilter.subfilter(filter, ((Integer) top).intValue(), idx);
                 }
             }
+            else if (!isEscaped && (filter.charAt(idx) == '\\'))
+            {
+                isEscaped = true;
+            }
+            else
+            {
+                isEscaped = false;
+            }
 
             idx = skipWhitespace(filter, idx + 1);
         }
@@ -221,7 +258,7 @@
             }
             else if (!Character.isWhitespace(c))
             {
-                attrEndIdx = startIdx + i;
+                attrEndIdx = startIdx + i + 1;
             }
         }
         if (attrEndIdx == startIdx)
@@ -229,10 +266,10 @@
             throw new IllegalArgumentException(
                 "Missing attribute name: " + filter.substring(startIdx, endIdx));
         }
-        String attr = filter.substring(startIdx, attrEndIdx + 1);
+        String attr = filter.substring(startIdx, attrEndIdx);
 
         // Skip the attribute name and any following whitespace.
-        startIdx = skipWhitespace(filter, attrEndIdx + 1);
+        startIdx = skipWhitespace(filter, attrEndIdx);
 
         // Determine the operator type.
         int op = -1;
@@ -266,7 +303,30 @@
         }
 
         // Parse value.
-        Object value = filter.subSequence(startIdx, endIdx);
+        StringBuffer sb = new StringBuffer(endIdx - startIdx);
+        for (int offset = 0; offset < (endIdx - startIdx); )
+        {
+            char c = filter.charAt(startIdx + offset);
+            if ((c == '(') || (c == ')'))
+            {
+                throw new IllegalArgumentException(
+                    "Illegal value: " + filter.substring(startIdx, endIdx));
+            }
+            else if (c == '\\')
+            {
+                offset++;
+            }
+
+            if ((startIdx + offset) >= endIdx)
+            {
+                throw new IllegalArgumentException(
+                    "Illegal value: " + filter.substring(startIdx, endIdx));
+            }
+
+            sb.append(filter.charAt(startIdx + offset));
+            offset++;
+        }
+        Object value = sb.toString();
 
         // Check if the equality comparison is actually a substring
         // comparison.
@@ -369,7 +429,7 @@
             {
                 sb.append("*");
             }
-            sb.append(pieces.get(i));
+            sb.append(toEncodedString(pieces.get(i)));
         }
         return sb.toString();
     }