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/04/15 07:42:24 UTC

svn commit: r161400 [1/2] - in directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/ldap/codec/grammars: ./ BindRequestGrammar.java BindResponseGrammar.java LdapControlGrammar.java LdapMessageGrammar.java LdapResultGrammar.java

Author: elecharny
Date: Thu Apr 14 22:42:23 2005
New Revision: 161400

URL: http://svn.apache.org/viewcvs?view=rev&rev=161400
Log:
Created the LdapResultGrammar, LdapControlGrammar and the BindResponseGrammar.
A lot of changes done in LdapMessageGrammar and BindRequestGrammar.

Added:
    directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/ldap/codec/grammars/
    directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/ldap/codec/grammars/BindRequestGrammar.java
    directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/ldap/codec/grammars/BindResponseGrammar.java
    directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/ldap/codec/grammars/LdapControlGrammar.java
    directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/ldap/codec/grammars/LdapMessageGrammar.java
      - copied, changed from r160136, directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/ldap/codec/LdapMessageGrammar.java
    directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/ldap/codec/grammars/LdapResultGrammar.java

Added: directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/ldap/codec/grammars/BindRequestGrammar.java
URL: http://svn.apache.org/viewcvs/directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/ldap/codec/grammars/BindRequestGrammar.java?view=auto&rev=161400
==============================================================================
--- directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/ldap/codec/grammars/BindRequestGrammar.java (added)
+++ directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/ldap/codec/grammars/BindRequestGrammar.java Thu Apr 14 22:42:23 2005
@@ -0,0 +1,541 @@
+/*
+ *   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.asn1.ldap.codec.grammars;
+
+import org.apache.asn1.ber.containers.IAsn1Container;
+import org.apache.asn1.ber.grammar.AbstractGrammar;
+import org.apache.asn1.ber.grammar.GrammarAction;
+import org.apache.asn1.ber.grammar.GrammarTransition;
+import org.apache.asn1.ber.grammar.IGrammar;
+import org.apache.asn1.ber.grammar.StatesEnum;
+import org.apache.asn1.ber.tlv.TLV;
+import org.apache.asn1.ber.tlv.Value;
+import org.apache.asn1.ldap.codec.DecoderException;
+import org.apache.asn1.ldap.codec.LdapMessageContainer;
+import org.apache.asn1.ldap.codec.primitives.LdapDN;
+import org.apache.asn1.ldap.codec.primitives.LdapString;
+import org.apache.asn1.ldap.codec.utils.IntegerDecoder;
+import org.apache.asn1.ldap.pojo.BindRequestPOJO;
+import org.apache.asn1.ldap.pojo.LdapMessagePOJO;
+import org.apache.asn1.ldap.pojo.SaslAuthenticationPOJO;
+import org.apache.asn1.ldap.pojo.SimpleAuthenticationPOJO;
+import org.apache.asn1.util.MutableString;
+import org.apache.asn1.util.pools.PoolEnum;
+import org.apache.asn1.util.pools.PoolException;
+
+import org.apache.log4j.Logger;
+
+
+/**
+ * This class implements the LdapMessage. All the actions are declared in this
+ * class. As it is a singleton, these declaration are only done once.
+ * 
+ * If an action is to be added or modified, this is where the work is to be done !
+ * 
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class BindRequestGrammar extends AbstractGrammar implements IGrammar
+{
+    //~ Static fields/initializers -----------------------------------------------------------------
+
+    /** The logger */
+    private static final Logger log = Logger.getLogger( BindRequestGrammar.class );
+
+    /** Logging speed up  */
+    private static final boolean DEBUG = log.isDebugEnabled();
+
+    /** The instance of grammar. BindRequestGrammar is a singleton */
+    private static IGrammar instance = new BindRequestGrammar();
+
+    //~ Methods ------------------------------------------------------------------------------------
+
+    /**
+     * Get the instance of this grammar
+     *
+     * @return An instance on the BindRequest Grammar
+     */
+    public static IGrammar getInstance()
+    {
+        return instance;
+    }
+
+    //~ Constructors -------------------------------------------------------------------------------
+
+    /**
+     * Creates a new LdapMessageGrammar object.
+     */
+    private BindRequestGrammar()
+    {
+
+        name = BindRequestGrammar.class.getName();
+
+        // We have 17 differents states, so 16 transitions between states.
+        super.transitions = new GrammarTransition[StatesEnum.LAST_BIND_REQUEST_STATE][256];
+
+        //============================================================================================
+        // protocolOp : Bind Request
+        //============================================================================================
+        // We have to allocate a BindRequestPOJO
+        // LdapMessage ::= ... BindRequest ...
+        // BindRequest ::= [APPLICATION 0] SEQUENCE { ... (Length)
+        super.transitions[StatesEnum.BIND_REQUEST_TAG][0x60]    = new GrammarTransition(
+                StatesEnum.BIND_REQUEST_TAG, StatesEnum.BIND_REQUEST_LENGTH, null );
+
+        super.transitions[StatesEnum.BIND_REQUEST_LENGTH][0x60] = new GrammarTransition(
+                StatesEnum.BIND_REQUEST_LENGTH, StatesEnum.BIND_REQUEST_VALUE,
+                new GrammarAction( "Init BindRequest" )
+                {
+                    public void action( IAsn1Container container ) throws DecoderException
+                    {
+
+                        LdapMessageContainer ldapMessageContainer = ( LdapMessageContainer )
+                            container;
+                        LdapMessagePOJO      ldapMessage          =
+                            ldapMessageContainer.getLdapMessage();
+
+                        checkLength( ldapMessageContainer.getLdapMessage(),
+                            ldapMessageContainer.getCurrentTLV() );
+
+                        try
+                        {
+
+                            // Now, we can allocate the BindRequest POJO
+                            BindRequestPOJO bindRequest = ( BindRequestPOJO )
+                                ldapMessageContainer.getPoolManager().allocate(
+                                    PoolEnum.BIND_REQUEST_POJO_POOL );
+
+                            // As this is a new Constructed object, we have to init its length
+                            TLV tlv            = ldapMessageContainer.getCurrentTLV();
+                            int expectedLength = tlv.getLength().getLength();
+
+                            bindRequest.setExpectedLength( expectedLength );
+                            bindRequest.setCurrentLength( 0 );
+                            bindRequest.setFather( ldapMessage );
+
+                            // And we associate it to the ldapMessage POJO
+                            ldapMessage.setProtocolOP( bindRequest );
+
+                        }
+                        catch ( PoolException pe )
+                        {
+                            throw new DecoderException(
+                                "Cannot allocate a BindRequest Pojo : " + pe.getMessage() );
+                        }
+                    }
+                } );
+
+        // LdapMessage ::= ... BindRequest ...
+        // BindRequest ::= [APPLICATION 0] SEQUENCE { ... (Value)
+        // Nothing to do, the Value is empty, this is a constructed TLV. We now can swith to the BindRequest Grammar
+        super.transitions[StatesEnum.BIND_REQUEST_VALUE][0x60] = new GrammarTransition(
+                StatesEnum.BIND_REQUEST_VALUE, StatesEnum.BIND_REQUEST_VERSION_TAG, null );
+
+        // BindRequest ::= ... version INTEGER (1 .. 127 ), ... (Tag)
+        // Nothing to do.
+        super.transitions[StatesEnum.BIND_REQUEST_VERSION_TAG][0x02] = new GrammarTransition(
+                StatesEnum.BIND_REQUEST_VERSION_TAG, StatesEnum.BIND_REQUEST_VERSION_LENGTH, null );
+
+        // BindRequest ::= ... version INTEGER (1 .. 127 ), ... (Length)
+        // Checks the length
+        super.transitions[StatesEnum.BIND_REQUEST_VERSION_LENGTH][0x02] = new GrammarTransition(
+                StatesEnum.BIND_REQUEST_VERSION_LENGTH, StatesEnum.BIND_REQUEST_VERSION_VALUE,
+                new GrammarAction( "Store version" )
+                {
+                    public void action( IAsn1Container container ) throws DecoderException
+                    {
+
+                        LdapMessageContainer ldapMessageContainer = ( LdapMessageContainer )
+                            container;
+
+                        checkLength( ldapMessageContainer.getLdapMessage().getProtocolOp(),
+                            ldapMessageContainer.getCurrentTLV() );
+                        return;
+                    }
+                } );
+
+        // BindRequest ::= ... version INTEGER (1 .. 127 ), ... (value)
+        // Checks that the Version is in [1, 127]
+        super.transitions[StatesEnum.BIND_REQUEST_VERSION_VALUE][0x02] = new GrammarTransition(
+                StatesEnum.BIND_REQUEST_VERSION_VALUE, StatesEnum.BIND_REQUEST_NAME_TAG,
+                new GrammarAction( "Store version" )
+                {
+                    public void action( IAsn1Container container ) throws DecoderException
+                    {
+
+                        LdapMessageContainer ldapMessageContainer = ( LdapMessageContainer )
+                            container;
+                        BindRequestPOJO      bindRequestMessage   = ( BindRequestPOJO )
+                            ldapMessageContainer.getLdapMessage().getProtocolOp();
+
+                        // The current TLV should be a integer between 1 and 127
+                        // We get it and store it in Version
+                        TLV   tlv     = ldapMessageContainer.getCurrentTLV();
+
+                        Value value   = tlv.getValue();
+
+                        int   version = IntegerDecoder.parse( value, 1, 127 );
+
+                        bindRequestMessage.setVersion( version );
+
+                        return;
+                    }
+                } );
+
+        // BindRequest ::= ... name LDAPDN, ... (Tag)
+        // Nothing to do. The tag is supposed to be 0x04
+        super.transitions[StatesEnum.BIND_REQUEST_NAME_TAG][0x04] = new GrammarTransition(
+                StatesEnum.BIND_REQUEST_NAME_TAG, StatesEnum.BIND_REQUEST_NAME_LENGTH, null );
+
+        // BindRequest ::= ... name LDAPDN, ... (Length)
+        // We just check the length.
+        super.transitions[StatesEnum.BIND_REQUEST_NAME_LENGTH][0x04] = new GrammarTransition(
+                StatesEnum.BIND_REQUEST_NAME_LENGTH, StatesEnum.BIND_REQUEST_NAME_VALUE,
+                new GrammarAction( "Check Bind Name Length" )
+                {
+                    public void action( IAsn1Container container ) throws DecoderException
+                    {
+
+                        LdapMessageContainer ldapMessageContainer = ( LdapMessageContainer )
+                            container;
+                        BindRequestPOJO bindRequestMessage = ( BindRequestPOJO )
+                        ldapMessageContainer.getLdapMessage().getProtocolOp();
+                        
+                        TLV                  tlv                  =
+                            ldapMessageContainer.getCurrentTLV();
+
+
+                        checkLength( bindRequestMessage, tlv );
+                        
+                        // We have to handle the special case of a 0 length name
+                        if (tlv.getLength().getLength() == 0)
+                        {
+                            bindRequestMessage.setName( MutableString.EMPTY_STRING );
+                        }
+                        
+                        return;
+                    }
+                } );
+
+        // BindRequest ::= ... name LDAPDN, ... (Value)
+        // We have to store the name
+        super.transitions[StatesEnum.BIND_REQUEST_NAME_VALUE][0x04] = new GrammarTransition(
+                StatesEnum.BIND_REQUEST_NAME_VALUE,
+                StatesEnum.BIND_REQUEST_AUTHENTICATION_CHOICE_TAG,
+                new GrammarAction( "Store Bind Name value" )
+                {
+                    public void action( IAsn1Container container ) throws DecoderException
+                    {
+
+                        LdapMessageContainer ldapMessageContainer = ( LdapMessageContainer )
+                            container;
+                        BindRequestPOJO bindRequestMessage = ( BindRequestPOJO )
+                        ldapMessageContainer.getLdapMessage().getProtocolOp();
+
+                        // Get the Value and store it in the BindRequest
+                        TLV             tlv                = ldapMessageContainer.getCurrentTLV();
+
+
+                        bindRequestMessage.setName( LdapDN.parseDN(
+                                ldapMessageContainer.getPoolManager(), tlv.getValue().getData() ) );
+                        return;
+                    }
+                } );
+
+        // BindRequest ::= ... authentication AuthenticationChoice }
+        // AuthenticationChoice ::= CHOICE {
+        // The tag might be either 0x80 (SimpleAuthentication) or 0x83 (SaslAuthentication)
+        //--------------------------------------------------------------------------------------------
+        // If it's 0x80, it is a SimpleAuthentication.
+        //--------------------------------------------------------------------------------------------
+        // Nothing to do.
+        super.transitions[StatesEnum.BIND_REQUEST_AUTHENTICATION_CHOICE_TAG][( 0x80 & 0x00FF )] =
+            new GrammarTransition( StatesEnum.BIND_REQUEST_AUTHENTICATION_CHOICE_TAG,
+                StatesEnum.BIND_REQUEST_AUTHENTICATION_SIMPLE_LENGTH, null );
+
+        // AuthenticationChoice ::= CHOICE {
+        //        simple         [0] OCTET STRING, (Length)
+        // We just have to check the length, and to allocate an authentication POJO
+        super.transitions[StatesEnum.BIND_REQUEST_AUTHENTICATION_SIMPLE_LENGTH][( 0x80 & 0x00FF )] =
+            new GrammarTransition( StatesEnum.BIND_REQUEST_AUTHENTICATION_SIMPLE_LENGTH,
+                StatesEnum.BIND_REQUEST_AUTHENTICATION_SIMPLE_VALUE,
+                new GrammarAction( "Check simple authentication length" )
+                {
+                    public void action( IAsn1Container container ) throws DecoderException
+                    {
+
+                        LdapMessageContainer ldapMessageContainer = ( LdapMessageContainer )
+                            container;
+                        BindRequestPOJO bindRequestMessage = ( BindRequestPOJO )
+                        ldapMessageContainer.getLdapMessage().getProtocolOp();
+                        
+                        TLV             tlv                = ldapMessageContainer.getCurrentTLV();
+
+                        checkLength( bindRequestMessage, tlv );
+
+                        // Allocate the Authentication POJO
+                        SimpleAuthenticationPOJO authentication = null;
+                        
+                        try
+                        {
+
+                            authentication = ( SimpleAuthenticationPOJO )
+                                ldapMessageContainer.getPoolManager().allocate(
+                                    PoolEnum.SIMPLE_AUTH_POJO_POOL );
+
+                            authentication.setFather( bindRequestMessage );
+
+                            bindRequestMessage.setAuthentication( authentication );
+                        }
+                        catch ( PoolException pe )
+                        {
+                            throw new DecoderException(
+                                "Cannot allocate a SimpleAuthentication Pojo : " + pe.getMessage() );
+                        }
+
+                        // We have to handle the special case of a 0 length simple
+                        if (tlv.getLength().getLength() == 0)
+                        {
+                            authentication.setSimple( new byte[]{} );
+                        }
+                        
+                        return;
+                    }
+                } );
+
+        // AuthenticationChoice ::= CHOICE {
+        //        simple         [0] OCTET STRING, (Value)
+        // We have to create an Authentication POJO to store the credentials.
+        // The nextState is GRAMMAR_END
+        super.transitions[StatesEnum.BIND_REQUEST_AUTHENTICATION_SIMPLE_VALUE][( 0x80 & 0x00FF )] =
+            new GrammarTransition( StatesEnum.BIND_REQUEST_AUTHENTICATION_SIMPLE_VALUE,
+                StatesEnum.GRAMMAR_END,
+                new GrammarAction( "Store Bind Simple Authentication value" )
+                {
+                    public void action( IAsn1Container container ) throws DecoderException
+                    {
+
+                        LdapMessageContainer ldapMessageContainer = ( LdapMessageContainer )
+                            container;
+                        
+                        BindRequestPOJO bindRequestMessage = ( BindRequestPOJO )
+                        ldapMessageContainer.getLdapMessage().getProtocolOp();
+                        
+                        SimpleAuthenticationPOJO simpleAuthentication = (SimpleAuthenticationPOJO)bindRequestMessage.getAuthentication();
+
+                        TLV           tlv    = ldapMessageContainer.getCurrentTLV();
+
+                        // Get the simple value
+                        // Store the simple in the authentication
+                        simpleAuthentication.setSimple( tlv.getValue().getData() );
+                    }
+                } );
+
+        //--------------------------------------------------------------------------------------------
+        // If it's 0x83, it is a Sasl Credentials.
+        // AuthenticationChoice ::= CHOICE {
+        //          ...
+        //        sasl         [3] SaslCredentials }
+        //
+        // SaslCredentials ::= SEQUENCE {
+        //        mechanism     LDAPSTRING,
+        //        credentials   OCTET STRING OPTIONNAL }
+        //--------------------------------------------------------------------------------------------
+        // AuthenticationChoice ::= CHOICE {
+        //        sasl         [3] saslCredentials, (Tag)
+        // Nothing to do. In fact, 0x83 is the mechanism tag. 
+        super.transitions[StatesEnum.BIND_REQUEST_AUTHENTICATION_CHOICE_TAG][( 0x83 & 0x00FF )] =
+            new GrammarTransition( StatesEnum.BIND_REQUEST_AUTHENTICATION_CHOICE_TAG,
+                StatesEnum.BIND_REQUEST_AUTHENTICATION_MECHANISM_LENGTH, null );
+
+        // AuthenticationChoice ::= CHOICE {
+        //        sasl         [3] saslCredentials }
+        //
+        // SaslCredentials ::= SEQUENCE {
+        //        mechanism     LDAPSTRING,  (Length)
+        //		  ...
+        // We just have to check the length.
+        super.transitions[StatesEnum.BIND_REQUEST_AUTHENTICATION_MECHANISM_LENGTH][( 0x83 & 0x00FF )] =
+            new GrammarTransition( StatesEnum.BIND_REQUEST_AUTHENTICATION_MECHANISM_LENGTH,
+                StatesEnum.BIND_REQUEST_AUTHENTICATION_MECHANISM_VALUE,
+                new GrammarAction( "Check sasl authentication mechanism length" )
+                {
+                    public void action( IAsn1Container container ) throws DecoderException
+                    {
+
+                        LdapMessageContainer ldapMessageContainer = ( LdapMessageContainer )
+                            container;
+                        BindRequestPOJO bindRequestMessage = ( BindRequestPOJO )
+                        ldapMessageContainer.getLdapMessage().getProtocolOp();
+
+                        TLV           tlv    = ldapMessageContainer.getCurrentTLV();
+                        
+                        checkLength( bindRequestMessage, tlv );
+
+                        // Create the SaslAuthentication POJO
+                        SaslAuthenticationPOJO authentication = null;
+
+                        try
+                        {
+                            authentication = ( SaslAuthenticationPOJO )
+                                ldapMessageContainer.getPoolManager().allocate(
+                                    PoolEnum.SASL_AUTH_POJO_POOL );
+
+                            authentication.setFather( bindRequestMessage );
+
+                            bindRequestMessage.setAuthentication( authentication );
+                        }
+                        catch ( PoolException pe )
+                        {
+                            throw new DecoderException(
+                                "Cannot allocate a SaslAuthentication Pojo : " + pe.getMessage() );
+                        }
+
+                        // We have to handle the special case of a 0 length mechanism
+                        if (tlv.getLength().getLength() == 0)
+                        {
+                            authentication.setMechanism( MutableString.EMPTY_STRING );
+                        }
+
+                        return;
+                    }
+                } );
+
+        // AuthenticationChoice ::= CHOICE {
+        //        sasl         [3] saslCredentials }
+        //
+        // SaslCredentials ::= SEQUENCE {
+        //        mechanism     LDAPSTRING,  (Value)
+        //		  ...
+        // We have to store the mechanism.
+        super.transitions[StatesEnum.BIND_REQUEST_AUTHENTICATION_MECHANISM_VALUE][( 0x83 & 0x00FF )] =
+            new GrammarTransition( StatesEnum.BIND_REQUEST_AUTHENTICATION_MECHANISM_VALUE,
+                StatesEnum.BIND_REQUEST_AUTHENTICATION_CREDENTIALS_TAG,
+                new GrammarAction( "Create Bind sasl Authentication POJO" )
+                {
+                    public void action( IAsn1Container container ) throws DecoderException
+                    {
+
+                        LdapMessageContainer   ldapMessageContainer = ( LdapMessageContainer )
+                            container;
+
+                        BindRequestPOJO        bindRequestMessage = ( BindRequestPOJO )
+                            ldapMessageContainer.getLdapMessage().getProtocolOp();
+                        
+                        SaslAuthenticationPOJO saslAuthentication = (SaslAuthenticationPOJO)bindRequestMessage.getAuthentication();
+
+                        MutableString mechanism = LdapString.parse(
+                                ldapMessageContainer.getPoolManager(),
+                                ldapMessageContainer.getCurrentTLV().getValue().getData() );
+                        
+                        saslAuthentication.setMechanism( mechanism );
+                        
+                        return;
+                    }
+                } );
+
+        //--------------------------------------------------------------------------------------------
+        // SaslCredentials ::= SEQUENCE {
+        //        ...
+        //        credentials     OCTET STRING OPTIONAL } (Tag)
+        //--------------------------------------------------------------------------------------------
+        // We may have a credential, or nothing, as it's an optional element.
+        // The tag will have one of those values :
+        //	- 0x04 if it's a credentials
+        //	- 0x80 if it's a control
+        //	- any other value is an error.
+        //
+        // It's a credential if it's 0x04
+        super.transitions[StatesEnum.BIND_REQUEST_AUTHENTICATION_CREDENTIALS_TAG][0x04] =
+            new GrammarTransition( StatesEnum.BIND_REQUEST_AUTHENTICATION_CREDENTIALS_TAG,
+                StatesEnum.BIND_REQUEST_AUTHENTICATION_CREDENTIALS_LENGTH, null );
+
+        // It's a control if it's 0x80
+        super.transitions[StatesEnum.BIND_REQUEST_AUTHENTICATION_CREDENTIALS_TAG][(0x80 & 0x00FF)] =
+            new GrammarTransition( StatesEnum.BIND_REQUEST_AUTHENTICATION_CREDENTIALS_TAG,
+                StatesEnum.GRAMMAR_END, null );
+        
+        // SaslCredentials ::= SEQUENCE {
+        //        ...
+        //        credentials     OCTET STRING OPTIONAL } (Length)
+        // We just have to check the length
+        super.transitions[StatesEnum.BIND_REQUEST_AUTHENTICATION_CREDENTIALS_LENGTH][0x04] =
+            new GrammarTransition( StatesEnum.BIND_REQUEST_AUTHENTICATION_CREDENTIALS_LENGTH,
+                StatesEnum.BIND_REQUEST_AUTHENTICATION_CREDENTIALS_VALUE,
+                new GrammarAction( "Check sasl authentication credentials length" )
+                {
+                    public void action( IAsn1Container container ) throws DecoderException
+                    {
+
+                        LdapMessageContainer ldapMessageContainer = ( LdapMessageContainer )
+                            container;
+                        
+                        BindRequestPOJO        bindRequestMessage = ( BindRequestPOJO )
+                        ldapMessageContainer.getLdapMessage().getProtocolOp();
+
+                        TLV           tlv    = ldapMessageContainer.getCurrentTLV();
+                        
+                        checkLength( bindRequestMessage, tlv );
+
+                        // We have to handle the special case of a 0 length credentials
+                        if (tlv.getLength().getLength() == 0)
+                        {
+                            SaslAuthenticationPOJO saslAuthentication = ( SaslAuthenticationPOJO ) ( bindRequestMessage
+                                .getAuthentication() );
+
+                            saslAuthentication.setCredentials( new byte[]{} );
+                        }
+
+                        return;
+                    }
+                } );
+
+        // SaslCredentials ::= SEQUENCE {
+        //        ...
+        //        credentials     OCTET STRING OPTIONAL } (Value)
+        //
+        // We have to get the Credentials and store it in the SaslAuthenticationPOJO.
+        // Two different following states are possible :
+        // - a Controls tag (0x80)
+        // - or nothing at all (end of the BindRequest).
+        // We just have to transit to the first case, which will accept or not the transition.
+        // This is done by transiting to the GRAMMAR_END state
+        super.transitions[StatesEnum.BIND_REQUEST_AUTHENTICATION_CREDENTIALS_VALUE][0x04] =
+            new GrammarTransition( StatesEnum.BIND_REQUEST_AUTHENTICATION_CREDENTIALS_VALUE,
+                StatesEnum.GRAMMAR_END,
+                new GrammarAction( "Store Bind sasl Authentication credentials value" )
+                {
+                    public void action( IAsn1Container container ) throws DecoderException
+                    {
+
+                        LdapMessageContainer ldapMessageContainer = ( LdapMessageContainer )
+                            container;
+
+                        BindRequestPOJO        bindRequestMessage = ( BindRequestPOJO )
+                        ldapMessageContainer.getLdapMessage().getProtocolOp();
+                        
+                        SaslAuthenticationPOJO saslAuthentication = ( SaslAuthenticationPOJO ) ( bindRequestMessage
+                                .getAuthentication() );
+
+                        // Get the Value and store it in the BindRequest
+                        TLV           tlv         = ldapMessageContainer.getCurrentTLV();
+
+                        saslAuthentication.setCredentials( tlv.getValue().getData() );
+                        return;
+                    }
+                } );
+    }
+}

Added: directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/ldap/codec/grammars/BindResponseGrammar.java
URL: http://svn.apache.org/viewcvs/directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/ldap/codec/grammars/BindResponseGrammar.java?view=auto&rev=161400
==============================================================================
--- directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/ldap/codec/grammars/BindResponseGrammar.java (added)
+++ directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/ldap/codec/grammars/BindResponseGrammar.java Thu Apr 14 22:42:23 2005
@@ -0,0 +1,227 @@
+/*
+ *   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.asn1.ldap.codec.grammars;
+
+import org.apache.asn1.ber.containers.IAsn1Container;
+import org.apache.asn1.ber.grammar.AbstractGrammar;
+import org.apache.asn1.ber.grammar.GrammarAction;
+import org.apache.asn1.ber.grammar.GrammarTransition;
+import org.apache.asn1.ber.grammar.IGrammar;
+import org.apache.asn1.ber.grammar.StatesEnum;
+import org.apache.asn1.ber.tlv.TLV;
+import org.apache.asn1.ldap.codec.DecoderException;
+import org.apache.asn1.ldap.codec.LdapMessageContainer;
+import org.apache.asn1.ldap.pojo.BindResponsePOJO;
+import org.apache.asn1.ldap.pojo.LdapMessagePOJO;
+import org.apache.asn1.util.pools.PoolEnum;
+import org.apache.asn1.util.pools.PoolException;
+
+import org.apache.log4j.Logger;
+
+
+/**
+ * This class implements the LdapMessage. All the actions are declared in this
+ * class. As it is a singleton, these declaration are only done once.
+ * 
+ * If an action is to be added or modified, this is where the work is to be done !
+ * 
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class BindResponseGrammar extends AbstractGrammar implements IGrammar
+{
+    //~ Static fields/initializers -----------------------------------------------------------------
+
+    /** The logger */
+    private static final Logger log = Logger.getLogger( BindResponseGrammar.class );
+
+    /** Logging speed up  */
+    private static final boolean DEBUG = log.isDebugEnabled();
+
+    /** The instance of grammar. LdapMessage is a singleton */
+    private static IGrammar instance = new BindResponseGrammar();
+
+    //~ Constructors -------------------------------------------------------------------------------
+
+    /**
+     * Creates a new LdapMessageGrammar object.
+     */
+    private BindResponseGrammar()
+    {
+        name = BindResponseGrammar.class.getName();
+
+        // We have 17 differents states, so 16 transitions between states.
+        super.transitions = new GrammarTransition[StatesEnum.LAST_LDAP_STATE][256];
+
+        //============================================================================================
+        // BindResponse Message
+        //============================================================================================
+        // BindResponse ::= APPLICATION 1] SEQUENCE {
+        //     COMPONENTS OF LDAPResult,
+        //     ...
+        // Nothing to do
+        super.transitions[StatesEnum.BIND_RESPONSE_TAG][0x61] = new GrammarTransition(
+                StatesEnum.BIND_RESPONSE_TAG, StatesEnum.BIND_RESPONSE_LENGTH, null );
+
+        // We have to allocate a BindRequestPOJO
+        // LdapMessage ::= ... BindResponse ...
+        // BindResponse ::= [APPLICATION 1] SEQUENCE { ... (Length)
+        super.transitions[StatesEnum.BIND_RESPONSE_LENGTH][0x61] = new GrammarTransition(
+                StatesEnum.BIND_RESPONSE_LENGTH, StatesEnum.BIND_RESPONSE_VALUE,
+                new GrammarAction( "Init BindReponse" )
+                {
+                    public void action( IAsn1Container container ) throws DecoderException
+                    {
+
+                        LdapMessageContainer ldapMessageContainer = ( LdapMessageContainer )
+                            container;
+                        LdapMessagePOJO      ldapMessage          =
+                            ldapMessageContainer.getLdapMessage();
+
+                        checkLength( ldapMessageContainer.getLdapMessage(),
+                            ldapMessageContainer.getCurrentTLV() );
+
+                        try
+                        {
+
+                            // Now, we can allocate the BindRequest POJO
+                            BindResponsePOJO bindResponse = ( BindResponsePOJO )
+                                ldapMessageContainer.getPoolManager().allocate(
+                                    PoolEnum.BIND_RESPONSE_POJO_POOL );
+
+                            // As this is a new Constructed object, we have to init its length
+                            TLV tlv            = ldapMessageContainer.getCurrentTLV();
+                            int expectedLength = tlv.getLength().getLength();
+                            bindResponse.setExpectedLength( expectedLength );
+                            bindResponse.setCurrentLength( 0 );
+                            bindResponse.setFather( ldapMessage );
+
+                            // And we associate it to the ldapMessage POJO
+                            ldapMessage.setProtocolOP( bindResponse );
+
+                        }
+                        catch ( PoolException pe )
+                        {
+                            throw new DecoderException(
+                                "Cannot allocate a BindResponse Pojo : " + pe.getMessage() );
+                        }
+                    }
+                } );
+
+        // LdapMessage ::= ... BindResponse ...
+        // BindResponse ::= [APPLICATION 1] SEQUENCE { ... (Value)
+        // The first Tag will be the LDAPResult Tag (0x0A). So we have to switch the grammar.
+        super.transitions[StatesEnum.BIND_RESPONSE_VALUE][0x61] = new GrammarTransition(
+                StatesEnum.BIND_RESPONSE_VALUE, StatesEnum.BIND_RESPONSE_LDAP_RESULT, null );
+
+        // LdapMessage ::= ... BindResponse ...
+        // BindResponse ::= [APPLICATION 1] SEQUENCE { ... (Value)
+        // The first Tag will be the LDAPResult Tag (0x0A). So we have to switch the grammar.
+        super.transitions[StatesEnum.BIND_RESPONSE_LDAP_RESULT][0x0A] = new GrammarTransition(
+                StatesEnum.BIND_RESPONSE_LDAP_RESULT, StatesEnum.LDAP_RESULT_GRAMMAR_SWITCH, null );
+
+        // BindResponse ::= APPLICATION 1] SEQUENCE {
+        //     ...
+        //    serverSaslCreds   [7] OCTET STRING OPTIONAL } (Tag)
+        // It's a server sasl credential if the tag is 0x87
+        // Otherwise, if the tag is 0x80, it's a control
+        super.transitions[StatesEnum.BIND_RESPONSE_SERVER_SASL_CREDS_TAG][0x87] =
+            new GrammarTransition( StatesEnum.BIND_RESPONSE_SERVER_SASL_CREDS_TAG,
+                StatesEnum.BIND_RESPONSE_SERVER_SASL_CREDS_LENGTH, null );
+
+        // It's a control if it's 0x80. We have to quit this grammar.
+        super.transitions[StatesEnum.BIND_RESPONSE_SERVER_SASL_CREDS_TAG][( 0x80 & 0x00FF )] =
+            new GrammarTransition( StatesEnum.BIND_RESPONSE_SERVER_SASL_CREDS_TAG,
+                StatesEnum.GRAMMAR_END, null );
+
+        // BindResponse ::= APPLICATION 1] SEQUENCE {
+        //     ...
+        //    serverSaslCreds   [7] OCTET STRING OPTIONAL } (Length)
+        // We have to check the length
+        super.transitions[StatesEnum.BIND_RESPONSE_SERVER_SASL_CREDS_LENGTH][0x87] =
+            new GrammarTransition( StatesEnum.BIND_RESPONSE_SERVER_SASL_CREDS_LENGTH,
+                StatesEnum.BIND_RESPONSE_SERVER_SASL_CREDS_VALUE,
+                new GrammarAction( "Check server sasl credentials length" )
+                {
+                    public void action( IAsn1Container container ) throws DecoderException
+                    {
+
+                        LdapMessageContainer ldapMessageContainer = ( LdapMessageContainer )
+                            container;
+
+                        BindResponsePOJO     bindResponseMessage = ( BindResponsePOJO )
+                            ldapMessageContainer.getLdapMessage().getProtocolOp();
+
+                        TLV                  tlv = ldapMessageContainer.getCurrentTLV();
+
+                        checkLength( bindResponseMessage, tlv );
+
+                        // We have to handle the special case of a 0 length server sasl credentials
+                        if ( tlv.getLength().getLength() == 0 )
+                        {
+                            bindResponseMessage.setServerSaslCreds( new byte[] {} );
+                        }
+
+                        return;
+                    }
+                } );
+
+        // BindResponse ::= APPLICATION 1] SEQUENCE {
+        //     ...
+        //    serverSaslCreds   [7] OCTET STRING OPTIONAL } (Length)
+        //
+        // We have to get the server sasl Credentials and store it in the BindResponse POJO.
+        // Two different following states are possible :
+        // - a Controls tag (0x80)
+        // - nothing at all (end of the BindResponse).
+        // We just have to transit to the first case, which will accept or not the transition.
+        // This is done by transiting to the GRAMMAR_END state
+        super.transitions[StatesEnum.BIND_RESPONSE_SERVER_SASL_CREDS_VALUE][0x87] =
+            new GrammarTransition( StatesEnum.BIND_RESPONSE_SERVER_SASL_CREDS_VALUE,
+                StatesEnum.GRAMMAR_END,
+                new GrammarAction( "Store server sasl credentials value" )
+                {
+                    public void action( IAsn1Container container ) throws DecoderException
+                    {
+
+                        LdapMessageContainer ldapMessageContainer = ( LdapMessageContainer )
+                            container;
+
+                        BindResponsePOJO     bindResponseMessage = ( BindResponsePOJO )
+                            ldapMessageContainer.getLdapMessage().getProtocolOp();
+
+                        // Get the Value and store it in the BindRequest
+                        TLV tlv = ldapMessageContainer.getCurrentTLV();
+
+                        bindResponseMessage.setServerSaslCreds( tlv.getValue().getData() );
+                        return;
+                    }
+                } );
+
+    }
+
+    //~ Methods ------------------------------------------------------------------------------------
+
+    /**
+     * Get the instance of this grammar
+     *
+     * @return An instance on the LdapMessage Grammar
+     */
+    public static IGrammar getInstance()
+    {
+        return instance;
+    }
+}

Added: directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/ldap/codec/grammars/LdapControlGrammar.java
URL: http://svn.apache.org/viewcvs/directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/ldap/codec/grammars/LdapControlGrammar.java?view=auto&rev=161400
==============================================================================
--- directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/ldap/codec/grammars/LdapControlGrammar.java (added)
+++ directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/ldap/codec/grammars/LdapControlGrammar.java Thu Apr 14 22:42:23 2005
@@ -0,0 +1,69 @@
+/*
+ *   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.asn1.ldap.codec.grammars;
+
+import org.apache.asn1.ber.grammar.AbstractGrammar;
+import org.apache.asn1.ber.grammar.GrammarTransition;
+import org.apache.asn1.ber.grammar.IGrammar;
+import org.apache.asn1.ber.grammar.StatesEnum;
+
+import org.apache.log4j.Logger;
+
+
+/**
+ * This class implements the LdapMessage. All the actions are declared in this
+ * class. As it is a singleton, these declaration are only done once.
+ * 
+ * If an action is to be added or modified, this is where the work is to be done !
+ * 
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class LdapControlGrammar extends AbstractGrammar implements IGrammar
+{
+    //~ Static fields/initializers -----------------------------------------------------------------
+
+    /** The logger */
+    private static final Logger log = Logger.getLogger( LdapControlGrammar.class );
+
+    /** Logging speed up  */
+    private static final boolean DEBUG = log.isDebugEnabled();
+
+    /** The instance of grammar. LdapControlGrammar is a singleton */
+    private static IGrammar instance = new LdapControlGrammar();
+
+    /**
+     * Get the instance of this grammar
+     *
+     * @return An instance on the LdapControl Grammar
+     */
+    public static IGrammar getInstance()
+    {
+        return instance;
+    }
+    
+    //~ Constructors -------------------------------------------------------------------------------
+    /**
+     * Creates a new LdapControlGrammar object.
+     */
+    private LdapControlGrammar()
+    {
+        name = LdapControlGrammar.class.getName();
+
+        super.transitions = new GrammarTransition[StatesEnum.CONTROL_LAST_STATE][256];
+
+    }
+}

Copied: directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/ldap/codec/grammars/LdapMessageGrammar.java (from r160136, directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/ldap/codec/LdapMessageGrammar.java)
URL: http://svn.apache.org/viewcvs/directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/ldap/codec/grammars/LdapMessageGrammar.java?view=diff&rev=161400&p1=directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/ldap/codec/LdapMessageGrammar.java&r1=160136&p2=directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/ldap/codec/grammars/LdapMessageGrammar.java&r2=161400
==============================================================================
--- directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/ldap/codec/LdapMessageGrammar.java (original)
+++ directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/ldap/codec/grammars/LdapMessageGrammar.java Thu Apr 14 22:42:23 2005
@@ -14,7 +14,7 @@
  *   limitations under the License.
  *
  */
-package org.apache.asn1.ldap.codec;
+package org.apache.asn1.ldap.codec.grammars;
 
 import org.apache.asn1.ber.containers.IAsn1Container;
 import org.apache.asn1.ber.grammar.AbstractGrammar;
@@ -24,14 +24,10 @@
 import org.apache.asn1.ber.grammar.StatesEnum;
 import org.apache.asn1.ber.tlv.TLV;
 import org.apache.asn1.ber.tlv.Value;
+import org.apache.asn1.ldap.codec.DecoderException;
+import org.apache.asn1.ldap.codec.LdapMessageContainer;
 import org.apache.asn1.ldap.codec.utils.IntegerDecoder;
-import org.apache.asn1.ldap.pojo.AbstractPOJO;
-import org.apache.asn1.ldap.pojo.BindRequestPOJO;
-import org.apache.asn1.ldap.pojo.BindResponsePOJO;
 import org.apache.asn1.ldap.pojo.LdapMessagePOJO;
-import org.apache.asn1.ldap.pojo.LdapPOJO;
-import org.apache.asn1.ldap.pojo.SimpleAuthenticationPOJO;
-import org.apache.asn1.util.MutableString;
 import org.apache.asn1.util.pools.PoolEnum;
 import org.apache.asn1.util.pools.PoolException;
 
@@ -56,51 +52,37 @@
     /** Logging speed up  */
     private static final boolean DEBUG = log.isDebugEnabled();
 
-    /** The instance of grammar. LdapMessage is a singleton */
+    /** The instance of grammar. LdapMessageGrammar is a singleton */
     private static IGrammar instance = new LdapMessageGrammar();
-    
-    static
-    {
-        getInstance().setName("LdapMessageGrammar");
-    }
 
-    //~ Constructors -------------------------------------------------------------------------------
     /**
-     * DOCUMENT ME!
+     * Get the instance of this grammar
      *
-     * @return DOCUMENT ME!
+     * @return An instance on the LdapMessage Grammar
      */
     public static IGrammar getInstance()
     {
         return instance;
     }
-
-    private void checkLength(LdapPOJO ldapPOJO, TLV tlv) throws DecoderException
-	{
-	    // Create a new expected Length
-	    int expectedLength = tlv.getLength().getLength();
-	    
-	    int tlvLength = tlv.getSize();
-	
-	    // An exception will be thrown if the current length exceed the expected length
-		((AbstractPOJO)ldapPOJO).addLength(expectedLength + tlvLength);
-	}
-
+    
+    //~ Constructors -------------------------------------------------------------------------------
     /**
      * Creates a new LdapMessageGrammar object.
      */
     private LdapMessageGrammar()
     {
 
-        // We have 17 differents states, so 16 transitions between states.
-        super.transitions = new GrammarTransition[StatesEnum.LAST_LDAP_STATE][256];
+        name = LdapMessageGrammar.class.getName();
+
+        // We have 9 differents states, so 8 transitions between states.
+        super.transitions = new GrammarTransition[StatesEnum.LAST_LDAP_MESSAGE_STATE][256];
 
         //============================================================================================
         // LdapMessage 
         //============================================================================================
         // LDAPMessage --> SEQUENCE { ... (Tag)
         // We have a LDAPMessage, and the tag must be 0x30
-        super.transitions[StatesEnum.LDAP_MESSAGE_TAG][0x30] = new GrammarTransition( "LdapMessage Tag",
+        super.transitions[StatesEnum.LDAP_MESSAGE_TAG][0x30] = new GrammarTransition( StatesEnum.LDAP_MESSAGE_TAG,
                 StatesEnum.LDAP_MESSAGE_LENGTH, new GrammarAction( "LdapMessage Tag" )
                 {
                     public void action( IAsn1Container container ) throws DecoderException
@@ -128,7 +110,7 @@
 
         // LDAPMessage --> SEQUENCE { ... (Length)
         // Ok, get the LdapMessage length
-        super.transitions[StatesEnum.LDAP_MESSAGE_LENGTH][0x30] = new GrammarTransition( "LdapMessage Length",
+        super.transitions[StatesEnum.LDAP_MESSAGE_LENGTH][0x30] = new GrammarTransition( StatesEnum.LDAP_MESSAGE_LENGTH,
                 StatesEnum.LDAP_MESSAGE_VALUE, new GrammarAction( "LdapMessage Length" )
                 {
                     public void action( IAsn1Container container ) throws DecoderException
@@ -145,24 +127,25 @@
                 } );
         
         // LDAPMessage --> SEQUENCE { ... (Value)
-        // Nothing to do, it's a constructed TLV
-        super.transitions[StatesEnum.LDAP_MESSAGE_VALUE][0x30] = new GrammarTransition( "LdapMessage Value", StatesEnum.LDAP_MESSAGE_ID_TAG, null);
+        // Nothing to do, it's a constructed TLV. It's just a phantom transition ...
+        super.transitions[StatesEnum.LDAP_MESSAGE_VALUE][0x30] = new GrammarTransition( StatesEnum.LDAP_MESSAGE_VALUE, StatesEnum.LDAP_MESSAGE_ID_TAG, null);
 
-        //============================================================================================
+        //--------------------------------------------------------------------------------------------
         // LdapMessage Message ID 
-        //============================================================================================
+        //--------------------------------------------------------------------------------------------
         // LDAPMessage --> ... MessageId ...(Tag)
         // The tag must be 0x02. Nothing special to do.
-        super.transitions[StatesEnum.LDAP_MESSAGE_ID_TAG][0x02] = new GrammarTransition( "MessageId Tag", StatesEnum.LDAP_MESSAGE_ID_LENGTH, null);
+        super.transitions[StatesEnum.LDAP_MESSAGE_ID_TAG][0x02] = new GrammarTransition( StatesEnum.LDAP_MESSAGE_ID_TAG, StatesEnum.LDAP_MESSAGE_ID_LENGTH, null);
 
         // LDAPMessage --> ... MessageId ...(Length)
         // Checks the length
-        super.transitions[StatesEnum.LDAP_MESSAGE_ID_LENGTH][0x02] = new GrammarTransition( "MessageId Length", StatesEnum.LDAP_MESSAGE_ID_VALUE, 
+        super.transitions[StatesEnum.LDAP_MESSAGE_ID_LENGTH][0x02] = new GrammarTransition( StatesEnum.LDAP_MESSAGE_ID_LENGTH, StatesEnum.LDAP_MESSAGE_ID_VALUE, 
                 new GrammarAction( "Check MessageId Length " )
                 {
                     public void action( IAsn1Container container ) throws DecoderException
                     {
-                    	checkLength(((LdapMessageContainer)container).getLdapMessage(), ((LdapMessageContainer)container).getCurrentTLV());
+                        LdapMessageContainer ldapMessageContainer = ((LdapMessageContainer)container);
+                    	checkLength(ldapMessageContainer.getLdapMessage(), ldapMessageContainer.getCurrentTLV());
 
                         return;
                     }
@@ -170,7 +153,8 @@
         
         // LDAPMessage --> ... MessageId ...(Value)
         // Checks that MessageId is in [0 .. 2147483647] and store the value in the LdapMessage POJO
-        super.transitions[StatesEnum.LDAP_MESSAGE_ID_VALUE][0x02] = new GrammarTransition( "MessageId Value", StatesEnum.PROTOCOL_OP_TAG,
+        // (2147483647 = Integer.MAX_VALUE)
+        super.transitions[StatesEnum.LDAP_MESSAGE_ID_VALUE][0x02] = new GrammarTransition( StatesEnum.LDAP_MESSAGE_ID_VALUE, StatesEnum.PROTOCOL_OP_TAG,
                 new GrammarAction( "Store MessageId" )
                 {
                     public void action( IAsn1Container container ) throws DecoderException
@@ -185,9 +169,9 @@
 
                         Value value     = tlv.getValue();
 
-                        int   messageId = IntegerDecoder.parse( value , 0, 2147483647);
+                        int   messageId = IntegerDecoder.parse( value , 0, Integer.MAX_VALUE);
 
-                        if ( ( messageId < 0 ) || ( messageId > 2147483647 ) )
+                        if ( ( messageId < 0 ) || ( messageId > Integer.MAX_VALUE ) )
                         {
                             throw new DecoderException(
                                 "The message ID must be between (0 .. 2 147 483 647)" );
@@ -201,304 +185,25 @@
                     }
                 } );
 
-        //============================================================================================
-        // LdapResult 
-        //============================================================================================
-        // LDAPResult --> SEQUENCE { 
-        //    resultCode ENUMERATED { ... (Tag)
-        // We have a LDAPResult Enumerated, the tag must be 0x0A
-        // Nothing to do
-        super.transitions[StatesEnum.LDAP_RESULT_CODE_TAG][0x0A] = new GrammarTransition( "LdapResult resultCode Tag",
-                StatesEnum.LDAP_RESULT_CODE_LENGTH, null);
-
-        // LDAPResult --> SEQUENCE { 
-        //    resultCode ENUMERATED { ... (Length)
-        // The length must be 1 (as the result code is between 0 and 90)
-        super.transitions[StatesEnum.LDAP_RESULT_CODE_LENGTH][0x0A] = new GrammarTransition( "LdapResult resultCode Length",
-                StatesEnum.LDAP_RESULT_CODE_VALUE, new GrammarAction( "LdapResult resultCode Length" )
-                {
-                    public void action( IAsn1Container container ) throws DecoderException
-                    {
-                    	// We have to check that the length is 1
-                        TLV tlv = ((LdapMessageContainer)container).getCurrentTLV();
-                        
-                	    if ( tlv.getLength().getLength() != 1 )
-                	    {
-                	        throw new DecoderException("The LdapResult resultCode must be 1 byte length, got " + tlv.getLength().getLength());
-                	    }
-                	    
-                    	checkLength(((LdapMessageContainer)container).getLdapMessage(), tlv);
-
-                    	return;
-                    }
-                } );
-        
-        // LDAPResult --> SEQUENCE { 
-        //    resultCode ENUMERATED { ... (Length)
-        // The value must be in {[0-8], [10-21], [32-35], 36, [48-54], [64-69], 71, 80}
-        super.transitions[StatesEnum.LDAP_RESULT_CODE_VALUE][0x0A] = new GrammarTransition( "LdapMessage Value", StatesEnum.LDAP_RESULT_MATCHED_DN_TAG, null);
-
-        //============================================================================================
-        // protocolOp : Bind Request 
-        //============================================================================================
-        // If the Tag is 0x60, then it's a BindRequest. Nothing to do while the length is not verified.
+        //********************************************************************************************
+        // If the Tag is 0x60, then it's a BindRequest. Nothing to do while the length is not checked.
+        // If the Tag is 0x61, then it's a BindResponse. 
+        //********************************************************************************************
+        
+        //--------------------------------------------------------------------------------------------
+        // BindRequest Message.
+        //--------------------------------------------------------------------------------------------
         // LdapMessage ::= ... BindRequest ...
         // BindRequest ::= [APPLICATION 0] SEQUENCE { ... (Tag)
-        super.transitions[StatesEnum.PROTOCOL_OP_TAG][0x60] = new GrammarTransition( "BindRequest Tag", StatesEnum.PROTOCOL_OP_LENGTH, null );
-
-        // We have to allocate a BindRequestPOJO
-        // LdapMessage ::= ... BindRequest ...
-        // BindRequest ::= [APPLICATION 0] SEQUENCE { ... (Length)
-        super.transitions[StatesEnum.PROTOCOL_OP_LENGTH][0x60] = new GrammarTransition( "BindRequest Length", StatesEnum.PROTOCOL_OP_VALUE, 
-                new GrammarAction( "Init BindRequest" )
-                {
-                    public void action( IAsn1Container container ) throws DecoderException
-                    {
-
-                    	LdapMessageContainer ldapMessageContainer = (LdapMessageContainer)container;
-                    	LdapMessagePOJO ldapMessage = ldapMessageContainer.getLdapMessage();
-
-                    	checkLength(((LdapMessageContainer)container).getLdapMessage(), ((LdapMessageContainer)container).getCurrentTLV());
-                    	
-                    	try 
-						{
-	                    	// Now, we can allocate the BindRequest POJO
-	                    	LdapPOJO bindRequest = (LdapPOJO)ldapMessageContainer.getPoolManager().allocate(PoolEnum.BIND_REQUEST_POJO_POOL);
-	                    	
-	                    	// As this is a new Constructed object, we have to init its length
-	                        TLV   tlv       = ldapMessageContainer.getCurrentTLV();
-	                        int expectedLength = tlv.getLength().getLength();
-	                    	((BindRequestPOJO)bindRequest).setExpectedLength(expectedLength);
-	                    	((BindRequestPOJO)bindRequest).setCurrentLength(0);
-
-							// And we associate it to the ldapMessage POJO
-	                    	ldapMessage.setProtocolOP(bindRequest);
-	                    	
-                    	} catch (PoolException pe) 
-						{
-                    		throw new DecoderException(
-                                    "Cannot allocate a BindRequest Pojo : " + pe.getMessage() );
-                    	}
-                    }
-                });
-
-        // LdapMessage ::= ... BindRequest ...
-        // BindRequest ::= [APPLICATION 0] SEQUENCE { ... (Value)
-        // Nothing to do, the Value is empty, this is a constructed TLV
-        super.transitions[StatesEnum.PROTOCOL_OP_VALUE][0x60] = new GrammarTransition( "BindRequest Value", StatesEnum.BIND_REQUEST_VERSION_TAG, null);
-
-        // BindRequest ::= ... version INTEGER (1 .. 127 ), ... (Tag)
-        // Nothing to do.
-        super.transitions[StatesEnum.BIND_REQUEST_VERSION_TAG][0x02] = new GrammarTransition( "Bind version Tag", StatesEnum.BIND_REQUEST_VERSION_LENGTH, null);
-        
-        // BindRequest ::= ... version INTEGER (1 .. 127 ), ... (Length)
-        // Checks the length
-        super.transitions[StatesEnum.BIND_REQUEST_VERSION_LENGTH][0x02] = new GrammarTransition( "Bind version Length", StatesEnum.BIND_REQUEST_VERSION_VALUE,
-                new GrammarAction( "Store version" )
-                {
-                    public void action( IAsn1Container container ) throws DecoderException
-                    {
-
-                    	checkLength(((LdapMessageContainer)container).getLdapMessage().getProtocolOp(), ((LdapMessageContainer)container).getCurrentTLV());
-                        return;
-                    }
-                } );
-
-        // BindRequest ::= ... version INTEGER (1 .. 127 ), ... (value)
-        // Checks that the Version is in [1, 127]
-        super.transitions[StatesEnum.BIND_REQUEST_VERSION_VALUE][0x02] = new GrammarTransition( "Bind version Length", StatesEnum.BIND_REQUEST_NAME_TAG,
-                new GrammarAction( "Store version" )
-                {
-                    public void action( IAsn1Container container ) throws DecoderException
-                    {
-
-                        LdapMessageContainer ldapMessageContainer = ( LdapMessageContainer )
-                            container;
-                        BindRequestPOJO      bindRequestMessage   =
-                        	(BindRequestPOJO)ldapMessageContainer.getLdapMessage().getProtocolOp();
-
-                        // The current TLV should be a integer between 1 and 127
-                        // We get it and store it in Version
-                        TLV   tlv     = ldapMessageContainer.getCurrentTLV();
-
-                        Value value   = tlv.getValue();
-
-                        int   version = IntegerDecoder.parse( value, 1, 127 );
-
-                        bindRequestMessage.setVersion( version );
-
-                        return;
-                    }
-                } );
-
-        // BindRequest ::= ... name LDAPDN, ... (Tag)
-        // Nothing to do. The tag is supposed to be 0x04
-        super.transitions[StatesEnum.BIND_REQUEST_NAME_TAG][0x04] = new GrammarTransition( "bind name tag", StatesEnum.BIND_REQUEST_NAME_LENGTH, null);
-        
-        // BindRequest ::= ... name LDAPDN, ... (Length)
-        // We just check the length.
-        super.transitions[StatesEnum.BIND_REQUEST_NAME_LENGTH][0x04] = new GrammarTransition( "bind name length", StatesEnum.BIND_REQUEST_NAME_VALUE,
-                new GrammarAction( "Check Bind Name Length" )
-                {
-                    public void action( IAsn1Container container ) throws DecoderException
-                    {
-                    	checkLength(((LdapMessageContainer)container).getLdapMessage().getProtocolOp(), ((LdapMessageContainer)container).getCurrentTLV());
-                        return;
-                    }
-                } );
-
-        // BindRequest ::= ... name LDAPDN, ... (Value)
-        // We just check the length.
-        super.transitions[StatesEnum.BIND_REQUEST_NAME_VALUE][0x04] = new GrammarTransition( "bind name value", StatesEnum.BIND_REQUEST_AUTHENTICATION_CHOICE_TAG,
-                new GrammarAction( "Store Bind Name value" )
-                {
-                    public void action( IAsn1Container container ) throws DecoderException
-                    {
-
-                        LdapMessageContainer ldapMessageContainer = ( LdapMessageContainer )container;
-                        
-	                    // Get the Value and store it in the BindRequest 
-	                    TLV   tlv     = ldapMessageContainer.getCurrentTLV();
-	                    
-	                    MutableString name = null;
-	                    
-	                    try
-	                    {
-		                    name = ( MutableString ) ldapMessageContainer.getPoolManager().allocateString(tlv.getValue().getData().length);
-	                    } 
-	                    catch (PoolException pe)
-	                    {
-	                        throw new DecoderException(
-		                            "Cannot allocate a MutableString for Name : " + pe.getMessage() );
-	                    }
-	                    
-                        name.setData(tlv.getValue().getData());
-                        
-
-                        BindRequestPOJO      bindRequestMessage   = (BindRequestPOJO)ldapMessageContainer.getLdapMessage().getProtocolOp();
-
-                        bindRequestMessage.setName(name);
-                        return;
-                    }
-                } );
-
-        // BindRequest ::= ... authentication AuthenticationChoice }
-        // AuthenticationChoice ::= CHOICE {
-        // The tag might be either 0x80 (SimpleAuthentication) or 0x83 (SaslAuthentication)
-        // Here, it's 0x80, so a SimpleAuthentication. 
-        // Nothing to do.
-        super.transitions[StatesEnum.BIND_REQUEST_AUTHENTICATION_CHOICE_TAG][( 0x80 & 0x00FF )] = new GrammarTransition( "Bind Simple Authentication Tag", StatesEnum.BIND_REQUEST_AUTHENTICATION_SIMPLE_LENGTH, null);
-        
-        // AuthenticationChoice ::= CHOICE {
-        //		simple         [0] OCTET STRING, (Length)
-        super.transitions[StatesEnum.BIND_REQUEST_AUTHENTICATION_SIMPLE_LENGTH][( 0x80 & 0x00FF )] = new GrammarTransition( "Bind Simple Authentication Length", StatesEnum.BIND_REQUEST_AUTHENTICATION_SIMPLE_VALUE, 
-        		new GrammarAction( "Check simple authentication length" ) 
-                {
-                    public void action( IAsn1Container container ) throws DecoderException
-                    {
-                    	checkLength(((LdapMessageContainer)container).getLdapMessage().getProtocolOp(), ((LdapMessageContainer)container).getCurrentTLV());
-                        
-                        return;
-                    }
-                } );
-
-        // AuthenticationChoice ::= CHOICE {
-        //		simple         [0] OCTET STRING, (Value)
-        super.transitions[StatesEnum.BIND_REQUEST_AUTHENTICATION_SIMPLE_VALUE][( 0x80 & 0x00FF )] = new GrammarTransition( "Bind Simple Authentication Value", -1, //StatesEnum.CONTROLS_TAG, 
-                new GrammarAction( "Store Bind Simple Authentication value" )
-                {
-                    public void action( IAsn1Container container ) throws DecoderException
-                    {
-
-                        LdapMessageContainer ldapMessageContainer = ( LdapMessageContainer )container;
-                        
-	                    // Get the Value and store it in the BindRequest 
-	                    TLV   tlv     = ldapMessageContainer.getCurrentTLV();
-	                    
-	                    MutableString simple = null;
-	                    
-	                    try
-	                    {
-		                    simple = ( MutableString ) ldapMessageContainer.getPoolManager().allocateString(tlv.getValue().getData().length);
-	                    } 
-	                    catch (PoolException pe)
-	                    {
-	                        throw new DecoderException(
-		                            "Cannot allocate a MutableString for simple : " + pe.getMessage() );
-	                    }
-	                    
-                        simple.setData(tlv.getValue().getData());
-
-                        BindRequestPOJO      bindRequestMessage   = (BindRequestPOJO)ldapMessageContainer.getLdapMessage().getProtocolOp();
-
-                        try 
-						{
-	                        SimpleAuthenticationPOJO authentication = ( SimpleAuthenticationPOJO )
-								ldapMessageContainer.getPoolManager().allocate(
-										PoolEnum.SIMPLE_AUTH_POJO_POOL );
-	                        
-	                        authentication.setSimple(simple);
-	
-	                        bindRequestMessage.setAuthentication(authentication);
-	                        return;
-						} 
-                        catch (PoolException pe) 
-						{
-                    		throw new DecoderException(
-                                    "Cannot allocate a SimpleAuthentication Pojo : " + pe.getMessage() );
-						}
-                    }
-                } );
+        // Nothing to do while the length is not checked.
+        super.transitions[StatesEnum.PROTOCOL_OP_TAG][0x60] = new GrammarTransition( StatesEnum.PROTOCOL_OP_TAG, StatesEnum.BIND_REQUEST_GRAMMAR_SWITCH, null );
 
-        //============================================================================================
-        // protocolOp : Bind Response 
-        //============================================================================================
-        // If the Tag is 0x61, then it's a BindResponse. Nothing to do while the length is not verified.
+        //--------------------------------------------------------------------------------------------
+        // BindResponse Message.
+        //--------------------------------------------------------------------------------------------
         // LdapMessage ::= ... BindResponse ...
         // BindResponse ::= [APPLICATION 1] SEQUENCE { ... (Tag)
-        super.transitions[StatesEnum.PROTOCOL_OP_TAG][0x61] = new GrammarTransition( "BindResponse Tag", StatesEnum.PROTOCOL_OP_LENGTH, null );
-
-        // We have to allocate a BindResponsePOJO
-        // LdapMessage ::= ... BindResponse ...
-        // BindResponse ::= [APPLICATION 1] SEQUENCE { ... (Length)
-        super.transitions[StatesEnum.PROTOCOL_OP_LENGTH][0x61] = new GrammarTransition( "BindResponse Length", StatesEnum.PROTOCOL_OP_VALUE, 
-                new GrammarAction( "Init BindReponse" )
-                {
-                    public void action( IAsn1Container container ) throws DecoderException
-                    {
-
-                    	LdapMessageContainer ldapMessageContainer = (LdapMessageContainer)container;
-                    	LdapMessagePOJO ldapMessage = ldapMessageContainer.getLdapMessage();
-
-                    	checkLength(((LdapMessageContainer)container).getLdapMessage(), ((LdapMessageContainer)container).getCurrentTLV());
-                    	
-                    	try 
-						{
-	                    	// Now, we can allocate the BindResponse POJO
-	                    	LdapPOJO bindResponse= (LdapPOJO)ldapMessageContainer.getPoolManager().allocate(PoolEnum.BIND_RESPONSE_POJO_POOL);
-	                    	
-	                    	// As this is a new Constructed object, we have to init its length
-	                        TLV   tlv       = ldapMessageContainer.getCurrentTLV();
-	                        int expectedLength = tlv.getLength().getLength();
-	                    	((BindResponsePOJO)bindResponse).setExpectedLength(expectedLength);
-	                    	((BindResponsePOJO)bindResponse).setCurrentLength(0);
-
-							// And we associate it to the ldapMessage POJO
-	                    	ldapMessage.setProtocolOP(bindResponse);
-	                    	
-                    	} catch (PoolException pe) 
-						{
-                    		throw new DecoderException(
-                                    "Cannot allocate a BindResponse Pojo : " + pe.getMessage() );
-                    	}
-                    }
-                });
-
-        // LdapMessage ::= ... BindResponse ...
-        // BindResponse ::= [APPLICATION 1] SEQUENCE { ... (Value)
-        // Ok, we have a LdapResult to parse. As it can be used in many different
-        // rules, we have to decode it using another grammar (LdapResultGrammar).
-        super.transitions[StatesEnum.PROTOCOL_OP_VALUE][0x61] = new GrammarTransition( "BindResponse Value", StatesEnum.LDAP_RESULT_GRAMMAR_SWITCH, null);
-
+        // We have to switch to the BindResponse grammar
+        super.transitions[StatesEnum.PROTOCOL_OP_TAG][0x61] = new GrammarTransition( StatesEnum.PROTOCOL_OP_TAG, StatesEnum.BIND_RESPONSE_GRAMMAR_SWITCH, null);
     }
 }