You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by se...@apache.org on 2009/05/04 18:03:04 UTC

svn commit: r771342 - in /directory/shared/trunk/ldap/src: main/antlr/distinguishedName.g main/java/org/apache/directory/shared/ldap/name/FastLdapDnParser.java test/java/org/apache/directory/shared/ldap/name/LdapDNTest.java

Author: seelmann
Date: Mon May  4 16:03:03 2009
New Revision: 771342

URL: http://svn.apache.org/viewvc?rev=771342&view=rev
Log:
Fixed handling of trailing spaces of a value: trailing spaces are not part of the value

Modified:
    directory/shared/trunk/ldap/src/main/antlr/distinguishedName.g
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/name/FastLdapDnParser.java
    directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/name/LdapDNTest.java

Modified: directory/shared/trunk/ldap/src/main/antlr/distinguishedName.g
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/src/main/antlr/distinguishedName.g?rev=771342&r1=771341&r2=771342&view=diff
==============================================================================
--- directory/shared/trunk/ldap/src/main/antlr/distinguishedName.g (original)
+++ directory/shared/trunk/ldap/src/main/antlr/distinguishedName.g Mon May  4 16:03:03 2009
@@ -146,6 +146,7 @@
     {
         String upValue = "";
         Object normValue = "";
+        String trailingSpaces = "";
     }
 }
 
@@ -295,7 +296,7 @@
             try
             {
                 rdn.addAttributeTypeAndValue( type, type, value.upValue, value.normValue );
-                { upName += value.upValue; }
+                { upName += value.upValue + value.trailingSpaces; }
             }
             catch ( InvalidNameException e )
             {
@@ -385,11 +386,17 @@
     }
     :
     (
-        quotestring [value]
+        (
+            quotestring [value]
+            ( SPACE { value.trailingSpaces += " "; } )*
+        )
         |
         string [value]
         |
-        hexstring [value]
+        (
+            hexstring [value]
+            ( SPACE { value.trailingSpaces += " "; } )*
+        )
     )?
     ;
 
@@ -408,7 +415,7 @@
     }
     :
     (
-        DQUOTE
+        dq1:DQUOTE { value.upValue += dq1.getText(); }
         (
             (
                 s:~(DQUOTE|ESC|ESCESC|HEXPAIR) 
@@ -420,7 +427,7 @@
             |
             bytes = pair[value] { bb.append( bytes ); }
         )*
-        DQUOTE
+        dq2:DQUOTE { value.upValue += dq2.getText(); }
     )
     {
         // TODO: pair / s
@@ -517,6 +524,9 @@
         {
             string = string.substring( 0, length - 1 );
             length = string.length();
+            
+            value.upValue = value.upValue.substring( 0, value.upValue.length() - 1 );
+            value.trailingSpaces += " ";
         }
         string = string.replace("\\ ", " ");
         

Modified: directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/name/FastLdapDnParser.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/name/FastLdapDnParser.java?rev=771342&r1=771341&r2=771342&view=diff
==============================================================================
--- directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/name/FastLdapDnParser.java (original)
+++ directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/name/FastLdapDnParser.java Mon May  4 16:03:03 2009
@@ -171,6 +171,9 @@
         String value = StringTools.trimRight( upValue );
         // TODO: trim, normalize, etc
 
+        // SPACE*
+        matchSpaces( name, pos );
+
         rdn.addAttributeTypeAndValue( type, type, upValue, value );
 
         rdn.setUpName( name.substring( rdnStart, pos.start ) );
@@ -188,12 +191,15 @@
      */
     private void matchSpaces( String name, Position pos ) throws InvalidNameException
     {
-        char c = ' ';
-        while ( c == ' ' && hasMoreChars( pos ) )
+        while ( hasMoreChars( pos ) )
         {
-            c = nextChar( name, pos, true );
+            char c = nextChar( name, pos, true );
+            if ( c != ' ' )
+            {
+                pos.start--;
+                break;
+            }
         }
-        pos.start--;
     }
 
 
@@ -526,11 +532,13 @@
     private String matchValue( String name, Position pos ) throws InvalidNameException
     {
         StringBuilder value = new StringBuilder();
+        int numTrailingSpaces = 0;
         while ( true )
         {
             if ( !hasMoreChars( pos ) )
             {
-                return value.toString();
+                pos.start -= numTrailingSpaces;
+                return value.substring( 0, value.length() - numTrailingSpaces );
             }
             char c = nextChar( name, pos, true );
             switch ( c )
@@ -543,8 +551,14 @@
                 case ',':
                 case ';':
                     pos.start--;
-                    return value.toString();
+                    pos.start -= numTrailingSpaces;
+                    return value.substring( 0, value.length() - numTrailingSpaces );
+                case ' ':
+                    numTrailingSpaces++;
+                    value.append( c );
+                    break;
                 default:
+                    numTrailingSpaces = 0;
                     value.append( c );
             }
         }

Modified: directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/name/LdapDNTest.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/name/LdapDNTest.java?rev=771342&r1=771341&r2=771342&view=diff
==============================================================================
--- directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/name/LdapDNTest.java (original)
+++ directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/name/LdapDNTest.java Mon May  4 16:03:03 2009
@@ -26,6 +26,7 @@
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.Enumeration;
@@ -3222,4 +3223,49 @@
         
         assertEquals( "1.2.3.4.5=0+1.2.3.4.6=0+1.2.3.4.7=omnischmomni,2.5.4.3=subtree,0.9.2342.19200300.100.1.25=example,0.9.2342.19200300.100.1.25=com", dn.toString() );
     }
+
+    /**
+     * Tests that AttributeTypeAndValues are correctly trimmed.
+     */
+    @Test
+    public void testTrimAtavs() throws InvalidNameException
+    {
+        // antlr parser: string value with trailing spaces
+        LdapDN dn1 = new LdapDN( " cn = Amos\\,Tori , ou=system " );
+        assertEquals( " cn = Amos\\,Tori ", dn1.getRdn().getUpName() );
+        AttributeTypeAndValue atav1 = dn1.getRdn().getAtav();
+        assertEquals( "cn", atav1.getUpType() );
+        assertEquals( "Amos\\,Tori", ( String ) atav1.getUpValue() );
+
+        // antlr parser: hexstring with trailing spaces
+        LdapDN dn3 = new LdapDN( " cn = #414243 , ou=system " );
+        assertEquals( " cn = #414243 ", dn3.getRdn().getUpName() );
+        AttributeTypeAndValue atav3 = dn3.getRdn().getAtav();
+        assertEquals( "cn", atav3.getUpType() );
+        assertEquals( "#414243", ( String ) atav3.getUpValue() );
+        assertTrue( Arrays.equals( StringTools.getBytesUtf8( "ABC" ), ( byte[] ) atav3.getNormValue() ) );
+
+        // antlr parser: 
+        LdapDN dn4 = new LdapDN( " cn = \\41\\42\\43 , ou=system " );
+        assertEquals( " cn = \\41\\42\\43 ", dn4.getRdn().getUpName() );
+        AttributeTypeAndValue atav4 = dn4.getRdn().getAtav();
+        assertEquals( "cn", atav4.getUpType() );
+        assertEquals( "\\41\\42\\43", ( String ) atav4.getUpValue() );
+        assertEquals( "ABC", ( String ) atav4.getNormValue() );
+
+        // antlr parser: quotestring with trailing spaces
+        LdapDN dn5 = new LdapDN( " cn = \"ABC\" , ou=system " );
+        assertEquals( " cn = \"ABC\" ", dn5.getRdn().getUpName() );
+        AttributeTypeAndValue atav5 = dn5.getRdn().getAtav();
+        assertEquals( "cn", atav5.getUpType() );
+        assertEquals( "\"ABC\"", ( String ) atav5.getUpValue() );
+        assertEquals( "ABC", ( String ) atav5.getNormValue() );
+
+        // fast parser: string value with trailing spaces 
+        LdapDN dn2 = new LdapDN( " cn = Amos Tori , ou=system " );
+        assertEquals( " cn = Amos Tori ", dn2.getRdn().getUpName() );
+        AttributeTypeAndValue atav2 = dn2.getRdn().getAtav();
+        assertEquals( "cn", atav2.getUpType() );
+        assertEquals( "Amos Tori", ( String ) atav2.getUpValue() );
+    }
 }