You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by ka...@apache.org on 2014/10/08 18:55:32 UTC

svn commit: r1630177 - in /directory/shared/trunk/ldap/codec/core/src: main/java/org/apache/directory/api/ldap/codec/controls/sort/ test/java/org/apache/directory/api/ldap/codec/sort/

Author: kayyagari
Date: Wed Oct  8 16:55:31 2014
New Revision: 1630177

URL: http://svn.apache.org/r1630177
Log:
o fixed wrong tag values (DIRAPI-137)
o added a missing transition
o updated tests

Modified:
    directory/shared/trunk/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/sort/SortRequestDecorator.java
    directory/shared/trunk/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/sort/SortRequestGrammar.java
    directory/shared/trunk/ldap/codec/core/src/test/java/org/apache/directory/api/ldap/codec/sort/SortRequestControlTest.java

Modified: directory/shared/trunk/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/sort/SortRequestDecorator.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/sort/SortRequestDecorator.java?rev=1630177&r1=1630176&r2=1630177&view=diff
==============================================================================
--- directory/shared/trunk/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/sort/SortRequestDecorator.java (original)
+++ directory/shared/trunk/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/sort/SortRequestDecorator.java Wed Oct  8 16:55:31 2014
@@ -31,6 +31,7 @@ import org.apache.directory.api.asn1.ber
 import org.apache.directory.api.asn1.ber.tlv.BerValue;
 import org.apache.directory.api.asn1.ber.tlv.TLV;
 import org.apache.directory.api.asn1.ber.tlv.UniversalTag;
+import org.apache.directory.api.asn1.util.Asn1StringUtils;
 import org.apache.directory.api.i18n.I18n;
 import org.apache.directory.api.ldap.codec.api.ControlDecorator;
 import org.apache.directory.api.ldap.codec.api.LdapApiService;
@@ -53,6 +54,9 @@ public class SortRequestDecorator extend
 
     private List<Integer> sortKeyLenList = new ArrayList<Integer>();
 
+    public static int ORDERING_RULE_TAG = 0x80;
+    
+    public static int REVERSE_ORDER_TAG = 0x81;
 
     /**
      * Creates a new instance of SortRequestDecorator.
@@ -100,8 +104,11 @@ public class SortRequestDecorator extend
                 skLen += 1 + TLV.getNbBytes( mrBytes.length ) + mrBytes.length;
             }
 
-            // reverse order flag
-            skLen += 1 + 1 + 1;
+            if ( sk.isReverseOrder() )
+            {
+                // reverse order flag
+                skLen += 1 + 1 + 1;
+            }
 
             sortKeyLenList.add( skLen );
 
@@ -138,12 +145,22 @@ public class SortRequestDecorator extend
 
             BerValue.encode( buffer, sk.getAttributeTypeDesc() );
 
-            if ( sk.getMatchingRuleId() != null )
+            String mrId = sk.getMatchingRuleId();
+            if ( mrId != null )
             {
-                BerValue.encode( buffer, sk.getMatchingRuleId() );
+                buffer.put( (byte)ORDERING_RULE_TAG );
+                byte[] value = Asn1StringUtils.getBytesUtf8( mrId );
+
+                buffer.put( TLV.getBytes( value.length ) );
+                buffer.put( value );
             }
 
-            BerValue.encode( buffer, sk.isReverseOrder() );
+            if ( sk.isReverseOrder() )
+            {
+                buffer.put( (byte)REVERSE_ORDER_TAG );
+                buffer.put( (byte)0x01 );
+                buffer.put( BerValue.TRUE_VALUE );
+            }
         }
 
         return buffer;

Modified: directory/shared/trunk/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/sort/SortRequestGrammar.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/sort/SortRequestGrammar.java?rev=1630177&r1=1630176&r2=1630177&view=diff
==============================================================================
--- directory/shared/trunk/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/sort/SortRequestGrammar.java (original)
+++ directory/shared/trunk/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/controls/sort/SortRequestGrammar.java Wed Oct  8 16:55:31 2014
@@ -34,6 +34,8 @@ import org.apache.directory.api.util.Str
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static org.apache.directory.api.ldap.codec.controls.sort.SortRequestDecorator.*;
+
 
 /**
  * Grammar used for decoding a SortRequestControl.
@@ -70,10 +72,11 @@ public class SortRequestGrammar extends 
                 {
                     LOG.debug( "AttributeTypeDesc = " + atDesc );
                 }
-                
+
                 SortKey sk = new SortKey( atDesc );
                 container.setCurrentKey( sk );
                 container.getControl().addSortKey( sk );
+                container.setGrammarEndAllowed( true );
             }
 
         };
@@ -93,9 +96,9 @@ public class SortRequestGrammar extends 
                     {
                         LOG.debug( "ReverseOrder = " + reverseOrder );
                     }
-                    
+
                     container.getCurrentKey().setReverseOrder( reverseOrder );
-                    
+
                     container.setGrammarEndAllowed( true );
                 }
                 catch ( BooleanDecoderException e )
@@ -107,7 +110,7 @@ public class SortRequestGrammar extends 
             }
 
         };
-        
+
         // Create the transitions table
         super.transitions = new GrammarTransition[SortRequestStates.END_STATE.ordinal()][256];
 
@@ -125,11 +128,11 @@ public class SortRequestGrammar extends 
             new GrammarTransition<SortRequestContainer>( SortRequestStates.SORT_KEY_SEQUENCE_STATE,
                 SortRequestStates.AT_DESC_STATE,
                 UniversalTag.OCTET_STRING.getValue(), addSortKey );
-        
-        super.transitions[SortRequestStates.AT_DESC_STATE.ordinal()][UniversalTag.OCTET_STRING.getValue()] =
+
+        super.transitions[SortRequestStates.AT_DESC_STATE.ordinal()][ORDERING_RULE_TAG] =
             new GrammarTransition<SortRequestContainer>( SortRequestStates.AT_DESC_STATE,
                 SortRequestStates.ORDER_RULE_STATE,
-                UniversalTag.OCTET_STRING.getValue(), new GrammarAction<SortRequestContainer>()
+                ORDERING_RULE_TAG, new GrammarAction<SortRequestContainer>()
                 {
 
                     @Override
@@ -142,27 +145,32 @@ public class SortRequestGrammar extends 
                         {
                             LOG.debug( "MatchingRuleOid = " + matchingRuleOid );
                         }
-                        
+
                         container.getCurrentKey().setMatchingRuleId( matchingRuleOid );
                     }
 
                 } );
-        
-        super.transitions[SortRequestStates.ORDER_RULE_STATE.ordinal()][UniversalTag.BOOLEAN.getValue()] =
+
+        super.transitions[SortRequestStates.ORDER_RULE_STATE.ordinal()][REVERSE_ORDER_TAG] =
             new GrammarTransition<SortRequestContainer>( SortRequestStates.ORDER_RULE_STATE,
                 SortRequestStates.REVERSE_ORDER_STATE,
-                UniversalTag.BOOLEAN.getValue(), storeReverseOrder );
-        
-        super.transitions[SortRequestStates.AT_DESC_STATE.ordinal()][UniversalTag.BOOLEAN.getValue()] =
+                REVERSE_ORDER_TAG, storeReverseOrder );
+
+        super.transitions[SortRequestStates.AT_DESC_STATE.ordinal()][REVERSE_ORDER_TAG] =
             new GrammarTransition<SortRequestContainer>( SortRequestStates.AT_DESC_STATE,
                 SortRequestStates.REVERSE_ORDER_STATE,
-                UniversalTag.BOOLEAN.getValue(), storeReverseOrder );
+                REVERSE_ORDER_TAG, storeReverseOrder );
 
         super.transitions[SortRequestStates.REVERSE_ORDER_STATE.ordinal()][UniversalTag.SEQUENCE.getValue()] =
             new GrammarTransition<SortRequestContainer>( SortRequestStates.REVERSE_ORDER_STATE,
                 SortRequestStates.SORT_KEY_SEQUENCE_STATE,
                 UniversalTag.SEQUENCE.getValue(), null );
 
+        super.transitions[SortRequestStates.AT_DESC_STATE.ordinal()][UniversalTag.SEQUENCE.getValue()] =
+            new GrammarTransition<SortRequestContainer>( SortRequestStates.AT_DESC_STATE,
+                SortRequestStates.SORT_KEY_SEQUENCE_STATE,
+                UniversalTag.SEQUENCE.getValue(), null );
+
     }
 
 

Modified: directory/shared/trunk/ldap/codec/core/src/test/java/org/apache/directory/api/ldap/codec/sort/SortRequestControlTest.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/codec/core/src/test/java/org/apache/directory/api/ldap/codec/sort/SortRequestControlTest.java?rev=1630177&r1=1630176&r2=1630177&view=diff
==============================================================================
--- directory/shared/trunk/ldap/codec/core/src/test/java/org/apache/directory/api/ldap/codec/sort/SortRequestControlTest.java (original)
+++ directory/shared/trunk/ldap/codec/core/src/test/java/org/apache/directory/api/ldap/codec/sort/SortRequestControlTest.java Wed Oct  8 16:55:31 2014
@@ -33,6 +33,7 @@ import org.apache.directory.api.ldap.cod
 import org.apache.directory.api.ldap.codec.osgi.AbstractCodecServiceTest;
 import org.apache.directory.api.ldap.model.message.controls.SortKey;
 import org.apache.directory.api.ldap.model.message.controls.SortRequest;
+import org.apache.directory.api.util.Strings;
 import org.junit.Test;
 
 /**
@@ -51,8 +52,8 @@ public class SortRequestControlTest exte
                0x30, 0x0E,
                 0x30, 0x0C,
                    0x04, 0x02, 'c', 'n',
-                   0x04, 0x03, 'o', 'i', 'd',
-                   0x01, 0x01, 0x00
+                   (byte)0x80, 0x03, 'o', 'i', 'd',
+                   (byte)0x81, 0x01, 0x00
             } );
         buffer.flip();
         
@@ -66,10 +67,13 @@ public class SortRequestControlTest exte
         assertEquals( "oid", sk.getMatchingRuleId() );
         assertFalse( sk.isReverseOrder() );
         
-        ByteBuffer encoded = ByteBuffer.allocate( buffer.capacity() );
+        // default value of false reverseOrder will not be encoded
+        int skipBytes = 3;
+        ByteBuffer encoded = ByteBuffer.allocate( buffer.capacity() - skipBytes );
         decorator.computeLength();
         decorator.encode( encoded );
-        assertTrue( Arrays.equals( buffer.array(), encoded.array() ) );
+        assertFalse( Arrays.equals( buffer.array(), encoded.array() ) );
+        assertEquals( buffer.array().length - skipBytes, encoded.array().length );
     }
     
     
@@ -83,13 +87,13 @@ public class SortRequestControlTest exte
 
                 0x30, 0x0C,
                    0x04, 0x02, 'c', 'n',
-                   0x04, 0x03, 'o', 'i', 'd',
-                   0x01, 0x01, 0x00,
+                   (byte)0x80, 0x03, 'o', 'i', 'd',
+                   (byte)0x81, 0x01, (byte)0xFF,
 
                 0x30, 0x0C,
                    0x04, 0x02, 's', 'n',
-                   0x04, 0x03, 'i', 'o', 'd',
-                   0x01, 0x01, (byte)0xFF
+                   (byte)0x80, 0x03, 'i', 'o', 'd',
+                   (byte)0x81, 0x01, (byte)0xFF
             } );
         buffer.flip();
         
@@ -97,11 +101,11 @@ public class SortRequestControlTest exte
         SortRequest control = ( SortRequest ) decorator.decode( buffer.array() );
         
         assertEquals( 2, control.getSortKeys().size() );
-        
+
         SortKey sk = control.getSortKeys().get( 0 );
         assertEquals( "cn", sk.getAttributeTypeDesc() );
         assertEquals( "oid", sk.getMatchingRuleId() );
-        assertFalse( sk.isReverseOrder() );
+        assertTrue( sk.isReverseOrder() );
         
         sk = control.getSortKeys().get( 1 );
         assertEquals( "sn", sk.getAttributeTypeDesc() );
@@ -123,7 +127,7 @@ public class SortRequestControlTest exte
             {
                0x30, 0x05,
                 0x30, 0x03,
-                   0x01, 0x01, 0x00
+                (byte)0x81, 0x01, 0x00
             } );
         buffer.flip();
         
@@ -141,7 +145,36 @@ public class SortRequestControlTest exte
                0x30, 0x09,
                 0x30, 0x07,
                    0x04, 0x02, 'c', 'n',
-                   0x01, 0x01, 0x00
+                   (byte)0x81, 0x01, (byte)0xFF
+            } );
+        buffer.flip();
+        
+        SortRequestDecorator decorator = new SortRequestDecorator( codec );
+        SortRequest control = ( SortRequest ) decorator.decode( buffer.array() );
+        
+        assertEquals( 1, control.getSortKeys().size() );
+        
+        SortKey sk = control.getSortKeys().get( 0 );
+        assertEquals( "cn", sk.getAttributeTypeDesc() );
+        assertNull( sk.getMatchingRuleId() );
+        assertTrue( sk.isReverseOrder() );
+        
+        ByteBuffer encoded = ByteBuffer.allocate( buffer.capacity() );
+        decorator.computeLength();
+        decorator.encode( encoded );
+        assertTrue( Arrays.equals( buffer.array(), encoded.array() ) );
+    }
+    
+    
+    @Test
+    public void testDecodeControlWithAtDescOnly() throws Exception
+    {
+        ByteBuffer buffer = ByteBuffer.allocate( 8 );
+        buffer.put( new byte[]
+            {
+               0x30, 0x06,
+                0x30, 0x04,
+                0x04, 0x02, 'c', 'n'
             } );
         buffer.flip();
         
@@ -160,4 +193,41 @@ public class SortRequestControlTest exte
         decorator.encode( encoded );
         assertTrue( Arrays.equals( buffer.array(), encoded.array() ) );
     }
+
+    
+    @Test
+    public void testDecodeControlWithMultipleAtDescOnly() throws Exception
+    {
+        ByteBuffer buffer = ByteBuffer.allocate( 0x0E );
+        buffer.put( new byte[]
+            {
+               0x30, 0x0C,
+                0x30, 0x04,
+                 0x04, 0x02, 'c', 'n',
+                0x30, 0x04,
+                 0x04, 0x02, 's', 'n'
+            } );
+        buffer.flip();
+        
+        SortRequestDecorator decorator = new SortRequestDecorator( codec );
+        SortRequest control = ( SortRequest ) decorator.decode( buffer.array() );
+        
+        assertEquals( 2, control.getSortKeys().size() );
+        
+        SortKey sk = control.getSortKeys().get( 0 );
+        assertEquals( "cn", sk.getAttributeTypeDesc() );
+        assertNull( sk.getMatchingRuleId() );
+        assertFalse( sk.isReverseOrder() );
+        
+        sk = control.getSortKeys().get( 1 );
+        assertEquals( "sn", sk.getAttributeTypeDesc() );
+        assertNull( sk.getMatchingRuleId() );
+        assertFalse( sk.isReverseOrder() );
+        
+        ByteBuffer encoded = ByteBuffer.allocate( buffer.capacity() );
+        decorator.computeLength();
+        decorator.encode( encoded );
+        assertTrue( Arrays.equals( buffer.array(), encoded.array() ) );
+    }
+
 }