You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by am...@apache.org on 2010/08/26 20:54:52 UTC

svn commit: r989871 - in /cxf/trunk/rt/frontend/jaxrs/src: main/java/org/apache/cxf/jaxrs/ext/search/FiqlParser.java test/java/org/apache/cxf/jaxrs/ext/search/FiqlParserTest.java

Author: amichalec
Date: Thu Aug 26 18:54:52 2010
New Revision: 989871

URL: http://svn.apache.org/viewvc?rev=989871&view=rev
Log:
Fixed brackets handling in FIQL parser

Modified:
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/search/FiqlParser.java
    cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/ext/search/FiqlParserTest.java

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/search/FiqlParser.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/search/FiqlParser.java?rev=989871&r1=989870&r2=989871&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/search/FiqlParser.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/search/FiqlParser.java Thu Aug 26 18:54:52 2010
@@ -101,27 +101,48 @@ public class FiqlParser<T> {
      * @throws FiqlParseException when expression does not follow FIQL grammar
      */
     public SearchCondition<T> parse(String fiqlExpression) throws FiqlParseException {
-        ASTNode<T> ast = parseAndsOrsParens(fiqlExpression);
+        ASTNode<T> ast = parseAndsOrsBrackets(fiqlExpression);
         // System.out.println(ast);
         return ast.build();
     }
 
-    private ASTNode<T> parseAndsOrsParens(String expr) throws FiqlParseException {
-        String s1 = "([\\p{ASCII}&&[^;,()]]+|\\([\\p{ASCII}]+\\))([;,])?";
-        Pattern p = Pattern.compile(s1);
-        Matcher m = p.matcher(expr);
+    private ASTNode<T> parseAndsOrsBrackets(String expr) throws FiqlParseException {
         List<String> subexpressions = new ArrayList<String>();
         List<String> operators = new ArrayList<String>();
-        int lastEnd = -1;
-        while (m.find()) {
-            subexpressions.add(m.group(1));
-            operators.add(m.group(2));
-            if (lastEnd != -1 && lastEnd != m.start()) {
-                throw new FiqlParseException(String
-                    .format("Unexpected characters \"%s\" starting at position %d", expr.substring(lastEnd, m
-                        .start()), lastEnd));
+        int level = 0;
+        int lastIdx = 0;
+        int idx = 0;
+        for (idx = 0; idx < expr.length(); idx++) {
+            char c = expr.charAt(idx);
+            if (c == '(') {
+                level++;
+            } else if (c == ')') {
+                level--;
+                if (level < 0) {
+                    throw new FiqlParseException(String.format("Unexpected closing bracket at position %d",
+                                                               idx));
+                }
             }
-            lastEnd = m.end();
+            String cs = Character.toString(c);
+            boolean isOperator = AND.equals(cs) || OR.equals(cs);
+            if (level == 0 && isOperator) {
+                String s1 = expr.substring(lastIdx, idx);
+                String s2 = expr.substring(idx, idx + 1);
+                subexpressions.add(s1);
+                operators.add(s2);
+                lastIdx = idx + 1;
+            }
+            boolean isEnd = (idx == expr.length() - 1);
+            if (isEnd) {
+                String s1 = expr.substring(lastIdx, idx + 1);
+                subexpressions.add(s1);
+                operators.add(null);
+                lastIdx = idx + 1;
+            }
+        }
+        if (level != 0) {
+            throw new FiqlParseException(String
+                .format("Unmatched opening and closing brackets in expression: %s", expr));
         }
         if (operators.get(operators.size() - 1) != null) {
             String op = operators.get(operators.size() - 1);
@@ -143,7 +164,7 @@ public class FiqlParser<T> {
                 String subex = subexpressions.get(from);
                 ASTNode<T> node = null;
                 if (subex.startsWith("(")) {
-                    node = parseAndsOrsParens(subex.substring(1, subex.length() - 1));
+                    node = parseAndsOrsBrackets(subex.substring(1, subex.length() - 1));
                 } else {
                     node = parseComparison(subex);
                 }

Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/ext/search/FiqlParserTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/ext/search/FiqlParserTest.java?rev=989871&r1=989870&r2=989871&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/ext/search/FiqlParserTest.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/ext/search/FiqlParserTest.java Thu Aug 26 18:54:52 2010
@@ -69,17 +69,32 @@ public class FiqlParserTest extends Asse
     }
 
     @Test
-    public void testRedundantParens() throws FiqlParseException {
+    public void testMultilevelExpression2() throws FiqlParseException {
+        parser.parse("((name==a;level==10),name!=b;name!=c);level=gt=10");
+    }
+
+    @Test
+    public void testRedundantBrackets() throws FiqlParseException {
         parser.parse("name==a;((((level==10))))");
     }
+    
+    @Test
+    public void testAndOfOrs() throws FiqlParseException {
+        parser.parse("(name==a,name==b);(level=gt=0,level=lt=10)");
+    }
+    
+    @Test
+    public void testOrOfAnds() throws FiqlParseException {
+        parser.parse("(name==a;name==b),(level=gt=0;level=lt=10)");
+    }
 
     @Test(expected = FiqlParseException.class)
-    public void testUnmatchedParen() throws FiqlParseException {
-        parser.parse("name==a;(level==10,(name!=b)");
+    public void testUnmatchedBracket() throws FiqlParseException {
+        parser.parse("name==a;(name!=b;(level==10,(name!=b))");
     }
 
     @Test(expected = FiqlParseException.class)
-    public void testUnmatchedParen2() throws FiqlParseException {
+    public void testUnmatchedBracket2() throws FiqlParseException {
         parser.parse("name==bbb;))()level==111");
     }