You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by ka...@apache.org on 2013/10/29 14:47:16 UTC
svn commit: r1536715 -
/directory/escimo/trunk/common/src/main/java/org/apache/directory/scim/search/FilterParser.java
Author: kayyagari
Date: Tue Oct 29 13:47:16 2013
New Revision: 1536715
URL: http://svn.apache.org/r1536715
Log:
handle groupings
Modified:
directory/escimo/trunk/common/src/main/java/org/apache/directory/scim/search/FilterParser.java
Modified: directory/escimo/trunk/common/src/main/java/org/apache/directory/scim/search/FilterParser.java
URL: http://svn.apache.org/viewvc/directory/escimo/trunk/common/src/main/java/org/apache/directory/scim/search/FilterParser.java?rev=1536715&r1=1536714&r2=1536715&view=diff
==============================================================================
--- directory/escimo/trunk/common/src/main/java/org/apache/directory/scim/search/FilterParser.java (original)
+++ directory/escimo/trunk/common/src/main/java/org/apache/directory/scim/search/FilterParser.java Tue Oct 29 13:47:16 2013
@@ -21,6 +21,8 @@ package org.apache.directory.scim.search
import static org.apache.directory.scim.search.Operator.*;
+import java.util.Stack;
+
/**
* TODO FilterParser.
*
@@ -32,6 +34,12 @@ public class FilterParser
private static class Position
{
int val;
+
+ private Position()
+ {
+ this( 0 );
+ }
+
private Position( int pos )
{
this.val = pos;
@@ -67,34 +75,40 @@ public class FilterParser
{
char c = filter.charAt( pos.val );
+ FilterNode next = null;
+
switch( c )
{
case '(':
//FIXME handle groupings
+ String group = getWithinParenthesis( pos, filter );
+ next = parse( group );
break;
default:
- FilterNode next = parseNode( pos, filter );
- if( next instanceof BranchNode )
- {
- if( node != null )
- {
- ( ( BranchNode ) next ).addNode( node );
- }
-
- node = next;
- }
- else if ( node instanceof BranchNode )
- {
- ( ( BranchNode ) node ).addNode( next );
- }
- else
- {
- node = next;
- }
+ next = parseNode( pos, filter );
+ }
+
+ if( next instanceof BranchNode )
+ {
+ if( node != null )
+ {
+ ( ( BranchNode ) next ).addNode( node );
+ }
+
+ node = next;
+ }
+ else if ( node instanceof BranchNode )
+ {
+ ( ( BranchNode ) node ).addNode( next );
+ }
+ else if( next != null )
+ {
+ node = next;
}
prevChar = c;
+ pos.increment();
}
return node;
@@ -227,11 +241,90 @@ public class FilterParser
return sb.toString();
}
+
+ private static String getWithinParenthesis( Position pos, String filter )
+ {
+ int start = -1;
+ int end = -1;
+
+ Stack<Integer> stack = new Stack<Integer>();
+
+ char prevChar = ' ';
+
+ boolean startQuote = false;
+
+ boolean endQuote = false;
+
+ boolean stop = false;
+
+ while( !stop && ( pos.val < filter.length() ) )
+ {
+ char c = filter.charAt( pos.val );
+
+ switch( c )
+ {
+ case '"':
+ if( startQuote && prevChar != '\\')
+ {
+ endQuote = true;
+ }
+ else if( !startQuote )
+ {
+ startQuote = true;
+ }
+ break;
+
+ case '(':
+ if( !startQuote )
+ {
+ if( start == -1 )
+ {
+ start = pos.val + 1;
+ }
+
+ stack.push( pos.val );
+ }
+ break;
+
+ case ')':
+ if( !startQuote )
+ {
+ if( stack.size() == 1 )
+ {
+ end = pos.val;
+ stop = true;
+ }
+ else
+ {
+ stack.pop();
+ }
+ }
+ break;
+ }
+
+ if( endQuote )
+ {
+ startQuote = false;
+ endQuote = false;
+ }
+
+ prevChar = c;
+ pos.increment();
+ }
+
+ return filter.substring( start, end );
+ }
+
+
public static void main( String[] args )
{
+ String s = "((( x eq \"(y)\" ))) and (y eq \"x\\\"\" )";
+// Position pos = new Position( 0 );
+// System.out.println(getWithinParenthesis( pos, s ));
+
String filter = "(x eq y) and userName eq \"bjensen\"";
- FilterNode node = parse( filter );
+ FilterNode node = parse( s );
System.out.println( node );
}
}