You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by el...@apache.org on 2005/09/09 23:43:24 UTC

svn commit: r279887 [12/15] - in /directory/shared/ldap/branches/elecharny-cleanup/apache2-provider: ./ conf/ perfs/ perfs/org/ perfs/org/apache/ perfs/org/apache/asn1new/ perfs/org/apache/asn1new/ber/ src/ src/java/ src/java/main/ src/java/main/org/ s...

Added: directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/java/main/org/apache/asn1new/ldap/pojo/filters/AttributeValueAssertionFilter.java
URL: http://svn.apache.org/viewcvs/directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/java/main/org/apache/asn1new/ldap/pojo/filters/AttributeValueAssertionFilter.java?rev=279887&view=auto
==============================================================================
--- directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/java/main/org/apache/asn1new/ldap/pojo/filters/AttributeValueAssertionFilter.java (added)
+++ directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/java/main/org/apache/asn1new/ldap/pojo/filters/AttributeValueAssertionFilter.java Fri Sep  9 14:41:22 2005
@@ -0,0 +1,206 @@
+/*
+ *   Copyright 2005 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.asn1new.ldap.pojo.filters;
+
+import java.nio.BufferOverflowException;
+import java.nio.ByteBuffer;
+
+import org.apache.asn1.codec.EncoderException;
+import org.apache.asn1new.ber.tlv.Length;
+import org.apache.asn1new.ber.tlv.Value;
+import org.apache.asn1new.ldap.codec.LdapConstants;
+import org.apache.asn1new.ldap.pojo.AttributeValueAssertion;
+
+
+/**
+ * Object to store the filter. A filter is seen as a tree with a root.
+ * 
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class AttributeValueAssertionFilter extends Filter
+{
+    //~ Instance fields ----------------------------------------------------------------------------
+
+    /** The assertion. */
+    private AttributeValueAssertion assertion;
+
+    /** The filter type */
+    private int filterType;
+    
+    /** The attributeValueAssertion length */
+    private transient int avaLength;
+
+    //~ Constructors -------------------------------------------------------------------------------
+
+    /**
+     * The constructor. 
+     * @param filterType DOCUMENT ME!
+    */
+    public AttributeValueAssertionFilter(  int filterType )
+    {
+        this.filterType = filterType;
+    }
+
+    //~ Methods ------------------------------------------------------------------------------------
+
+    /**
+     * Get the assertion
+     *
+     * @return Returns the assertion.
+     */
+    public AttributeValueAssertion getAssertion()
+    {
+        return assertion;
+    }
+
+    /**
+     * Set the assertion
+     *
+     * @param assertion The assertion to set.
+     */
+    public void setAssertion( AttributeValueAssertion assertion )
+    {
+        this.assertion = assertion;
+    }
+
+    /**
+     * Get the filter type
+     *
+     * @return Returns the filterType.
+     */
+    public int getFilterType()
+    {
+        return filterType;
+    }
+
+    /**
+     * Set the filter type
+     *
+     * @param filterType The filterType to set.
+     */
+    public void setFilterType( int filterType )
+    {
+        this.filterType = filterType;
+    }
+
+    /**
+     * Compute the AttributeValueFilter length
+     * 
+     * AttributeValueFilter :
+     * 
+     * 0xA(3, 5, 6, 8) L1
+     *  |
+     *  +--> 0x04 L2 attributeDesc
+     *  +--> 0x04 L3 assertionValue
+     *  
+     * 
+     * L2 = Length(attributeDesc)
+     * L3 = Length(assertionValue)
+     * L1 = 1 + Length(L2) + L2 
+     *      + 1 + Length(L3) + L3
+     * 
+     * Length(AttributeValueFilter) = Length(0xA?) + Length(L1)
+     *                                + 1 + Length(L2) + L2 
+     *                                + 1 + Length(L3) + L3 
+     * 
+     */
+    public int computeLength()
+    {
+        avaLength = 0;
+        int attributeDescLength = assertion.getAttributeDesc().length();
+        
+        avaLength = 1 + Length.getNbBytes( attributeDescLength ) + attributeDescLength;
+        
+        int assertionValueLength = assertion.getAssertionValue().getLength();
+        
+        avaLength += 1 + Length.getNbBytes( assertionValueLength ) + assertionValueLength;
+        
+        return 1 + Length.getNbBytes( avaLength ) + avaLength;
+    }
+    
+    /**
+     * Encode the AttributeValueAssertion Filters to a PDU. The 
+     * following filters are to be encoded :
+     *  - equality match 
+     *  - greater or equal
+     *  - less or equal
+     *  - approx match 
+     * 
+     * AttributeValueAssertion filters :
+     * 
+     * 0xA[3, 5, 6, 8] LL 
+     * 0x04 LL attributeDesc
+     * 0x04 LL assertionValue
+     * 
+     * @param buffer The buffer where to put the PDU
+     * @return The PDU.
+     */
+    public ByteBuffer encode( ByteBuffer buffer ) throws EncoderException
+    {
+        if (buffer == null)
+        {
+            throw new EncoderException("Cannot put a PDU in a null buffer !");
+        }
+
+        try 
+        {
+            // The AttributeValueAssertion Tag
+            switch (filterType)
+            {
+                case LdapConstants.EQUALITY_MATCH_FILTER :
+                    buffer.put( (byte)LdapConstants.EQUALITY_MATCH_FILTER_TAG );
+                    break;
+                    
+                case LdapConstants.LESS_OR_EQUAL_FILTER :
+                    buffer.put( (byte)LdapConstants.LESS_OR_EQUAL_FILTER_TAG );
+                    break;
+                    
+                case LdapConstants.GREATER_OR_EQUAL_FILTER :
+                    buffer.put( (byte)LdapConstants.GREATER_OR_EQUAL_FILTER_TAG );
+                    break;
+                    
+                case LdapConstants.APPROX_MATCH_FILTER :
+                    buffer.put( (byte)LdapConstants.APPROX_MATCH_FILTER_TAG );
+                    break;
+            }
+            
+            buffer.put( Length.getBytes( avaLength ) );
+        }
+        catch ( BufferOverflowException boe )
+        {
+            throw new EncoderException("The PDU buffer size is too small !"); 
+        }
+        
+        // The attribute desc
+        Value.encode( buffer, assertion.getAttributeDesc() );
+
+        // The assertion desc
+        Value.encode( buffer, assertion.getAssertionValue() );
+            
+        return buffer;
+    }
+
+    /**
+     * Return a string compliant with RFC 2254 representing an item filter
+     *
+     * @return The item filter string
+     */
+    public String toString()
+    {
+        return assertion.toStringRFC2254( filterType );
+    }
+}

Propchange: directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/java/main/org/apache/asn1new/ldap/pojo/filters/AttributeValueAssertionFilter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/java/main/org/apache/asn1new/ldap/pojo/filters/ConnectorFilter.java
URL: http://svn.apache.org/viewcvs/directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/java/main/org/apache/asn1new/ldap/pojo/filters/ConnectorFilter.java?rev=279887&view=auto
==============================================================================
--- directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/java/main/org/apache/asn1new/ldap/pojo/filters/ConnectorFilter.java (added)
+++ directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/java/main/org/apache/asn1new/ldap/pojo/filters/ConnectorFilter.java Fri Sep  9 14:41:22 2005
@@ -0,0 +1,166 @@
+/*
+ *   Copyright 2005 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.asn1new.ldap.pojo.filters;
+
+import org.apache.asn1.codec.DecoderException;
+import org.apache.asn1.codec.EncoderException;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Iterator;
+
+
+/**
+ * This Filter abstract class is used to store a set of filters used by OR/AND/NOT
+ * filters. 
+ * 
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public abstract class ConnectorFilter extends Filter
+{
+    //~ Instance fields ----------------------------------------------------------------------------
+
+    /** The set of filters used by And/Or filters */
+    protected ArrayList filterSet;
+    
+    /** The filters length */
+    protected transient int filtersLength;
+
+    //~ Constructors -------------------------------------------------------------------------------
+
+    /**
+     * The constructor. We wont initialize the ArrayList as it may not be used. 
+     */
+    public ConnectorFilter()
+    {
+    }
+
+    //~ Methods ------------------------------------------------------------------------------------
+
+    /**
+     * Add a new Filter to the list.
+     * @param filter The filter to add
+     */
+    public void addFilter( Filter filter ) throws DecoderException
+    {
+
+        if ( this.filterSet == null )
+        {
+            this.filterSet = new ArrayList();
+        }
+
+        this.filterSet.add( filter );
+    }
+
+    /**
+     * Get the list of filters stored in the composite filter
+     *
+     * @return And array of filters
+     */
+    public ArrayList getFilterSet()
+    {
+        return filterSet;
+    }
+
+    /**
+     * Compute the ConnectorFilter length
+     * 
+     * Length(ConnectorFilter) = sum(filterSet.computeLength())
+     * 
+     */
+    public int computeLength()
+    {
+        int connectorFilterLength = 0;
+        
+        if ( ( filterSet != null ) && ( filterSet.size() != 0 ) )
+        {
+            Iterator filterIterator = filterSet.iterator();
+            
+            while ( filterIterator.hasNext() )
+            {
+                Filter filter = (Filter)filterIterator.next();
+                
+                connectorFilterLength += filter.computeLength();
+            }
+        }
+        
+        return connectorFilterLength;
+    }
+
+    /**
+     * Encode the ConnectorFilter message to a PDU.
+     * 
+     * ConnectorFilter :
+     * 
+     * filter.encode()
+     * ...
+     * filter.encode()
+     * 
+     * @param buffer The buffer where to put the PDU
+     * @return The PDU.
+     */
+    public ByteBuffer encode( ByteBuffer buffer ) throws EncoderException
+    {
+        if (buffer == null)
+        {
+            throw new EncoderException("Cannot put a PDU in a null buffer !");
+        }
+
+        // encode each filter
+        if ( ( filterSet != null ) && ( filterSet.size() != 0 ) )
+        {
+            Iterator filterIterator = filterSet.iterator();
+            
+            while ( filterIterator.hasNext() )
+            {
+                Filter filter = (Filter)filterIterator.next();
+                
+                filter.encode( buffer );
+            }
+        }
+            
+        return buffer;
+    }
+
+    /**
+     * Return a string compliant with RFC 2254 representing a composite
+     * filter, one of AND, OR and NOT
+     *
+     * @return The composite filter string
+     */
+    public String toString()
+    {
+
+        StringBuffer sb = new StringBuffer();
+
+        if ( ( filterSet != null ) && ( filterSet.size() != 0 ) )
+        {
+
+            Iterator filterIterator = filterSet.iterator();
+
+            while ( filterIterator.hasNext() )
+            {
+
+                Filter filter = ( Filter ) filterIterator.next();
+
+                sb.append( '(' ).append( filter.toString() ).append( ')' );
+            }
+        }
+
+        return sb.toString();
+    }
+}

Propchange: directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/java/main/org/apache/asn1new/ldap/pojo/filters/ConnectorFilter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/java/main/org/apache/asn1new/ldap/pojo/filters/ExtensibleMatchFilter.java
URL: http://svn.apache.org/viewcvs/directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/java/main/org/apache/asn1new/ldap/pojo/filters/ExtensibleMatchFilter.java?rev=279887&view=auto
==============================================================================
--- directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/java/main/org/apache/asn1new/ldap/pojo/filters/ExtensibleMatchFilter.java (added)
+++ directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/java/main/org/apache/asn1new/ldap/pojo/filters/ExtensibleMatchFilter.java Fri Sep  9 14:41:22 2005
@@ -0,0 +1,336 @@
+/*
+ *   Copyright 2005 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.asn1new.ldap.pojo.filters;
+
+import java.nio.BufferOverflowException;
+import java.nio.ByteBuffer;
+
+import org.apache.asn1.codec.EncoderException;
+import org.apache.asn1new.ber.tlv.Length;
+import org.apache.asn1new.ber.tlv.UniversalTag;
+import org.apache.asn1new.ber.tlv.Value;
+import org.apache.asn1new.primitives.OctetString;
+import org.apache.asn1new.ldap.codec.LdapConstants;
+import org.apache.asn1new.ldap.codec.primitives.LdapString;
+
+
+/**
+ * The search request filter Matching Rule assertion
+ * 
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class ExtensibleMatchFilter extends Filter
+{
+    //~ Instance fields ----------------------------------------------------------------------------
+
+    /** The expected lenth of the Matching Rule Assertion */
+    private transient int expectedMatchingRuleLength;
+
+    /** Matching rule  */
+    private LdapString matchingRule;
+
+    /** Matching rule type */
+    private LdapString type;
+
+    /** Matching rule value */
+    private OctetString matchValue;
+
+    /** The dnAttributes flag */
+    private boolean dnAttributes;
+    
+    /** The extensible match length */
+    private transient int extensibleMatchLength;
+    
+    /** The matching Rule Assertion Length */
+    private transient int matchingRuleAssertionLength;
+
+    //~ Constructors -------------------------------------------------------------------------------
+
+    /**
+     * Creates a new ExtensibleMatchFilter object.
+     * The dnAttributes flag defaults to false.
+     */
+    public ExtensibleMatchFilter()
+    {
+        dnAttributes = false;
+    }
+
+    //~ Methods ------------------------------------------------------------------------------------
+
+    /**
+     * Get the dnAttributes flag
+     *
+     * @return Returns the dnAttributes.
+     */
+    public boolean isDnAttributes()
+    {
+        return dnAttributes;
+    }
+
+    /**
+     * Set the dnAttributes flag
+     *
+     * @param dnAttributes The dnAttributes to set.
+     */
+    public void setDnAttributes( boolean dnAttributes )
+    {
+        this.dnAttributes = dnAttributes;
+    }
+
+    /**
+     * Get the matchingRule
+     *
+     * @return Returns the matchingRule.
+     */
+    public LdapString getMatchingRule()
+    {
+        return matchingRule;
+    }
+
+    /**
+     * Set the matchingRule
+     *
+     * @param matchingRule The matchingRule to set.
+     */
+    public void setMatchingRule( LdapString matchingRule )
+    {
+        this.matchingRule = matchingRule;
+    }
+
+    /**
+     * Get the matchValue
+     *
+     * @return Returns the matchValue.
+     */
+    public OctetString getMatchValue()
+    {
+        return matchValue;
+    }
+
+    /**
+     * Set the matchValue
+     *
+     * @param matchValue The matchValue to set.
+     */
+    public void setMatchValue( OctetString matchValue )
+    {
+        this.matchValue = matchValue;
+    }
+
+    /**
+     * Get the type
+     *
+     * @return Returns the type.
+     */
+    public LdapString getType()
+    {
+        return type;
+    }
+
+    /**
+     * Set the type
+     *
+     * @param type The type to set.
+     */
+    public void setType( LdapString type )
+    {
+        this.type = type;
+    }
+
+    /**
+     * get the expectedMatchingRuleLength
+     *
+     * @return Returns the expectedMatchingRuleLength.
+     */
+    public int getExpectedMatchingRuleLength()
+    {
+        return expectedMatchingRuleLength;
+    }
+
+    /**
+     * Set the expectedMatchingRuleLength
+     *
+     * @param expectedMatchingRuleLength The expectedMatchingRuleLength to set.
+     */
+    public void setExpectedMatchingRuleLength( int expectedMatchingRuleLength )
+    {
+        this.expectedMatchingRuleLength = expectedMatchingRuleLength;
+    }
+
+    /**
+     * Compute the ExtensibleMatchFilter length
+     * 
+     * ExtensibleMatchFilter :
+     * 
+     * 0xA9 L1
+     *  |
+     *  +--> 0x30 L2
+     *        |
+     *       [+--> 0x81 L3 matchingRule]
+     *       [+--> 0x82 L4 type]
+     *       [+--> 0x83 L5 matchValue]
+     *       [+--> 0x01 0x01 dnAttributes]
+     *  
+     */
+    public int computeLength()
+    {
+        if ( matchingRule != null )
+        {
+            matchingRuleAssertionLength = 1 + Length.getNbBytes( matchingRule.getLength() ) + matchingRule.getLength(); 
+        }
+        
+        if ( type != null )
+        {
+            matchingRuleAssertionLength += 1 + Length.getNbBytes( type.getLength() ) + type.getLength();
+        }
+        
+        if ( matchValue != null )
+        {
+            matchingRuleAssertionLength += 1 + Length.getNbBytes( matchValue.getLength() ) + matchValue.getLength(); 
+        }
+        
+        if ( dnAttributes == true )
+        {
+            matchingRuleAssertionLength += 1 + 1 + 1;
+        }
+
+        extensibleMatchLength = 1 + Length.getNbBytes( matchingRuleAssertionLength ) + matchingRuleAssertionLength;
+        
+        return 1 + Length.getNbBytes( extensibleMatchLength ) + extensibleMatchLength;
+    }
+    
+    /**
+     * Encode the ExtensibleMatch Filters to a PDU. 
+     * 
+     * ExtensibleMatch filter :
+     * 
+     * 0xA9 LL 
+     * 0x30 LL matchingRuleAssertion
+     *  |     0x81 LL matchingRule
+     *  |    / |   0x82 LL Type  
+     *  |   /  |  /0x83 LL matchValue
+     *  +--+   +-+
+     *  |   \     \
+     *  |    \     0x83 LL MatchValue
+     *  |     0x82 LL type
+     *  |     0x83 LL matchValue
+     *  +--[0x84 0x01 dnAttributes]
+     * 
+     * @param buffer The buffer where to put the PDU
+     * @return The PDU.
+     */
+    public ByteBuffer encode( ByteBuffer buffer ) throws EncoderException
+    {
+        if (buffer == null)
+        {
+            throw new EncoderException("Cannot put a PDU in a null buffer !");
+        }
+
+        try 
+        {
+            // The ExtensibleMatch Tag
+            buffer.put( (byte)LdapConstants.EXTENSIBLE_MATCH_FILTER_TAG );
+            buffer.put( Length.getBytes( extensibleMatchLength ) );
+
+            // The MatchingRuleAssertion sequence tag
+            buffer.put( UniversalTag.SEQUENCE_TAG );
+            buffer.put( Length.getBytes( matchingRuleAssertionLength ) );
+
+            if ( ( matchingRule == null ) && ( type == null ) ) 
+            {
+                throw new EncoderException("Cannot have a null matching rule and a null type");
+            }
+            
+            // The matching rule
+            if ( matchingRule != null ) 
+            {
+                buffer.put( (byte)LdapConstants.SEARCH_MATCHING_RULE_TAG );
+                buffer.put( Length.getBytes( matchingRule.getLength() ) );
+                buffer.put( matchingRule.getData() );                
+            }
+            
+            // The type
+            if ( type != null ) 
+            {
+                buffer.put( (byte)LdapConstants.SEARCH_TYPE_TAG );
+                buffer.put( Length.getBytes( type.getLength() ) );
+                buffer.put( type.getData() );                
+            }
+            
+            // The match value
+            if ( matchValue != null ) 
+            {
+                buffer.put( (byte)LdapConstants.SEARCH_MATCH_VALUE_TAG );
+                buffer.put( Length.getBytes( matchValue.getLength() ) );
+                buffer.put( matchValue.getValue() );                
+            }
+
+            // The dnAttributes flag, if true only
+            if ( dnAttributes == true )
+            {
+                buffer.put( (byte)LdapConstants.DN_ATTRIBUTES_FILTER_TAG );
+                buffer.put( (byte)1 );
+                buffer.put( Value.TRUE_VALUE );                
+            }
+        }
+        catch ( BufferOverflowException boe )
+        {
+            throw new EncoderException("The PDU buffer size is too small !"); 
+        }
+        
+        return buffer;
+    }
+
+    /**
+     * Return a String representing an extended filter as of RFC 2254
+     *
+     * @return An Extened Filter String
+     */
+    public String toString()
+    {
+
+        StringBuffer sb = new StringBuffer();
+
+        if ( type != null )
+        {
+            sb.append( type.toString() );
+        }
+
+        if ( dnAttributes == true )
+        {
+            sb.append( ":dn" );
+        }
+
+        if ( matchingRule == null )
+        {
+
+            if ( type == null )
+            {
+                return "Extended Filter wrong syntax";
+            }
+        }
+        else
+        {
+            sb.append( ':' ).append( matchingRule.toString() );
+        }
+
+        sb.append( ":=" ).append( matchValue.toString() );
+
+        return sb.toString();
+    }
+}

Propchange: directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/java/main/org/apache/asn1new/ldap/pojo/filters/ExtensibleMatchFilter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/java/main/org/apache/asn1new/ldap/pojo/filters/Filter.java
URL: http://svn.apache.org/viewcvs/directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/java/main/org/apache/asn1new/ldap/pojo/filters/Filter.java?rev=279887&view=auto
==============================================================================
--- directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/java/main/org/apache/asn1new/ldap/pojo/filters/Filter.java (added)
+++ directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/java/main/org/apache/asn1new/ldap/pojo/filters/Filter.java Fri Sep  9 14:41:22 2005
@@ -0,0 +1,41 @@
+/*
+ *   Copyright 2005 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.asn1new.ldap.pojo.filters;
+
+import org.apache.asn1new.Asn1Object;
+
+
+/**
+ * An abstract Asn1Object used to store the filter. A filter is seen as a tree with a root.
+ * This class does nothing, it's just the root of all the different filters.
+ * 
+ * 
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public abstract class Filter extends Asn1Object
+{
+    //~ Constructors -------------------------------------------------------------------------------
+
+    /**
+     * The constructor.  
+     */
+    public Filter()
+    {
+    }
+
+    //~ Methods ------------------------------------------------------------------------------------
+}

Propchange: directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/java/main/org/apache/asn1new/ldap/pojo/filters/Filter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/java/main/org/apache/asn1new/ldap/pojo/filters/NotFilter.java
URL: http://svn.apache.org/viewcvs/directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/java/main/org/apache/asn1new/ldap/pojo/filters/NotFilter.java?rev=279887&view=auto
==============================================================================
--- directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/java/main/org/apache/asn1new/ldap/pojo/filters/NotFilter.java (added)
+++ directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/java/main/org/apache/asn1new/ldap/pojo/filters/NotFilter.java Fri Sep  9 14:41:22 2005
@@ -0,0 +1,147 @@
+/*
+ *   Copyright 2005 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.asn1new.ldap.pojo.filters;
+
+import java.nio.BufferOverflowException;
+import java.nio.ByteBuffer;
+
+import org.apache.asn1.codec.DecoderException;
+import org.apache.asn1.codec.EncoderException;
+import org.apache.asn1new.ber.tlv.Length;
+import org.apache.asn1new.ldap.codec.LdapConstants;
+
+/**
+ * Not Filter Object to store the Not filter.
+ * 
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class NotFilter extends ConnectorFilter
+{
+    //~ Methods ------------------------------------------------------------------------------------
+
+    /**
+     * The constructor. 
+     */
+    public NotFilter()
+    {
+    }
+    
+    /**
+     * Subclass the addFilterMethod, as this is specific for a NotFilter
+     * (we cannot have more than one elements).
+     * @param Filter The Filter to add
+     */
+    public void addFilter( Filter filter ) throws DecoderException
+    {
+        if ( filterSet != null )
+        {
+            throw new DecoderException("Cannot have more than one Filter within a Not Filter");
+        }
+        
+        super.addFilter( filter );
+    }
+
+    /**
+     * Get the NotFilter
+     *
+     * @return Returns the notFilter.
+     */
+    public Filter getNotFilter()
+    {
+        return (Filter)filterSet.get(0);
+    }
+
+    /**
+     * Set the NotFilter
+     *
+     * @param not The notFilter to set.
+     */
+    public void setNotFilter( Filter notFilter ) throws DecoderException
+    {
+        if ( filterSet != null )
+        {
+            throw new DecoderException("Cannot have more than one Filter within a Not Filter");
+        }
+        
+        super.addFilter( notFilter );
+    }
+    
+    /**
+     * Compute the NotFilter length
+     * 
+     * NotFilter :
+     * 
+     * 0xA2 L1 super.computeLength()
+     * 
+     * Length(NotFilter) = Length(0xA2) + Length(super.computeLength()) + super.computeLength()
+     * 
+     */
+    public int computeLength()
+    {
+        filtersLength = super.computeLength();
+        
+        return 1 + Length.getNbBytes( filtersLength ) + filtersLength;
+    }
+
+    /**
+     * Encode the NotFilter message to a PDU.
+     * 
+     * NotFilter :
+     * 
+     * 0xA2 LL 
+     * filter.encode()
+     * 
+     * @param buffer The buffer where to put the PDU
+     * @return The PDU.
+     */
+    public ByteBuffer encode( ByteBuffer buffer ) throws EncoderException
+    {
+        if (buffer == null)
+        {
+            throw new EncoderException("Cannot put a PDU in a null buffer !");
+        }
+
+        try 
+        {
+            // The NotFilter Tag
+            buffer.put( (byte)LdapConstants.NOT_FILTER_TAG );
+            buffer.put( Length.getBytes( filtersLength ) );
+        }
+        catch ( BufferOverflowException boe )
+        {
+            throw new EncoderException("The PDU buffer size is too small !"); 
+        }
+        
+        super.encode( buffer );
+            
+        return buffer;
+    }
+
+    /**
+     * Return a string compliant with RFC 2254 representing a NOT filter
+     *
+     * @return The NOT filter string
+     */
+    public String toString()
+    {
+        StringBuffer sb = new StringBuffer();
+        
+        sb.append('!').append(super.toString());
+        
+        return sb.toString();
+    }
+}

Propchange: directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/java/main/org/apache/asn1new/ldap/pojo/filters/NotFilter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/java/main/org/apache/asn1new/ldap/pojo/filters/OrFilter.java
URL: http://svn.apache.org/viewcvs/directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/java/main/org/apache/asn1new/ldap/pojo/filters/OrFilter.java?rev=279887&view=auto
==============================================================================
--- directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/java/main/org/apache/asn1new/ldap/pojo/filters/OrFilter.java (added)
+++ directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/java/main/org/apache/asn1new/ldap/pojo/filters/OrFilter.java Fri Sep  9 14:41:22 2005
@@ -0,0 +1,121 @@
+/*
+ *   Copyright 2005 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.asn1new.ldap.pojo.filters;
+
+import java.nio.BufferOverflowException;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+
+import org.apache.asn1.codec.EncoderException;
+import org.apache.asn1new.ber.tlv.Length;
+import org.apache.asn1new.ldap.codec.LdapConstants;
+
+
+/**
+ * Or Filter Object to store the Or filter.
+ * 
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class OrFilter extends ConnectorFilter
+{
+    //~ Constructors -------------------------------------------------------------------------------
+
+    /**
+     * The constructor. We wont initialize the ArrayList as they may not be used. 
+     */
+    public OrFilter()
+    {
+    }
+
+    //~ Methods ------------------------------------------------------------------------------------
+
+    /**
+     * Get the OrFilter
+     *
+     * @return Returns the orFilter.
+     */
+    public ArrayList getOrFilter()
+    {
+        return filterSet;
+    }
+
+    /**
+     * Compute the OrFilter length
+     * 
+     * OrFilter :
+     * 
+     * 0xA1 L1 super.computeLength()
+     * 
+     * Length(OrFilter) = Length(0xA1) + Length(super.computeLength()) + super.computeLength()
+     * 
+     */
+    public int computeLength()
+    {
+        filtersLength = super.computeLength();
+        
+        return 1 + Length.getNbBytes( filtersLength ) + filtersLength;
+    }
+    
+    /**
+     * Encode the OrFilter message to a PDU.
+     * 
+     * OrFilter :
+     * 
+     * 0xA1 LL 
+     * filter.encode()
+     * 
+     * @param buffer The buffer where to put the PDU
+     * @return The PDU.
+     */
+    public ByteBuffer encode( ByteBuffer buffer ) throws EncoderException
+    {
+        if (buffer == null)
+        {
+            throw new EncoderException("Cannot put a PDU in a null buffer !");
+        }
+
+        try 
+        {
+            // The OrFilter Tag
+            buffer.put( (byte)LdapConstants.OR_FILTER_TAG );
+            buffer.put( Length.getBytes( filtersLength ) );
+        }
+        catch ( BufferOverflowException boe )
+        {
+            throw new EncoderException("The PDU buffer size is too small !"); 
+        }
+        
+        super.encode( buffer );
+            
+        return buffer;
+    }
+
+    /**
+     * Return a string compliant with RFC 2254 representing an OR filter
+     *
+     * @return The OR filter string
+     */
+    public String toString()
+    {
+
+        StringBuffer sb = new StringBuffer();
+
+        sb.append( '|' ).append( super.toString() );
+
+        return sb.toString();
+    }
+}

Propchange: directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/java/main/org/apache/asn1new/ldap/pojo/filters/OrFilter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/java/main/org/apache/asn1new/ldap/pojo/filters/PresentFilter.java
URL: http://svn.apache.org/viewcvs/directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/java/main/org/apache/asn1new/ldap/pojo/filters/PresentFilter.java?rev=279887&view=auto
==============================================================================
--- directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/java/main/org/apache/asn1new/ldap/pojo/filters/PresentFilter.java (added)
+++ directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/java/main/org/apache/asn1new/ldap/pojo/filters/PresentFilter.java Fri Sep  9 14:41:22 2005
@@ -0,0 +1,134 @@
+/*
+ *   Copyright 2005 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.asn1new.ldap.pojo.filters;
+
+import java.nio.BufferOverflowException;
+import java.nio.ByteBuffer;
+
+import org.apache.asn1.codec.EncoderException;
+import org.apache.asn1new.ber.tlv.Length;
+import org.apache.asn1new.ldap.codec.LdapConstants;
+import org.apache.asn1new.ldap.codec.primitives.LdapString;
+
+
+/**
+ * Object to store the filter. A filter is seen as a tree with a root.
+ * 
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class PresentFilter extends Filter
+{
+    //~ Instance fields ----------------------------------------------------------------------------
+
+    /** The attribute description. */
+    private LdapString attributeDescription;
+
+    //~ Constructors -------------------------------------------------------------------------------
+
+    /**
+     * The constructor. 
+     */
+    public PresentFilter()
+    {
+    }
+
+    //~ Methods ------------------------------------------------------------------------------------
+
+    /**
+     * Get the attribute
+     *
+     * @return Returns the attributeDescription.
+     */
+    public LdapString getAttributeDescription()
+    {
+        return attributeDescription;
+    }
+
+    /**
+     * Set the attributeDescription
+     *
+     * @param attributeDescription The attributeDescription to set.
+     */
+    public void setAttributeDescription( LdapString attributeDescription )
+    {
+        this.attributeDescription = attributeDescription;
+    }
+
+    /**
+     * Compute the PresentFilter length
+     * 
+     * PresentFilter :
+     * 
+     * 0x87 L1 present
+     * 
+     * Length(PresentFilter) = Length(0x87) + Length(super.computeLength()) + super.computeLength()
+     * 
+     */
+    public int computeLength()
+    {
+        return 1 + Length.getNbBytes( attributeDescription.getLength() ) + attributeDescription.getLength();
+    }
+    
+    /**
+     * Encode the PresentFilter message to a PDU.
+     * 
+     * PresentFilter :
+     * 
+     * 0x87 LL attributeDescription 
+     * 
+     * @param buffer The buffer where to put the PDU
+     * @return The PDU.
+     */
+    public ByteBuffer encode( ByteBuffer buffer ) throws EncoderException
+    {
+        if (buffer == null)
+        {
+            throw new EncoderException("Cannot put a PDU in a null buffer !");
+        }
+
+        try 
+        {
+            // The PresentFilter Tag
+            buffer.put( (byte)LdapConstants.PRESENT_FILTER_TAG );
+            buffer.put( Length.getBytes( attributeDescription.getLength() ) );
+            buffer.put( attributeDescription.getData() );
+        }
+        catch ( BufferOverflowException boe )
+        {
+            throw new EncoderException("The PDU buffer size is too small !"); 
+        }
+        
+        super.encode( buffer );
+            
+        return buffer;
+    }
+
+    /**
+     * Return a string compliant with RFC 2254 representing a Present filter
+     *
+     * @return The Present filter string
+     */
+    public String toString()
+    {
+
+        StringBuffer sb = new StringBuffer();
+
+        sb.append( attributeDescription.toString() ).append( "=*" );
+
+        return sb.toString();
+    }
+}

Propchange: directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/java/main/org/apache/asn1new/ldap/pojo/filters/PresentFilter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/java/main/org/apache/asn1new/ldap/pojo/filters/SubstringFilter.java
URL: http://svn.apache.org/viewcvs/directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/java/main/org/apache/asn1new/ldap/pojo/filters/SubstringFilter.java?rev=279887&view=auto
==============================================================================
--- directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/java/main/org/apache/asn1new/ldap/pojo/filters/SubstringFilter.java (added)
+++ directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/java/main/org/apache/asn1new/ldap/pojo/filters/SubstringFilter.java Fri Sep  9 14:41:22 2005
@@ -0,0 +1,344 @@
+/*
+ *   Copyright 2005 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.asn1new.ldap.pojo.filters;
+
+import java.nio.BufferOverflowException;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.apache.asn1.codec.EncoderException;
+import org.apache.asn1new.ber.tlv.Length;
+import org.apache.asn1new.ber.tlv.UniversalTag;
+import org.apache.asn1new.ber.tlv.Value;
+import org.apache.asn1new.ldap.codec.LdapConstants;
+import org.apache.asn1new.ldap.codec.primitives.LdapString;
+
+
+/**
+ * A Object that stores the substring filter. A substring filter follow this grammar :
+ * substring  = attr "=" ([initial] any [final] | 
+ * 						 (initial [any] [final) | 
+ * 						 ([initial] [any] final)
+ * initial    = value
+ * any        = "*" *(value "*")
+ * final      = value
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class SubstringFilter extends Filter
+{
+    //~ Instance fields ----------------------------------------------------------------------------
+
+    /** The substring filter type (an attributeDescription) */
+    private LdapString type;
+
+    /** This member is used to control the length of the three parts of the substring filter **/
+    private transient int substringsLength;
+    
+    /** The initial filter */
+    private LdapString initialSubstrings;
+
+    /** The any filter. It's a list of LdapString */
+    private ArrayList anySubstrings;
+
+    /** The final filter */
+    private LdapString finalSubstrings;
+    
+    private transient int substringsFilterLength;
+
+    private transient int substringsFilterSequenceLength;
+
+    //~ Methods ------------------------------------------------------------------------------------
+    
+    /**
+     * The constructor. We will create the 'any' subsring arraylist with only one element.
+     */
+    public SubstringFilter()
+    {
+        anySubstrings = new ArrayList(1);
+    }
+
+    /**
+     * Get the internal substrings
+     *
+     * @return Returns the anySubstrings.
+     */
+    public ArrayList getAnySubstrings()
+    {
+        return anySubstrings;
+    }
+
+    /**
+     * Add a internal substring
+     *
+     * @param anySubstrings The anySubstrings to set.
+     */
+    public void addAnySubstrings( LdapString anySubstrings )
+    {
+        this.anySubstrings.add(anySubstrings);
+    }
+
+    /**
+     * Get the final substring
+     *
+     * @return Returns the finalSubstrings.
+     */
+    public LdapString getFinalSubstrings()
+    {
+        return finalSubstrings;
+    }
+
+    /**
+     * Set the final substring
+     *
+     * @param finalSubstrings The finalSubstrings to set.
+     */
+    public void setFinalSubstrings( LdapString finalSubstrings )
+    {
+        this.finalSubstrings = finalSubstrings;
+    }
+
+    /**
+     * Get the initial substring
+     *
+     * @return Returns the initialSubstrings.
+     */
+    public LdapString getInitialSubstrings()
+    {
+        return initialSubstrings;
+    }
+
+    /**
+     * Set the initial substring
+     *
+     * @param initialSubstrings The initialSubstrings to set.
+     */
+    public void setInitialSubstrings( LdapString initialSubstrings )
+    {
+        this.initialSubstrings = initialSubstrings;
+    }
+
+    /**
+     * Get the attribute
+     *
+     * @return Returns the type.
+     */
+    public LdapString getType()
+    {
+        return type;
+    }
+
+    /**
+     * Set the attribute to match
+     *
+     * @param type The type to set.
+     */
+    public void setType( LdapString type )
+    {
+        this.type = type;
+    }
+    
+    /**
+     * @return Returns the substringsLength.
+     */
+    public int getSubstringsLength() 
+    {
+        return substringsLength;
+    }
+    
+    /**
+     * @param substringsLength The substringsLength to set.
+     */
+    public void setSubstringsLength(int substringsLength) 
+    {
+        this.substringsLength = substringsLength;
+    }
+    
+    /**
+     * Compute the SubstringFilter length
+     * 
+     * SubstringFilter :
+     * 
+     * 0xA4 L1
+     *  |
+     *  +--> 0x04 L2 type
+     *  +--> 0x30 L3
+     *        |
+     *       [+--> 0x80 L4 initial]
+     *       [+--> 0x81 L5-1 any]
+     *       [+--> 0x81 L5-2 any]
+     *       [+--> ... 
+     *       [+--> 0x81 L5-i any]
+     *       [+--> ... 
+     *       [+--> 0x81 L5-n any]
+     *       [+--> 0x82 L6 final]
+     *  
+     */
+    public int computeLength()
+    {
+        // The type
+        substringsFilterLength = 1 + Length.getNbBytes( type.getLength() ) + type.getLength();
+        substringsFilterSequenceLength = 0;
+        
+        if ( initialSubstrings != null )
+        {
+            substringsFilterSequenceLength += 1 + Length.getNbBytes( initialSubstrings.getLength() ) + initialSubstrings.getLength(); 
+        }
+        
+        if ( anySubstrings != null)
+        {
+            Iterator anyIterator = anySubstrings.iterator();
+            
+            while ( anyIterator.hasNext() )
+            {
+                LdapString any = (LdapString)anyIterator.next();
+                substringsFilterSequenceLength += 1 + Length.getNbBytes( any.getLength() ) + any.getLength();
+            }
+        }
+        
+        if ( finalSubstrings != null )
+        {
+            substringsFilterSequenceLength += 1 + Length.getNbBytes( finalSubstrings.getLength() ) + finalSubstrings.getLength(); 
+        }
+        
+        substringsFilterLength += 1 + Length.getNbBytes( substringsFilterSequenceLength ) + substringsFilterSequenceLength;
+        
+        return 1 + Length.getNbBytes( substringsFilterLength ) + substringsFilterLength;
+    }
+    
+    /**
+     * Encode the Substrings Filter to a PDU. 
+     * 
+     * Substrings Filter :
+     * 
+     * 0xA4 LL 
+     * 0x30 LL substringsFilter
+     *   0x04 LL type
+     *   0x30 LL substrings sequence
+     *    |  0x80 LL initial
+     *    | /  [0x81 LL any]* 
+     *    |/   [0x82 LL final]
+     *    +--[0x81 LL any]+
+     *     \   [0x82 LL final]
+     *      \
+     *       0x82 LL final
+     * 
+     * @param buffer The buffer where to put the PDU
+     * @return The PDU.
+     */
+    public ByteBuffer encode( ByteBuffer buffer ) throws EncoderException
+    {
+        if (buffer == null)
+        {
+            throw new EncoderException("Cannot put a PDU in a null buffer !");
+        }
+
+        try 
+        {
+            // The SubstringFilter Tag
+            buffer.put( (byte)LdapConstants.SUBSTRINGS_FILTER_TAG );
+            buffer.put( Length.getBytes( substringsFilterLength ) );
+            
+            // The type
+            Value.encode( buffer, type );
+
+            // The SubstringSequenceFilter Tag
+            buffer.put( UniversalTag.SEQUENCE_TAG );
+            buffer.put( Length.getBytes( substringsFilterSequenceLength ) );
+            
+
+            if ( ( initialSubstrings == null ) && 
+                 ( ( anySubstrings == null ) || ( anySubstrings.size() == 0 ) ) &&
+                 ( finalSubstrings == null ) ) 
+            {
+                throw new EncoderException("Cannot have a null initial, any and final substring");
+            }
+            
+            // The initial substring
+            if ( initialSubstrings != null ) 
+            {
+                buffer.put( (byte)LdapConstants.SEARCH_SUBSTRINGS_INITIAL_TAG );
+                buffer.put( Length.getBytes( initialSubstrings.getLength() ) );
+                buffer.put( initialSubstrings.getData() );                
+            }
+            
+            // The any substrings
+            if ( anySubstrings != null)
+            {
+                Iterator anyIterator = anySubstrings.iterator();
+                
+                while ( anyIterator.hasNext() )
+                {
+                    LdapString any = (LdapString)anyIterator.next();
+                    buffer.put( (byte)LdapConstants.SEARCH_SUBSTRINGS_ANY_TAG );
+                    buffer.put( Length.getBytes( any.getLength() ) );
+                    buffer.put( any.getData() );
+                }
+            }
+            
+            // The final substring
+            if ( finalSubstrings != null ) 
+            {
+                buffer.put( (byte)LdapConstants.SEARCH_SUBSTRINGS_FINAL_TAG );
+                buffer.put( Length.getBytes( finalSubstrings.getLength() ) );
+                buffer.put( finalSubstrings.getData() );                
+            }
+        }
+        catch ( BufferOverflowException boe )
+        {
+            throw new EncoderException("The PDU buffer size is too small !"); 
+        }
+        
+        return buffer;
+    }
+
+    /**
+     * Return a string compliant with RFC 2254 representing a Substring filter
+     *
+     * @return The substring filter string
+     */
+    public String toString()
+    {
+
+        StringBuffer sb = new StringBuffer();
+
+        if (initialSubstrings != null)
+        {
+            sb.append( initialSubstrings.toString() );
+        }
+        
+        sb.append('*');
+
+        if ( anySubstrings != null )
+        {
+            Iterator anyIterator = anySubstrings.iterator();
+            
+            while (anyIterator.hasNext())
+            {
+                sb.append( (LdapString)anyIterator.next() ).append('*');
+            }
+        }
+        
+        if (finalSubstrings != null)
+        {
+            sb.append( finalSubstrings.toString() );
+        }
+        
+        return sb.toString();
+    }
+}

Propchange: directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/java/main/org/apache/asn1new/ldap/pojo/filters/SubstringFilter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/test/org/apache/asn1new/ldap/codec/AbandonRequestTest.java
URL: http://svn.apache.org/viewcvs/directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/test/org/apache/asn1new/ldap/codec/AbandonRequestTest.java?rev=279887&view=auto
==============================================================================
--- directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/test/org/apache/asn1new/ldap/codec/AbandonRequestTest.java (added)
+++ directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/test/org/apache/asn1new/ldap/codec/AbandonRequestTest.java Fri Sep  9 14:41:22 2005
@@ -0,0 +1,176 @@
+/*
+ *   Copyright 2005 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.asn1new.ldap.codec;
+
+import java.nio.ByteBuffer;
+
+import org.apache.asn1.codec.DecoderException;
+import org.apache.asn1.codec.EncoderException;
+import org.apache.asn1new.ber.Asn1Decoder;
+import org.apache.asn1new.ber.containers.IAsn1Container;
+import org.apache.asn1new.ldap.pojo.AbandonRequest;
+import org.apache.asn1new.ldap.pojo.LdapMessage;
+import org.apache.asn1new.util.StringUtils;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+/**
+ * Test an AbandonRequest
+ * 
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class AbandonRequestTest extends TestCase {
+    /**
+     * Test the decoding of a AbandonRequest with no controls
+     */
+    public void testDecodeAbandonRequestNoControls()
+    {
+        Asn1Decoder ldapDecoder = new LdapDecoder();
+
+        ByteBuffer  stream      = ByteBuffer.allocate( 0x08 );
+        stream.put(
+            new byte[]
+            {
+                0x30, 0x06, 		// LDAPMessage ::=SEQUENCE {
+				0x02, 0x01, 0x03, 	//        messageID MessageID
+				0x50, 0x01, 0x02	//        CHOICE { ..., abandonRequest AbandonRequest,...
+									// AbandonRequest ::= [APPLICATION 16] MessageID
+            } );
+
+        String decodedPdu = StringUtils.dumpBytes( stream.array() );
+        stream.flip();
+
+        // Allocate a LdapMessageContainer Container
+        IAsn1Container ldapMessageContainer = new LdapMessageContainer();
+
+        // Decode the PDU
+        try
+        {
+            ldapDecoder.decode( stream, ldapMessageContainer );
+        }
+        catch ( DecoderException de )
+        {
+            de.printStackTrace();
+            Assert.fail( de.getMessage() );
+        }
+    	
+        // Check that everything is OK
+        LdapMessage message = ( ( LdapMessageContainer ) ldapMessageContainer ).getLdapMessage();
+        AbandonRequest abandonRequest = message.getAbandonRequest();
+
+        Assert.assertEquals( 3, message.getMessageId() );
+        Assert.assertEquals( 2, abandonRequest.getAbandonedMessageId() );
+        
+        // Check the length
+        Assert.assertEquals(8, message.computeLength());
+        
+        // Check the encoding
+        try
+        {
+            ByteBuffer bb = message.encode( null );
+            
+            String encodedPdu = StringUtils.dumpBytes( bb.array() ); 
+            
+            Assert.assertEquals(encodedPdu, decodedPdu );
+        }
+        catch ( EncoderException ee )
+        {
+            ee.printStackTrace();
+            Assert.fail( ee.getMessage() );
+        }
+    }
+
+    /**
+     * Test the decoding of a AbandonRequest with controls
+     */
+    public void testDecodeAbandonRequestWithControls()
+    {
+        Asn1Decoder ldapDecoder = new LdapDecoder();
+
+        ByteBuffer  stream      = ByteBuffer.allocate( 0x4A );
+        stream.put(
+            new byte[]
+            {
+                0x30, 0x48,         // LDAPMessage ::=SEQUENCE {
+                0x02, 0x01, 0x03,   //        messageID MessageID
+                0x50, 0x01, 0x02,    //        CHOICE { ..., abandonRequest AbandonRequest,...
+                (byte)0xA0, 0x40,   //    controls       [0] Controls OPTIONAL }
+                0x30, 0x3E,         // Controls ::= SEQUENCE OF Control
+                0x30, 0x13,         // Control ::= SEQUENCE {
+                                    //    controlType             LDAPOID, 
+                0x04, 0x06, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x01,
+                0x01, 0x01, (byte)0xFF,   //    criticality             BOOLEAN DEFAULT FALSE,
+                                    //    controlValue            OCTET STRING OPTIONAL }
+                0x04, 0x06, 'a', 'b', 'c', 'd', 'e', 'f',
+                0x30, 0x10,         // Control ::= SEQUENCE {
+                                    //    controlType             LDAPOID, 
+                0x04, 0x06, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x02,
+                                    //    controlValue            OCTET STRING OPTIONAL }
+                0x04, 0x06, 'g', 'h', 'i', 'j', 'k', 'l',
+                0x30, 0x0B,         // Control ::= SEQUENCE {
+                                    //    controlType             LDAPOID, 
+                0x04, 0x06, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x03,
+                0x01, 0x01, (byte)0xFF,   //    criticality             BOOLEAN DEFAULT FALSE}
+                0x30, 0x08,         // Control ::= SEQUENCE {
+                                    //    controlType             LDAPOID} 
+                0x04, 0x06, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x04
+            } );
+
+        String decodedPdu = StringUtils.dumpBytes( stream.array() );
+        stream.flip();
+
+        // Allocate a LdapMessageContainer Container
+        IAsn1Container ldapMessageContainer = new LdapMessageContainer();
+
+        // Decode the PDU
+        try
+        {
+            ldapDecoder.decode( stream, ldapMessageContainer );
+        }
+        catch ( DecoderException de )
+        {
+            de.printStackTrace();
+            Assert.fail( de.getMessage() );
+        }
+        
+        // Check that everything is OK
+        LdapMessage message = ( ( LdapMessageContainer ) ldapMessageContainer ).getLdapMessage();
+        AbandonRequest abandonRequest = message.getAbandonRequest();
+
+        Assert.assertEquals( 3, message.getMessageId() );
+        Assert.assertEquals( 2, abandonRequest.getAbandonedMessageId() );
+        
+        // Check the length
+        Assert.assertEquals(0x4A, message.computeLength());
+        
+        // Check the encoding
+        try
+        {
+            ByteBuffer bb = message.encode( null );
+            
+            String encodedPdu = StringUtils.dumpBytes( bb.array() ); 
+            
+            Assert.assertEquals(encodedPdu, decodedPdu );
+        }
+        catch ( EncoderException ee )
+        {
+            ee.printStackTrace();
+            Assert.fail( ee.getMessage() );
+        }
+    }
+}

Propchange: directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/test/org/apache/asn1new/ldap/codec/AbandonRequestTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/test/org/apache/asn1new/ldap/codec/AddRequestTest.java
URL: http://svn.apache.org/viewcvs/directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/test/org/apache/asn1new/ldap/codec/AddRequestTest.java?rev=279887&view=auto
==============================================================================
--- directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/test/org/apache/asn1new/ldap/codec/AddRequestTest.java (added)
+++ directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/test/org/apache/asn1new/ldap/codec/AddRequestTest.java Fri Sep  9 14:41:22 2005
@@ -0,0 +1,175 @@
+/*
+ *   Copyright 2005 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.asn1new.ldap.codec;
+
+import java.nio.ByteBuffer;
+import java.util.HashMap;
+import java.util.HashSet;
+
+import javax.naming.NamingEnumeration;
+import javax.naming.NamingException;
+import javax.naming.directory.Attributes;
+import javax.naming.directory.BasicAttribute;
+
+import org.apache.asn1.codec.DecoderException;
+import org.apache.asn1.codec.EncoderException;
+import org.apache.asn1new.ber.Asn1Decoder;
+import org.apache.asn1new.ber.containers.IAsn1Container;
+import org.apache.asn1new.ldap.pojo.AddRequest;
+import org.apache.asn1new.ldap.pojo.LdapMessage;
+import org.apache.asn1new.primitives.OctetString;
+import org.apache.asn1new.util.StringUtils;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+/**
+ * Test the AddRequest codec
+ * 
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class AddRequestTest extends TestCase {
+    /**
+     * Test the decoding of a AddRequest
+     */
+    public void testDecodeAddRequestSuccess() throws NamingException
+    {
+        Asn1Decoder ldapDecoder = new LdapDecoder();
+
+        ByteBuffer  stream      = ByteBuffer.allocate( 0x5B );
+        
+        stream.put(
+            new byte[]
+            {
+                0x30, 0x59, 		// LDAPMessage ::= SEQUENCE {
+				0x02, 0x01, 0x01, 	//     messageID MessageID
+				0x68, 0x54, 		//     CHOICE { ..., addRequest   AddRequest, ...
+                        			// AddRequest ::= [APPLICATION 8] SEQUENCE {
+									//     entry           LDAPDN,
+				0x04, 0x22, 'c', 'n', '=', 't', 'e', 's', 't', 'M', 'o', 'd', 'i', 'f', 'y', ',', ' ', 'o', 'u', '=', 'u', 's', 'e', 'r', 's', ',', ' ', 'o', 'u', '=', 's', 'y', 's', 't', 'e', 'm',
+									//     attributes      AttributeList }
+                0x30, 0x2E,         // AttributeList ::= SEQUENCE OF SEQUENCE {
+                0x30, 0x0c,         // attribute 1
+                0x04, 0x01, 'l',    //     type    AttributeDescription,
+                0x31, 0x07,         //     vals    SET OF AttributeValue }
+                0x04, 0x05, 'P', 'a', 'r', 'i', 's',
+
+                0x30, 0x1E,         // attribute 2
+                					//     type    AttributeDescription,
+                0x04, 0x05, 'a', 't', 't', 'r', 's', 
+                0x31, 0x15,         //     vals    SET OF AttributeValue }
+                0x04, 0x05, 't', 'e', 's', 't', '1',
+                0x04, 0x05, 't', 'e', 's', 't', '2',
+                0x04, 0x05, 't', 'e', 's', 't', '3',
+            } );
+
+        String decodedPdu = StringUtils.dumpBytes( stream.array() );
+        stream.flip();
+
+        // Allocate a LdapMessage Container
+        IAsn1Container ldapMessageContainer = new LdapMessageContainer();
+
+        // Decode a AddRequest message
+        try
+        {
+            ldapDecoder.decode( stream, ldapMessageContainer );
+        }
+        catch ( DecoderException de )
+        {
+            de.printStackTrace();
+            Assert.fail( de.getMessage() );
+        }
+    	
+        LdapMessage message = ( ( LdapMessageContainer ) ldapMessageContainer ).getLdapMessage();
+        AddRequest addRequest      = message.getAddRequest();
+
+        // Check the decoded message
+        Assert.assertEquals( 1, message.getMessageId() );
+        Assert.assertEquals( "cn=testModify, ou=users, ou=system", addRequest.getEntry() );
+
+        Attributes attributes = addRequest.getAttributes();
+        
+        Assert.assertEquals( 2, attributes.size() );
+        
+        HashSet expectedTypes = new HashSet();
+        
+        expectedTypes.add("l");
+        expectedTypes.add("attrs");
+        
+        HashMap typesVals = new HashMap();
+        
+        HashSet lVal1 = new HashSet();
+        lVal1.add("Paris");
+        typesVals.put("l", lVal1);
+        
+        HashSet lVal2 = new HashSet();
+        lVal2.add("test1");
+        lVal2.add("test2");
+        lVal2.add("test3");
+        typesVals.put("attrs", lVal2);
+        
+        BasicAttribute attributeValue = (BasicAttribute)attributes.get( "l" );
+            
+        Assert.assertTrue( expectedTypes.contains( attributeValue.getID().toLowerCase() ) );
+            
+        NamingEnumeration values = attributeValue.getAll();
+        HashSet vals = (HashSet)typesVals.get( attributeValue.getID().toLowerCase() );
+
+        while ( values.hasMore() )
+        {
+            OctetString value = (OctetString)values.next();
+            
+            Assert.assertTrue( vals.contains( value.toString() ) );
+            
+            vals.remove( value.toString() );
+        }
+
+        attributeValue = (BasicAttribute)attributes.get( "attrs" );
+        
+	    Assert.assertTrue( expectedTypes.contains( attributeValue.getID().toLowerCase() ) );
+	        
+	    values = attributeValue.getAll();
+	    vals = (HashSet)typesVals.get( attributeValue.getID().toLowerCase() );
+	
+	    while ( values.hasMore() )
+	    {
+	        OctetString value = (OctetString)values.next();
+	        
+	        Assert.assertTrue( vals.contains( value.toString() ) );
+	        
+	        vals.remove( value.toString() );
+	    }
+	    
+        // Check the length
+        Assert.assertEquals(0x5B, message.computeLength());
+	    
+        // Check the encoding
+        try
+        {
+            ByteBuffer bb = message.encode( null );
+            
+            String encodedPdu = StringUtils.dumpBytes( bb.array() ); 
+            
+            Assert.assertEquals(encodedPdu, decodedPdu );
+        }
+        catch ( EncoderException ee )
+        {
+            ee.printStackTrace();
+            Assert.fail( ee.getMessage() );
+        }
+    }
+}

Propchange: directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/test/org/apache/asn1new/ldap/codec/AddRequestTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/test/org/apache/asn1new/ldap/codec/AddResponseTest.java
URL: http://svn.apache.org/viewcvs/directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/test/org/apache/asn1new/ldap/codec/AddResponseTest.java?rev=279887&view=auto
==============================================================================
--- directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/test/org/apache/asn1new/ldap/codec/AddResponseTest.java (added)
+++ directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/test/org/apache/asn1new/ldap/codec/AddResponseTest.java Fri Sep  9 14:41:22 2005
@@ -0,0 +1,108 @@
+/*
+ *   Copyright 2005 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.asn1new.ldap.codec;
+
+import java.nio.ByteBuffer;
+
+import org.apache.asn1.codec.DecoderException;
+import org.apache.asn1.codec.EncoderException;
+import org.apache.asn1new.ber.Asn1Decoder;
+import org.apache.asn1new.ber.containers.IAsn1Container;
+import org.apache.asn1new.ldap.pojo.AddResponse;
+import org.apache.asn1new.ldap.pojo.LdapMessage;
+import org.apache.asn1new.util.StringUtils;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+/**
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class AddResponseTest extends TestCase {
+    /**
+     * Test the decoding of a AddResponse
+     */
+    public void testDecodeAddResponseSuccess()
+    {
+        Asn1Decoder ldapDecoder = new LdapDecoder();
+
+        ByteBuffer  stream      = ByteBuffer.allocate( 0x2D );
+        
+        stream.put(
+            new byte[]
+            {
+                0x30, 0x2B, 		// LDAPMessage ::=SEQUENCE {
+				0x02, 0x01, 0x01, 	//         messageID MessageID
+				0x69, 0x26, 		//        CHOICE { ..., addResponse AddResponse, ...
+                        			// AddResponse ::= [APPLICATION 9] LDAPResult
+				0x0A, 0x01, 0x00, 	//   LDAPResult ::= SEQUENCE {
+									//		resultCode ENUMERATED {
+									//			success (0), ...
+				 					//      },
+				0x04, 0x1F,			//		matchedDN    LDAPDN,
+				'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=',
+                'e', 'x', 'a', 'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm',
+				0x04, 0x00  		//      errorMessage LDAPString,
+									//		referral     [3] Referral OPTIONAL }
+									// }
+            } );
+
+        String decodedPdu = StringUtils.dumpBytes( stream.array() );
+        stream.flip();
+
+        // Allocate a LdapMessage Container
+        IAsn1Container ldapMessageContainer = new LdapMessageContainer();
+
+        // Decode the AddResponse PDU
+        try
+        {
+            ldapDecoder.decode( stream, ldapMessageContainer );
+        }
+        catch ( DecoderException de )
+        {
+            de.printStackTrace();
+            Assert.fail( de.getMessage() );
+        }
+    	
+        // Check the decoded AddResponse
+        LdapMessage message = ( ( LdapMessageContainer ) ldapMessageContainer ).getLdapMessage();
+        AddResponse addResponse      = message.getAddResponse();
+        
+        Assert.assertEquals( 1, message.getMessageId() );
+        Assert.assertEquals( 0, addResponse.getLdapResult().getResultCode() );
+        Assert.assertEquals( "uid=akarasulu,dc=example,dc=com", addResponse.getLdapResult().getMatchedDN() );
+        Assert.assertEquals( "", addResponse.getLdapResult().getErrorMessage() );
+
+        // Check the length
+        Assert.assertEquals(0x2D, message.computeLength());
+        
+        try
+        {
+            ByteBuffer bb = message.encode( null );
+            
+            String encodedPdu = StringUtils.dumpBytes( bb.array() ); 
+            
+            Assert.assertEquals(encodedPdu, decodedPdu );
+        }
+        catch ( EncoderException ee )
+        {
+            ee.printStackTrace();
+            Assert.fail( ee.getMessage() );
+        }
+
+    }
+}

Propchange: directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/test/org/apache/asn1new/ldap/codec/AddResponseTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/test/org/apache/asn1new/ldap/codec/BindRequestTest.java
URL: http://svn.apache.org/viewcvs/directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/test/org/apache/asn1new/ldap/codec/BindRequestTest.java?rev=279887&view=auto
==============================================================================
--- directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/test/org/apache/asn1new/ldap/codec/BindRequestTest.java (added)
+++ directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/test/org/apache/asn1new/ldap/codec/BindRequestTest.java Fri Sep  9 14:41:22 2005
@@ -0,0 +1,375 @@
+/*
+ *   Copyright 2005 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.asn1new.ldap.codec;
+
+import java.nio.ByteBuffer;
+
+import org.apache.asn1.codec.DecoderException;
+import org.apache.asn1.codec.EncoderException;
+import org.apache.asn1new.ber.Asn1Decoder;
+import org.apache.asn1new.ber.containers.IAsn1Container;
+import org.apache.asn1new.ldap.pojo.BindRequest;
+import org.apache.asn1new.ldap.pojo.LdapMessage;
+import org.apache.asn1new.ldap.pojo.SaslCredentials;
+import org.apache.asn1new.ldap.pojo.SimpleAuthentication;
+import org.apache.asn1new.util.StringUtils;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+/**
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class BindRequestTest extends TestCase {
+    /**
+     * Test the decoding of a BindRequest with Simple authentication
+     * and no controls
+     */
+    public void testDecodeBindRequestSimpleNoControls()
+    {
+        Asn1Decoder ldapDecoder = new LdapDecoder();
+
+        ByteBuffer  stream      = ByteBuffer.allocate( 0x35 );
+        stream.put(
+            new byte[]
+            {
+                0x30, 0x33, 		// LDAPMessage ::=SEQUENCE {
+				0x02, 0x01, 0x01, 	//         messageID MessageID
+				0x60, 0x2E, 		//        CHOICE { ..., bindRequest BindRequest, ...
+                        			// BindRequest ::= APPLICATION[0] SEQUENCE {
+				0x02, 0x01, 0x03, 	//        version INTEGER (1..127),
+				0x04, 0x1F, 		//        name LDAPDN,
+				'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=',
+                'e', 'x', 'a', 'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm',
+				( byte ) 0x80, 0x08, //        authentication AuthenticationChoice
+                                     // AuthenticationChoice ::= CHOICE { simple [0] OCTET STRING, ...
+				'p', 'a', 's', 's', 'w', 'o', 'r', 'd'
+            } );
+
+        String decodedPdu = StringUtils.dumpBytes( stream.array() );
+        stream.flip();
+
+        // Allocate a LdapMessage Container
+        IAsn1Container ldapMessageContainer = new LdapMessageContainer();
+
+        // Decode the BindRequest PDU
+        try
+        {
+            ldapDecoder.decode( stream, ldapMessageContainer );
+        }
+        catch ( DecoderException de )
+        {
+            de.printStackTrace();
+            Assert.fail( de.getMessage() );
+        }
+    	
+        // Check the decoded BindRequest 
+        LdapMessage message = ( ( LdapMessageContainer ) ldapMessageContainer ).getLdapMessage();
+        BindRequest br      = message.getBindRequest();
+
+        Assert.assertEquals( 1, message.getMessageId() );
+        Assert.assertEquals( 3, br.getVersion() );
+        Assert.assertEquals( "uid=akarasulu,dc=example,dc=com", br.getName() );
+        Assert.assertEquals( true, ( br.getAuthentication() instanceof SimpleAuthentication ) );
+        Assert.assertEquals( "password", ( ( SimpleAuthentication ) br.getAuthentication() ).getSimple().toString() );
+
+        // Check the length
+        Assert.assertEquals(0x35, message.computeLength());
+        
+        // Check the encoding
+        try
+        {
+            ByteBuffer bb = message.encode( null );
+            
+            String encodedPdu = StringUtils.dumpBytes( bb.array() ); 
+            
+            Assert.assertEquals(encodedPdu, decodedPdu );
+        }
+        catch ( EncoderException ee )
+        {
+            ee.printStackTrace();
+            Assert.fail( ee.getMessage() );
+        }
+    }
+
+    /**
+     * Test the decoding of a BindRequest with Simple authentication,
+     * no name
+     * and no controls
+     */
+    public void testDecodeBindRequestSimpleNoName()
+    {
+        Asn1Decoder ldapDecoder = new LdapDecoder();
+
+        ByteBuffer  stream      = ByteBuffer.allocate( 0x15 );
+        stream.put(
+            new byte[]
+            {
+                0x30, 0x13, 		// LDAPMessage ::=SEQUENCE {
+				0x02, 0x01, 0x01, 	//         messageID MessageID
+				0x60, 0x0D, 		//        CHOICE { ..., bindRequest BindRequest, ...
+                        			// BindRequest ::= APPLICATION[0] SEQUENCE {
+				0x02, 0x01, 0x03, 	//        version INTEGER (1..127),
+				( byte ) 0x80, 0x08, //        authentication AuthenticationChoice
+                                     // AuthenticationChoice ::= CHOICE { simple [0] OCTET STRING, ...
+				'p', 'a', 's', 's', 'w', 'o', 'r', 'd'
+            } );
+
+        stream.flip();
+
+        // Allocate a LdapMessage Container
+        IAsn1Container ldapMessageContainer =  new LdapMessageContainer();
+
+        // Decode the BindRequest PDU
+        try
+        {
+            ldapDecoder.decode( stream, ldapMessageContainer );
+        }
+        catch ( DecoderException de )
+        {
+            Assert.assertEquals( "Bad transition !", de.getMessage() );
+            return;
+        }
+    	
+        Assert.fail("Should never reach this point.");
+    }
+
+    /**
+     * Test the decoding of a BindRequest with Simple authentication,
+     * empty name (an anonymous bind)
+     * and no controls
+     */
+    public void testDecodeBindRequestSimpleEmptyName()
+    {
+        Asn1Decoder ldapDecoder = new LdapDecoder();
+
+        ByteBuffer  stream      = ByteBuffer.allocate( 0x16 );
+        stream.put(
+            new byte[]
+            {
+                0x30, 0x14, 		 // LDAPMessage ::=SEQUENCE {
+				0x02, 0x01, 0x01, 	 //         messageID MessageID
+				0x60, 0x0F, 		 //        CHOICE { ..., bindRequest BindRequest, ...
+                        			 // BindRequest ::= APPLICATION[0] SEQUENCE {
+				0x02, 0x01, 0x03, 	 //        version INTEGER (1..127),
+				0x04, 0x00,          //        name LDAPDN,
+				( byte ) 0x80, 0x08, //        authentication AuthenticationChoice
+                                     // AuthenticationChoice ::= CHOICE { simple [0] OCTET STRING, ...
+				'p', 'a', 's', 's', 'w', 'o', 'r', 'd'
+            } );
+
+        String decodedPdu = StringUtils.dumpBytes( stream.array() );
+
+        stream.flip();
+
+        // Allocate a LdapMessage Container
+        IAsn1Container ldapMessageContainer =  new LdapMessageContainer();
+
+        // Decode the BindRequest PDU
+        try
+        {
+            ldapDecoder.decode( stream, ldapMessageContainer );
+        }
+        catch ( DecoderException de )
+        {
+            de.printStackTrace();
+            Assert.fail( de.getMessage() );
+        }
+
+        // Check the decoded BindRequest 
+        LdapMessage message = ( ( LdapMessageContainer ) ldapMessageContainer ).getLdapMessage();
+        BindRequest br      = message.getBindRequest();
+
+        Assert.assertEquals( 1, message.getMessageId() );
+        Assert.assertEquals( 3, br.getVersion() );
+        Assert.assertEquals( "", br.getName() );
+        Assert.assertEquals( true, ( br.getAuthentication() instanceof SimpleAuthentication ) );
+        Assert.assertEquals( "password", ( ( (SimpleAuthentication)br.getAuthentication() ).getSimple().toString() ) );
+
+        // Check the length
+        Assert.assertEquals(0x16, message.computeLength());
+        
+        // Check the encoding
+        try
+        {
+            ByteBuffer bb = message.encode( null );
+            
+            String encodedPdu = StringUtils.dumpBytes( bb.array() ); 
+            
+            Assert.assertEquals(encodedPdu, decodedPdu );
+        }
+        catch ( EncoderException ee )
+        {
+            ee.printStackTrace();
+            Assert.fail( ee.getMessage() );
+        }
+    }
+
+    /**
+     * Test the decoding of a BindRequest with Sasl authentication,
+     * no credentials and no controls
+     */
+    public void testDecodeBindRequestSaslNoCredsNoControls()
+    {
+        Asn1Decoder ldapDecoder = new LdapDecoder();
+
+        ByteBuffer  stream      = ByteBuffer.allocate( 0x38 );
+        stream.put(
+            new byte[]
+            {
+                0x30, 0x36, 		// LDAPMessage ::=SEQUENCE {
+				0x02, 0x01, 0x01, 	//         messageID MessageID
+				0x60, 0x31, 		//        CHOICE { ..., bindRequest BindRequest, ...
+                        			// BindRequest ::= APPLICATION[0] SEQUENCE {
+				0x02, 0x01, 0x03, 	//        version INTEGER (1..127),
+				0x04, 0x1F, 		//        name LDAPDN,
+				'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=',
+                'e', 'x', 'a', 'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm',
+				( byte ) 0x83, 0x0B, //        authentication AuthenticationChoice
+                                     // AuthenticationChoice ::= CHOICE { ... sasl [3] SaslCredentials }
+				 					 // SaslCredentials ::= SEQUENCE {
+									 //      mechanism   LDAPSTRING,
+				 					 //      ...
+				'K', 'E', 'R', 'B', 'E', 'R', 'O', 'S', '_', 'V', '4'
+            } );
+
+        String decodedPdu = StringUtils.dumpBytes( stream.array() );
+        stream.flip();
+
+        // Allocate a LdapMessage Container
+        IAsn1Container ldapMessageContainer = new LdapMessageContainer();
+
+        // Decode the BindRequest PDU
+        try
+        {
+            ldapDecoder.decode( stream, ldapMessageContainer );
+        }
+        catch ( DecoderException de )
+        {
+            de.printStackTrace();
+            Assert.fail( de.getMessage() );
+        }
+    	
+        // Check the decoded BindRequest 
+        LdapMessage message = ( ( LdapMessageContainer ) ldapMessageContainer ).getLdapMessage();
+        BindRequest br      = message.getBindRequest();
+
+        Assert.assertEquals( 1, message.getMessageId() );
+        Assert.assertEquals( 3, br.getVersion() );
+        Assert.assertEquals( "uid=akarasulu,dc=example,dc=com", br.getName() );
+        Assert.assertEquals( true, ( br.getAuthentication() instanceof SaslCredentials ) );
+        Assert.assertEquals( "KERBEROS_V4", ( ( SaslCredentials ) br.getAuthentication() ).getMechanism() );
+
+        // Check the length
+        Assert.assertEquals(0x38, message.computeLength());
+        
+        // Check the encoding
+        try
+        {
+            ByteBuffer bb = message.encode( null );
+            
+            String encodedPdu = StringUtils.dumpBytes( bb.array() ); 
+            
+            Assert.assertEquals(encodedPdu, decodedPdu );
+        }
+        catch ( EncoderException ee )
+        {
+            ee.printStackTrace();
+            Assert.fail( ee.getMessage() );
+        }
+    }
+
+    /**
+     * Test the decoding of a BindRequest with Sasl authentication,
+     * a credentials and no controls
+     */
+    public void testDecodeBindRequestSaslCredsNoControls()
+    {
+        Asn1Decoder ldapDecoder = new LdapDecoder();
+
+        ByteBuffer  stream      = ByteBuffer.allocate( 0x40 );
+        stream.put(
+            new byte[]
+            {
+                0x30, 0x3E, 		// LDAPMessage ::=SEQUENCE {
+				0x02, 0x01, 0x01, 	//         messageID MessageID
+				0x60, 0x39, 		//        CHOICE { ..., bindRequest BindRequest, ...
+                        			// BindRequest ::= APPLICATION[0] SEQUENCE {
+				0x02, 0x01, 0x03, 	//        version INTEGER (1..127),
+				0x04, 0x1F, 		//        name LDAPDN,
+				'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=',
+                'e', 'x', 'a', 'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm',
+				( byte ) 0x83, 0x0B, //        authentication AuthenticationChoice }
+                                     // AuthenticationChoice ::= CHOICE { ... sasl [3] SaslCredentials }
+									 // SaslCredentials ::= SEQUENCE {
+									 //      mechanism   LDAPSTRING,
+									 //      ...
+				'K', 'E', 'R', 'B', 'E', 'R', 'O', 'S', '_', 'V', '4',
+				( byte ) 0x04, 0x06, // SaslCredentials ::= SEQUENCE {        
+				 					 //      ...
+				 					 //      credentials   OCTET STRING OPTIONAL }
+                					 // 
+				'a', 'b', 'c', 'd', 'e', 'f'
+            } );
+
+        String decodedPdu = StringUtils.dumpBytes( stream.array() );
+        stream.flip();
+
+        // Allocate a LdapMessage Container
+        IAsn1Container ldapMessageContainer = new LdapMessageContainer();
+
+        // Decode the BindRequest PDU
+        try
+        {
+            ldapDecoder.decode( stream, ldapMessageContainer );
+        }
+        catch ( DecoderException de )
+        {
+            de.printStackTrace();
+            Assert.fail( de.getMessage() );
+        }
+    	
+        // Check the decoded BindRequest 
+        LdapMessage message = ( ( LdapMessageContainer ) ldapMessageContainer ).getLdapMessage();
+        BindRequest br      = message.getBindRequest();
+
+        Assert.assertEquals( 1, message.getMessageId() );
+        Assert.assertEquals( 3, br.getVersion() );
+        Assert.assertEquals( "uid=akarasulu,dc=example,dc=com", br.getName() );
+        Assert.assertEquals( true, ( br.getAuthentication() instanceof SaslCredentials ) );
+        Assert.assertEquals( "KERBEROS_V4", ( ( SaslCredentials ) br.getAuthentication() ).getMechanism() );
+        Assert.assertEquals( "abcdef", ( ( SaslCredentials ) br.getAuthentication() ).getCredentials().toString() );
+
+        // Check the length
+        Assert.assertEquals(0x40, message.computeLength());
+        
+        // Check the encoding
+        try
+        {
+            ByteBuffer bb = message.encode( null );
+            
+            String encodedPdu = StringUtils.dumpBytes( bb.array() ); 
+            
+            Assert.assertEquals(encodedPdu, decodedPdu );
+        }
+        catch ( EncoderException ee )
+        {
+            ee.printStackTrace();
+            Assert.fail( ee.getMessage() );
+        }
+    }
+}

Propchange: directory/shared/ldap/branches/elecharny-cleanup/apache2-provider/src/test/org/apache/asn1new/ldap/codec/BindRequestTest.java
------------------------------------------------------------------------------
    svn:eol-style = native