You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by pa...@apache.org on 2006/12/08 12:08:17 UTC

svn commit: r483930 [1/3] - in /directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src: main/java/org/apache/directory/ldapstudio/dsmlv2/ test/java/org/apache/directory/ldapstudio/dsmlv2/addRequest/ test/java/org/apache/directory/ldapstudio...

Author: pamarcelot
Date: Fri Dec  8 03:08:09 2006
New Revision: 483930

URL: http://svn.apache.org/viewvc?view=rev&rev=483930
Log:
Updating DSML Parser. Resolving Jira DIRSTUDIO-2 (DSML Parser doesn't parse well base64 Data).

Base64 encoded values can be found in the following tags :
- <initial>, <any>, <final> of a Substrings Filter
- <value> in a ExtensibleMatch Filter
- <value> in a EqualityMatch Filter, GreaterOrEqual Filter, LessOrEqual Filter, ApproxMatch Filter
- <value> in a <assertion> tag in a CompareRequest
- <value> in a <attr> tag in SearchResultEntry and AddRequest
- <value> in a <modification> tag in ModifyRequest

Resolving problem where an exception was thrown if a value in a response was empty (<value></value>)

Added:
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/main/java/org/apache/directory/ldapstudio/dsmlv2/ParserUtils.java
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/addRequest/request_with_1_attr_with_base64_value.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/addResponse/response_with_1_control_empty_value.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/addResponse/response_with_1_empty_referral.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/addResponse/response_with_empty_error_message.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/authResponse/response_with_1_control_empty_value.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/authResponse/response_with_1_empty_referral.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/authResponse/response_with_empty_error_message.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/compareRequest/request_with_1_complete_assertion_base64_value.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/compareResponse/response_with_1_control_empty_value.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/compareResponse/response_with_1_empty_referral.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/compareResponse/response_with_empty_error_message.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/delResponse/response_with_1_control_empty_value.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/delResponse/response_with_1_empty_referral.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/delResponse/response_with_empty_error_message.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/errorResponse/response_with_empty_message.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/extendedRequest/request_with_base64_requestValue.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/extendedResponse/response_with_1_control_empty_value.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/extendedResponse/response_with_1_empty_referral.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/extendedResponse/response_with_base64_response.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/extendedResponse/response_with_empty_error_message.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/extendedResponse/response_with_empty_response.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/extendedResponse/response_with_empty_responseName.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/modDNResponse/response_with_1_control_empty_value.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/modDNResponse/response_with_1_empty_referral.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/modDNResponse/response_with_empty_error_message.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/modifyRequest/request_with_1_modification_base64_value.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/modifyResponse/response_with_1_control_empty_value.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/modifyResponse/response_with_1_empty_referral.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/modifyResponse/response_with_empty_error_message.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/searchRequest/filters/request_with_approxMatch_base64_value.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/searchRequest/filters/request_with_equalityMatch_base64_value.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/searchRequest/filters/request_with_extensibleMatch_base64_value.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/searchRequest/filters/request_with_greaterOrEqual_base64_value.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/searchRequest/filters/request_with_lessOrEqual_base64_value.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/searchRequest/filters/request_with_substrings_1_base64_any.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/searchRequest/filters/request_with_substrings_1_base64_final.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/searchRequest/filters/request_with_substrings_1_base64_initial.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/searchResponse/searchResultDone/response_with_1_control_empty_value.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/searchResponse/searchResultDone/response_with_1_empty_referral.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/searchResponse/searchResultDone/response_with_empty_error_message.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/searchResponse/searchResultEntry/response_with_1_attr_1_base64_value.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/searchResponse/searchResultEntry/response_with_1_attr_1_empty_value.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/searchResponse/searchResultEntry/response_with_1_control_empty_value.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/searchResponse/searchResultReference/response_with_1_control_empty_value.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/searchResponse/searchResultReference/response_with_1_empty_ref.xml
Modified:
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/main/java/org/apache/directory/ldapstudio/dsmlv2/Dsmlv2Grammar.java
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/main/java/org/apache/directory/ldapstudio/dsmlv2/Dsmlv2Parser.java
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/main/java/org/apache/directory/ldapstudio/dsmlv2/Dsmlv2ResponseGrammar.java
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/main/java/org/apache/directory/ldapstudio/dsmlv2/Dsmlv2ResponseParser.java
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/java/org/apache/directory/ldapstudio/dsmlv2/addRequest/AddRequestTest.java
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/java/org/apache/directory/ldapstudio/dsmlv2/addResponse/AddResponseTest.java
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/java/org/apache/directory/ldapstudio/dsmlv2/authResponse/AuthResponseTest.java
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/java/org/apache/directory/ldapstudio/dsmlv2/compareRequest/CompareRequestTest.java
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/java/org/apache/directory/ldapstudio/dsmlv2/compareResponse/CompareResponseTest.java
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/java/org/apache/directory/ldapstudio/dsmlv2/delResponse/DelResponseTest.java
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/java/org/apache/directory/ldapstudio/dsmlv2/errorResponse/ErrorResponseTest.java
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/java/org/apache/directory/ldapstudio/dsmlv2/extendedRequest/ExtendedRequestTest.java
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/java/org/apache/directory/ldapstudio/dsmlv2/extendedResponse/ExtendedResponseTest.java
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/java/org/apache/directory/ldapstudio/dsmlv2/modDNResponse/ModifyDNResponseTest.java
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/java/org/apache/directory/ldapstudio/dsmlv2/modifyRequest/ModifyRequestTest.java
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/java/org/apache/directory/ldapstudio/dsmlv2/modifyResponse/ModifyResponseTest.java
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/java/org/apache/directory/ldapstudio/dsmlv2/searchRequest/SearchRequestTest.java
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/java/org/apache/directory/ldapstudio/dsmlv2/searchResponse/searchResultDone/SearchResultDoneTest.java
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/java/org/apache/directory/ldapstudio/dsmlv2/searchResponse/searchResultEntry/SearchResultEntryTest.java
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/java/org/apache/directory/ldapstudio/dsmlv2/searchResponse/searchResultReference/SearchResultReferenceTest.java
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/extendedRequest/request_with_2_requestValue.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/extendedRequest/request_with_empty_requestName.xml
    directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/resources/org/apache/directory/ldapstudio/dsmlv2/extendedRequest/request_with_requestValue.xml

Modified: directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/main/java/org/apache/directory/ldapstudio/dsmlv2/Dsmlv2Grammar.java
URL: http://svn.apache.org/viewvc/directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/main/java/org/apache/directory/ldapstudio/dsmlv2/Dsmlv2Grammar.java?view=diff&rev=483930&r1=483929&r2=483930
==============================================================================
--- directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/main/java/org/apache/directory/ldapstudio/dsmlv2/Dsmlv2Grammar.java (original)
+++ directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/main/java/org/apache/directory/ldapstudio/dsmlv2/Dsmlv2Grammar.java Fri Dec  8 03:08:09 2006
@@ -67,9 +67,6 @@
  */
 public class Dsmlv2Grammar extends AbstractGrammar implements IGrammar
 {
-    private static final String XML_SCHEMA_URI = "http://www.w3c.org/2001/XMLSchema";
-    private static final String XML_SCHEMA_INSTANCE_URI = "http://www.w3c.org/2001/XMLSchema-instance";
-
     /** The instance of grammar. Dsmlv2Grammar is a singleton */
     private static Dsmlv2Grammar instance = new Dsmlv2Grammar();
 
@@ -1248,10 +1245,21 @@
             XmlPullParser xpp = container.getParser();
             try
             {
+                // We have to catch the type Attribute Value before going to the next Text node
+                String typeValue = ParserUtils.getXsiTypeAttributeValue( xpp );
+                
+                // Getting the value
                 String nextText = xpp.nextText();
                 if ( !nextText.equals( "" ) )
                 {
-                    addRequest.addAttributeValue( nextText.trim() );
+                    if ( ParserUtils.isBase64BinaryValue( xpp, typeValue ) )
+                    {
+                        addRequest.addAttributeValue( Base64.decode( nextText.trim().toCharArray() ) );
+                    }
+                    else
+                    {
+                        addRequest.addAttributeValue( nextText.trim() );
+                    }
                 }
             }
             catch ( IOException e )
@@ -1399,10 +1407,22 @@
             XmlPullParser xpp = container.getParser();
             try
             {
+                // We have to catch the type Attribute Value before going to the next Text node
+                String typeValue = ParserUtils.getXsiTypeAttributeValue( xpp );
+                
+                // Getting the value
                 String nextText = xpp.nextText();
                 if ( !nextText.equals( "" ) )
                 {
-                    compareRequest.setAssertionValue( nextText.trim() );
+                    if ( ParserUtils.isBase64BinaryValue( xpp, typeValue ) )
+                    {
+                        compareRequest.setAssertionValue( Base64.decode( nextText.trim().toCharArray() ) );
+                    }
+                    else
+                    {
+
+                        compareRequest.setAssertionValue( nextText.trim() );
+                    }
                 }
             }
             catch ( IOException e )
@@ -1534,10 +1554,21 @@
             XmlPullParser xpp = container.getParser();
             try
             {
+                // We have to catch the type Attribute Value before going to the next Text node
+                String typeValue = ParserUtils.getXsiTypeAttributeValue( xpp );
+                
+                // Getting the value
                 String nextText = xpp.nextText();
                 if ( !nextText.equals( "" ) )
                 {
-                    extendedRequest.setRequestValue( nextText.trim().getBytes() );
+                    if ( ParserUtils.isBase64BinaryValue( xpp, typeValue ) )
+                    {
+                        extendedRequest.setRequestValue( Base64.decode( nextText.trim().toCharArray() ) );
+                    }
+                    else
+                    {
+                        extendedRequest.setRequestValue( nextText.trim().getBytes() );
+                    }
                 }
             }
             catch ( IOException e )
@@ -1759,8 +1790,21 @@
             XmlPullParser xpp = container.getParser();
             try
             {
+                // We have to catch the type Attribute Value before going to the next Text node
+                String typeValue = ParserUtils.getXsiTypeAttributeValue( xpp );
+                
+                // Getting the value
                 String nextText = xpp.nextText();
-                modifyRequest.addAttributeValue( nextText.trim() );
+                // We are testing if nextText equals "" since a modification can be "".
+                
+                if ( ParserUtils.isBase64BinaryValue( xpp, typeValue ) )
+                {
+                    modifyRequest.addAttributeValue( Base64.decode( nextText.trim().toCharArray() ) );
+                }
+                else
+                {
+                    modifyRequest.addAttributeValue( nextText.trim() );
+                }
             }
             catch ( IOException e )
             {
@@ -2007,10 +2051,21 @@
             XmlPullParser xpp = container.getParser();
             try
             {
+                // We have to catch the type Attribute Value before going to the next Text node
+                String typeValue = ParserUtils.getXsiTypeAttributeValue( xpp );
+                
+                // Getting the value
                 String nextText = xpp.nextText();
                 if ( !nextText.equals( "" ) )
                 {
-                    substringFilter.setInitialSubstrings( nextText.trim() );
+                    if ( ParserUtils.isBase64BinaryValue( xpp, typeValue ) )
+                    {
+                        substringFilter.setInitialSubstrings( new String( Base64.decode( nextText.trim().toCharArray() ) ) );
+                    }
+                    else
+                    {
+                        substringFilter.setInitialSubstrings( nextText.trim() );
+                    }
                 }
             }
             catch ( IOException e )
@@ -2033,10 +2088,21 @@
             XmlPullParser xpp = container.getParser();
             try
             {
+                // We have to catch the type Attribute Value before going to the next Text node
+                String typeValue = ParserUtils.getXsiTypeAttributeValue( xpp );
+                
+                // Getting the value
                 String nextText = xpp.nextText();
                 if ( !nextText.equals( "" ) )
                 {
-                    substringFilter.addAnySubstrings( nextText.trim() );
+                    if ( ParserUtils.isBase64BinaryValue( xpp, typeValue ) )
+                    {
+                        substringFilter.addAnySubstrings( new String( Base64.decode( nextText.trim().toCharArray() ) ) );
+                    }
+                    else
+                    {
+                        substringFilter.addAnySubstrings( nextText.trim() );
+                    }
                 }
             }
             catch ( IOException e )
@@ -2059,10 +2125,21 @@
             XmlPullParser xpp = container.getParser();
             try
             {
+                // We have to catch the type Attribute Value before going to the next Text node
+                String typeValue = ParserUtils.getXsiTypeAttributeValue( xpp );
+                
+                // Getting the value
                 String nextText = xpp.nextText();
                 if ( !nextText.equals( "" ) )
                 {
-                    substringFilter.setFinalSubstrings( nextText.trim() );
+                    if ( ParserUtils.isBase64BinaryValue( xpp, typeValue ) )
+                    {
+                        substringFilter.setFinalSubstrings( new String( Base64.decode( nextText.trim().toCharArray() ) ) );
+                    }
+                    else
+                    {
+                        substringFilter.setFinalSubstrings( nextText.trim() );
+                    }
                 }
             }
             catch ( IOException e )
@@ -2390,10 +2467,21 @@
             XmlPullParser xpp = container.getParser();
             try
             {
+                // We have to catch the type Attribute Value before going to the next Text node
+                String typeValue = ParserUtils.getXsiTypeAttributeValue( xpp );
+                
+                // Getting the value
                 String nextText = xpp.nextText();
                 if ( !nextText.equals( "" ) )
                 {
-                    assertion.setAssertionValue( nextText.trim() );
+                    if ( ParserUtils.isBase64BinaryValue( xpp, typeValue ) )
+                    {
+                        assertion.setAssertionValue( Base64.decode( nextText.trim().toCharArray() ) );
+                    }
+                    else
+                    {
+                        assertion.setAssertionValue( nextText.trim() );
+                    }
                 }
             }
             catch ( IOException e )
@@ -2514,10 +2602,21 @@
             XmlPullParser xpp = container.getParser();
             try
             {
+                // We have to catch the type Attribute Value before going to the next Text node
+                String typeValue = ParserUtils.getXsiTypeAttributeValue( xpp );
+                
+                // Getting the value
                 String nextText = xpp.nextText();
                 if ( !nextText.equals( "" ) )
                 {
-                    filter.setMatchValue( nextText.trim() );
+                    if ( ParserUtils.isBase64BinaryValue( xpp, typeValue ) )
+                    {
+                        filter.setMatchValue( Base64.decode( nextText.trim().toCharArray() ) );
+                    }
+                    else
+                    {
+                        filter.setMatchValue( nextText.trim() );
+                    }
                 }
             }
             catch ( IOException e )
@@ -2545,9 +2644,11 @@
             attributeValue = xpp.getAttributeValue( "", "type" );
             if ( attributeValue != null )
             {
-                // TODO Add a verification for a match with NumericOid format (see
-                // DSMLv2 specifications)
-                control.setControlType( attributeValue ); // TODO LDAPString uses UTF8 bytes, so the charset must be verified before doing this.  
+                if ( !OID.isOID( attributeValue ) )
+                {
+                    throw new XmlPullParserException( "Incorrect value for 'type' attribute. This is not an OID.", xpp, null );
+                }
+                control.setControlType( attributeValue );
             }
             else
             {
@@ -2585,13 +2686,14 @@
             XmlPullParser xpp = container.getParser();
             try
             {
-                String typeValue = getXsiTypeAttributeValue( xpp );
+                // We have to catch the type Attribute Value before going to the next Text node
+                String typeValue = ParserUtils.getXsiTypeAttributeValue( xpp );
                 
                 // Getting the value
                 String nextText = xpp.nextText();
                 if ( !nextText.equals( "" ) )
                 {
-                    if ( isBase64BinaryValue( xpp, typeValue ) )
+                    if ( ParserUtils.isBase64BinaryValue( xpp, typeValue ) )
                     {
                         control.setControlValue( Base64.decode( nextText.trim().toCharArray() ) );
                     }
@@ -2617,48 +2719,5 @@
     public static Dsmlv2Grammar getInstance()
     {
         return instance;
-    }
-    
-    /**
-     * Returns the value of the attribute 'type' of the "XMLSchema-instance' namespace if it exists
-     *
-     * @param xpp the XPP parser to use
-     * @return the value of the attribute 'type' of the "XMLSchema-instance' namespace if it exists
-     */
-    private String getXsiTypeAttributeValue( XmlPullParser xpp )
-    {
-        String type = null;
-        int nbAttributes = xpp.getAttributeCount();
-        for ( int i = 0; i < nbAttributes; i++ )
-        {
-            // Checking if the attribute 'type' from XML Schema Instance namespace is used.
-            if ( xpp.getAttributeName( i ).equals( "type" ) && xpp.getNamespace( xpp.getAttributePrefix( i ) ).equals( XML_SCHEMA_INSTANCE_URI ))
-            {
-                type = xpp.getAttributeValue( i );
-                break;
-            }
-        }
-        return type;
-    }
-    
-    /**
-     * Returns true if the value of the current tag is Base64Binary encoded
-     *
-     * @param parser the XPP parser to use
-     * @param attrValue the attribute value
-     * @return true if the value of the current tag is Base64BinaryEncoded, false if not
-     */
-    private boolean isBase64BinaryValue( XmlPullParser parser, String attrValue )
-    {
-        if ( attrValue == null )
-        {
-            return false;
-        }
-        // We are looking for something that should look like that: "aNameSpace:base64Binary"
-        // We split the String. The first element should be the namespace prefix and the second "base64Binary"
-        String [] splitedString = attrValue.split( ":" );
-        return ( splitedString.length == 2 ) 
-                && ( XML_SCHEMA_URI.equals( parser.getNamespace( splitedString[0] ) ) ) 
-                && ( "base64Binary".equals( splitedString[1] ) );
     }
 }

Modified: directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/main/java/org/apache/directory/ldapstudio/dsmlv2/Dsmlv2Parser.java
URL: http://svn.apache.org/viewvc/directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/main/java/org/apache/directory/ldapstudio/dsmlv2/Dsmlv2Parser.java?view=diff&rev=483930&r1=483929&r2=483930
==============================================================================
--- directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/main/java/org/apache/directory/ldapstudio/dsmlv2/Dsmlv2Parser.java (original)
+++ directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/main/java/org/apache/directory/ldapstudio/dsmlv2/Dsmlv2Parser.java Fri Dec  8 03:08:09 2006
@@ -131,7 +131,6 @@
 
             if ( transition.hasAction() )
             {
-                //                    System.out.println( transition.getAction().toString() );// TODO Suppress
                 transition.getAction().action( container );
             }
         }

Modified: directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/main/java/org/apache/directory/ldapstudio/dsmlv2/Dsmlv2ResponseGrammar.java
URL: http://svn.apache.org/viewvc/directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/main/java/org/apache/directory/ldapstudio/dsmlv2/Dsmlv2ResponseGrammar.java?view=diff&rev=483930&r1=483929&r2=483930
==============================================================================
--- directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/main/java/org/apache/directory/ldapstudio/dsmlv2/Dsmlv2ResponseGrammar.java (original)
+++ directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/main/java/org/apache/directory/ldapstudio/dsmlv2/Dsmlv2ResponseGrammar.java Fri Dec  8 03:08:09 2006
@@ -51,6 +51,7 @@
 import org.apache.directory.shared.ldap.codec.util.LdapURL;
 import org.apache.directory.shared.ldap.codec.util.LdapURLEncodingException;
 import org.apache.directory.shared.ldap.name.LdapDN;
+import org.apache.directory.shared.ldap.util.Base64;
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 
@@ -188,23 +189,18 @@
         //  Transitions concerning : ERROR RESPONSE
         //====================================================
         super.transitions[Dsmlv2StatesEnum.ERROR_RESPONSE] = new HashMap<Tag, GrammarTransition>();
-        super.transitions[Dsmlv2StatesEnum.MESSAGE_START] = new HashMap<Tag, GrammarTransition>();
         super.transitions[Dsmlv2StatesEnum.MESSAGE_END] = new HashMap<Tag, GrammarTransition>();
         super.transitions[Dsmlv2StatesEnum.DETAIL_START] = new HashMap<Tag, GrammarTransition>();
         super.transitions[Dsmlv2StatesEnum.DETAIL_END] = new HashMap<Tag, GrammarTransition>();
 
         // State: [ERROR_RESPONSE] - Tag: <message>
         super.transitions[Dsmlv2StatesEnum.ERROR_RESPONSE].put( new Tag( "message", Tag.START ), new GrammarTransition(
-            Dsmlv2StatesEnum.ERROR_RESPONSE, Dsmlv2StatesEnum.MESSAGE_START, errorResponseAddMessage ) );
+            Dsmlv2StatesEnum.ERROR_RESPONSE, Dsmlv2StatesEnum.MESSAGE_END, errorResponseAddMessage ) );
 
         // State: [ERROR_RESPONSE] - Tag: <detail>
         super.transitions[Dsmlv2StatesEnum.ERROR_RESPONSE].put( new Tag( "detail", Tag.START ), new GrammarTransition(
             Dsmlv2StatesEnum.ERROR_RESPONSE, Dsmlv2StatesEnum.DETAIL_START, errorResponseAddDetail ) );
 
-        // State: [MESSAGE_START] - Tag: </message>
-        super.transitions[Dsmlv2StatesEnum.MESSAGE_START].put( new Tag( "message", Tag.END ), new GrammarTransition(
-            Dsmlv2StatesEnum.MESSAGE_START, Dsmlv2StatesEnum.MESSAGE_END, null ) );
-
         // State: [MESSAGE_END] - Tag: </errorResponse>
         super.transitions[Dsmlv2StatesEnum.MESSAGE_END].put( new Tag( "errorResponse", Tag.END ),
             new GrammarTransition( Dsmlv2StatesEnum.MESSAGE_END, Dsmlv2StatesEnum.BATCH_RESPONSE_LOOP, null ) );
@@ -231,17 +227,12 @@
         super.transitions[Dsmlv2StatesEnum.EXTENDED_RESPONSE] = new HashMap<Tag, GrammarTransition>();
         super.transitions[Dsmlv2StatesEnum.EXTENDED_RESPONSE_CONTROL_START] = new HashMap<Tag, GrammarTransition>();
         super.transitions[Dsmlv2StatesEnum.EXTENDED_RESPONSE_CONTROL_END] = new HashMap<Tag, GrammarTransition>();
-        super.transitions[Dsmlv2StatesEnum.EXTENDED_RESPONSE_CONTROL_VALUE_START] = new HashMap<Tag, GrammarTransition>();
         super.transitions[Dsmlv2StatesEnum.EXTENDED_RESPONSE_CONTROL_VALUE_END] = new HashMap<Tag, GrammarTransition>();
         super.transitions[Dsmlv2StatesEnum.EXTENDED_RESPONSE_RESULT_CODE_START] = new HashMap<Tag, GrammarTransition>();
         super.transitions[Dsmlv2StatesEnum.EXTENDED_RESPONSE_RESULT_CODE_END] = new HashMap<Tag, GrammarTransition>();
-        super.transitions[Dsmlv2StatesEnum.EXTENDED_RESPONSE_ERROR_MESSAGE_START] = new HashMap<Tag, GrammarTransition>();
         super.transitions[Dsmlv2StatesEnum.EXTENDED_RESPONSE_ERROR_MESSAGE_END] = new HashMap<Tag, GrammarTransition>();
-        super.transitions[Dsmlv2StatesEnum.EXTENDED_RESPONSE_REFERRAL_START] = new HashMap<Tag, GrammarTransition>();
         super.transitions[Dsmlv2StatesEnum.EXTENDED_RESPONSE_REFERRAL_END] = new HashMap<Tag, GrammarTransition>();
-        super.transitions[Dsmlv2StatesEnum.RESPONSE_NAME_START] = new HashMap<Tag, GrammarTransition>();
         super.transitions[Dsmlv2StatesEnum.RESPONSE_NAME_END] = new HashMap<Tag, GrammarTransition>();
-        super.transitions[Dsmlv2StatesEnum.RESPONSE_START] = new HashMap<Tag, GrammarTransition>();
         super.transitions[Dsmlv2StatesEnum.RESPONSE_END] = new HashMap<Tag, GrammarTransition>();
 
         // State: [EXTENDED_RESPONSE] - Tag: <control>
@@ -252,13 +243,7 @@
         // State: [EXTENDED_RESPONSE_CONTROL_START] - Tag: <controlValue>
         super.transitions[Dsmlv2StatesEnum.EXTENDED_RESPONSE_CONTROL_START].put( new Tag( "controlValue", Tag.START ),
             new GrammarTransition( Dsmlv2StatesEnum.EXTENDED_RESPONSE_CONTROL_START,
-                Dsmlv2StatesEnum.EXTENDED_RESPONSE_CONTROL_VALUE_START, ldapResultControlValueCreation ) );
-
-        // State: [EXTENDED_RESPONSE_CONTROL_VALUE_START] - Tag: </controlValue>
-        super.transitions[Dsmlv2StatesEnum.EXTENDED_RESPONSE_CONTROL_VALUE_START].put(
-            new Tag( "controlValue", Tag.END ), new GrammarTransition(
-                Dsmlv2StatesEnum.EXTENDED_RESPONSE_CONTROL_VALUE_START,
-                Dsmlv2StatesEnum.EXTENDED_RESPONSE_CONTROL_VALUE_END, null ) );
+                Dsmlv2StatesEnum.EXTENDED_RESPONSE_CONTROL_VALUE_END, ldapResultControlValueCreation ) );
 
         // State: [EXTENDED_RESPONSE_CONTROL_VALUE_END] - Tag: </control>
         super.transitions[Dsmlv2StatesEnum.EXTENDED_RESPONSE_CONTROL_VALUE_END].put( new Tag( "control", Tag.END ),
@@ -294,22 +279,22 @@
         super.transitions[Dsmlv2StatesEnum.EXTENDED_RESPONSE_RESULT_CODE_END].put(
             new Tag( "errorMessage", Tag.START ), new GrammarTransition(
                 Dsmlv2StatesEnum.EXTENDED_RESPONSE_RESULT_CODE_END,
-                Dsmlv2StatesEnum.EXTENDED_RESPONSE_ERROR_MESSAGE_START, extendedResponseAddErrorMessage ) );
+                Dsmlv2StatesEnum.EXTENDED_RESPONSE_ERROR_MESSAGE_END, extendedResponseAddErrorMessage ) );
 
         // State: [EXTENDED_RESPONSE_RESULT_CODE_END] - Tag: <referral>
         super.transitions[Dsmlv2StatesEnum.EXTENDED_RESPONSE_RESULT_CODE_END].put( new Tag( "referral", Tag.START ),
             new GrammarTransition( Dsmlv2StatesEnum.EXTENDED_RESPONSE_RESULT_CODE_END,
-                Dsmlv2StatesEnum.EXTENDED_RESPONSE_REFERRAL_START, extendedResponseAddReferral ) );
+                Dsmlv2StatesEnum.EXTENDED_RESPONSE_REFERRAL_END, extendedResponseAddReferral ) );
 
         // State: [EXTENDED_RESPONSE_RESULT_CODE_END] - Tag: <responseName>
         super.transitions[Dsmlv2StatesEnum.EXTENDED_RESPONSE_RESULT_CODE_END].put(
             new Tag( "responseName", Tag.START ), new GrammarTransition(
-                Dsmlv2StatesEnum.EXTENDED_RESPONSE_RESULT_CODE_END, Dsmlv2StatesEnum.RESPONSE_NAME_START,
+                Dsmlv2StatesEnum.EXTENDED_RESPONSE_RESULT_CODE_END, Dsmlv2StatesEnum.RESPONSE_NAME_END,
                 extendedResponseAddResponseName ) );
 
         // State: [EXTENDED_RESPONSE_RESULT_CODE_END] - Tag: <response>
         super.transitions[Dsmlv2StatesEnum.EXTENDED_RESPONSE_RESULT_CODE_END].put( new Tag( "response", Tag.START ),
-            new GrammarTransition( Dsmlv2StatesEnum.EXTENDED_RESPONSE_RESULT_CODE_END, Dsmlv2StatesEnum.RESPONSE_START,
+            new GrammarTransition( Dsmlv2StatesEnum.EXTENDED_RESPONSE_RESULT_CODE_END, Dsmlv2StatesEnum.RESPONSE_END,
                 extendedResponseAddResponse ) );
 
         // State: [EXTENDED_RESPONSE_RESULT_CODE_END] - Tag: </extendedResponse>
@@ -317,56 +302,40 @@
             new Tag( "extendedResponse", Tag.END ), new GrammarTransition(
                 Dsmlv2StatesEnum.EXTENDED_RESPONSE_RESULT_CODE_END, Dsmlv2StatesEnum.BATCH_RESPONSE_LOOP, null ) );
 
-        // State: [EXTENDED_RESPONSE_ERROR_MESSAGE_START] - Tag: </errorMessage>
-        super.transitions[Dsmlv2StatesEnum.EXTENDED_RESPONSE_ERROR_MESSAGE_START].put(
-            new Tag( "errorMessage", Tag.END ), new GrammarTransition(
-                Dsmlv2StatesEnum.EXTENDED_RESPONSE_ERROR_MESSAGE_START,
-                Dsmlv2StatesEnum.EXTENDED_RESPONSE_ERROR_MESSAGE_END, null ) );
-
         // State: [EXTENDED_RESPONSE_ERROR_MESSAGE_END] - Tag: <referral>
         super.transitions[Dsmlv2StatesEnum.EXTENDED_RESPONSE_ERROR_MESSAGE_END].put( new Tag( "referral", Tag.START ),
             new GrammarTransition( Dsmlv2StatesEnum.EXTENDED_RESPONSE_ERROR_MESSAGE_END,
-                Dsmlv2StatesEnum.EXTENDED_RESPONSE_REFERRAL_START, extendedResponseAddReferral ) );
+                Dsmlv2StatesEnum.EXTENDED_RESPONSE_REFERRAL_END, extendedResponseAddReferral ) );
 
         // State: [EXTENDED_RESPONSE_ERROR_MESSAGE_END] - Tag: <responseName>
         super.transitions[Dsmlv2StatesEnum.EXTENDED_RESPONSE_ERROR_MESSAGE_END].put(
             new Tag( "responseName", Tag.START ), new GrammarTransition(
-                Dsmlv2StatesEnum.EXTENDED_RESPONSE_ERROR_MESSAGE_END, Dsmlv2StatesEnum.RESPONSE_NAME_START,
+                Dsmlv2StatesEnum.EXTENDED_RESPONSE_ERROR_MESSAGE_END, Dsmlv2StatesEnum.RESPONSE_NAME_END,
                 extendedResponseAddResponseName ) );
 
         // State: [EXTENDED_RESPONSE_ERROR_MESSAGE_END] - Tag: <response>
         super.transitions[Dsmlv2StatesEnum.EXTENDED_RESPONSE_ERROR_MESSAGE_END].put( new Tag( "response", Tag.START ),
             new GrammarTransition( Dsmlv2StatesEnum.EXTENDED_RESPONSE_ERROR_MESSAGE_END,
-                Dsmlv2StatesEnum.RESPONSE_START, extendedResponseAddResponse ) );
+                Dsmlv2StatesEnum.RESPONSE_END, extendedResponseAddResponse ) );
 
         // State: [EXTENDED_RESPONSE_ERROR_MESSAGE_END] - Tag: </extendedResponse>
         super.transitions[Dsmlv2StatesEnum.EXTENDED_RESPONSE_ERROR_MESSAGE_END].put( new Tag( "extendedResponse",
             Tag.END ), new GrammarTransition( Dsmlv2StatesEnum.EXTENDED_RESPONSE_ERROR_MESSAGE_END,
             Dsmlv2StatesEnum.BATCH_RESPONSE_LOOP, null ) );
 
-        // State: [EXTENDED_RESPONSE_REFERRAL_START] - Tag: <referral>
-        super.transitions[Dsmlv2StatesEnum.EXTENDED_RESPONSE_REFERRAL_START].put( new Tag( "referral", Tag.END ),
-            new GrammarTransition( Dsmlv2StatesEnum.EXTENDED_RESPONSE_REFERRAL_START,
-                Dsmlv2StatesEnum.EXTENDED_RESPONSE_REFERRAL_END, null ) );
-
-        // State: [EXTENDED_RESPONSE_REFERRAL_START] - Tag: <referral>
-        super.transitions[Dsmlv2StatesEnum.EXTENDED_RESPONSE_REFERRAL_START].put( new Tag( "referral", Tag.END ),
-            new GrammarTransition( Dsmlv2StatesEnum.EXTENDED_RESPONSE_REFERRAL_START,
-                Dsmlv2StatesEnum.EXTENDED_RESPONSE_REFERRAL_END, null ) );
-
         // State: [EXTENDED_RESPONSE_REFERRAL_END] - Tag: <referral>
         super.transitions[Dsmlv2StatesEnum.EXTENDED_RESPONSE_REFERRAL_END].put( new Tag( "referral", Tag.START ),
             new GrammarTransition( Dsmlv2StatesEnum.EXTENDED_RESPONSE_REFERRAL_END,
-                Dsmlv2StatesEnum.EXTENDED_RESPONSE_REFERRAL_START, extendedResponseAddReferral ) );
+                Dsmlv2StatesEnum.EXTENDED_RESPONSE_REFERRAL_END, extendedResponseAddReferral ) );
 
         // State: [EXTENDED_RESPONSE_REFERRAL_END] - Tag: <responseName>
         super.transitions[Dsmlv2StatesEnum.EXTENDED_RESPONSE_REFERRAL_END].put( new Tag( "responseName", Tag.START ),
             new GrammarTransition( Dsmlv2StatesEnum.EXTENDED_RESPONSE_REFERRAL_END,
-                Dsmlv2StatesEnum.RESPONSE_NAME_START, extendedResponseAddResponseName ) );
+                Dsmlv2StatesEnum.RESPONSE_NAME_END, extendedResponseAddResponseName ) );
 
         // State: [EXTENDED_RESPONSE_REFERRAL_END] - Tag: <reponse>
         super.transitions[Dsmlv2StatesEnum.EXTENDED_RESPONSE_REFERRAL_END].put( new Tag( "reponse", Tag.START ),
-            new GrammarTransition( Dsmlv2StatesEnum.EXTENDED_RESPONSE_REFERRAL_END, Dsmlv2StatesEnum.RESPONSE_START,
+            new GrammarTransition( Dsmlv2StatesEnum.EXTENDED_RESPONSE_REFERRAL_END, Dsmlv2StatesEnum.RESPONSE_END,
                 extendedResponseAddResponse ) );
 
         // State: [EXTENDED_RESPONSE_REFERRAL_END] - Tag: </extendedResponse>
@@ -374,23 +343,15 @@
             new GrammarTransition( Dsmlv2StatesEnum.EXTENDED_RESPONSE_REFERRAL_END,
                 Dsmlv2StatesEnum.BATCH_RESPONSE_LOOP, null ) );
 
-        // State: [RESPONSE_NAME_START] - Tag: </responseName>
-        super.transitions[Dsmlv2StatesEnum.RESPONSE_NAME_START].put( new Tag( "responseName", Tag.END ),
-            new GrammarTransition( Dsmlv2StatesEnum.RESPONSE_NAME_START, Dsmlv2StatesEnum.RESPONSE_NAME_END, null ) );
-
         // State: [RESPONSE_NAME_END] - Tag: <response>
         super.transitions[Dsmlv2StatesEnum.RESPONSE_NAME_END].put( new Tag( "response", Tag.START ),
-            new GrammarTransition( Dsmlv2StatesEnum.RESPONSE_NAME_END, Dsmlv2StatesEnum.RESPONSE_START,
+            new GrammarTransition( Dsmlv2StatesEnum.RESPONSE_NAME_END, Dsmlv2StatesEnum.RESPONSE_END,
                 extendedResponseAddResponse ) );
 
         // State: [RESPONSE_NAME_END] - Tag: </extendedResponse>
         super.transitions[Dsmlv2StatesEnum.RESPONSE_NAME_END].put( new Tag( "extendedResponse", Tag.END ),
             new GrammarTransition( Dsmlv2StatesEnum.RESPONSE_NAME_END, Dsmlv2StatesEnum.BATCH_RESPONSE_LOOP, null ) );
 
-        // State: [RESPONSE_START] - Tag: </response>
-        super.transitions[Dsmlv2StatesEnum.RESPONSE_START].put( new Tag( "response", Tag.END ), new GrammarTransition(
-            Dsmlv2StatesEnum.RESPONSE_START, Dsmlv2StatesEnum.RESPONSE_END, null ) );
-
         // State: [RESPONSE_END] - Tag: </extendedResponse>
         super.transitions[Dsmlv2StatesEnum.RESPONSE_END].put( new Tag( "extendedResponse", Tag.END ),
             new GrammarTransition( Dsmlv2StatesEnum.RESPONSE_END, Dsmlv2StatesEnum.BATCH_RESPONSE_LOOP, null ) );
@@ -401,13 +362,10 @@
         super.transitions[Dsmlv2StatesEnum.LDAP_RESULT] = new HashMap<Tag, GrammarTransition>();
         super.transitions[Dsmlv2StatesEnum.LDAP_RESULT_CONTROL_START] = new HashMap<Tag, GrammarTransition>();
         super.transitions[Dsmlv2StatesEnum.LDAP_RESULT_CONTROL_END] = new HashMap<Tag, GrammarTransition>();
-        super.transitions[Dsmlv2StatesEnum.LDAP_RESULT_CONTROL_VALUE_START] = new HashMap<Tag, GrammarTransition>();
         super.transitions[Dsmlv2StatesEnum.LDAP_RESULT_CONTROL_VALUE_END] = new HashMap<Tag, GrammarTransition>();
         super.transitions[Dsmlv2StatesEnum.LDAP_RESULT_RESULT_CODE_START] = new HashMap<Tag, GrammarTransition>();
         super.transitions[Dsmlv2StatesEnum.LDAP_RESULT_RESULT_CODE_END] = new HashMap<Tag, GrammarTransition>();
-        super.transitions[Dsmlv2StatesEnum.LDAP_RESULT_ERROR_MESSAGE_START] = new HashMap<Tag, GrammarTransition>();
         super.transitions[Dsmlv2StatesEnum.LDAP_RESULT_ERROR_MESSAGE_END] = new HashMap<Tag, GrammarTransition>();
-        super.transitions[Dsmlv2StatesEnum.LDAP_RESULT_REFERRAL_START] = new HashMap<Tag, GrammarTransition>();
         super.transitions[Dsmlv2StatesEnum.LDAP_RESULT_REFERRAL_END] = new HashMap<Tag, GrammarTransition>();
         super.transitions[Dsmlv2StatesEnum.SEARCH_RESULT_DONE_END] = new HashMap<Tag, GrammarTransition>();
 
@@ -422,12 +380,7 @@
         // State: [LDAP_RESULT_CONTROL_START] - Tag: <controlValue>
         super.transitions[Dsmlv2StatesEnum.LDAP_RESULT_CONTROL_START].put( new Tag( "controlValue", Tag.START ),
             new GrammarTransition( Dsmlv2StatesEnum.LDAP_RESULT_CONTROL_START,
-                Dsmlv2StatesEnum.LDAP_RESULT_CONTROL_VALUE_START, ldapResultControlValueCreation ) );
-
-        // State: [LDAP_RESULT_CONTROL_VALUE_START] - Tag: </controlValue>
-        super.transitions[Dsmlv2StatesEnum.LDAP_RESULT_CONTROL_VALUE_START].put( new Tag( "controlValue", Tag.END ),
-            new GrammarTransition( Dsmlv2StatesEnum.LDAP_RESULT_CONTROL_VALUE_START,
-                Dsmlv2StatesEnum.LDAP_RESULT_CONTROL_VALUE_END, null ) );
+                Dsmlv2StatesEnum.LDAP_RESULT_CONTROL_VALUE_END, ldapResultControlValueCreation ) );
 
         // State: [LDAP_RESULT_CONTROL_VALUE_END] - Tag: </control>
         super.transitions[Dsmlv2StatesEnum.LDAP_RESULT_CONTROL_VALUE_END].put( new Tag( "control", Tag.END ),
@@ -457,12 +410,12 @@
         // State: [LDAP_RESULT_RESULT_CODE_END] - Tag: <errorMessage>
         super.transitions[Dsmlv2StatesEnum.LDAP_RESULT_RESULT_CODE_END].put( new Tag( "errorMessage", Tag.START ),
             new GrammarTransition( Dsmlv2StatesEnum.LDAP_RESULT_RESULT_CODE_END,
-                Dsmlv2StatesEnum.LDAP_RESULT_ERROR_MESSAGE_START, ldapResultAddErrorMessage ) );
+                Dsmlv2StatesEnum.LDAP_RESULT_ERROR_MESSAGE_END, ldapResultAddErrorMessage ) );
 
         // State: [LDAP_RESULT_RESULT_CODE_END] - Tag: <referral>
         super.transitions[Dsmlv2StatesEnum.LDAP_RESULT_RESULT_CODE_END].put( new Tag( "referral", Tag.START ),
             new GrammarTransition( Dsmlv2StatesEnum.LDAP_RESULT_RESULT_CODE_END,
-                Dsmlv2StatesEnum.LDAP_RESULT_REFERRAL_START, ldapResultAddReferral ) );
+                Dsmlv2StatesEnum.LDAP_RESULT_REFERRAL_END, ldapResultAddReferral ) );
 
         // State: [LDAP_RESULT_RESULT_CODE_END] - Tag: </addResponse>
         super.transitions[Dsmlv2StatesEnum.LDAP_RESULT_RESULT_CODE_END].put( new Tag( "addResponse", Tag.END ),
@@ -504,15 +457,10 @@
             .put( new Tag( "searchResponse", Tag.END ), new GrammarTransition( Dsmlv2StatesEnum.SEARCH_RESULT_DONE_END,
                 Dsmlv2StatesEnum.BATCH_RESPONSE_LOOP, null ) );
 
-        // State: [LDAP_RESULT_ERROR_MESSAGE_START] - Tag: </errorMessage>
-        super.transitions[Dsmlv2StatesEnum.LDAP_RESULT_ERROR_MESSAGE_START].put( new Tag( "errorMessage", Tag.END ),
-            new GrammarTransition( Dsmlv2StatesEnum.LDAP_RESULT_ERROR_MESSAGE_START,
-                Dsmlv2StatesEnum.LDAP_RESULT_ERROR_MESSAGE_END, null ) );
-
         // State: [LDAP_RESULT_ERROR_MESSAGE_END] - Tag: <referral>
         super.transitions[Dsmlv2StatesEnum.LDAP_RESULT_ERROR_MESSAGE_END].put( new Tag( "referral", Tag.START ),
             new GrammarTransition( Dsmlv2StatesEnum.LDAP_RESULT_ERROR_MESSAGE_END,
-                Dsmlv2StatesEnum.LDAP_RESULT_REFERRAL_START, ldapResultAddReferral ) );
+                Dsmlv2StatesEnum.LDAP_RESULT_REFERRAL_END, ldapResultAddReferral ) );
 
         // State: [LDAP_RESULT_ERROR_MESSAGE_END] - Tag: </addResponse>
         super.transitions[Dsmlv2StatesEnum.LDAP_RESULT_ERROR_MESSAGE_END].put( new Tag( "addResponse", Tag.END ),
@@ -549,15 +497,10 @@
             new GrammarTransition( Dsmlv2StatesEnum.LDAP_RESULT_ERROR_MESSAGE_END,
                 Dsmlv2StatesEnum.SEARCH_RESULT_DONE_END, null ) );
 
-        // State: [LDAP_RESULT_REFERRAL_START] - Tag: </referral>
-        super.transitions[Dsmlv2StatesEnum.LDAP_RESULT_REFERRAL_START].put( new Tag( "referral", Tag.END ),
-            new GrammarTransition( Dsmlv2StatesEnum.LDAP_RESULT_REFERRAL_START,
-                Dsmlv2StatesEnum.LDAP_RESULT_REFERRAL_END, null ) );
-
         // State: [LDAP_RESULT_REFERRAL_END] - Tag: <referral>
         super.transitions[Dsmlv2StatesEnum.LDAP_RESULT_REFERRAL_END].put( new Tag( "referral", Tag.START ),
             new GrammarTransition( Dsmlv2StatesEnum.LDAP_RESULT_REFERRAL_END,
-                Dsmlv2StatesEnum.LDAP_RESULT_REFERRAL_START, ldapResultAddReferral ) );
+                Dsmlv2StatesEnum.LDAP_RESULT_REFERRAL_END, ldapResultAddReferral ) );
 
         // State: [LDAP_RESULT_REFERRAL_END] - Tag: </addResponse>
         super.transitions[Dsmlv2StatesEnum.LDAP_RESULT_REFERRAL_END].put( new Tag( "addResponse", Tag.END ),
@@ -620,11 +563,9 @@
         super.transitions[Dsmlv2StatesEnum.SEARCH_RESULT_ENTRY] = new HashMap<Tag, GrammarTransition>();
         super.transitions[Dsmlv2StatesEnum.SEARCH_RESULT_ENTRY_CONTROL_START] = new HashMap<Tag, GrammarTransition>();
         super.transitions[Dsmlv2StatesEnum.SEARCH_RESULT_ENTRY_CONTROL_END] = new HashMap<Tag, GrammarTransition>();
-        super.transitions[Dsmlv2StatesEnum.SEARCH_RESULT_ENTRY_CONTROL_VALUE_START] = new HashMap<Tag, GrammarTransition>();
         super.transitions[Dsmlv2StatesEnum.SEARCH_RESULT_ENTRY_CONTROL_VALUE_END] = new HashMap<Tag, GrammarTransition>();
         super.transitions[Dsmlv2StatesEnum.SEARCH_RESULT_ENTRY_ATTR_START] = new HashMap<Tag, GrammarTransition>();
         super.transitions[Dsmlv2StatesEnum.SEARCH_RESULT_ENTRY_ATTR_END] = new HashMap<Tag, GrammarTransition>();
-        super.transitions[Dsmlv2StatesEnum.SEARCH_RESULT_ENTRY_VALUE_START] = new HashMap<Tag, GrammarTransition>();
         super.transitions[Dsmlv2StatesEnum.SEARCH_RESULT_ENTRY_VALUE_END] = new HashMap<Tag, GrammarTransition>();
 
         // State: [SEARCH_RESULT_ENTRY] - Tag: <control>
@@ -646,12 +587,7 @@
         super.transitions[Dsmlv2StatesEnum.SEARCH_RESULT_ENTRY_CONTROL_START].put(
             new Tag( "controlValue", Tag.START ), new GrammarTransition(
                 Dsmlv2StatesEnum.SEARCH_RESULT_ENTRY_CONTROL_START,
-                Dsmlv2StatesEnum.SEARCH_RESULT_ENTRY_CONTROL_VALUE_START, searchResultEntryControlValueCreation ) );
-
-        // State: [SEARCH_RESULT_ENTRY_CONTROL_VALUE_START] - Tag: </controlValue>
-        super.transitions[Dsmlv2StatesEnum.SEARCH_RESULT_ENTRY_CONTROL_VALUE_START].put( new Tag( "controlValue",
-            Tag.END ), new GrammarTransition( Dsmlv2StatesEnum.SEARCH_RESULT_ENTRY_CONTROL_VALUE_START,
-            Dsmlv2StatesEnum.SEARCH_RESULT_ENTRY_CONTROL_VALUE_END, null ) );
+                Dsmlv2StatesEnum.SEARCH_RESULT_ENTRY_CONTROL_VALUE_END, searchResultEntryControlValueCreation ) );
 
         // State: [SEARCH_RESULT_ENTRY_CONTROL_VALUE_END] - Tag: </control>
         super.transitions[Dsmlv2StatesEnum.SEARCH_RESULT_ENTRY_CONTROL_VALUE_END].put( new Tag( "control", Tag.END ),
@@ -686,7 +622,7 @@
         // State: [SEARCH_RESULT_ENTRY_ATTR_START] - Tag: <value>
         super.transitions[Dsmlv2StatesEnum.SEARCH_RESULT_ENTRY_ATTR_START].put( new Tag( "value", Tag.START ),
             new GrammarTransition( Dsmlv2StatesEnum.SEARCH_RESULT_ENTRY_ATTR_START,
-                Dsmlv2StatesEnum.SEARCH_RESULT_ENTRY_VALUE_START, searchResultEntryAddValue ) );
+                Dsmlv2StatesEnum.SEARCH_RESULT_ENTRY_VALUE_END, searchResultEntryAddValue ) );
 
         // State: [SEARCH_RESULT_ENTRY_ATTR_END] - Tag: <attr>
         super.transitions[Dsmlv2StatesEnum.SEARCH_RESULT_ENTRY_ATTR_END].put( new Tag( "attr", Tag.START ),
@@ -698,15 +634,10 @@
             new GrammarTransition( Dsmlv2StatesEnum.SEARCH_RESULT_ENTRY_ATTR_END,
                 Dsmlv2StatesEnum.SEARCH_RESULT_ENTRY_LOOP, null ) );
 
-        // State: [SEARCH_RESULT_ENTRY_VALUE_START] - Tag: </value>
-        super.transitions[Dsmlv2StatesEnum.SEARCH_RESULT_ENTRY_VALUE_START].put( new Tag( "value", Tag.END ),
-            new GrammarTransition( Dsmlv2StatesEnum.SEARCH_RESULT_ENTRY_VALUE_START,
-                Dsmlv2StatesEnum.SEARCH_RESULT_ENTRY_VALUE_END, null ) );
-
         // State: [SEARCH_RESULT_ENTRY_VALUE_END] - Tag: <value>
         super.transitions[Dsmlv2StatesEnum.SEARCH_RESULT_ENTRY_VALUE_END].put( new Tag( "value", Tag.START ),
             new GrammarTransition( Dsmlv2StatesEnum.SEARCH_RESULT_ENTRY_VALUE_END,
-                Dsmlv2StatesEnum.SEARCH_RESULT_ENTRY_VALUE_START, searchResultEntryAddValue ) );
+                Dsmlv2StatesEnum.SEARCH_RESULT_ENTRY_VALUE_END, searchResultEntryAddValue ) );
 
         // State: [SEARCH_RESULT_ENTRY_VALUE_END] - Tag: </attr>
         super.transitions[Dsmlv2StatesEnum.SEARCH_RESULT_ENTRY_VALUE_END].put( new Tag( "attr", Tag.END ),
@@ -740,9 +671,7 @@
         super.transitions[Dsmlv2StatesEnum.SEARCH_RESULT_REFERENCE] = new HashMap<Tag, GrammarTransition>();
         super.transitions[Dsmlv2StatesEnum.SEARCH_RESULT_REFERENCE_CONTROL_START] = new HashMap<Tag, GrammarTransition>();
         super.transitions[Dsmlv2StatesEnum.SEARCH_RESULT_REFERENCE_CONTROL_END] = new HashMap<Tag, GrammarTransition>();
-        super.transitions[Dsmlv2StatesEnum.SEARCH_RESULT_REFERENCE_CONTROL_VALUE_START] = new HashMap<Tag, GrammarTransition>();
         super.transitions[Dsmlv2StatesEnum.SEARCH_RESULT_REFERENCE_CONTROL_VALUE_END] = new HashMap<Tag, GrammarTransition>();
-        super.transitions[Dsmlv2StatesEnum.SEARCH_RESULT_REFERENCE_REF_START] = new HashMap<Tag, GrammarTransition>();
         super.transitions[Dsmlv2StatesEnum.SEARCH_RESULT_REFERENCE_REF_END] = new HashMap<Tag, GrammarTransition>();
 
         // State: [SEARCH_RESULT_REFERENCE] - Tag: <control>
@@ -753,17 +682,12 @@
         // State: [SEARCH_RESULT_REFERENCE] - Tag: <ref>
         super.transitions[Dsmlv2StatesEnum.SEARCH_RESULT_REFERENCE].put( new Tag( "ref", Tag.START ),
             new GrammarTransition( Dsmlv2StatesEnum.SEARCH_RESULT_REFERENCE,
-                Dsmlv2StatesEnum.SEARCH_RESULT_REFERENCE_REF_START, searchResultReferenceAddRef ) );
+                Dsmlv2StatesEnum.SEARCH_RESULT_REFERENCE_REF_END, searchResultReferenceAddRef ) );
 
         // State: [SEARCH_RESULT_REFERENCE_CONTROL_START] - Tag: <controlValue>
         super.transitions[Dsmlv2StatesEnum.SEARCH_RESULT_REFERENCE_CONTROL_START].put( new Tag( "controlValue",
             Tag.START ), new GrammarTransition( Dsmlv2StatesEnum.SEARCH_RESULT_REFERENCE_CONTROL_START,
-            Dsmlv2StatesEnum.SEARCH_RESULT_REFERENCE_CONTROL_VALUE_START, searchResultReferenceControlValueCreation ) );
-
-        // State: [SEARCH_RESULT_REFERENCE_CONTROL_VALUE_START] - Tag: </controlValue>
-        super.transitions[Dsmlv2StatesEnum.SEARCH_RESULT_REFERENCE_CONTROL_VALUE_START].put( new Tag( "controlValue",
-            Tag.END ), new GrammarTransition( Dsmlv2StatesEnum.SEARCH_RESULT_REFERENCE_CONTROL_VALUE_START,
-            Dsmlv2StatesEnum.SEARCH_RESULT_REFERENCE_CONTROL_VALUE_END, null ) );
+            Dsmlv2StatesEnum.SEARCH_RESULT_REFERENCE_CONTROL_VALUE_END, searchResultReferenceControlValueCreation ) );
 
         // State: [sEARCH_RESULT_REFERENCE_CONTROL_VALUE_END] - Tag: </control>
         super.transitions[Dsmlv2StatesEnum.SEARCH_RESULT_REFERENCE_CONTROL_VALUE_END].put(
@@ -784,17 +708,12 @@
         // State: [SEARCH_RESULT_REFERENCE_CONTROL_END] - Tag: <ref>
         super.transitions[Dsmlv2StatesEnum.SEARCH_RESULT_REFERENCE_CONTROL_END].put( new Tag( "ref", Tag.START ),
             new GrammarTransition( Dsmlv2StatesEnum.SEARCH_RESULT_REFERENCE_CONTROL_END,
-                Dsmlv2StatesEnum.SEARCH_RESULT_REFERENCE_REF_START, searchResultReferenceAddRef ) );
-
-        // State: [SEARCH_RESULT_REFERENCE_REF_START] - Tag: </ref>
-        super.transitions[Dsmlv2StatesEnum.SEARCH_RESULT_REFERENCE_REF_START].put( new Tag( "ref", Tag.END ),
-            new GrammarTransition( Dsmlv2StatesEnum.SEARCH_RESULT_REFERENCE_REF_START,
-                Dsmlv2StatesEnum.SEARCH_RESULT_REFERENCE_REF_END, null ) );
+                Dsmlv2StatesEnum.SEARCH_RESULT_REFERENCE_REF_END, searchResultReferenceAddRef ) );
 
         // State: [SEARCH_RESULT_REFERENCE_REF_END] - Tag: <ref>
         super.transitions[Dsmlv2StatesEnum.SEARCH_RESULT_REFERENCE_REF_END].put( new Tag( "ref", Tag.START ),
             new GrammarTransition( Dsmlv2StatesEnum.SEARCH_RESULT_REFERENCE_REF_END,
-                Dsmlv2StatesEnum.SEARCH_RESULT_REFERENCE_REF_START, searchResultReferenceAddRef ) );
+                Dsmlv2StatesEnum.SEARCH_RESULT_REFERENCE_REF_END, searchResultReferenceAddRef ) );
 
         // State: [SEARCH_RESULT_REFERENCE_REF_END] - Tag: </searchResultReference>
         super.transitions[Dsmlv2StatesEnum.SEARCH_RESULT_REFERENCE_REF_END].put( new Tag( "searchResultReference",
@@ -1269,23 +1188,20 @@
         public void action( Dsmlv2Container container ) throws XmlPullParserException
         {
             ErrorResponse errorResponse = ( ErrorResponse ) container.getBatchResponse().getCurrentResponse();
-
+            
             XmlPullParser xpp = container.getParser();
-
-            int eventType = 0;
             try
             {
-                eventType = xpp.next();
+                String nextText = xpp.nextText();
+                if ( !nextText.equals( "" ) )
+                {
+                    errorResponse.setMessage( nextText.trim() );
+                }
             }
             catch ( IOException e )
             {
                 throw new XmlPullParserException( e.getMessage(), xpp, null );
             }
-
-            if ( eventType == XmlPullParser.TEXT )
-            {
-                errorResponse.setMessage( xpp.getText().trim() );
-            }
         }
     };
 
@@ -1315,9 +1231,11 @@
         attributeValue = xpp.getAttributeValue( "", "type" );
         if ( attributeValue != null )
         {
-            // TODO Add a verification for a match with NumericOid format (see
-            // DSMLv2 specifications)
-            control.setControlType( attributeValue ); // TODO LDAPString uses UTF8 bytes, so the charset must be verified before doing this.
+            if ( !OID.isOID( attributeValue ) )
+            {
+                throw new XmlPullParserException( "Incorrect value for 'type' attribute. This is not an OID.", xpp, null );
+            }
+            control.setControlType( attributeValue );
         }
         else
         {
@@ -1401,25 +1319,28 @@
         Control control = parent.getCurrentControl();
 
         XmlPullParser xpp = container.getParser();
-
-        int eventType = 0;
         try
         {
-            eventType = xpp.next();
+            // We have to catch the type Attribute Value before going to the next Text node
+            String typeValue = ParserUtils.getXsiTypeAttributeValue( xpp );
+            
+            // Getting the value
+            String nextText = xpp.nextText();
+            if ( !nextText.equals( "" ) )
+            {
+                if ( ParserUtils.isBase64BinaryValue( xpp, typeValue ) )
+                {
+                    control.setControlValue( Base64.decode( nextText.trim().toCharArray() ) );
+                }
+                else
+                {
+                    control.setControlValue( nextText.trim() );
+                }
+            }
         }
         catch ( IOException e )
         {
-            throw new XmlPullParserException( "name attribute is required", xpp, null );
-        }
-
-        if ( eventType != XmlPullParser.TEXT )
-        {
-            // TODO we insert a blank value
-            control.setControlValue( "" );
-        }
-        else
-        {
-            control.setControlValue( xpp.getText().trim() );
+            throw new XmlPullParserException( "An unexpected error ocurred : " + e.getMessage(), xpp, null );
         }
     }
 
@@ -1552,24 +1473,17 @@
             }
 
             XmlPullParser xpp = container.getParser();
-
-            int eventType = 0;
             try
             {
-                eventType = xpp.next();
+                String nextText = xpp.nextText();
+                if ( !nextText.equals( "" ) )
+                {
+                    ldapResult.setErrorMessage( nextText.trim() );
+                }
             }
             catch ( IOException e )
             {
-                throw new XmlPullParserException( e.getMessage(), xpp, null );
-            }
-
-            if ( eventType != XmlPullParser.TEXT )
-            {
-                throw new XmlPullParserException( "An error has ocurred.", xpp, null );
-            }
-            else
-            {
-                ldapResult.setErrorMessage( xpp.getText().trim() );
+                throw new XmlPullParserException( "An unexpected error ocurred : " + e.getMessage(), xpp, null );
             }
         }
     };
@@ -1604,31 +1518,24 @@
             }
 
             XmlPullParser xpp = container.getParser();
-
-            int eventType = 0;
             try
             {
-                eventType = xpp.next();
+                String nextText = xpp.nextText();
+                if ( !nextText.equals( "" ) )
+                {
+                    try
+                    {
+                        ldapResult.addReferral( new LdapURL( nextText.trim() ) );
+                    }
+                    catch ( LdapURLEncodingException e )
+                    {
+                        throw new XmlPullParserException( e.getMessage(), xpp, null );
+                    }
+                }
             }
             catch ( IOException e )
             {
-                throw new XmlPullParserException( e.getMessage(), xpp, null );
-            }
-
-            if ( eventType != XmlPullParser.TEXT )
-            {
-                throw new XmlPullParserException( "An error has ocurred.", xpp, null );
-            }
-            else
-            {
-                try
-                {
-                    ldapResult.addReferral( new LdapURL( xpp.getText().trim() ) );
-                }
-                catch ( LdapURLEncodingException e )
-                {
-                    throw new XmlPullParserException( e.getMessage(), xpp, null );
-                }
+                throw new XmlPullParserException( "An unexpected error ocurred : " + e.getMessage(), xpp, null );
             }
         }
     };
@@ -1835,28 +1742,28 @@
         public void action( Dsmlv2Container container ) throws XmlPullParserException
         {
             SearchResponse searchResponse = ( SearchResponse ) container.getBatchResponse().getCurrentResponse();
-
             SearchResultEntry searchResultEntry = searchResponse.getCurrentSearchResultEntry();
 
             XmlPullParser xpp = container.getParser();
-
-            int eventType = 0;
             try
             {
-                eventType = xpp.next();
+                // We have to catch the type Attribute Value before going to the next Text node
+                String typeValue = ParserUtils.getXsiTypeAttributeValue( xpp );
+                
+                // Getting the value
+                String nextText = xpp.nextText();
+                if ( ParserUtils.isBase64BinaryValue( xpp, typeValue ) )
+                {
+                    searchResultEntry.addAttributeValue( Base64.decode( nextText.toCharArray() ) );
+                }
+                else
+                {
+                    searchResultEntry.addAttributeValue( nextText );
+                }
             }
             catch ( IOException e )
             {
-                throw new XmlPullParserException( e.getMessage(), xpp, null );
-            }
-
-            if ( eventType != XmlPullParser.TEXT )
-            {
-                throw new XmlPullParserException( "An error has ocurred.", xpp, null );
-            }
-            else
-            {
-                searchResultEntry.addAttributeValue( xpp.getText() );
+                throw new XmlPullParserException( "An unexpected error ocurred : " + e.getMessage(), xpp, null );
             }
         }
     };
@@ -1870,35 +1777,24 @@
         public void action( Dsmlv2Container container ) throws XmlPullParserException
         {
             SearchResponse searchResponse = ( SearchResponse ) container.getBatchResponse().getCurrentResponse();
-
             SearchResultReference searchResultReference = searchResponse.getCurrentSearchResultReference();
 
             XmlPullParser xpp = container.getParser();
-
-            int eventType = 0;
             try
             {
-                eventType = xpp.next();
+                String nextText = xpp.nextText();
+                if ( !nextText.equals( "" ) )
+                {
+                    searchResultReference.addSearchResultReference( new LdapURL( nextText ) );
+                }
             }
             catch ( IOException e )
             {
-                throw new XmlPullParserException( e.getMessage(), xpp, null );
+                throw new XmlPullParserException( "An unexpected error ocurred : " + e.getMessage(), xpp, null );
             }
-
-            if ( eventType != XmlPullParser.TEXT )
+            catch ( LdapURLEncodingException e )
             {
-                throw new XmlPullParserException( "An error has ocurred.", xpp, null );
-            }
-            else
-            {
-                try
-                {
-                    searchResultReference.addSearchResultReference( new LdapURL( xpp.getText() ) );
-                }
-                catch ( LdapURLEncodingException e )
-                {
-                    throw new XmlPullParserException( e.getMessage(), xpp, null );
-                }
+                throw new XmlPullParserException( e.getMessage(), xpp, null );
             }
         }
     };
@@ -1929,31 +1825,22 @@
             ExtendedResponse extendedResponse = ( ExtendedResponse ) container.getBatchResponse().getCurrentResponse();
 
             XmlPullParser xpp = container.getParser();
-
-            int eventType = 0;
             try
             {
-                eventType = xpp.next();
+                String nextText = xpp.nextText();
+                if ( !nextText.equals( "" ) )
+                {
+                    extendedResponse.setResponseName( new OID( nextText.trim() ) );
+                }
+                
             }
             catch ( IOException e )
             {
-                throw new XmlPullParserException( e.getMessage(), xpp, null );
+                throw new XmlPullParserException( "An unexpected error ocurred : " + e.getMessage(), xpp, null );
             }
-
-            if ( eventType != XmlPullParser.TEXT )
+            catch ( DecoderException e )
             {
-                throw new XmlPullParserException( "An error has ocurred.", xpp, null );
-            }
-            else
-            {
-                try
-                {
-                    extendedResponse.setResponseName( new OID( xpp.getText().trim() ) );
-                }
-                catch ( DecoderException e )
-                {
-                    throw new XmlPullParserException( e.getMessage(), xpp, null );
-                }
+                throw new XmlPullParserException( e.getMessage(), xpp, null );
             }
         }
     };
@@ -1968,24 +1855,25 @@
             ExtendedResponse extendedResponse = ( ExtendedResponse ) container.getBatchResponse().getCurrentResponse();
 
             XmlPullParser xpp = container.getParser();
-
-            int eventType = 0;
             try
             {
-                eventType = xpp.next();
+                // We have to catch the type Attribute Value before going to the next Text node
+                String typeValue = ParserUtils.getXsiTypeAttributeValue( xpp );
+                
+                // Getting the value
+                String nextText = xpp.nextText();
+                if ( ParserUtils.isBase64BinaryValue( xpp, typeValue ) )
+                {
+                    extendedResponse.setResponse( Base64.decode( nextText.trim().toCharArray() ) );
+                }
+                else
+                {
+                    extendedResponse.setResponse( nextText.trim() );
+                }
             }
             catch ( IOException e )
             {
-                throw new XmlPullParserException( e.getMessage(), xpp, null );
-            }
-
-            if ( eventType != XmlPullParser.TEXT )
-            {
-                throw new XmlPullParserException( "An error has ocurred.", xpp, null );
-            }
-            else
-            {
-                extendedResponse.setResponse( xpp.getText().trim() );
+                throw new XmlPullParserException( "An unexpected error ocurred : " + e.getMessage(), xpp, null );
             }
         }
     };

Modified: directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/main/java/org/apache/directory/ldapstudio/dsmlv2/Dsmlv2ResponseParser.java
URL: http://svn.apache.org/viewvc/directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/main/java/org/apache/directory/ldapstudio/dsmlv2/Dsmlv2ResponseParser.java?view=diff&rev=483930&r1=483929&r2=483930
==============================================================================
--- directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/main/java/org/apache/directory/ldapstudio/dsmlv2/Dsmlv2ResponseParser.java (original)
+++ directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/main/java/org/apache/directory/ldapstudio/dsmlv2/Dsmlv2ResponseParser.java Fri Dec  8 03:08:09 2006
@@ -46,7 +46,7 @@
         this.container.setGrammar( Dsmlv2ResponseGrammar.getInstance() );
 
         XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
-        // factory.setNamespaceAware(true);
+        factory.setNamespaceAware(true);
         XmlPullParser xpp = factory.newPullParser();
 
         container.setParser( xpp );
@@ -131,7 +131,6 @@
 
             if ( transition.hasAction() )
             {
-                //                    System.out.println( transition.getAction().toString() );// TODO Suppress
                 transition.getAction().action( container );
             }
         }

Added: directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/main/java/org/apache/directory/ldapstudio/dsmlv2/ParserUtils.java
URL: http://svn.apache.org/viewvc/directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/main/java/org/apache/directory/ldapstudio/dsmlv2/ParserUtils.java?view=auto&rev=483930
==============================================================================
--- directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/main/java/org/apache/directory/ldapstudio/dsmlv2/ParserUtils.java (added)
+++ directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/main/java/org/apache/directory/ldapstudio/dsmlv2/ParserUtils.java Fri Dec  8 03:08:09 2006
@@ -0,0 +1,54 @@
+
+package org.apache.directory.ldapstudio.dsmlv2;
+
+import org.xmlpull.v1.XmlPullParser;
+
+public class ParserUtils
+{
+    private static final String XML_SCHEMA_URI = "http://www.w3c.org/2001/XMLSchema";
+    private static final String XML_SCHEMA_INSTANCE_URI = "http://www.w3c.org/2001/XMLSchema-instance";
+
+    
+    /**
+     * Returns the value of the attribute 'type' of the "XMLSchema-instance' namespace if it exists
+     *
+     * @param xpp the XPP parser to use
+     * @return the value of the attribute 'type' of the "XMLSchema-instance' namespace if it exists
+     */
+    public static String getXsiTypeAttributeValue( XmlPullParser xpp )
+    {
+        String type = null;
+        int nbAttributes = xpp.getAttributeCount();
+        for ( int i = 0; i < nbAttributes; i++ )
+        {
+            // Checking if the attribute 'type' from XML Schema Instance namespace is used.
+            if ( xpp.getAttributeName( i ).equals( "type" ) && xpp.getNamespace( xpp.getAttributePrefix( i ) ).equals( XML_SCHEMA_INSTANCE_URI ))
+            {
+                type = xpp.getAttributeValue( i );
+                break;
+            }
+        }
+        return type;
+    }
+    
+    /**
+     * Returns true if the value of the current tag is Base64Binary encoded
+     *
+     * @param parser the XPP parser to use
+     * @param attrValue the attribute value
+     * @return true if the value of the current tag is Base64BinaryEncoded, false if not
+     */
+    public static boolean isBase64BinaryValue( XmlPullParser parser, String attrValue )
+    {
+        if ( attrValue == null )
+        {
+            return false;
+        }
+        // We are looking for something that should look like that: "aNameSpace:base64Binary"
+        // We split the String. The first element should be the namespace prefix and the second "base64Binary"
+        String [] splitedString = attrValue.split( ":" );
+        return ( splitedString.length == 2 ) 
+                && ( XML_SCHEMA_URI.equals( parser.getNamespace( splitedString[0] ) ) ) 
+                && ( "base64Binary".equals( splitedString[1] ) );
+    }
+}

Modified: directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/java/org/apache/directory/ldapstudio/dsmlv2/addRequest/AddRequestTest.java
URL: http://svn.apache.org/viewvc/directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/java/org/apache/directory/ldapstudio/dsmlv2/addRequest/AddRequestTest.java?view=diff&rev=483930&r1=483929&r2=483930
==============================================================================
--- directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/java/org/apache/directory/ldapstudio/dsmlv2/addRequest/AddRequestTest.java (original)
+++ directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/java/org/apache/directory/ldapstudio/dsmlv2/addRequest/AddRequestTest.java Fri Dec  8 03:08:09 2006
@@ -358,7 +358,7 @@
 
 
     /**
-     * Test parsing of a request with an Attr elements without value
+     * Test parsing of a request with an Attr elements with value
      */
     public void testRequestWith1AttrWithValue()
     {
@@ -419,6 +419,70 @@
         }
 
         assertEquals( "top", value );
+    }
+    
+    /**
+     * Test parsing of a request with an Attr elements with value
+     */
+    public void testRequestWith1AttrWithBase64Value()
+    {
+        Dsmlv2Parser parser = null;
+        try
+        {
+            parser = new Dsmlv2Parser();
+
+            parser.setInputFile( AddRequestTest.class.getResource( "request_with_1_attr_with_base64_value.xml" ).getFile() );
+
+            parser.parse();
+        }
+        catch ( Exception e )
+        {
+            fail( e.getMessage() );
+        }
+
+        AddRequest addRequest = ( AddRequest ) parser.getBatchRequest().getCurrentRequest();
+
+        Attributes attributes = addRequest.getAttributes();
+
+        assertEquals( 1, attributes.size() );
+
+        // Getting the Attribute       
+        NamingEnumeration ne = attributes.getAll();
+
+        Attribute attribute = null;
+        try
+        {
+            attribute = ( Attribute ) ne.next();
+        }
+        catch ( NamingException e )
+        {
+            fail( e.getMessage() );
+        }
+
+        assertEquals( "objectclass", attribute.getID() );
+
+        // Getting the Value
+        NamingEnumeration ne2 = null;
+        try
+        {
+            ne2 = attribute.getAll();
+        }
+        catch ( NamingException e )
+        {
+            fail( e.getMessage() );
+        }
+
+        Object value = null;
+        try
+        {
+            value = ne2.next();
+        }
+        catch ( NamingException e )
+        {
+            fail( e.getMessage() );
+        }
+
+        assertEquals( "DSMLv2.0 rocks!!", new String( (byte[]) value ) );
     }
 
 

Modified: directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/java/org/apache/directory/ldapstudio/dsmlv2/addResponse/AddResponseTest.java
URL: http://svn.apache.org/viewvc/directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/java/org/apache/directory/ldapstudio/dsmlv2/addResponse/AddResponseTest.java?view=diff&rev=483930&r1=483929&r2=483930
==============================================================================
--- directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/java/org/apache/directory/ldapstudio/dsmlv2/addResponse/AddResponseTest.java (original)
+++ directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/java/org/apache/directory/ldapstudio/dsmlv2/addResponse/AddResponseTest.java Fri Dec  8 03:08:09 2006
@@ -99,6 +99,33 @@
         assertEquals( "Some text", StringTools.utf8ToString( ( byte[] ) control.getControlValue() ) );
     }
 
+    /**
+     * Test parsing of a response with a (optional) Control element with emptyValue
+     */
+    public void testResponseWith1ControlEmptyValue()
+    {
+        Dsmlv2ResponseParser parser = null;
+        try
+        {
+            parser = new Dsmlv2ResponseParser();
+
+            parser.setInputFile( AddResponseTest.class.getResource( "response_with_1_control_empty_value.xml" ).getFile() );
+
+            parser.parse();
+        }
+        catch ( Exception e )
+        {
+            fail( e.getMessage() );
+        }
+
+        AddResponse addResponse = ( AddResponse ) parser.getBatchResponse().getCurrentResponse();
+        Control control = addResponse.getCurrentControl();
+        
+        assertEquals( 1, addResponse.getControls().size() );
+        assertTrue( control.getCriticality() );
+        assertEquals( "1.2.840.113556.1.4.643", control.getControlType() );
+        assertEquals( StringTools.EMPTY_BYTES,  ( byte[] ) control.getControlValue() );
+    }
 
     /**
      * Test parsing of a response with 2 (optional) Control elements
@@ -238,6 +265,32 @@
         assertEquals( "Unrecognized extended operation EXTENSION_OID: 1.2.6.1.4.1.18060.1.1.1.100.2", ldapResult
             .getErrorMessage() );
     }
+    
+    /**
+     * Test parsing of a response with empty Error Message
+     */
+    public void testResponseWithEmptyErrorMessage()
+    {
+        Dsmlv2ResponseParser parser = null;
+        try
+        {
+            parser = new Dsmlv2ResponseParser();
+
+            parser.setInputFile( AddResponseTest.class.getResource( "response_with_empty_error_message.xml" ).getFile() );
+
+            parser.parse();
+        }
+        catch ( Exception e )
+        {
+            fail( e.getMessage() );
+        }
+
+        AddResponse addResponse = ( AddResponse ) parser.getBatchResponse().getCurrentResponse();
+
+        LdapResult ldapResult = addResponse.getLdapResult();
+
+        assertNull( ldapResult.getErrorMessage() );
+    }
 
 
     /**
@@ -277,6 +330,34 @@
         {
             fail();
         }
+    }
+    
+    /**
+     * Test parsing of a response with an empty Referral
+     */
+    public void testResponseWith1EmptyReferral()
+    {
+        Dsmlv2ResponseParser parser = null;
+        try
+        {
+            parser = new Dsmlv2ResponseParser();
+
+            parser.setInputFile( AddResponseTest.class.getResource( "response_with_1_empty_referral.xml" ).getFile() );
+
+            parser.parse();
+        }
+        catch ( Exception e )
+        {
+            fail( e.getMessage() );
+        }
+
+        AddResponse addResponse = ( AddResponse ) parser.getBatchResponse().getCurrentResponse();
+
+        LdapResult ldapResult = addResponse.getLdapResult();
+
+        List referrals = ldapResult.getReferrals();
+
+        assertEquals( 0, referrals.size() );
     }
 
 

Modified: directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/java/org/apache/directory/ldapstudio/dsmlv2/authResponse/AuthResponseTest.java
URL: http://svn.apache.org/viewvc/directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/java/org/apache/directory/ldapstudio/dsmlv2/authResponse/AuthResponseTest.java?view=diff&rev=483930&r1=483929&r2=483930
==============================================================================
--- directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/java/org/apache/directory/ldapstudio/dsmlv2/authResponse/AuthResponseTest.java (original)
+++ directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/java/org/apache/directory/ldapstudio/dsmlv2/authResponse/AuthResponseTest.java Fri Dec  8 03:08:09 2006
@@ -98,6 +98,34 @@
 
         assertEquals( "Some text", StringTools.utf8ToString( ( byte[] ) control.getControlValue() ) );
     }
+    
+    /**
+     * Test parsing of a response with a (optional) Control element with empty value
+     */
+    public void testResponseWith1ControlEmptyValue()
+    {
+        Dsmlv2ResponseParser parser = null;
+        try
+        {
+            parser = new Dsmlv2ResponseParser();
+
+            parser.setInputFile( AuthResponseTest.class.getResource( "response_with_1_control_empty_value.xml" ).getFile() );
+
+            parser.parse();
+        }
+        catch ( Exception e )
+        {
+            fail( e.getMessage() );
+        }
+
+        BindResponse bindResponse = ( BindResponse ) parser.getBatchResponse().getCurrentResponse();
+        Control control = bindResponse.getCurrentControl();
+        
+        assertEquals( 1, bindResponse.getControls().size() );
+        assertTrue( control.getCriticality() );
+        assertEquals( "1.2.840.113556.1.4.643", control.getControlType() );
+        assertEquals( StringTools.EMPTY_BYTES, ( byte[] ) control.getControlValue() );
+    }
 
 
     /**
@@ -238,6 +266,32 @@
         assertEquals( "Unrecognized extended operation EXTENSION_OID: 1.2.6.1.4.1.18060.1.1.1.100.2", ldapResult
             .getErrorMessage() );
     }
+    
+    /**
+     * Test parsing of a response with Empty Error Message
+     */
+    public void testResponseWithEmptyErrorMessage()
+    {
+        Dsmlv2ResponseParser parser = null;
+        try
+        {
+            parser = new Dsmlv2ResponseParser();
+
+            parser.setInputFile( AuthResponseTest.class.getResource( "response_with_empty_error_message.xml" ).getFile() );
+
+            parser.parse();
+        }
+        catch ( Exception e )
+        {
+            fail( e.getMessage() );
+        }
+
+        BindResponse bindResponse = ( BindResponse ) parser.getBatchResponse().getCurrentResponse();
+
+        LdapResult ldapResult = bindResponse.getLdapResult();
+
+        assertNull( ldapResult.getErrorMessage() );
+    }
 
 
     /**
@@ -277,6 +331,34 @@
         {
             fail();
         }
+    }
+    
+    /**
+     * Test parsing of a response with an empty Referral
+     */
+    public void testResponseWith1EmptyReferral()
+    {
+        Dsmlv2ResponseParser parser = null;
+        try
+        {
+            parser = new Dsmlv2ResponseParser();
+
+            parser.setInputFile( AuthResponseTest.class.getResource( "response_with_1_empty_referral.xml" ).getFile() );
+
+            parser.parse();
+        }
+        catch ( Exception e )
+        {
+            fail( e.getMessage() );
+        }
+
+        BindResponse bindResponse = ( BindResponse ) parser.getBatchResponse().getCurrentResponse();
+
+        LdapResult ldapResult = bindResponse.getLdapResult();
+
+        List referrals = ldapResult.getReferrals();
+
+        assertEquals( 0, referrals.size() );
     }
 
 

Modified: directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/java/org/apache/directory/ldapstudio/dsmlv2/compareRequest/CompareRequestTest.java
URL: http://svn.apache.org/viewvc/directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/java/org/apache/directory/ldapstudio/dsmlv2/compareRequest/CompareRequestTest.java?view=diff&rev=483930&r1=483929&r2=483930
==============================================================================
--- directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/java/org/apache/directory/ldapstudio/dsmlv2/compareRequest/CompareRequestTest.java (original)
+++ directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/java/org/apache/directory/ldapstudio/dsmlv2/compareRequest/CompareRequestTest.java Fri Dec  8 03:08:09 2006
@@ -288,6 +288,34 @@
         assertEquals( "Johnson", ( String ) compareRequest.getAssertionValue() );
     }
 
+    /**
+     * Test parsing of a request with a complete assertion with base64 value
+     */
+    public void testRequestWith1CompleteAssertionBase64Value()
+    {
+        Dsmlv2Parser parser = null;
+        try
+        {
+            parser = new Dsmlv2Parser();
+
+            parser.setInputFile( CompareRequestTest.class.getResource( "request_with_1_complete_assertion_base64_value.xml" )
+                .getFile() );
+
+            parser.parse();
+        }
+        catch ( Exception e )
+        {
+            fail( e.getMessage() );
+        }
+
+        CompareRequest compareRequest = ( CompareRequest ) parser.getBatchRequest().getCurrentRequest();
+
+        assertEquals( "cn=Bob Rush,ou=Dev,dc=Example,dc=COM", ( String ) compareRequest.getEntry().toString() );
+
+        assertEquals( "sn", ( String ) compareRequest.getAttributeDesc() );
+
+        assertEquals( "DSMLv2.0 rocks!!", new String( (byte[]) compareRequest.getAssertionValue() ) );
+    }
 
     /**
      * Test parsing of a request with an Attr elements with empty value

Modified: directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/java/org/apache/directory/ldapstudio/dsmlv2/compareResponse/CompareResponseTest.java
URL: http://svn.apache.org/viewvc/directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/java/org/apache/directory/ldapstudio/dsmlv2/compareResponse/CompareResponseTest.java?view=diff&rev=483930&r1=483929&r2=483930
==============================================================================
--- directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/java/org/apache/directory/ldapstudio/dsmlv2/compareResponse/CompareResponseTest.java (original)
+++ directory/sandbox/pamarcelot/ldapstudio/ldapstudio-dsml-parser/src/test/java/org/apache/directory/ldapstudio/dsmlv2/compareResponse/CompareResponseTest.java Fri Dec  8 03:08:09 2006
@@ -98,6 +98,34 @@
 
         assertEquals( "Some text", StringTools.utf8ToString( ( byte[] ) control.getControlValue() ) );
     }
+    
+    /**
+     * Test parsing of a response with a (optional) Control element with empty value
+     */
+    public void testResponseWith1ControlEmptyValue()
+    {
+        Dsmlv2ResponseParser parser = null;
+        try
+        {
+            parser = new Dsmlv2ResponseParser();
+
+            parser.setInputFile( CompareResponseTest.class.getResource( "response_with_1_control_empty_value.xml" ).getFile() );
+
+            parser.parse();
+        }
+        catch ( Exception e )
+        {
+            fail( e.getMessage() );
+        }
+
+        CompareResponse compareResponse = ( CompareResponse ) parser.getBatchResponse().getCurrentResponse();
+        Control control = compareResponse.getCurrentControl();
+        
+        assertEquals( 1, compareResponse.getControls().size() );
+        assertTrue( control.getCriticality() );
+        assertEquals( "1.2.840.113556.1.4.643", control.getControlType() );
+        assertEquals( StringTools.EMPTY_BYTES, ( byte[] ) control.getControlValue() );
+    }
 
 
     /**
@@ -238,6 +266,32 @@
         assertEquals( "Unrecognized extended operation EXTENSION_OID: 1.2.6.1.4.1.18060.1.1.1.100.2", ldapResult
             .getErrorMessage() );
     }
+    
+    /**
+     * Test parsing of a response with empty Error Message
+     */
+    public void testResponseWithEmptyErrorMessage()
+    {
+        Dsmlv2ResponseParser parser = null;
+        try
+        {
+            parser = new Dsmlv2ResponseParser();
+
+            parser.setInputFile( CompareResponseTest.class.getResource( "response_with_empty_error_message.xml" ).getFile() );
+
+            parser.parse();
+        }
+        catch ( Exception e )
+        {
+            fail( e.getMessage() );
+        }
+
+        CompareResponse compareResponse = ( CompareResponse ) parser.getBatchResponse().getCurrentResponse();
+
+        LdapResult ldapResult = compareResponse.getLdapResult();
+
+        assertNull( ldapResult.getErrorMessage() );
+    }
 
 
     /**
@@ -277,6 +331,34 @@
         {
             fail();
         }
+    }
+    
+    /**
+     * Test parsing of a response with an empty Referral
+     */
+    public void testResponseWith1EmptyReferral()
+    {
+        Dsmlv2ResponseParser parser = null;
+        try
+        {
+            parser = new Dsmlv2ResponseParser();
+
+            parser.setInputFile( CompareResponseTest.class.getResource( "response_with_1_empty_referral.xml" ).getFile() );
+
+            parser.parse();
+        }
+        catch ( Exception e )
+        {
+            fail( e.getMessage() );
+        }
+
+        CompareResponse compareResponse = ( CompareResponse ) parser.getBatchResponse().getCurrentResponse();
+
+        LdapResult ldapResult = compareResponse.getLdapResult();
+
+        List referrals = ldapResult.getReferrals();
+
+        assertEquals( 0, referrals.size() );
     }