You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by ak...@apache.org on 2004/06/14 05:08:36 UTC

svn commit: rev 21180 - in incubator/directory/snickers/trunk/ldap-ber-provider/src: java/org/apache/snickers/ldap java/org/apache/snickers/ldap/search test/org/apache/snickers/ldap/bind test/org/apache/snickers/ldap/search

Author: akarasulu
Date: Sun Jun 13 20:08:35 2004
New Revision: 21180

Added:
   incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/search/ApproxMatchRule.java   (contents, props changed)
   incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/search/EqualityMatchRule.java   (contents, props changed)
   incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/search/GreaterOrEqualRule.java   (contents, props changed)
   incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/search/LessOrEqualRule.java   (contents, props changed)
   incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/search/PresentRule.java   (contents, props changed)
   incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/search/SubstringMatchAnyRule.java   (contents, props changed)
   incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/search/SubstringMatchFinalRule.java   (contents, props changed)
   incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/search/SubstringMatchInitialRule.java   (contents, props changed)
   incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/search/SubstringMatchRule.java   (contents, props changed)
   incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/search/TerminateFilterStateRule.java   (contents, props changed)
Modified:
   incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/LdapDigesterFactory.java
   incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/LdapTag.java
   incubator/directory/snickers/trunk/ldap-ber-provider/src/test/org/apache/snickers/ldap/bind/BindResponseRuleTest.java
   incubator/directory/snickers/trunk/ldap-ber-provider/src/test/org/apache/snickers/ldap/search/SearchRequestTest.java
Log:
Commit changes ...

 o added search request filter rules for equality match
 o added search request filter rules for presence match
 o added search request filter rules for greaterThan match
 o added search request filter rules for lessThan match
 o added search request filter rules for approximate match
   
To do ...

 o need to handle extensible match
 o and, or and not expressions



Modified: incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/LdapDigesterFactory.java
==============================================================================
--- incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/LdapDigesterFactory.java	(original)
+++ incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/LdapDigesterFactory.java	Sun Jun 13 20:08:35 2004
@@ -18,6 +18,7 @@
 
 
 import org.apache.snickers.ber.digester.BERDigester ;
+import org.apache.snickers.ber.digester.TagTree;
 import org.apache.snickers.ber.primitives.UniversalTag ;
 import org.apache.snickers.ber.digester.rules.PrimitiveIntDecodeRule ;
 import org.apache.snickers.ber.digester.rules.PrimitiveOctetStringRule ;
@@ -110,7 +111,7 @@
         addModifyDnResponseRules( digester ) ;
         addModifyRequestRules( digester ) ;
         addModifyResponseRules( digester ) ;
-        adddeletes( digester ) ;
+        addSearchRequestRules( digester ) ;
         addSearchResponseDoneRules( digester ) ;
         addSearchResponseReferenceRules( digester ) ;
         addSearchResponseEntryRules( digester ) ;
@@ -119,7 +120,7 @@
     }
 
 
-    private void adddeletes( BERDigester digester )
+    private void addSearchRequestRules( BERDigester digester )
     {
         int[] pattern = new int[2];
 
@@ -147,14 +148,66 @@
         digester.addRule( pattern, new TypesOnlyRule() );
 
         pattern[2] = UniversalTag.SEQUENCE_SEQUENCE_OF.getPrimitiveTag();
+        digester.addRule( pattern, new TerminateFilterStateRule() );
         digester.addRule( pattern, new RequestedAttributesStateChangeRule() );
 
-        pattern = new int[4] ;
-        pattern[0] = UniversalTag.SEQUENCE_SEQUENCE_OF.getPrimitiveTag() ;
+        pattern = new int[4];
+        pattern[0] = UniversalTag.SEQUENCE_SEQUENCE_OF.getPrimitiveTag();
         pattern[1] = LdapTag.SEARCH_REQUEST.getPrimitiveTag();
         pattern[2] = UniversalTag.SEQUENCE_SEQUENCE_OF.getPrimitiveTag();
         pattern[3] = UniversalTag.OCTET_STRING.getPrimitiveTag();
         digester.addRule( pattern, new RequestedAttributesRule() );
+
+        pattern = new int[2];
+        pattern[0] = TagTree.WILDCARD;
+        pattern[1] = LdapTag.CONTEXT_SPECIFIC_TAG_7.getPrimitiveTag();
+        digester.addRule( pattern, new PresentRule() );
+
+        pattern = new int[3];
+        pattern[0] = TagTree.WILDCARD;
+        pattern[1] = LdapTag.CONTEXT_SPECIFIC_TAG_3.getPrimitiveTag();
+        pattern[2] = UniversalTag.OCTET_STRING.getPrimitiveTag();
+        digester.addRule( pattern, new EqualityMatchRule() );
+
+        //
+        // substring filter and helper rules
+        //
+
+        pattern[1] = LdapTag.CONTEXT_SPECIFIC_TAG_4.getPrimitiveTag();
+        digester.addRule( pattern, new Octets2StringRule() );
+        pattern[2] = UniversalTag.SEQUENCE_SEQUENCE_OF.getPrimitiveTag();
+        digester.addRule( pattern, new SubstringMatchRule() );
+
+        pattern = new int[4];
+        pattern[0] = TagTree.WILDCARD;
+        pattern[1] = LdapTag.CONTEXT_SPECIFIC_TAG_4.getPrimitiveTag();
+        pattern[2] = UniversalTag.SEQUENCE_SEQUENCE_OF.getPrimitiveTag();
+        pattern[3] = LdapTag.CONTEXT_SPECIFIC_TAG_0.getPrimitiveTag();
+        digester.addRule( pattern, new SubstringMatchInitialRule() );
+
+        pattern[3] = LdapTag.CONTEXT_SPECIFIC_TAG_1.getPrimitiveTag();
+        digester.addRule( pattern, new SubstringMatchAnyRule() );
+
+        pattern[3] = LdapTag.CONTEXT_SPECIFIC_TAG_2.getPrimitiveTag();
+        digester.addRule( pattern, new SubstringMatchFinalRule() );
+
+        //
+        // end substring filter rules
+        //
+
+        pattern = new int[3];
+        pattern[0] = TagTree.WILDCARD;
+        pattern[1] = LdapTag.CONTEXT_SPECIFIC_TAG_5.getPrimitiveTag();
+        pattern[2] = UniversalTag.OCTET_STRING.getPrimitiveTag();
+        digester.addRule( pattern, new GreaterOrEqualRule() );
+
+        pattern[1] = LdapTag.CONTEXT_SPECIFIC_TAG_6.getPrimitiveTag();
+        digester.addRule( pattern, new LessOrEqualRule() );
+
+        pattern[1] = LdapTag.CONTEXT_SPECIFIC_TAG_8.getPrimitiveTag();
+        digester.addRule( pattern, new ApproxMatchRule() );
+
+
     }
 
 

Modified: incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/LdapTag.java
==============================================================================
--- incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/LdapTag.java	(original)
+++ incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/LdapTag.java	Sun Jun 13 20:08:35 2004
@@ -201,13 +201,38 @@
             "EXTENDED_RESPONSE", EXTENDED_RESPONSE_TAG,
             EXTENDED_RESPONSE_ID ) ;
 
+
+    /** Context specific 6 tag */
+    public static final ContextSpecificTag CONTEXT_SPECIFIC_TAG_8 =
+            new ContextSpecificTag( 8, true );
+
+    /** Context specific 6 tag */
+    public static final ContextSpecificTag CONTEXT_SPECIFIC_TAG_7 =
+            new ContextSpecificTag( 7, true );
+
+    /** Context specific 6 tag */
+    public static final ContextSpecificTag CONTEXT_SPECIFIC_TAG_6 =
+            new ContextSpecificTag( 6, true );
+
+    /** Context specific 5 tag */
+    public static final ContextSpecificTag CONTEXT_SPECIFIC_TAG_5 =
+            new ContextSpecificTag( 5, true );
+
+    /** Context specific tag used for SearchRequest expr node greaterOrEqual*/
+    public static final ContextSpecificTag GREATER_OR_EQUAL_TAG =
+            CONTEXT_SPECIFIC_TAG_5;
+
+    /** Context specific 3 tag */
+    public static final ContextSpecificTag CONTEXT_SPECIFIC_TAG_3 =
+            new ContextSpecificTag( 3, true ) ;
+
     /** Context specific tag used for LDAPResult referrals */
     public static final ContextSpecificTag REFERRAL_TAG =
-            new ContextSpecificTag( 3, true ) ;
+            CONTEXT_SPECIFIC_TAG_3 ;
 
     /** Context specific tag used for BindResponse serverSaslCreds */
     public static final ContextSpecificTag SERVER_SASL_CREDS_TAG =
-            new ContextSpecificTag( 7, true ) ;
+            CONTEXT_SPECIFIC_TAG_7 ;
 
     /** Context specific tag used for CONTEXT_SPECIFIC 0 */
     public static final ContextSpecificTag CONTEXT_SPECIFIC_TAG_0 =
@@ -217,10 +242,6 @@
     public static final ContextSpecificTag EXTENDED_REQUEST_NAME_TAG =
             CONTEXT_SPECIFIC_TAG_0 ;
 
-    /** Context specific tag used for ExtendedRequest request value */
-    public static final ContextSpecificTag EXTENDED_REQUEST_VALUE_TAG =
-            new ContextSpecificTag( 1, false ) ;
-
     /** Context specific tag used for ExtendedResponse responseName */
     public static final ContextSpecificTag EXTENDED_RESPONSE_NAME_TAG =
             new ContextSpecificTag( 10, false ) ;
@@ -233,6 +254,21 @@
     public static final ContextSpecificTag MODIFYDN_REQUEST_NEWSUP_TAG =
             CONTEXT_SPECIFIC_TAG_0 ;
 
+    /** Context specific tag used for Search request new superior dn */
+    public static final ContextSpecificTag SEARCH_REQUEST_EQUALITY_MATH_TAG =
+            CONTEXT_SPECIFIC_TAG_3 ;
+
+    public static final ContextSpecificTag CONTEXT_SPECIFIC_TAG_4 =
+        new ContextSpecificTag( 4, true );
+
+    public static final ContextSpecificTag CONTEXT_SPECIFIC_TAG_1 =
+            new ContextSpecificTag( 1, true ) ;
+
+    /** Context specific tag used for ExtendedRequest request value */
+    public static final ContextSpecificTag EXTENDED_REQUEST_VALUE_TAG =
+           CONTEXT_SPECIFIC_TAG_1;
+    public static final ContextSpecificTag CONTEXT_SPECIFIC_TAG_2 = 
+            new ContextSpecificTag( 2, true ) ;
 
 
     // -----------------------------------------------------------------------

Added: incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/search/ApproxMatchRule.java
==============================================================================
--- (empty file)
+++ incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/search/ApproxMatchRule.java	Sun Jun 13 20:08:35 2004
@@ -0,0 +1,157 @@
+/*
+ *   Copyright 2004 The Apache Software Foundation
+ *
+ *   Licensed under the Apache License, Version 2.0 (the "License");
+ *   you may not use this file except in compliance with the License.
+ *   You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *   limitations under the License.
+ *
+ */
+package org.apache.snickers.ldap.search;
+
+
+import java.nio.ByteBuffer;
+
+import org.apache.snickers.ber.TypeClass;
+import org.apache.snickers.ber.digester.rules.PrimitiveOctetStringRule;
+import org.apache.snickers.ldap.LdapTag;
+
+import org.apache.ldap.common.filter.SimpleNode;
+
+
+/**
+ * Rule used to gather and push an equality match node onto the stack.  This
+ * rule is registered using a wild card pattern: [*, 0x83000000, 0x04000000 ].
+ * It does check that all patterns causing a firing have the starting pattern
+ * of a SearchRequest.
+ * 
+ * @author <a href="mailto:directory-dev@incubator.apache.org">Apache Directory
+ *         Project</a>
+ * @version $Rev$
+ */
+public class ApproxMatchRule extends PrimitiveOctetStringRule
+{
+    private boolean isEnabled = true ;
+    private String name = null ;
+    private String value = null ;
+
+
+    public void tag( int id, boolean isPrimitive, TypeClass typeClass )
+    {
+        // check to see we are within limits - have the right number of tags
+        int tagCount = getDigester().getTagCount();
+        if ( tagCount < 4 )
+        {
+            this.isEnabled = false;
+            return;
+        }
+
+        /*
+         * check to see that we're dealing within a search request - this is
+         * done by making sure the tag right above the bottom tag is equal
+         * to the SEARCH_REQUEST tag. If not we must disable this rule.
+         */
+        if ( getDigester().getTag( tagCount - 2 ) !=
+                LdapTag.SEARCH_REQUEST.getPrimitiveTag() )
+        {
+            this.isEnabled = false;
+            return;
+        }
+
+        super.tag( id, isPrimitive, typeClass );
+
+        int ii = getDigester().getCount() - 2;
+        SearchRequestProcessing processing;
+        processing = ( SearchRequestProcessing ) getDigester().peek(ii);
+
+        if ( processing.getState() != processing.FILTER_STATE )
+        {
+            isEnabled = false ;
+        }
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.snickers.ber.Rule#length(int)
+     */
+    public void length( int length )
+    {
+        if ( isEnabled )
+        {
+            super.length( length );
+        }
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.snickers.ber.Rule#value(java.nio.ByteBuffer)
+     */
+    public void value( ByteBuffer buf )
+    {
+        if ( isEnabled )
+        {
+            super.value( buf );
+        }
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.snickers.ber.Rule#finish()
+     */
+    public void finish()
+    {
+        if ( ! isEnabled )
+        {
+            isEnabled = true ;
+            return ;
+        }
+
+        // pushes a ByteBuffer onto the stack
+        super.finish() ;
+
+        // pop the ByteBuffer the super method pushed
+        ByteBuffer buf = ( ByteBuffer ) getDigester().pop() ;
+
+        byte[] octets = null ;
+        if ( buf.limit() == buf.capacity() && buf.hasArray() )
+        {
+            // use the backing store
+            octets = buf.array() ;
+        }
+        else
+        {
+            // copy because we don't have accessible array or data < array
+            octets = new byte[buf.remaining()];
+            buf.get( octets );
+        }
+
+        if ( name == null && value == null )
+        {
+            name = new String( octets ) ;
+        }
+        else if ( name != null && value == null )
+        {
+            value = new String( octets ) ;
+
+
+            SimpleNode node;
+            node = new SimpleNode( name, value, SimpleNode.APPROXIMATE );
+            getDigester().push( node ) ;
+
+            name = null ;
+            value = null ;
+        }
+        else
+        {
+            throw new IllegalStateException( "name = " + name
+                    + " and value = " + value );
+        }
+    }
+}

Added: incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/search/EqualityMatchRule.java
==============================================================================
--- (empty file)
+++ incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/search/EqualityMatchRule.java	Sun Jun 13 20:08:35 2004
@@ -0,0 +1,157 @@
+/*
+ *   Copyright 2004 The Apache Software Foundation
+ *
+ *   Licensed under the Apache License, Version 2.0 (the "License");
+ *   you may not use this file except in compliance with the License.
+ *   You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *   limitations under the License.
+ *
+ */
+package org.apache.snickers.ldap.search;
+
+
+import java.nio.ByteBuffer;
+
+import org.apache.snickers.ber.TypeClass;
+import org.apache.snickers.ber.digester.rules.PrimitiveOctetStringRule;
+import org.apache.snickers.ldap.LdapTag;
+
+import org.apache.ldap.common.filter.SimpleNode;
+
+
+/**
+ * Rule used to gather and push an equality match node onto the stack.  This
+ * rule is registered using a wild card pattern: [*, 0x83000000, 0x04000000 ].
+ * It does check that all patterns causing a firing have the starting pattern
+ * of a SearchRequest.
+ * 
+ * @author <a href="mailto:directory-dev@incubator.apache.org">Apache Directory
+ *         Project</a>
+ * @version $Rev$
+ */
+public class EqualityMatchRule extends PrimitiveOctetStringRule
+{
+    private boolean isEnabled = true ;
+    private String name = null ;
+    private String value = null ;
+
+
+    public void tag( int id, boolean isPrimitive, TypeClass typeClass )
+    {
+        // check to see we are within limits - have the right number of tags
+        int tagCount = getDigester().getTagCount();
+        if ( tagCount < 4 )
+        {
+            this.isEnabled = false;
+            return;
+        }
+
+        /*
+         * check to see that we're dealing within a search request - this is
+         * done by making sure the tag right above the bottom tag is equal
+         * to the SEARCH_REQUEST tag. If not we must disable this rule.
+         */
+        if ( getDigester().getTag( tagCount - 2 ) !=
+                LdapTag.SEARCH_REQUEST.getPrimitiveTag() )
+        {
+            this.isEnabled = false;
+            return;
+        }
+
+        super.tag( id, isPrimitive, typeClass );
+
+        int ii = getDigester().getCount() - 2;
+        SearchRequestProcessing processing;
+        processing = ( SearchRequestProcessing ) getDigester().peek(ii);
+
+        if ( processing.getState() != processing.FILTER_STATE )
+        {
+            isEnabled = false ;
+        }
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.snickers.ber.Rule#length(int)
+     */
+    public void length( int length )
+    {
+        if ( isEnabled )
+        {
+            super.length( length );
+        }
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.snickers.ber.Rule#value(java.nio.ByteBuffer)
+     */
+    public void value( ByteBuffer buf )
+    {
+        if ( isEnabled )
+        {
+            super.value( buf );
+        }
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.snickers.ber.Rule#finish()
+     */
+    public void finish()
+    {
+        if ( ! isEnabled )
+        {
+            isEnabled = true ;
+            return ;
+        }
+
+        // pushes a ByteBuffer onto the stack
+        super.finish() ;
+
+        // pop the ByteBuffer the super method pushed
+        ByteBuffer buf = ( ByteBuffer ) getDigester().pop() ;
+
+        byte[] octets = null ;
+        if ( buf.limit() == buf.capacity() && buf.hasArray() )
+        {
+            // use the backing store
+            octets = buf.array() ;
+        }
+        else
+        {
+            // copy because we don't have accessible array or data < array
+            octets = new byte[buf.remaining()];
+            buf.get( octets );
+        }
+
+        if ( name == null && value == null )
+        {
+            name = new String( octets ) ;
+        }
+        else if ( name != null && value == null )
+        {
+            value = new String( octets ) ;
+
+
+            SimpleNode node;
+            node = new SimpleNode( name, value, SimpleNode.EQUALITY );
+            getDigester().push( node ) ;
+
+            name = null ;
+            value = null ;
+        }
+        else
+        {
+            throw new IllegalStateException( "name = " + name
+                    + " and value = " + value );
+        }
+    }
+}

Added: incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/search/GreaterOrEqualRule.java
==============================================================================
--- (empty file)
+++ incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/search/GreaterOrEqualRule.java	Sun Jun 13 20:08:35 2004
@@ -0,0 +1,136 @@
+/*
+ *   Copyright 2004 The Apache Software Foundation
+ *
+ *   Licensed under the Apache License, Version 2.0 (the "License");
+ *   you may not use this file except in compliance with the License.
+ *   You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *   limitations under the License.
+ *
+ */
+package org.apache.snickers.ldap.search;
+
+
+import java.nio.ByteBuffer;
+
+import org.apache.snickers.ber.TypeClass;
+import org.apache.snickers.ber.digester.rules.PrimitiveOctetStringRule;
+
+import org.apache.ldap.common.filter.SimpleNode;
+
+
+/**
+ * Rule used to gather and push an equality match node onto the stack.  This
+ * rule is registered using a wild card pattern: [*, 0x83000000, 0x04000000 ].
+ * It does check that all patterns causing a firing have the starting pattern
+ * of a SearchRequest.
+ * 
+ * @author <a href="mailto:directory-dev@incubator.apache.org">Apache Directory
+ *         Project</a>
+ * @version $Rev$
+ */
+public class GreaterOrEqualRule extends PrimitiveOctetStringRule
+{
+    private boolean isEnabled = true ;
+    private String name = null ;
+    private String value = null ;
+
+
+    public void tag( int id, boolean isPrimitive, TypeClass typeClass )
+    {
+        super.tag( id, isPrimitive, typeClass );
+
+        int ii = getDigester().getCount() - 2;
+        SearchRequestProcessing processing;
+        processing = ( SearchRequestProcessing ) getDigester().peek(ii);
+
+        if ( processing.getState() != processing.FILTER_STATE )
+        {
+            isEnabled = false ;
+        }
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.snickers.ber.Rule#length(int)
+     */
+    public void length( int length )
+    {
+        if ( isEnabled )
+        {
+            super.length( length );
+        }
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.snickers.ber.Rule#value(java.nio.ByteBuffer)
+     */
+    public void value( ByteBuffer buf )
+    {
+        if ( isEnabled )
+        {
+            super.value( buf );
+        }
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.snickers.ber.Rule#finish()
+     */
+    public void finish()
+    {
+        if ( ! isEnabled )
+        {
+            isEnabled = true ;
+            return ;
+        }
+
+        // pushes a ByteBuffer onto the stack
+        super.finish() ;
+
+        // pop the ByteBuffer the super method pushed
+        ByteBuffer buf = ( ByteBuffer ) getDigester().pop() ;
+
+        byte[] octets = null ;
+        if ( buf.limit() == buf.capacity() && buf.hasArray() )
+        {
+            // use the backing store
+            octets = buf.array() ;
+        }
+        else
+        {
+            // copy because we don't have accessible array or data < array
+            octets = new byte[buf.remaining()];
+            buf.get( octets );
+        }
+
+        if ( name == null && value == null )
+        {
+            name = new String( octets ) ;
+        }
+        else if ( name != null && value == null )
+        {
+            value = new String( octets ) ;
+
+
+            SimpleNode node;
+            node = new SimpleNode( name, value, SimpleNode.GREATEREQ );
+            getDigester().push( node ) ;
+
+            name = null ;
+            value = null ;
+        }
+        else
+        {
+            throw new IllegalStateException( "name = " + name
+                    + " and value = " + value );
+        }
+    }
+}

Added: incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/search/LessOrEqualRule.java
==============================================================================
--- (empty file)
+++ incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/search/LessOrEqualRule.java	Sun Jun 13 20:08:35 2004
@@ -0,0 +1,136 @@
+/*
+ *   Copyright 2004 The Apache Software Foundation
+ *
+ *   Licensed under the Apache License, Version 2.0 (the "License");
+ *   you may not use this file except in compliance with the License.
+ *   You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *   limitations under the License.
+ *
+ */
+package org.apache.snickers.ldap.search;
+
+
+import java.nio.ByteBuffer;
+
+import org.apache.snickers.ber.TypeClass;
+import org.apache.snickers.ber.digester.rules.PrimitiveOctetStringRule;
+
+import org.apache.ldap.common.filter.SimpleNode;
+
+
+/**
+ * Rule used to gather and push an equality match node onto the stack.  This
+ * rule is registered using a wild card pattern: [*, 0x83000000, 0x04000000 ].
+ * It does check that all patterns causing a firing have the starting pattern
+ * of a SearchRequest.
+ * 
+ * @author <a href="mailto:directory-dev@incubator.apache.org">Apache Directory
+ *         Project</a>
+ * @version $Rev$
+ */
+public class LessOrEqualRule extends PrimitiveOctetStringRule
+{
+    private boolean isEnabled = true ;
+    private String name = null ;
+    private String value = null ;
+
+
+    public void tag( int id, boolean isPrimitive, TypeClass typeClass )
+    {
+        super.tag( id, isPrimitive, typeClass );
+
+        int ii = getDigester().getCount() - 2;
+        SearchRequestProcessing processing;
+        processing = ( SearchRequestProcessing ) getDigester().peek(ii);
+
+        if ( processing.getState() != processing.FILTER_STATE )
+        {
+            isEnabled = false ;
+        }
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.snickers.ber.Rule#length(int)
+     */
+    public void length( int length )
+    {
+        if ( isEnabled )
+        {
+            super.length( length );
+        }
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.snickers.ber.Rule#value(java.nio.ByteBuffer)
+     */
+    public void value( ByteBuffer buf )
+    {
+        if ( isEnabled )
+        {
+            super.value( buf );
+        }
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.snickers.ber.Rule#finish()
+     */
+    public void finish()
+    {
+        if ( ! isEnabled )
+        {
+            isEnabled = true ;
+            return ;
+        }
+
+        // pushes a ByteBuffer onto the stack
+        super.finish() ;
+
+        // pop the ByteBuffer the super method pushed
+        ByteBuffer buf = ( ByteBuffer ) getDigester().pop() ;
+
+        byte[] octets = null ;
+        if ( buf.limit() == buf.capacity() && buf.hasArray() )
+        {
+            // use the backing store
+            octets = buf.array() ;
+        }
+        else
+        {
+            // copy because we don't have accessible array or data < array
+            octets = new byte[buf.remaining()];
+            buf.get( octets );
+        }
+
+        if ( name == null && value == null )
+        {
+            name = new String( octets ) ;
+        }
+        else if ( name != null && value == null )
+        {
+            value = new String( octets ) ;
+
+
+            SimpleNode node;
+            node = new SimpleNode( name, value, SimpleNode.LESSEQ );
+            getDigester().push( node ) ;
+
+            name = null ;
+            value = null ;
+        }
+        else
+        {
+            throw new IllegalStateException( "name = " + name
+                    + " and value = " + value );
+        }
+    }
+}

Added: incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/search/PresentRule.java
==============================================================================
--- (empty file)
+++ incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/search/PresentRule.java	Sun Jun 13 20:08:35 2004
@@ -0,0 +1,138 @@
+/*
+ *   Copyright 2004 The Apache Software Foundation
+ *
+ *   Licensed under the Apache License, Version 2.0 (the "License");
+ *   you may not use this file except in compliance with the License.
+ *   You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *   limitations under the License.
+ *
+ */
+package org.apache.snickers.ldap.search;
+
+
+import java.nio.ByteBuffer;
+
+import org.apache.snickers.ldap.LdapTag;
+import org.apache.snickers.ber.digester.rules.PrimitiveOctetStringRule;
+import org.apache.snickers.ber.TypeClass;
+
+import org.apache.ldap.common.filter.PresenceNode;
+
+
+/**
+ * Populates the baseObject field of the SearchRequest.
+ * 
+ * @author <a href="mailto:directory-dev@incubator.apache.org">Apache Directory
+ *         Project</a>
+ * @version $Rev$
+ */
+public class PresentRule extends PrimitiveOctetStringRule
+{
+    private boolean isEnabled = true ;
+
+
+    public PresentRule()
+    {
+        super( LdapTag.CONTEXT_SPECIFIC_TAG_7 ) ;
+    }
+
+
+    public void tag( int id, boolean isPrimitive, TypeClass typeClass )
+    {
+        // check to see we are within limits - have the right number of tags
+        int tagCount = getDigester().getTagCount();
+        if ( tagCount < 3 )
+        {
+            this.isEnabled = false;
+            return;
+        }
+
+        /*
+         * check to see that we're dealing within a search request - this is
+         * done by making sure the tag right above the bottom tag is equal
+         * to the SEARCH_REQUEST tag. If not we must disable this rule.
+         */
+        if ( getDigester().getTag( tagCount - 2 ) !=
+                LdapTag.SEARCH_REQUEST.getPrimitiveTag() )
+        {
+            this.isEnabled = false;
+            return;
+        }
+
+        super.tag( id, isPrimitive, typeClass );
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.snickers.ber.Rule#length(int)
+     */
+    public void length( int length )
+    {
+        if ( isEnabled )
+        {
+            super.length( length );
+        }
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.snickers.ber.Rule#value(java.nio.ByteBuffer)
+     */
+    public void value( ByteBuffer buf )
+    {
+        if ( isEnabled )
+        {
+            super.value( buf );
+        }
+    }
+
+
+    /**
+     * Allows the super method to push a ByteBuffer onto the top of the stack
+     * which contains the drained contents of the superclass' ByteAccumulator.
+     * This ByteBuffer is popped first then used to populate the credentials.
+     * There is no need to copy this buffer since it will not be used again
+     * by the ByteAccumulator of the superclass so we should be able to use
+     * the byte[] based backing store if one is present.  However it might
+     * have to be copied even then.  Situations requiring a copy are when the
+     * buffer has a limit less than the capacity or when there is no
+     * accessible array to the buffer.
+     *
+     * @see org.apache.snickers.ber.digester.Rule#finish()
+     */
+    public void finish()
+    {
+        if ( isEnabled )
+        {
+            // pushes a ByteBuffer onto the stack
+            super.finish() ;
+
+            // pop the ByteBuffer the super method pushed
+            ByteBuffer buf = ( ByteBuffer ) getDigester().pop() ;
+
+            byte[] octets = null ;
+            if ( buf.limit() == buf.capacity() && buf.hasArray() )
+            {
+                // use the backing store
+                octets = buf.array() ;
+            }
+            else
+            {
+                // copy because we don't have accessible array or data < array
+                octets = new byte[buf.remaining()];
+                buf.get( octets );
+            }
+
+            getDigester().push( new PresenceNode( new String( octets ) ) );
+        }
+
+        isEnabled = true ;
+    }
+}

Added: incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/search/SubstringMatchAnyRule.java
==============================================================================
--- (empty file)
+++ incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/search/SubstringMatchAnyRule.java	Sun Jun 13 20:08:35 2004
@@ -0,0 +1,69 @@
+/*
+ *   Copyright 2004 The Apache Software Foundation
+ *
+ *   Licensed under the Apache License, Version 2.0 (the "License");
+ *   you may not use this file except in compliance with the License.
+ *   You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *   limitations under the License.
+ *
+ */
+package org.apache.snickers.ldap.search;
+
+
+import java.nio.ByteBuffer;
+
+import org.apache.snickers.ber.digester.rules.PrimitiveOctetStringRule;
+import org.apache.snickers.ldap.LdapTag;
+
+
+/**
+ * A helper rule used to build a Substring match fiter expression.  This rule
+ * accessess the top object on the object stack which it presumes is the rule
+ * it is helping: an instance of the SubstringMatchRule class.  It sets the
+ * initial string value using the setter on this rule.
+ * 
+ * @author <a href="mailto:directory-dev@incubator.apache.org">Apache Directory
+ *         Project</a>
+ * @version $Rev$
+ */
+public class SubstringMatchAnyRule extends PrimitiveOctetStringRule
+{
+    public SubstringMatchAnyRule()
+    {
+        super( LdapTag.CONTEXT_SPECIFIC_TAG_1 );
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.snickers.ber.Rule#finish()
+     */
+    public void finish()
+    {
+        super.finish() ;
+
+        // pop the ByteBuffer the super method pushed
+        ByteBuffer buf = ( ByteBuffer ) getDigester().pop() ;
+
+        byte[] octets = null ;
+        if ( buf.limit() == buf.capacity() && buf.hasArray() )
+        {
+            // use the backing store
+            octets = buf.array() ;
+        }
+        else
+        {
+            // copy because we don't have accessible array or data < array
+            octets = new byte[buf.remaining()] ;
+            buf.get( octets ) ;
+        }
+
+        SubstringMatchRule rule = ( SubstringMatchRule ) getDigester().peek() ;
+        rule.addAny( new String( octets ) );
+    }
+}

Added: incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/search/SubstringMatchFinalRule.java
==============================================================================
--- (empty file)
+++ incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/search/SubstringMatchFinalRule.java	Sun Jun 13 20:08:35 2004
@@ -0,0 +1,70 @@
+/*
+ *   Copyright 2004 The Apache Software Foundation
+ *
+ *   Licensed under the Apache License, Version 2.0 (the "License");
+ *   you may not use this file except in compliance with the License.
+ *   You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *   limitations under the License.
+ *
+ */
+package org.apache.snickers.ldap.search;
+
+
+import java.nio.ByteBuffer;
+
+import org.apache.snickers.ber.digester.rules.PrimitiveOctetStringRule;
+import org.apache.snickers.ldap.LdapTag;
+
+
+/**
+ * A helper rule used to build a Substring match fiter expression.  This rule
+ * accessess the top object on the object stack which it presumes is the rule
+ * it is helping: an instance of the SubstringMatchRule class.  It sets the
+ * initial string value using the setter on this rule.
+ * 
+ * @author <a href="mailto:directory-dev@incubator.apache.org">Apache Directory
+ *         Project</a>
+ * @version $Rev$
+ */
+public class SubstringMatchFinalRule extends PrimitiveOctetStringRule
+{
+    public SubstringMatchFinalRule()
+    {
+        super( LdapTag.CONTEXT_SPECIFIC_TAG_2 );
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.snickers.ber.Rule#finish()
+     */
+    public void finish()
+    {
+        super.finish() ;
+
+        // pop the ByteBuffer the super method pushed
+        ByteBuffer buf = ( ByteBuffer ) getDigester().pop() ;
+
+        byte[] octets = null ;
+        if ( buf.limit() == buf.capacity() && buf.hasArray() )
+        {
+            // use the backing store
+            octets = buf.array() ;
+        }
+        else
+        {
+            // copy because we don't have accessible array or data < array
+            octets = new byte[buf.remaining()] ;
+            buf.get( octets ) ;
+        }
+
+        SubstringMatchRule rule = ( SubstringMatchRule ) getDigester().peek() ;
+        rule.setFinalStr( new String( octets ) );
+    }
+}

Added: incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/search/SubstringMatchInitialRule.java
==============================================================================
--- (empty file)
+++ incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/search/SubstringMatchInitialRule.java	Sun Jun 13 20:08:35 2004
@@ -0,0 +1,70 @@
+/*
+ *   Copyright 2004 The Apache Software Foundation
+ *
+ *   Licensed under the Apache License, Version 2.0 (the "License");
+ *   you may not use this file except in compliance with the License.
+ *   You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *   limitations under the License.
+ *
+ */
+package org.apache.snickers.ldap.search;
+
+
+import java.nio.ByteBuffer;
+
+import org.apache.snickers.ber.digester.rules.PrimitiveOctetStringRule;
+import org.apache.snickers.ldap.LdapTag;
+
+
+/**
+ * A helper rule used to build a Substring match fiter expression.  This rule
+ * accessess the top object on the object stack which it presumes is the rule
+ * it is helping: an instance of the SubstringMatchRule class.  It sets the
+ * initial string value using the setter on this rule.
+ * 
+ * @author <a href="mailto:directory-dev@incubator.apache.org">Apache Directory
+ *         Project</a>
+ * @version $Rev$
+ */
+public class SubstringMatchInitialRule extends PrimitiveOctetStringRule
+{
+    public SubstringMatchInitialRule()
+    {
+        super( LdapTag.CONTEXT_SPECIFIC_TAG_0 );
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.snickers.ber.Rule#finish()
+     */
+    public void finish()
+    {
+        super.finish() ;
+
+        // pop the ByteBuffer the super method pushed
+        ByteBuffer buf = ( ByteBuffer ) getDigester().pop() ;
+
+        byte[] octets = null ;
+        if ( buf.limit() == buf.capacity() && buf.hasArray() )
+        {
+            // use the backing store
+            octets = buf.array() ;
+        }
+        else
+        {
+            // copy because we don't have accessible array or data < array
+            octets = new byte[buf.remaining()] ;
+            buf.get( octets ) ;
+        }
+
+        SubstringMatchRule rule = ( SubstringMatchRule ) getDigester().peek() ;
+        rule.setInitial( new String( octets ) );
+    }
+}

Added: incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/search/SubstringMatchRule.java
==============================================================================
--- (empty file)
+++ incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/search/SubstringMatchRule.java	Sun Jun 13 20:08:35 2004
@@ -0,0 +1,187 @@
+/*
+ *   Copyright 2004 The Apache Software Foundation
+ *
+ *   Licensed under the Apache License, Version 2.0 (the "License");
+ *   you may not use this file except in compliance with the License.
+ *   You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *   limitations under the License.
+ *
+ */
+package org.apache.snickers.ldap.search;
+
+
+import java.util.ArrayList;
+import java.nio.ByteBuffer;
+
+import org.apache.snickers.ldap.LdapTag;
+import org.apache.snickers.ber.TypeClass;
+import org.apache.snickers.ber.digester.AbstractRule;
+
+import org.apache.ldap.common.filter.SubstringNode;
+
+
+/**
+ * A rule used to collect and instantiate a substring filter expression.  This
+ * rule reacts with others because it itself is pushed onto the stack.
+ * Interfaces on the rule allow for the collection of substring filter
+ * parameters.
+ * <br/>
+ * The rule is registered with wild card pattern [*, 0x84000000, 0x10000000] on
+ * a search request rather than using [*, 0x84000000].  This is done to have
+ * more specific registration.  It excepts a String the attribute name or "type"
+ * according to the ASN.1 definition to be available on the stack deposited by
+ * a rule using the [*, 0x84000000, 0x04000000] pattern.
+ *
+ * @author <a href="mailto:directory-dev@incubator.apache.org">Apache Directory
+ *         Project</a>
+ * @version $Rev$
+ */
+public class SubstringMatchRule extends AbstractRule
+{
+    private boolean isEnabled = true;
+    /** the initial substring gotten from the stack */
+    private String type = null;
+    private String initialStr = null;
+    private String finalStr = null;
+    private ArrayList any = new ArrayList();
+
+
+    /*
+     * @see org.apache.snickers.ber.digester.Rule#tag(int, boolean,
+     * org.apache.snickers.ber.TypeClass)
+     */
+    public void tag( int id, boolean isPrimitive, TypeClass typeClass )
+    {
+        // check to see we are within limits - have the right number of tags
+        int tagCount = getDigester().getTagCount();
+        if ( tagCount < 4 )
+        {
+            this.isEnabled = false;
+            return;
+        }
+
+        /*
+         * check to see that we're dealing within a search request - this is
+         * done by making sure the tag right above the bottom tag is equal
+         * to the SEARCH_REQUEST tag. If not we must disable this rule.
+         */
+        if ( getDigester().getTag( tagCount - 2 ) !=
+                LdapTag.SEARCH_REQUEST.getPrimitiveTag() )
+        {
+            this.isEnabled = false;
+            return;
+        }
+
+        super.tag( id, isPrimitive, typeClass );
+
+        /*
+         * If enabled we need to pop the string deposited there from a helper
+         * rule next we push this rule onto the stack to be populated by other
+         * rules.
+         */
+        if ( isEnabled )
+        {
+            type = ( String ) getDigester().pop();
+            getDigester().push( this );
+        }
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.snickers.ber.Rule#length(int)
+     */
+    public void length( int length )
+    {
+        if ( isEnabled )
+        {
+            super.length( length );
+        }
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.snickers.ber.Rule#value(java.nio.ByteBuffer)
+     */
+    public void value( ByteBuffer buf )
+    {
+        if ( isEnabled )
+        {
+            super.value( buf );
+        }
+    }
+
+
+    /**
+     * Creates a SubstringNode using all the values that have been set by other
+     * helper rules and pushes the node onto the object stack.
+     *
+     * @see org.apache.snickers.ber.digester.Rule#finish()
+     */
+    public void finish()
+    {
+        if ( isEnabled )
+        {
+            super.finish();
+            SubstringNode node;
+            node = new SubstringNode( any, type, initialStr, finalStr );
+
+            if ( getDigester().peek() == this )
+            {
+                getDigester().pop();
+            }
+
+            getDigester().push( node );
+        }
+
+        type = null;
+        finalStr = null;
+        isEnabled = true;
+        initialStr = null;
+        any = new ArrayList();
+    }
+
+
+    // ------------------------------------------------------------------------
+    // Members called by other rules to populate the fields of this rule
+    // ------------------------------------------------------------------------
+
+
+    /**
+     * Sets the initial portion of the substring match expression.
+     *
+     * @param initialStr the initial String
+     */
+    public void setInitial( String initialStr )
+    {
+        this.initialStr = initialStr;
+    }
+
+
+    /**
+     * Sets the final portion of the substring match expression.
+     *
+     * @param finalStr the final String
+     */
+    public void setFinalStr( String finalStr )
+    {
+        this.finalStr = finalStr;
+    }
+
+
+    /**
+     * Adds middle any region String to the substring match expression.
+     *
+     * @param anyStr a middle any region String
+     */
+    public void addAny( String anyStr )
+    {
+        this.any.add( anyStr ) ;
+    }
+}

Added: incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/search/TerminateFilterStateRule.java
==============================================================================
--- (empty file)
+++ incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/search/TerminateFilterStateRule.java	Sun Jun 13 20:08:35 2004
@@ -0,0 +1,52 @@
+/*
+ *   Copyright 2004 The Apache Software Foundation
+ *
+ *   Licensed under the Apache License, Version 2.0 (the "License");
+ *   you may not use this file except in compliance with the License.
+ *   You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *   limitations under the License.
+ *
+ */
+package org.apache.snickers.ldap.search;
+
+
+import org.apache.snickers.ber.TypeClass;
+import org.apache.ldap.common.filter.ExprNode;
+
+
+/**
+ * Used to terminate the filter processing state.  Registered before the
+ * attributes rules are registered to switch state.
+ * 
+ * @author <a href="mailto:directory-dev@incubator.apache.org">Apache Directory
+ *         Project</a>
+ * @version $Rev$
+ */
+public class TerminateFilterStateRule extends BaseSearchRequestRule
+{
+    public TerminateFilterStateRule( )
+    {
+        super( 3 );
+    }
+
+
+    public void tag( int id, boolean isPrimitive, TypeClass typeClass )
+    {
+        super.tag( id, isPrimitive, typeClass );
+
+        if ( getProcessing().getState() == getProcessing().FILTER_STATE )
+        {
+            getRequest().setFilter( ( ExprNode ) getDigester().pop() );
+            getProcessing().next();
+        }
+
+        setEnabled( false );
+    }
+}

Modified: incubator/directory/snickers/trunk/ldap-ber-provider/src/test/org/apache/snickers/ldap/bind/BindResponseRuleTest.java
==============================================================================
--- incubator/directory/snickers/trunk/ldap-ber-provider/src/test/org/apache/snickers/ldap/bind/BindResponseRuleTest.java	(original)
+++ incubator/directory/snickers/trunk/ldap-ber-provider/src/test/org/apache/snickers/ldap/bind/BindResponseRuleTest.java	Sun Jun 13 20:08:35 2004
@@ -17,28 +17,19 @@
 package org.apache.snickers.ldap.bind ;
 
 
-import java.util.Iterator ;
-import java.nio.ByteBuffer ;
+import java.util.Iterator;
 
-import junit.framework.TestCase ;
-
-import org.apache.snickers.ber.digester.BERDigester ;
-
-import org.apache.snickers.ber.* ;
-import org.apache.snickers.ber.primitives.UniversalTag;
-import org.apache.snickers.ber.digester.rules.PrimitiveIntDecodeRule ;
-import org.apache.snickers.ber.digester.rules.PrimitiveOctetStringRule ;
 import org.apache.snickers.ldap.testutils.RuleTestCase;
 import org.apache.snickers.ldap.testutils.TestUtils;
 
-import org.apache.ldap.common.message.* ;
-import org.apache.commons.codec.stateful.CallbackHistory ;
+import org.apache.ldap.common.message.*;
 
 
 /**
  * Tests the population of an LdapResult using a ResultRule.
  * 
- * @author <a href="mailto:directory-dev@incubator.apache.org">Apache Directory Project</a>
+ * @author <a href="mailto:directory-dev@incubator.apache.org">Apache Directory
+ * Project</a>
  * @version $Rev$
  */
 public class BindResponseRuleTest extends RuleTestCase

Modified: incubator/directory/snickers/trunk/ldap-ber-provider/src/test/org/apache/snickers/ldap/search/SearchRequestTest.java
==============================================================================
--- incubator/directory/snickers/trunk/ldap-ber-provider/src/test/org/apache/snickers/ldap/search/SearchRequestTest.java	(original)
+++ incubator/directory/snickers/trunk/ldap-ber-provider/src/test/org/apache/snickers/ldap/search/SearchRequestTest.java	Sun Jun 13 20:08:35 2004
@@ -19,10 +19,10 @@
 
 import java.util.Collection;
 import java.util.Iterator;
+import java.util.ArrayList;
 
 import org.apache.ldap.common.message.*;
-import org.apache.ldap.common.filter.ExprNode;
-import org.apache.ldap.common.filter.FilterParserImpl;
+import org.apache.ldap.common.filter.*;
 
 import org.apache.snickers.ldap.testutils.TestUtils;
 import org.apache.snickers.ldap.testutils.RuleTestCase;
@@ -38,9 +38,9 @@
 public class SearchRequestTest extends RuleTestCase
 {
     /**
-     * Tests an search request decode.
+     * Tests an search request decode with a simple equality match filter.
      */
-    public void testSearchRequest() throws Exception
+    public void testEqualityMatchFilter() throws Exception
     {
         SearchRequestImpl req = new SearchRequestImpl( 33 );
         req.setBase( "dc=example,dc=com" );
@@ -58,8 +58,7 @@
         FilterParserImpl parser = new FilterParserImpl();
         ExprNode node = null ;
         node = parser.parse(
-                "( & ( ou = Human Resources ) ( l = SunnyVale ) "
-                + " ( | ( uid = akarasulu ) ( ! ( uid = jbean ) ) ) )" );
+                "( ou = Human Resources ) " ) ;
         req.setFilter( node );
 
         System.out.println( "Generated SearchRequest for test:" );
@@ -85,7 +84,380 @@
             assertTrue( attributes.contains( list.next() ) );
         }
 
-        // control test should fail
+        // control test should not exist
         assertFalse( attributes.contains( "(*&#$&#$*@#" ) );
+
+        // filter tests
+        node = req.getFilter();
+        StringBuffer buf0 = new StringBuffer();
+        node.printToBuffer( buf0 );
+        node = decoded.getFilter();
+        StringBuffer buf1 = new StringBuffer();
+        node.printToBuffer( buf1 );
+        assertEquals(buf0.toString(), buf1.toString()) ;
+    }
+
+
+    /**
+     * Tests an search request decode with a simple greaterOrEqual filter.
+     */
+    public void testGreaterOrEqualFilter() throws Exception
+    {
+        SearchRequestImpl req = new SearchRequestImpl( 33 );
+        req.setBase( "dc=example,dc=com" );
+        req.setDerefAliases( DerefAliasesEnum.DEREFFINDINGBASEOBJ );
+        req.setScope( ScopeEnum.BASEOBJECT );
+        req.setSizeLimit( 2 );
+        req.setTimeLimit( 3 );
+        req.setTypesOnly( true );
+
+        req.addAttribute( "attr0" );
+        req.addAttribute( "attr1" );
+        req.addAttribute( "attr2" );
+
+
+        req.setFilter( new SimpleNode( "age", "30", SimpleNode.GREATEREQ ) );
+
+        System.out.println( "Generated SearchRequest for test:" );
+        System.out.println( TestUtils.printTupleTree( req ) );
+
+        SearchRequest decoded = ( SearchRequest )
+                snickersDecode( snaccEncode( req ) );
+        assertNotNull( decoded );
+
+        // test that we have all the properties set
+        assertEquals( req.getBase(), decoded.getBase() );
+        assertEquals( req.getScope(), decoded.getScope() );
+        assertEquals( req.getTypesOnly(), decoded.getTypesOnly() );
+        assertEquals( req.getTimeLimit(), decoded.getTimeLimit() );
+        assertEquals( req.getSizeLimit(), decoded.getSizeLimit() );
+        assertEquals( req.getDerefAliases(), decoded.getDerefAliases() );
+
+        // test that we have all the attributes
+        Iterator list = req.getAttributes().iterator();
+        Collection attributes = decoded.getAttributes();
+        while( list.hasNext() )
+        {
+            assertTrue( attributes.contains( list.next() ) );
+        }
+
+        // control test should not exist
+        assertFalse( attributes.contains( "(*&#$&#$*@#" ) );
+
+        // filter tests
+        ExprNode node = req.getFilter();
+        StringBuffer buf0 = new StringBuffer();
+        node.printToBuffer( buf0 );
+        node = decoded.getFilter();
+        StringBuffer buf1 = new StringBuffer();
+        node.printToBuffer( buf1 );
+        assertEquals(buf0.toString(), buf1.toString()) ;
+        System.out.println( buf1.toString() );
     }
+
+
+    /**
+     * Tests an search request decode with a simple lessOrEqual match
+     * filter.
+     */
+    public void testLessOrEqualFilter() throws Exception
+    {
+        SearchRequestImpl req = new SearchRequestImpl( 33 );
+        req.setBase( "dc=example,dc=com" );
+        req.setDerefAliases( DerefAliasesEnum.DEREFFINDINGBASEOBJ );
+        req.setScope( ScopeEnum.BASEOBJECT );
+        req.setSizeLimit( 2 );
+        req.setTimeLimit( 3 );
+        req.setTypesOnly( true );
+
+        req.addAttribute( "attr0" );
+        req.addAttribute( "attr1" );
+        req.addAttribute( "attr2" );
+
+        req.setFilter( new SimpleNode( "age", "30", SimpleNode.LESSEQ ) );
+
+        System.out.println( "Generated SearchRequest for test:" );
+        System.out.println( TestUtils.printTupleTree( req ) );
+
+        SearchRequest decoded = ( SearchRequest )
+                snickersDecode( snaccEncode( req ) );
+        assertNotNull( decoded );
+
+        // test that we have all the properties set
+        assertEquals( req.getBase(), decoded.getBase() );
+        assertEquals( req.getScope(), decoded.getScope() );
+        assertEquals( req.getTypesOnly(), decoded.getTypesOnly() );
+        assertEquals( req.getTimeLimit(), decoded.getTimeLimit() );
+        assertEquals( req.getSizeLimit(), decoded.getSizeLimit() );
+        assertEquals( req.getDerefAliases(), decoded.getDerefAliases() );
+
+        // test that we have all the attributes
+        Iterator list = req.getAttributes().iterator();
+        Collection attributes = decoded.getAttributes();
+        while( list.hasNext() )
+        {
+            assertTrue( attributes.contains( list.next() ) );
+        }
+
+        // control test should not exist
+        assertFalse( attributes.contains( "(*&#$&#$*@#" ) );
+
+        // filter tests
+        ExprNode node = req.getFilter();
+        StringBuffer buf0 = new StringBuffer();
+        node.printToBuffer( buf0 );
+        node = decoded.getFilter();
+        StringBuffer buf1 = new StringBuffer();
+        node.printToBuffer( buf1 );
+        assertEquals(buf0.toString(), buf1.toString()) ;
+        System.out.println( buf1.toString() );
+    }
+
+
+    /**
+     * Tests an search request decode with a simple presence match filter.
+     */
+    public void testPresentFilter() throws Exception
+    {
+        SearchRequestImpl req = new SearchRequestImpl( 33 );
+        req.setBase( "dc=example,dc=com" );
+        req.setDerefAliases( DerefAliasesEnum.DEREFFINDINGBASEOBJ );
+        req.setScope( ScopeEnum.BASEOBJECT );
+        req.setSizeLimit( 2 );
+        req.setTimeLimit( 3 );
+        req.setTypesOnly( true );
+
+        req.addAttribute( "attr0" );
+        req.addAttribute( "attr1" );
+        req.addAttribute( "attr2" );
+
+
+        req.setFilter( new PresenceNode( "objectClass" ) );
+
+        System.out.println( "Generated SearchRequest for test:" );
+        System.out.println( TestUtils.printTupleTree( req ) );
+
+        SearchRequest decoded = ( SearchRequest )
+                snickersDecode( snaccEncode( req ) );
+        assertNotNull( decoded );
+
+        // test that we have all the properties set
+        assertEquals( req.getBase(), decoded.getBase() );
+        assertEquals( req.getScope(), decoded.getScope() );
+        assertEquals( req.getTypesOnly(), decoded.getTypesOnly() );
+        assertEquals( req.getTimeLimit(), decoded.getTimeLimit() );
+        assertEquals( req.getSizeLimit(), decoded.getSizeLimit() );
+        assertEquals( req.getDerefAliases(), decoded.getDerefAliases() );
+
+        // test that we have all the attributes
+        Iterator list = req.getAttributes().iterator();
+        Collection attributes = decoded.getAttributes();
+        while( list.hasNext() )
+        {
+            assertTrue( attributes.contains( list.next() ) );
+        }
+
+        // control test should not exist
+        assertFalse( attributes.contains( "(*&#$&#$*@#" ) );
+
+        // filter tests
+        ExprNode node = req.getFilter();
+        StringBuffer buf0 = new StringBuffer();
+        node.printToBuffer( buf0 );
+        node = decoded.getFilter();
+        StringBuffer buf1 = new StringBuffer();
+        node.printToBuffer( buf1 );
+        assertEquals(buf0.toString(), buf1.toString()) ;
+        System.out.println( buf1.toString() );
+    }
+
+
+    /**
+     * Tests an search request decode with a simple approx match filter.
+     */
+    public void testApproxMatchFilter() throws Exception
+    {
+        SearchRequestImpl req = new SearchRequestImpl( 33 );
+        req.setBase( "dc=example,dc=com" );
+        req.setDerefAliases( DerefAliasesEnum.DEREFFINDINGBASEOBJ );
+        req.setScope( ScopeEnum.BASEOBJECT );
+        req.setSizeLimit( 2 );
+        req.setTimeLimit( 3 );
+        req.setTypesOnly( true );
+
+        req.addAttribute( "attr0" );
+        req.addAttribute( "attr1" );
+        req.addAttribute( "attr2" );
+
+
+        req.setFilter( new SimpleNode( "cn", "Alex Karasula",
+                SimpleNode.APPROXIMATE ) );
+
+        System.out.println( "Generated SearchRequest for test:" );
+        System.out.println( TestUtils.printTupleTree( req ) );
+
+        SearchRequest decoded = ( SearchRequest )
+                snickersDecode( snaccEncode( req ) );
+        assertNotNull( decoded );
+
+        // test that we have all the properties set
+        assertEquals( req.getBase(), decoded.getBase() );
+        assertEquals( req.getScope(), decoded.getScope() );
+        assertEquals( req.getTypesOnly(), decoded.getTypesOnly() );
+        assertEquals( req.getTimeLimit(), decoded.getTimeLimit() );
+        assertEquals( req.getSizeLimit(), decoded.getSizeLimit() );
+        assertEquals( req.getDerefAliases(), decoded.getDerefAliases() );
+
+        // test that we have all the attributes
+        Iterator list = req.getAttributes().iterator();
+        Collection attributes = decoded.getAttributes();
+        while( list.hasNext() )
+        {
+            assertTrue( attributes.contains( list.next() ) );
+        }
+
+        // control test should not exist
+        assertFalse( attributes.contains( "(*&#$&#$*@#" ) );
+
+        // filter tests
+        ExprNode node = req.getFilter();
+        StringBuffer buf0 = new StringBuffer();
+        node.printToBuffer( buf0 );
+        node = decoded.getFilter();
+        StringBuffer buf1 = new StringBuffer();
+        node.printToBuffer( buf1 );
+        assertEquals(buf0.toString(), buf1.toString()) ;
+        System.out.println( buf1.toString() );
+    }
+
+
+    /**
+     * Tests an search request decode with a simple substring match filter.
+     */
+    public void testSubstringsFilter() throws Exception
+    {
+        SearchRequestImpl req = new SearchRequestImpl( 33 );
+        req.setBase( "dc=example,dc=com" );
+        req.setDerefAliases( DerefAliasesEnum.DEREFFINDINGBASEOBJ );
+        req.setScope( ScopeEnum.BASEOBJECT );
+        req.setSizeLimit( 2 );
+        req.setTimeLimit( 3 );
+        req.setTypesOnly( true );
+
+        req.addAttribute( "attr0" );
+        req.addAttribute( "attr1" );
+        req.addAttribute( "attr2" );
+
+        String any0 = "ijklm";
+        String any1 = "nopqrs";
+        ArrayList any = new ArrayList();
+        any.add( any0 );
+        any.add( any1 );
+        SubstringNode node = new SubstringNode( any, "cn", "abcdefgh", "wxyz" );
+
+        req.setFilter( node );
+
+        StringBuffer buf0 = new StringBuffer();
+        node.printToBuffer( buf0 );
+        System.out.println( buf0.toString() );
+
+        System.out.println( "Generated SearchRequest for test:" );
+        System.out.println( TestUtils.printTupleTree( req ) );
+
+        SearchRequest decoded = ( SearchRequest )
+                snickersDecode( snaccEncode( req ) );
+        assertNotNull( decoded );
+
+        // test that we have all the properties set
+        assertEquals( req.getBase(), decoded.getBase() );
+        assertEquals( req.getScope(), decoded.getScope() );
+        assertEquals( req.getTypesOnly(), decoded.getTypesOnly() );
+        assertEquals( req.getTimeLimit(), decoded.getTimeLimit() );
+        assertEquals( req.getSizeLimit(), decoded.getSizeLimit() );
+        assertEquals( req.getDerefAliases(), decoded.getDerefAliases() );
+
+        // test that we have all the attributes
+        Iterator list = req.getAttributes().iterator();
+        Collection attributes = decoded.getAttributes();
+        while( list.hasNext() )
+        {
+            assertTrue( attributes.contains( list.next() ) );
+        }
+
+        // control test should not exist
+        assertFalse( attributes.contains( "(*&#$&#$*@#" ) );
+
+        // filter tests
+
+        node = ( SubstringNode ) decoded.getFilter();
+        StringBuffer buf1 = new StringBuffer();
+        node.printToBuffer( buf1 );
+        System.out.println( buf1.toString() );
+        assertEquals(buf0.toString(), buf1.toString()) ;
+    }
+
+
+    /**
+     * Tests an search request decode with a simple greaterOrEqual match filter.
+     *
+    public void testSearchRequest7() throws Exception
+    {
+        SearchRequestImpl req = new SearchRequestImpl( 33 );
+        req.setBase( "dc=example,dc=com" );
+        req.setDerefAliases( DerefAliasesEnum.DEREFFINDINGBASEOBJ );
+        req.setScope( ScopeEnum.BASEOBJECT );
+        req.setSizeLimit( 2 );
+        req.setTimeLimit( 3 );
+        req.setTypesOnly( true );
+
+        req.addAttribute( "attr0" );
+        req.addAttribute( "attr1" );
+        req.addAttribute( "attr2" );
+
+
+        FilterParserImpl parser = new FilterParserImpl();
+        ExprNode node = null ;
+        node = parser.parse(
+                "( age > 30 ) " ) ;
+                //"( & ( ou = Human Resources ) ( l = SunnyVale ) "
+                //+ " ( | ( uid = akarasulu ) ( ! ( uid = jbean ) ) ) )" );
+        req.setFilter( node );
+
+        System.out.println( "Generated SearchRequest for test:" );
+        System.out.println( TestUtils.printTupleTree( req ) );
+
+        SearchRequest decoded = ( SearchRequest )
+                snickersDecode( snaccEncode( req ) );
+        assertNotNull( decoded );
+
+        // test that we have all the properties set
+        assertEquals( req.getBase(), decoded.getBase() );
+        assertEquals( req.getScope(), decoded.getScope() );
+        assertEquals( req.getTypesOnly(), decoded.getTypesOnly() );
+        assertEquals( req.getTimeLimit(), decoded.getTimeLimit() );
+        assertEquals( req.getSizeLimit(), decoded.getSizeLimit() );
+        assertEquals( req.getDerefAliases(), decoded.getDerefAliases() );
+
+        // test that we have all the attributes
+        Iterator list = req.getAttributes().iterator();
+        Collection attributes = decoded.getAttributes();
+        while( list.hasNext() )
+        {
+            assertTrue( attributes.contains( list.next() ) );
+        }
+
+        // control test should not exist
+        assertFalse( attributes.contains( "(*&#$&#$*@#" ) );
+
+        // filter tests
+        node = req.getFilter();
+        StringBuffer buf0 = new StringBuffer();
+        node.printToBuffer( buf0 );
+        node = decoded.getFilter();
+        StringBuffer buf1 = new StringBuffer();
+        node.printToBuffer( buf1 );
+        assertEquals(buf0.toString(), buf1.toString()) ;
+        System.out.println( buf1.toString() );
+    }
+     */
 }