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

svn commit: r373182 - /directory/trunks/common/ldap/src/main/java/org/apache/ldap/common/codec/search/SearchResultEntry.java

Author: elecharny
Date: Sat Jan 28 09:17:26 2006
New Revision: 373182

URL: http://svn.apache.org/viewcvs?rev=373182&view=rev
Log:
Fixed the encoding of ResultEntry with no values for an attribute

Modified:
    directory/trunks/common/ldap/src/main/java/org/apache/ldap/common/codec/search/SearchResultEntry.java

Modified: directory/trunks/common/ldap/src/main/java/org/apache/ldap/common/codec/search/SearchResultEntry.java
URL: http://svn.apache.org/viewcvs/directory/trunks/common/ldap/src/main/java/org/apache/ldap/common/codec/search/SearchResultEntry.java?rev=373182&r1=373181&r2=373182&view=diff
==============================================================================
--- directory/trunks/common/ldap/src/main/java/org/apache/ldap/common/codec/search/SearchResultEntry.java (original)
+++ directory/trunks/common/ldap/src/main/java/org/apache/ldap/common/codec/search/SearchResultEntry.java Sat Jan 28 09:17:26 2006
@@ -240,7 +240,7 @@
             while ( attributes.hasMoreElements() )
             {
                 Attribute attribute = (Attribute)attributes.nextElement();
-                if ( attribute.size() == 0 ) continue;
+                
                 int localAttributeLength = 0;
                 int localValuesLength = 0;
                 
@@ -248,49 +248,57 @@
                 int idLength = attribute.getID().getBytes().length;
                 localAttributeLength = 1 + Length.getNbBytes( idLength ) + idLength;
                 
-                // The values
-                try
+                if ( attribute.size() != 0 ) 
                 {
-	                NamingEnumeration values = attribute.getAll();
-	                
-	                if ( values.hasMoreElements() )
-	                {
-                        localValuesLength = 0;
-	                    
-		                while ( values.hasMoreElements() )
-		                {
-		                    Object value = (Object)values.next();
-		                    
-		                    if ( value instanceof String )
-		                    {
-		                    	String stringValue = (String)value;
-                                
-                                int stringLength = StringTools.getBytesUtf8( stringValue ).length;
-                                localValuesLength += 1 + Length.getNbBytes( stringLength ) + stringLength;
-		                    }
-		                    else
-		                    {
-		                    	byte[] binaryValue = (byte[])value;
-	                            localValuesLength += 1 + Length.getNbBytes( binaryValue.length ) + binaryValue.length;
-		                    }
-		                    
-		                }
-
-                        localAttributeLength += 1 + Length.getNbBytes( localValuesLength ) + localValuesLength; 
-	                }
-	                else
-	                {
-	                	// We have to deal with the special wase where
-	                	// we don't have a value.
-	                	// It will be encoded as an empty OCTETSTRING,
-	                	// so it will be two byte slong (0x04 0x00)
-	                	localAttributeLength += 1 + 1;
-	                }
-	                
+                    // The values
+                    try
+                    {
+    	                NamingEnumeration values = attribute.getAll();
+    	                
+    	                if ( values.hasMoreElements() )
+    	                {
+                            localValuesLength = 0;
+    	                    
+    		                while ( values.hasMoreElements() )
+    		                {
+    		                    Object value = (Object)values.next();
+    		                    
+    		                    if ( value instanceof String )
+    		                    {
+    		                    	String stringValue = (String)value;
+                                    
+                                    int stringLength = StringTools.getBytesUtf8( stringValue ).length;
+                                    localValuesLength += 1 + Length.getNbBytes( stringLength ) + stringLength;
+    		                    }
+    		                    else
+    		                    {
+    		                    	byte[] binaryValue = (byte[])value;
+    	                            localValuesLength += 1 + Length.getNbBytes( binaryValue.length ) + binaryValue.length;
+    		                    }
+    		                    
+    		                }
+    
+                            localAttributeLength += 1 + Length.getNbBytes( localValuesLength ) + localValuesLength; 
+    	                }
+    	                else
+    	                {
+    	                	// We have to deal with the special wase where
+    	                	// we don't have a value.
+    	                	// It will be encoded as an empty OCTETSTRING,
+    	                	// so it will be two byte slong (0x04 0x00)
+    	                	localAttributeLength += 1 + 1;
+    	                }
+    	                
+                    }
+                    catch (NamingException ne)
+                    {
+                        return 0;
+                    }
                 }
-                catch (NamingException ne)
+                else
                 {
-                    return 0;
+                    // We have no values. We will just have an empty SET OF : 0x31 0x00
+                    localAttributeLength += 1 + 1;
                 }
                 
                 // add the attribute length to the attributes length
@@ -300,6 +308,11 @@
                 valsLength.add( new Integer( localValuesLength ) );
             }
         }
+        else
+        {
+            // We do not have any attributes, so the SEQUENCE is empty : 0x30 0x00 
+            attributesLength = 1 + 1;
+        }
         
         searchResultEntryLength += 1 + Length.getNbBytes( attributesLength ) + attributesLength;
 
@@ -362,7 +375,6 @@
                 while ( attributes.hasMoreElements() )
                 {
                     Attribute attribute = (Attribute)attributes.nextElement();
-                    if ( attribute.size() == 0 ) continue;
                     
                     // The partial attribute list sequence
                     buffer.put( UniversalTag.SEQUENCE_TAG );
@@ -376,36 +388,45 @@
                     buffer.put( UniversalTag.SET_TAG );
                     int localValuesLength = ( (Integer)valsLength.get( attributeNumber ) ).intValue();
                     buffer.put( Length.getBytes( localValuesLength ) );
-                    
-                    try
+
+                    if ( attribute.size() != 0 )
                     {
-                        NamingEnumeration values = attribute.getAll();
-                        
-                        if ( values.hasMoreElements() )
+                        try
                         {
-                            while ( values.hasMoreElements() )
+                            NamingEnumeration values = attribute.getAll();
+                            
+                            if ( values.hasMoreElements() )
                             {
-                                Object value = values.next();
-                                
-                                if ( value instanceof String )
+                                while ( values.hasMoreElements() )
                                 {
-                                	Value.encode( buffer, (String)value );
-                                }
-                                else
-                                {
-                                	Value.encode( buffer, (byte[])value );
+                                    Object value = values.next();
+                                    
+                                    if ( value instanceof String )
+                                    {
+                                    	Value.encode( buffer, (String)value );
+                                    }
+                                    else
+                                    {
+                                    	Value.encode( buffer, (byte[])value );
+                                    }
                                 }
                             }
                         }
-                    }
-                    catch (NamingException ne)
-                    {
-                        throw new EncoderException("Cannot enumerate the values");
+                        catch (NamingException ne)
+                        {
+                            throw new EncoderException("Cannot enumerate the values");
+                        }
                     }
                     
                     // Go to the next attribute number;
                     attributeNumber++;
                 }
+            }
+            else
+            {
+                // The empty partial attribute list sequence
+                buffer.put( UniversalTag.SEQUENCE_TAG );
+                buffer.put( (byte)0x00 );
             }
         }
         catch ( BufferOverflowException boe )