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/11/25 18:30:22 UTC

svn commit: r348987 - in /directory/sandbox/ersiner/apacheds-with-storedprocs/core/src/main/java/org/apache/ldap/server/storedprocs/codec: StoredProcedureContainer.java StoredProcedureEnum.java StoredProcedureGrammar.java

Author: elecharny
Date: Fri Nov 25 09:30:16 2005
New Revision: 348987

URL: http://svn.apache.org/viewcvs?rev=348987&view=rev
Log:
created the first brew of StoredProcedure codec

Added:
    directory/sandbox/ersiner/apacheds-with-storedprocs/core/src/main/java/org/apache/ldap/server/storedprocs/codec/StoredProcedureContainer.java
    directory/sandbox/ersiner/apacheds-with-storedprocs/core/src/main/java/org/apache/ldap/server/storedprocs/codec/StoredProcedureEnum.java
    directory/sandbox/ersiner/apacheds-with-storedprocs/core/src/main/java/org/apache/ldap/server/storedprocs/codec/StoredProcedureGrammar.java

Added: directory/sandbox/ersiner/apacheds-with-storedprocs/core/src/main/java/org/apache/ldap/server/storedprocs/codec/StoredProcedureContainer.java
URL: http://svn.apache.org/viewcvs/directory/sandbox/ersiner/apacheds-with-storedprocs/core/src/main/java/org/apache/ldap/server/storedprocs/codec/StoredProcedureContainer.java?rev=348987&view=auto
==============================================================================
--- directory/sandbox/ersiner/apacheds-with-storedprocs/core/src/main/java/org/apache/ldap/server/storedprocs/codec/StoredProcedureContainer.java (added)
+++ directory/sandbox/ersiner/apacheds-with-storedprocs/core/src/main/java/org/apache/ldap/server/storedprocs/codec/StoredProcedureContainer.java Fri Nov 25 09:30:16 2005
@@ -0,0 +1,87 @@
+/*
+ *   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.ldap.server.storedprocs.codec;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.asn1new.ber.AbstractContainer;
+import org.apache.asn1new.ber.containers.IAsn1Container;
+import org.apache.asn1new.ber.grammar.IGrammar;
+import org.apache.asn1.codec.util.StringUtils;
+import org.apache.ldap.server.storedprocs.StoredProcedurePojo;
+
+
+/**
+ *  
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class StoredProcedureContainer extends AbstractContainer implements IAsn1Container
+{
+    //~ Instance fields ----------------------------------------------------------------------------
+
+    /** The pojo */
+    private StoredProcedurePojo storedProcedurePojo;
+    
+    //~ Constructors -------------------------------------------------------------------------------
+
+    /**
+     */
+    public StoredProcedureContainer()
+    {
+        super( );
+        currentGrammar = 0;
+        grammars = new IGrammar[1];
+        grammarStack = new IGrammar[1];
+        stateStack = new int[1];
+        nbGrammars = 0;
+
+        grammars[StoredProcedureEnum.STORED_PROCEDURE_GRAMMAR] = StoredProcedureGrammar.getInstance(); 
+
+        grammarStack[currentGrammar] = grammars[StoredProcedureEnum.STORED_PROCEDURE_GRAMMAR];
+        
+        states = StoredProcedureEnum.getInstance();
+    }
+
+    //~ Methods ------------------------------------------------------------------------------------
+    /**
+     * @return Returns the ldapMessage.
+     */
+    public StoredProcedurePojo getStoredProcedurePojo()
+    {
+
+        return storedProcedurePojo;
+    }
+
+    /**
+     * Set a ldapMessage Object into the container. It will be completed
+     * by the ldapDecoder .
+     *
+     * @param ldapMessage The ldapMessage to set.
+     */
+    public void setStoredProcedurePojo( StoredProcedurePojo storedProcedurePojo )
+    {
+        this.storedProcedurePojo = storedProcedurePojo;
+    }
+    
+    public void clean()
+    {
+    	super.clean();
+    	
+    	storedProcedurePojo = null;
+    }
+}

Added: directory/sandbox/ersiner/apacheds-with-storedprocs/core/src/main/java/org/apache/ldap/server/storedprocs/codec/StoredProcedureEnum.java
URL: http://svn.apache.org/viewcvs/directory/sandbox/ersiner/apacheds-with-storedprocs/core/src/main/java/org/apache/ldap/server/storedprocs/codec/StoredProcedureEnum.java?rev=348987&view=auto
==============================================================================
--- directory/sandbox/ersiner/apacheds-with-storedprocs/core/src/main/java/org/apache/ldap/server/storedprocs/codec/StoredProcedureEnum.java (added)
+++ directory/sandbox/ersiner/apacheds-with-storedprocs/core/src/main/java/org/apache/ldap/server/storedprocs/codec/StoredProcedureEnum.java Fri Nov 25 09:30:16 2005
@@ -0,0 +1,208 @@
+/*
+ *   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.ldap.server.storedprocs.codec;
+
+import org.apache.asn1new.ber.grammar.IGrammar;
+import org.apache.asn1new.ber.grammar.IStates;
+
+
+/**
+ * This class store the Ldap grammar's constants.
+ * It is also used for debugging purpose
+ * 
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class StoredProcedureEnum implements IStates
+{
+    //~ Static fields/initializers -----------------------------------------------------------------
+
+    //=========================================================================
+    // StoredProcedure
+    //=========================================================================
+    /** StoredProcedure Tag */
+    public static int STORED_PROCEDURE_TAG = 0;
+
+    /** StoredProcedure Value */
+    public static int STORED_PROCEDURE_VALUE = 1;
+
+    // Language ---------------------------------------------------------------
+    /** Language Tag */
+    public static int LANGUAGE_TAG = 2;
+
+    /** Language Value */
+    public static int LANGUAGE_VALUE = 3;
+
+    // Procedure --------------------------------------------------------------
+    /** Procedure Tag */
+    public static int PROCEDURE_TAG = 4;
+
+    /** Procedure Value */
+    public static int PROCEDURE_VALUE = 5;
+
+    // Parameters -------------------------------------------------------------
+    /** Parameters Tag */
+    public static int PARAMETERS_TAG = 6;
+
+    /** Parameters Value */
+    public static int PARAMETERS_VALUE = 7;
+
+    // Parameter type ---------------------------------------------------------
+    /** Parameter type Tag */
+    public static int PARAMETER_TYPE_TAG = 8;
+
+    /** Parameter type Value */
+    public static int PARAMETER_TYPE_VALUE = 9;
+
+    // Parameters value -------------------------------------------------------
+    /** Parameter value Tag */
+    public static int PARAMETER_VALUE_TAG = 10;
+
+    /** Parameter value Value */
+    public static int PARAMETER_VALUE_VALUE = 11;
+    
+    public static int LAST_STORED_PROCEDURE_STATE = 12;
+    
+    //=========================================================================
+    // Grammars declaration.
+    //=========================================================================
+    /** Ldap Message Grammar */
+    public static final int STORED_PROCEDURE_GRAMMAR_SWITCH = 0x0100;
+
+    /** LdapMessage grammar number */
+    public static final int STORED_PROCEDURE_GRAMMAR = 0;
+    
+    /** The total number of grammars used */
+    public static final int NB_GRAMMARS = 1;
+
+    //=========================================================================
+    // Grammar switches debug strings 
+    //=========================================================================
+    /** A string representation of grammars */
+    private static String[] GrammarSwitchString =
+        new String[]
+        {
+            "STORED_PROCEDURE_GRAMMAR_SWITCH", 
+        };
+
+    //=========================================================================
+    // States debug strings 
+    //=========================================================================
+    /** A string representation of all the states */
+    private static String[] StoredProcedureString =
+        new String[]
+        {
+        	"STORED_PROCEDURE_TAG",
+        	"STORED_PROCEDURE_VALUE",
+        	"LANGUAGE_TAG",
+        	"LANGUAGE_VALUE",
+        	"PROCEDURE_TAG",
+        	"PROCEDURE_VALUE",
+        	"PARAMETERS_TAG",
+        	"PARAMETERS_VALUE",
+        	"PARAMETER_TYPE_TAG",
+        	"PARAMETER_TYPE_VALUE",
+        	"PARAMETER_VALUE_TAG",
+        	"PARAMETER_VALUE_VALUE"
+        };
+
+    /** The instance */
+    private static StoredProcedureEnum instance = new StoredProcedureEnum();
+
+    //~ Constructors -------------------------------------------------------------------------------
+
+    /**
+     * This is a private constructor. This class is a singleton
+     *
+     */
+    private StoredProcedureEnum()
+    {
+    }
+
+    //~ Methods ------------------------------------------------------------------------------------
+
+    /**
+     * Get an instance of this class
+     * @return An instance on this class
+     */
+    public static IStates getInstance()
+    {
+        return instance;
+    }
+    
+    /**
+     * Get the grammar name
+     * @param The grammar code
+     * @return The grammar name
+     */
+    public String getGrammarName(int grammar)
+    {
+        switch (grammar)
+        {
+            case STORED_PROCEDURE_GRAMMAR            : return "STORED_PROCEDURE_GRAMMAR";
+
+        	default                              : return "UNKNOWN";
+        }
+    }
+
+    /**
+     * Get the grammar name
+     * @param The grammar class
+     * @return The grammar name
+     */
+    public String getGrammarName(IGrammar grammar)
+    {
+        if (grammar instanceof StoredProcedureGrammar)
+        {
+            return "STORED_PROCEDURE_GRAMMAR";
+        }
+        else 
+        {
+            return "UNKNOWN GRAMMAR";
+        }
+    }
+
+    /**
+     * Get the string representing the state
+     * 
+     * @param grammar The current grammar being used
+     * @param state The state number
+     * @return The String representing the state
+     */
+    public String getState( int grammar, int state )
+    {
+
+        if ( ( state & GRAMMAR_SWITCH_MASK ) != 0 )
+        {
+            return ( state == END_STATE ) ? "END_STATE"
+                : GrammarSwitchString[( ( state & GRAMMAR_SWITCH_MASK ) >> 8 ) - 1];
+        }
+        else
+        {
+
+            switch ( grammar )
+            {
+
+                case STORED_PROCEDURE_GRAMMAR :
+                    return ( ( state == GRAMMAR_END ) ? "STORED_PROCEDURE_END_STATE" : StoredProcedureString[state] );
+
+                default :
+                    return "UNKNOWN";
+            }
+        }
+    }
+}

Added: directory/sandbox/ersiner/apacheds-with-storedprocs/core/src/main/java/org/apache/ldap/server/storedprocs/codec/StoredProcedureGrammar.java
URL: http://svn.apache.org/viewcvs/directory/sandbox/ersiner/apacheds-with-storedprocs/core/src/main/java/org/apache/ldap/server/storedprocs/codec/StoredProcedureGrammar.java?rev=348987&view=auto
==============================================================================
--- directory/sandbox/ersiner/apacheds-with-storedprocs/core/src/main/java/org/apache/ldap/server/storedprocs/codec/StoredProcedureGrammar.java (added)
+++ directory/sandbox/ersiner/apacheds-with-storedprocs/core/src/main/java/org/apache/ldap/server/storedprocs/codec/StoredProcedureGrammar.java Fri Nov 25 09:30:16 2005
@@ -0,0 +1,370 @@
+/*
+ *   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.ldap.server.storedprocs.codec;
+
+import javax.naming.InvalidNameException;
+
+import org.apache.asn1.codec.DecoderException;
+import org.apache.asn1new.ber.containers.IAsn1Container;
+import org.apache.asn1new.ber.grammar.AbstractGrammar;
+import org.apache.asn1new.ber.grammar.GrammarAction;
+import org.apache.asn1new.ber.grammar.GrammarTransition;
+import org.apache.asn1new.ber.grammar.IGrammar;
+import org.apache.asn1new.ber.tlv.TLV;
+import org.apache.asn1new.ber.tlv.UniversalTag;
+import org.apache.asn1.codec.util.StringUtils;
+import org.apache.ldap.server.storedprocs.StoredProcedurePojo;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * This class implements the SearchResultEntry LDAP message. All the actions are declared in this
+ * class. As it is a singleton, these declaration are only done once.
+ * 
+ * We have to deal with empty elements, as stated by rfc 2251 :
+ * 
+ * -- implementors should note that the PartialAttributeList may
+ * -- have zero elements (if none of the attributes of that entry
+ * -- were requested, or could be returned), and that the vals set
+ * -- may also have zero elements (if types only was requested, or
+ * -- all values were excluded from the result.)
+ * 
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class StoredProcedureGrammar extends AbstractGrammar implements IGrammar
+{
+    //~ Static fields/initializers -----------------------------------------------------------------
+
+    /** The logger */
+    private static final Logger log = LoggerFactory.getLogger( StoredProcedureGrammar.class );
+
+    /** The instance of grammar. SearchResultEntryGrammar is a singleton */
+    private static IGrammar instance = new StoredProcedureGrammar();
+
+    //~ Constructors -------------------------------------------------------------------------------
+
+    /**
+     * Creates a new SearchResultEntryGrammar object.
+     */
+    private StoredProcedureGrammar()
+    {
+        name       = StoredProcedureGrammar.class.getName();
+        statesEnum = StoredProcedureEnum.getInstance();
+
+        // Create the transitions table
+        super.transitions = new GrammarTransition[StoredProcedureEnum.LAST_STORED_PROCEDURE_STATE][256];
+
+        //============================================================================================
+        // StoredProcedure Message
+        //============================================================================================
+        // StoredProcedure ::= SEQUENCE { (Tag)
+        //   ...
+        // Nothing to do.
+        super.transitions[StoredProcedureEnum.STORED_PROCEDURE_TAG][UniversalTag.SEQUENCE_TAG] = new GrammarTransition(
+        		StoredProcedureEnum.STORED_PROCEDURE_TAG, StoredProcedureEnum.STORED_PROCEDURE_VALUE,
+                null );
+
+        // StoredProcedure ::= SEQUENCE { (Value)
+        //   ...
+        // Nothing to do.
+        super.transitions[StoredProcedureEnum.STORED_PROCEDURE_VALUE][UniversalTag.SEQUENCE_TAG] = new GrammarTransition(
+        		StoredProcedureEnum.STORED_PROCEDURE_VALUE,
+        		StoredProcedureEnum.LANGUAGE_TAG, null );
+
+        //    language OCTETSTRING, (Tag)
+        //    ...
+        // Nothing to do
+        super.transitions[StoredProcedureEnum.LANGUAGE_TAG][UniversalTag.OCTET_STRING_TAG] =
+            new GrammarTransition(
+            		StoredProcedureEnum.LANGUAGE_TAG,
+            		StoredProcedureEnum.LANGUAGE_VALUE, null );
+
+        //    language OCTETSTRING, (Tag)
+        //    ...
+        // Store the language.
+        super.transitions[StoredProcedureEnum.LANGUAGE_VALUE][UniversalTag.OCTET_STRING_TAG] =
+            new GrammarTransition(
+            		StoredProcedureEnum.LANGUAGE_VALUE,
+            		StoredProcedureEnum.PROCEDURE_TAG,
+                new GrammarAction( "Create the pojo" )
+                {
+                    public void action( IAsn1Container container ) throws DecoderException
+                    {
+
+                        StoredProcedureContainer storedProcedureContainer = ( StoredProcedureContainer )
+                            container;
+
+                        TLV                  tlv                  =
+                        	storedProcedureContainer.getCurrentTLV();
+
+                        // Store the value.
+                        if ( tlv.getLength().getLength() == 0 )
+                        {
+                        	// This is supposed to be Java
+                            StoredProcedurePojo storedProcedurePojo = new StoredProcedurePojo();
+                        }
+                        else
+                        {
+                        	String language = StringUtils.toUtf8( tlv.getValue().getData() );
+                            
+                        	if ( "java".compareToIgnoreCase( language ) == 0 )
+                        	{
+                        		StoredProcedurePojo storedProcedurePojo = new StoredProcedurePojo();
+                        	}
+                        	else
+                        	{
+                                log.error( "The language " + StringUtils.dumpBytes( tlv.getValue().getData() ) + " is invalid" );
+                                throw new DecoderException( "The language " + StringUtils.dumpBytes( tlv.getValue().getData() ) + " is invalid" );
+                        	}
+                        }
+
+                        if ( log.isDebugEnabled() )
+                        {
+                            log.debug( "Language found : java " );
+                        }
+                    }
+                } );
+
+/*
+        // SearchResultEntry ::= [APPLICATION 4] SEQUENCE {
+        //    attributes      PartialAttributeList }
+        // PartialAttributeList ::= *SEQUENCE* OF SEQUENCE { (Tag)
+        //    ...
+        // Nothing to do
+        super.transitions[LdapStatesEnum.SEARCH_RESULT_ENTRY_ATTRIBUTES_TAG][UniversalTag.SEQUENCE_TAG] =
+            new GrammarTransition(
+                LdapStatesEnum.SEARCH_RESULT_ENTRY_ATTRIBUTES_TAG,
+                LdapStatesEnum.SEARCH_RESULT_ENTRY_ATTRIBUTES_VALUE, null );
+
+        // SearchResultEntry ::= [APPLICATION 4] SEQUENCE {
+        //    attributes      PartialAttributeList }
+        // PartialAttributeList ::= *SEQUENCE* OF SEQUENCE { (Tag)
+        //    ...
+        // We may have many attributes. Nothing to do
+        super.transitions[LdapStatesEnum.SEARCH_RESULT_ENTRY_ATTRIBUTES_VALUE][UniversalTag.SEQUENCE_TAG] =
+            new GrammarTransition(
+                LdapStatesEnum.SEARCH_RESULT_ENTRY_ATTRIBUTES_VALUE,
+                LdapStatesEnum.SEARCH_RESULT_ENTRY_PARTIAL_ATTRIBUTE_LIST_TAG, null );
+
+        // PartialAttributeList ::= SEQUENCE OF *SEQUENCE* { (Tag)
+        //    ...
+        // Nothing to do
+        super.transitions[LdapStatesEnum.SEARCH_RESULT_ENTRY_PARTIAL_ATTRIBUTE_LIST_TAG][UniversalTag.SEQUENCE_TAG] =
+            new GrammarTransition(
+                LdapStatesEnum.SEARCH_RESULT_ENTRY_PARTIAL_ATTRIBUTE_LIST_TAG,
+                LdapStatesEnum.SEARCH_RESULT_ENTRY_PARTIAL_ATTRIBUTE_LIST_VALUE, null );
+
+        // SearchResultEntry ::= [APPLICATION 4] SEQUENCE {
+        //    attributes      PartialAttributeList }
+        // PartialAttributeList ::= SEQUENCE OF *SEQUENCE* { (Tag)
+        //    ...
+        // Loop.
+        super.transitions[LdapStatesEnum.SEARCH_RESULT_ENTRY_ATTRIBUTE_VALUE_OR_LIST_TAG][UniversalTag.SEQUENCE_TAG] =
+            new GrammarTransition(
+                LdapStatesEnum.SEARCH_RESULT_ENTRY_ATTRIBUTE_VALUE_OR_LIST_TAG,
+                LdapStatesEnum.SEARCH_RESULT_ENTRY_PARTIAL_ATTRIBUTE_LIST_VALUE, null );
+
+        // PartialAttributeList ::= SEQUENCE OF *SEQUENCE* { (Value)
+        //    ...
+        // We may have many attributes. We also have to store a previously decoded AttributeValue
+        super.transitions[LdapStatesEnum.SEARCH_RESULT_ENTRY_PARTIAL_ATTRIBUTE_LIST_VALUE][UniversalTag.SEQUENCE_TAG] =
+            new GrammarTransition(
+                LdapStatesEnum.SEARCH_RESULT_ENTRY_PARTIAL_ATTRIBUTE_LIST_VALUE,
+                LdapStatesEnum.SEARCH_RESULT_ENTRY_TYPE_TAG,
+                new GrammarAction( "Store attributeValue" )
+                {
+                    public void action( IAsn1Container container ) throws DecoderException
+                    {
+
+                        LdapMessageContainer ldapMessageContainer = ( LdapMessageContainer )
+                            container;
+                        LdapMessage          ldapMessage          =
+                            ldapMessageContainer.getLdapMessage();
+                        SearchResultEntry    searchResultEntry    =
+                            ldapMessage.getSearchResultEntry();
+
+                        searchResultEntry.addPartialAttributeList();
+                    }
+                } );
+
+        // PartialAttributeList ::= SEQUENCE OF SEQUENCE {
+        //    type    AttributeDescription, (Tag)
+        //    ...
+        // Nothing to do.
+        super.transitions[LdapStatesEnum.SEARCH_RESULT_ENTRY_TYPE_TAG][UniversalTag.OCTET_STRING_TAG] =
+            new GrammarTransition(
+                LdapStatesEnum.SEARCH_RESULT_ENTRY_TYPE_TAG,
+                LdapStatesEnum.SEARCH_RESULT_ENTRY_TYPE_VALUE, null );
+
+        // PartialAttributeList ::= SEQUENCE OF SEQUENCE {
+        //    type    AttributeDescription, (Value)
+        //    ...
+        // Store the attribute's name.
+        super.transitions[LdapStatesEnum.SEARCH_RESULT_ENTRY_TYPE_VALUE][UniversalTag.OCTET_STRING_TAG] =
+            new GrammarTransition(
+                LdapStatesEnum.SEARCH_RESULT_ENTRY_TYPE_VALUE,
+                LdapStatesEnum.SEARCH_RESULT_ENTRY_VALS_TAG,
+                new GrammarAction( "Store search result entry object name Value" )
+                {
+                    public void action( IAsn1Container container ) throws DecoderException
+                    {
+
+                        LdapMessageContainer ldapMessageContainer = ( LdapMessageContainer )
+                            container;
+                        LdapMessage          ldapMessage          =
+                            ldapMessageContainer.getLdapMessage();
+                        SearchResultEntry    searchResultEntry    =
+                            ldapMessage.getSearchResultEntry();
+
+                        TLV                  tlv                  =
+                            ldapMessageContainer.getCurrentTLV();
+
+                        LdapString type = LdapString.EMPTY_STRING;
+
+                        // Store the name
+                        if ( tlv.getLength().getLength() == 0 )
+                        {
+                            searchResultEntry.addAttributeValues( type );
+                        }
+                        else
+                        {
+                            try
+                            {
+                                type = new LdapString( tlv.getValue().getData() );
+                                searchResultEntry.addAttributeValues( type );
+                            }
+                            catch ( LdapStringEncodingException lsee )
+                            {
+                                log.error( "Invalid attribute type : " + StringUtils.dumpBytes( tlv.getValue().getData() ) );
+                                throw new DecoderException( "The attribute type is invalid : " + lsee.getMessage() );
+                            }
+                        }
+                        
+                        if ( log.isDebugEnabled() )
+                        {
+                            log.debug( "Attribute type : " + type );
+                        }
+                    }
+                } );
+
+        // PartialAttributeList ::= SEQUENCE OF SEQUENCE {
+        //    ...
+        //    vals    *SET OF* AttributeValue} (Tag)
+        // Nothing to do
+        super.transitions[LdapStatesEnum.SEARCH_RESULT_ENTRY_VALS_TAG][UniversalTag.SET_TAG] =
+            new GrammarTransition(
+                LdapStatesEnum.SEARCH_RESULT_ENTRY_VALS_TAG,
+                LdapStatesEnum.SEARCH_RESULT_ENTRY_VALS_VALUE, null );
+
+        // PartialAttributeList ::= SEQUENCE OF SEQUENCE {
+        //    ...
+        //    vals    *SET OF* AttributeValue} (Value)
+        // We may have many values. Nothing to do
+        super.transitions[LdapStatesEnum.SEARCH_RESULT_ENTRY_VALS_VALUE][UniversalTag.SET_TAG] =
+            new GrammarTransition(
+                LdapStatesEnum.SEARCH_RESULT_ENTRY_VALS_VALUE,
+                LdapStatesEnum.SEARCH_RESULT_ENTRY_ATTRIBUTE_VALUE_TAG, null );
+
+        // PartialAttributeList ::= SEQUENCE OF SEQUENCE {
+        //    ...
+        //    vals    SET OF *AttributeValue*} (Tag)
+        // Nothing to do
+        super.transitions[LdapStatesEnum.SEARCH_RESULT_ENTRY_ATTRIBUTE_VALUE_TAG][UniversalTag.OCTET_STRING_TAG] =
+            new GrammarTransition(
+                LdapStatesEnum.SEARCH_RESULT_ENTRY_ATTRIBUTE_VALUE_TAG,
+                LdapStatesEnum.SEARCH_RESULT_ENTRY_ATTRIBUTE_VALUE_VALUE, null );
+
+        // PartialAttributeList ::= SEQUENCE OF SEQUENCE {
+        //    ...
+        //    vals    SET OF *AttributeValue*} (Tag)
+        // The loop.
+        super.transitions[LdapStatesEnum.SEARCH_RESULT_ENTRY_ATTRIBUTE_VALUE_OR_LIST_TAG][UniversalTag.OCTET_STRING_TAG] =
+            new GrammarTransition(
+                LdapStatesEnum.SEARCH_RESULT_ENTRY_ATTRIBUTE_VALUE_OR_LIST_TAG,
+                LdapStatesEnum.SEARCH_RESULT_ENTRY_ATTRIBUTE_VALUE_VALUE, null );
+
+        // PartialAttributeList ::= SEQUENCE OF SEQUENCE {
+        //    ...
+        //    vals    SET OF *AttributeValue*} (Value)
+        // We may have many values. Store the current one in the current Attribute Value
+        super.transitions[LdapStatesEnum.SEARCH_RESULT_ENTRY_ATTRIBUTE_VALUE_VALUE][UniversalTag.OCTET_STRING_TAG] =
+            new GrammarTransition(
+                LdapStatesEnum.SEARCH_RESULT_ENTRY_ATTRIBUTE_VALUE_VALUE,
+                LdapStatesEnum.SEARCH_RESULT_ENTRY_ATTRIBUTE_VALUE_OR_LIST_TAG,
+                new GrammarAction( "Store Attribute Value value" )
+                {
+                    public void action( IAsn1Container container ) throws DecoderException
+                    {
+
+                        LdapMessageContainer ldapMessageContainer = ( LdapMessageContainer )
+                            container;
+                        LdapMessage          ldapMessage          =
+                            ldapMessageContainer.getLdapMessage();
+                        SearchResultEntry    searchResultEntry    =
+                            ldapMessage.getSearchResultEntry();
+
+                        TLV                  tlv                  =
+                            ldapMessageContainer.getCurrentTLV();
+
+                        // Store the value
+                        Object value = null;
+                        
+                        if ( tlv.getLength().getLength() == 0 )
+                        {
+                            searchResultEntry.addAttributeValue( "" );
+                        }
+                        else
+                        {
+                            if (ldapMessageContainer.isBinary( searchResultEntry.getCurrentAttributeValueType() ) )
+                            {
+                                value = tlv.getValue().getData();
+                                
+                                if ( log.isDebugEnabled() )
+                                {
+                                    log.debug( "Attribute value " + StringUtils.dumpBytes( (byte[])value ) );
+                                }
+                            }
+                            else
+                            {
+                                value = StringUtils.toUtf8( tlv.getValue().getData() );
+
+                                if ( log.isDebugEnabled() )
+                                {
+                                    log.debug( "Attribute value " + value );
+                                }
+                            }
+
+                            searchResultEntry.addAttributeValue( value );
+                        }
+                    }
+                } );
+*/
+    }
+
+    //~ Methods ------------------------------------------------------------------------------------
+
+    /**
+     * Get the instance of this grammar
+     *
+     * @return An instance on the SearchResultEntry Grammar
+     */
+    public static IGrammar getInstance()
+    {
+        return instance;
+    }
+}