You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by ni...@apache.org on 2005/12/04 18:01:46 UTC

svn commit: r353872 - in /directory/network/trunk/src: java/org/apache/mina/common/ByteBuffer.java java/org/apache/mina/common/ByteBufferProxy.java test/org/apache/mina/common/ByteBufferTest.java

Author: niklas
Date: Sun Dec  4 09:01:38 2005
New Revision: 353872

URL: http://svn.apache.org/viewcvs?rev=353872&view=rev
Log:
Resolved issue DIRMINA-127

Modified:
    directory/network/trunk/src/java/org/apache/mina/common/ByteBuffer.java
    directory/network/trunk/src/java/org/apache/mina/common/ByteBufferProxy.java
    directory/network/trunk/src/test/org/apache/mina/common/ByteBufferTest.java

Modified: directory/network/trunk/src/java/org/apache/mina/common/ByteBuffer.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/common/ByteBuffer.java?rev=353872&r1=353871&r2=353872&view=diff
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/common/ByteBuffer.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/common/ByteBuffer.java Sun Dec  4 09:01:38 2005
@@ -380,6 +380,28 @@
      * @see java.nio.Buffer#clear()
      */
     public abstract ByteBuffer clear();
+    
+    /**
+     * Clears this buffer and fills its content with <tt>NUL</tt>.
+     * The position is set to zero, the limit is set to the capacity,
+     * and the mark is discarded.
+     */
+    public ByteBuffer sweep()
+    {
+        clear();
+        return fillAndReset( remaining() );
+    }
+    
+    /**
+     * Clears this buffer and fills its content with <tt>value</tt>.
+     * The position is set to zero, the limit is set to the capacity,
+     * and the mark is discarded.
+     */
+    public ByteBuffer sweep( byte value )
+    {
+        clear();
+        return fillAndReset( value, remaining() );
+    }
 
     /**
      * @see java.nio.Buffer#flip()
@@ -802,21 +824,79 @@
             CharSequence in, int fieldSize, CharsetEncoder encoder ) throws CharacterCodingException;
 
     /**
-     * Reads a Pascal string which as a 16-bit length field before the actual
+     * Reads a string which has a 16-bit length field before the actual
      * encoded string, using the specified <code>decoder</code> and returns it.
+     * This method is a shortcut for <tt>getPrefixedString(2, decoder)</tt>.
      */
-    public abstract String getPascalString( CharsetDecoder decoder ) throws CharacterCodingException;
+    public String getPrefixedString( CharsetDecoder decoder ) throws CharacterCodingException
+    {
+        return getPrefixedString( 2, decoder );
+    }
+    
+    /**
+     * Reads a string which has a length field before the actual
+     * encoded string, using the specified <code>decoder</code> and returns it.
+     * 
+     * @param prefixLength the length of the length field (1, 2, or 4)
+     */
+    public abstract String getPrefixedString( int prefixLength, CharsetDecoder decoder ) throws CharacterCodingException;
 
     /**
      * Writes the content of <code>in</code> into this buffer as a 
-     * Pascal string which has a 16-bit length field before the actual
+     * string which has a 16-bit length field before the actual
+     * encoded string, using the specified <code>encoder</code>.
+     * This method is a shortcut for <tt>putPrefixedString(in, 2, 0, encoder)</tt>.
+     * 
+     * @throws BufferOverflowException if the specified string doesn't fit
+     */
+    public ByteBuffer putPrefixedString( CharSequence in, CharsetEncoder encoder ) throws CharacterCodingException
+    {
+        return putPrefixedString( in, 2, 0, encoder );
+    }
+    
+    /**
+     * Writes the content of <code>in</code> into this buffer as a 
+     * string which has a 16-bit length field before the actual
+     * encoded string, using the specified <code>encoder</code>.
+     * This method is a shortcut for <tt>putPrefixedString(in, prefixLength, 0, encoder)</tt>.
+     * 
+     * @param prefixLength the length of the length field (1, 2, or 4)
+     * 
+     * @throws BufferOverflowException if the specified string doesn't fit
+     */
+    public ByteBuffer putPrefixedString( CharSequence in, int prefixLength, CharsetEncoder encoder ) throws CharacterCodingException
+    {
+        return putPrefixedString( in, prefixLength, 0, encoder );
+    }
+    
+    /**
+     * Writes the content of <code>in</code> into this buffer as a 
+     * string which has a 16-bit length field before the actual
+     * encoded string, using the specified <code>encoder</code>.
+     * This method is a shortcut for <tt>putPrefixedString(in, prefixLength, padding, ( byte ) 0, encoder)</tt>.
+     * 
+     * @param prefixLength the length of the length field (1, 2, or 4)
+     * @param padding the number of padded <tt>NUL</tt>s (1 (or 0), 2, or 4)
+     *  
+     * @throws BufferOverflowException if the specified string doesn't fit
+     */
+    public ByteBuffer putPrefixedString( CharSequence in, int prefixLength, int padding, CharsetEncoder encoder ) throws CharacterCodingException
+    {
+        return putPrefixedString( in, prefixLength, padding, ( byte ) 0, encoder );
+    }
+    
+    /**
+     * Writes the content of <code>in</code> into this buffer as a 
+     * string which has a 16-bit length field before the actual
      * encoded string, using the specified <code>encoder</code>.
-     * This method doesn't terminate the string with <tt>NUL</tt>
-     * because we don't need to do so.
      * 
+     * @param prefixLength the length of the length field (1, 2, or 4)
+     * @param padding the number of padded bytes (1 (or 0), 2, or 4)
+     * @param padValue the value of padded bytes
+     *  
      * @throws BufferOverflowException if the specified string doesn't fit
      */
-    public abstract ByteBuffer putPascalString( CharSequence in, CharsetEncoder encoder ) throws CharacterCodingException;
+    public abstract ByteBuffer putPrefixedString( CharSequence in, int prefixLength, int padding, byte padValue, CharsetEncoder encoder ) throws CharacterCodingException;
     
     /**
      * Reads a Java object from the buffer using the context {@link ClassLoader}
@@ -871,20 +951,6 @@
      */
     public abstract ByteBuffer fillAndReset( int size );
     
-    /**
-     * Sweeps this buffer clean from any previous content. Sets the position to 
-     * zero and the limit to the capacity and sets all bytes between position 
-     * and limit to <code>NUL (0x00)</code>.
-     */
-    public abstract ByteBuffer sweep();
-    
-    /**
-     * Sweeps this buffer clean from any previous content. Sets the position to 
-     * zero and the limit to the capacity and sets all bytes between position 
-     * and limit to the specified value.
-     */
-    public abstract ByteBuffer sweep( byte value );
-    
     private static class DefaultByteBuffer extends ByteBuffer
     {
         private java.nio.ByteBuffer buf;
@@ -1697,9 +1763,25 @@
             return this;
         }
         
-        public String getPascalString( CharsetDecoder decoder ) throws CharacterCodingException
+        public String getPrefixedString( int prefixLength, CharsetDecoder decoder ) throws CharacterCodingException
         {
-            int fieldSize = getUnsignedShort();
+            int fieldSize;
+            
+            switch( prefixLength )
+            {
+            case 1:
+                fieldSize = getUnsigned();
+                break;
+            case 2:
+                fieldSize = getUnsignedShort();
+                break;
+            case 4:
+                fieldSize = getInt();
+                break;
+            default:
+                throw new IllegalArgumentException( "prefixLength: " + prefixLength );
+            }
+
             if( fieldSize < 0 )
             {
                 throw new BufferDataException( "Invalid fieldSize: " + fieldSize );
@@ -1764,23 +1846,67 @@
             return out.flip().toString();
         }
         
-        public ByteBuffer putPascalString( CharSequence val, CharsetEncoder encoder ) throws CharacterCodingException
+        public ByteBuffer putPrefixedString( CharSequence val, int prefixLength, int padding, byte padValue, CharsetEncoder encoder ) throws CharacterCodingException
         {
-            if( val.length() > 65535 )
+            int maxLength;
+            switch( prefixLength )
+            {
+            case 1:
+                maxLength = 255;
+                break;
+            case 2:
+                maxLength = 65535;
+                break;
+            case 4:
+                maxLength = Integer.MAX_VALUE;
+                break;
+            default:
+                throw new IllegalArgumentException( "prefixLength: " + prefixLength );
+            }
+            
+            if( val.length() > maxLength )
             {
                 throw new IllegalArgumentException( "The specified string is too long." );
             }
             if( val.length() == 0 )
             {
-                putShort( ( short ) 0 );
+                switch( prefixLength )
+                {
+                case 1:
+                    put( ( byte ) 0 );
+                    break;
+                case 2:
+                    putShort( ( short ) 0 );
+                    break;
+                case 4:
+                    putInt( 0 );
+                    break;
+                }
                 return this;
             }
             
+            int padMask;
+            switch( padding )
+            {
+            case 0:
+            case 1:
+                padMask = 0;
+                break;
+            case 2:
+                padMask = 1;
+                break;
+            case 4:
+                padMask = 3;
+                break;
+            default:
+                throw new IllegalArgumentException( "padding: " + padding );
+            }
+
             CharBuffer in = CharBuffer.wrap( val ); 
             int expectedLength = (int) (in.remaining() * encoder.averageBytesPerChar());
 
+            skip( prefixLength ); // make a room for the length field
             int oldPos = position();
-            skip( 2 ); // make a room for the length field
             encoder.reset();
 
             for (;;) {
@@ -1794,7 +1920,7 @@
                     cr = encoder.flush( buf() );
                 }
                 
-                if( position() - oldPos > 65535 )
+                if( position() - oldPos > maxLength )
                 {
                     throw new IllegalArgumentException( "The specified string is too long." );
                 }
@@ -1812,10 +1938,20 @@
             }
             
             // Write the length field
-            int newPos = position();
-            position( oldPos );
-            putShort( ( short ) ( newPos - oldPos - 2 ) );
-            position( newPos );
+            fill( padValue, padding - ( ( position() - oldPos ) & padMask ) );
+            int length = position() - oldPos;
+            switch( prefixLength )
+            {
+            case 1:
+                put( oldPos - 1, ( byte ) length );
+                break;
+            case 2:
+                putShort( oldPos - 2, ( short ) length );
+                break;
+            case 4:
+                putInt( oldPos - 4, length );
+                break;
+            }
             return this;
         }
         
@@ -1890,18 +2026,6 @@
         {
             autoExpand( size );
             return position( position() + size );
-        }
-
-        public ByteBuffer sweep()
-        {
-            clear();
-            return fillAndReset( remaining() );
-        }
-
-        public ByteBuffer sweep( byte value )
-        {
-            clear();
-            return fillAndReset( value, remaining() );
         }
 
         public ByteBuffer fill( byte value, int size )

Modified: directory/network/trunk/src/java/org/apache/mina/common/ByteBufferProxy.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/common/ByteBufferProxy.java?rev=353872&r1=353871&r2=353872&view=diff
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/common/ByteBufferProxy.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/common/ByteBufferProxy.java Sun Dec  4 09:01:38 2005
@@ -127,6 +127,18 @@
         return this;
     }
 
+    public ByteBuffer sweep()
+    {
+        buf.sweep();
+        return this;
+    }
+    
+    public ByteBuffer sweep( byte value )
+    {
+        buf.sweep( value );
+        return this;
+    }
+
     public ByteBuffer flip()
     {
         buf.flip();
@@ -453,10 +465,16 @@
         return buf.getString( decoder );
     }
     
-    public String getPascalString( CharsetDecoder decoder )
+    public String getPrefixedString( CharsetDecoder decoder )
             throws CharacterCodingException
     {
-        return buf.getPascalString( decoder );
+        return buf.getPrefixedString( decoder );
+    }
+
+    public String getPrefixedString( int prefixLength, CharsetDecoder decoder )
+            throws CharacterCodingException
+    {
+        return buf.getPrefixedString( prefixLength, decoder );
     }
 
     public ByteBuffer putString( CharSequence in, int fieldSize,
@@ -474,10 +492,24 @@
         return this;
     }
     
-    public ByteBuffer putPascalString( CharSequence in, CharsetEncoder encoder )
+    public ByteBuffer putPrefixedString( CharSequence in, CharsetEncoder encoder )
+            throws CharacterCodingException
+    {
+        buf.putPrefixedString( in, encoder );
+        return this;
+    }
+
+    public ByteBuffer putPrefixedString( CharSequence in, int prefixLength, int padding, CharsetEncoder encoder )
+            throws CharacterCodingException
+    {
+        buf.putPrefixedString( in, prefixLength, padding, encoder );
+        return this;
+    }
+
+    public ByteBuffer putPrefixedString( CharSequence in, int prefixLength, int padding, byte padValue, CharsetEncoder encoder )
             throws CharacterCodingException
     {
-        buf.putPascalString( in, encoder );
+        buf.putPrefixedString( in, prefixLength, padding, padValue, encoder );
         return this;
     }
 
@@ -508,18 +540,6 @@
     public ByteBuffer fillAndReset( int size )
     {
         buf.fillAndReset( size );
-        return this;
-    }
-
-    public ByteBuffer sweep()
-    {
-        buf.sweep();
-        return this;
-    }
-
-    public ByteBuffer sweep( byte value )
-    {
-        buf.sweep( value );
         return this;
     }
 

Modified: directory/network/trunk/src/test/org/apache/mina/common/ByteBufferTest.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/test/org/apache/mina/common/ByteBufferTest.java?rev=353872&r1=353871&r2=353872&view=diff
==============================================================================
--- directory/network/trunk/src/test/org/apache/mina/common/ByteBufferTest.java (original)
+++ directory/network/trunk/src/test/org/apache/mina/common/ByteBufferTest.java Sun Dec  4 09:01:38 2005
@@ -323,7 +323,7 @@
         Assert.assertEquals( 0, buf.get( 1 ) );
     }
     
-    public void testGetPascalString() throws Exception
+    public void testGetPrefixedString() throws Exception
     {
         ByteBuffer buf = ByteBuffer.allocate( 16 );
         CharsetEncoder encoder;
@@ -334,10 +334,10 @@
         buf.putShort( ( short ) 3 );
         buf.putString( "ABCD", encoder );
         buf.clear();
-        Assert.assertEquals( "ABC", buf.getPascalString( decoder ) );
+        Assert.assertEquals( "ABC", buf.getPrefixedString( decoder ) );
     }
     
-    public void testPutPascalString() throws Exception
+    public void testPutPrefixedString() throws Exception
     {
         CharsetEncoder encoder;
         ByteBuffer buf = ByteBuffer.allocate( 16 );
@@ -345,7 +345,7 @@
         encoder = Charset.forName( "ISO-8859-1" ).newEncoder();
         
         // Without autoExpand
-        buf.putPascalString( "ABC", encoder );
+        buf.putPrefixedString( "ABC", encoder );
         Assert.assertEquals( 5, buf.position() );
         Assert.assertEquals( 0, buf.get( 0 ) );
         Assert.assertEquals( 3, buf.get( 1 ) );
@@ -356,7 +356,7 @@
         buf.clear();
         try
         {
-            buf.putPascalString( "123456789012345", encoder );
+            buf.putPrefixedString( "123456789012345", encoder );
             Assert.fail();
         }
         catch( BufferOverflowException e )
@@ -367,7 +367,7 @@
         // With autoExpand
         buf.clear();
         buf.setAutoExpand( true );
-        buf.putPascalString( "123456789012345", encoder );
+        buf.putPrefixedString( "123456789012345", encoder );
         Assert.assertEquals( 17, buf.position() );
         Assert.assertEquals( 0, buf.get( 0 ) );
         Assert.assertEquals( 15, buf.get( 1 ) );
@@ -388,6 +388,54 @@
         Assert.assertEquals( '5', buf.get( 16 ) );
     }
     
+    public void testPutPrefixedStringWithPrefixLength() throws Exception
+    {
+        CharsetEncoder encoder = Charset.forName( "ISO-8859-1" ).newEncoder();
+        ByteBuffer buf = ByteBuffer.allocate( 16 ).sweep().setAutoExpand( true );
+        
+        buf.putPrefixedString( "A", 1, encoder );
+        Assert.assertEquals( 2, buf.position() );
+        Assert.assertEquals( 1, buf.get( 0 ) );
+        Assert.assertEquals( 'A', buf.get( 1 ) );
+        
+        buf.sweep();
+        buf.putPrefixedString( "A", 2, encoder );
+        Assert.assertEquals( 3, buf.position() );
+        Assert.assertEquals( 0, buf.get( 0 ) );
+        Assert.assertEquals( 1, buf.get( 1 ) );
+        Assert.assertEquals( 'A', buf.get( 2 ) );
+        
+        buf.sweep();
+        buf.putPrefixedString( "A", 4, encoder );
+        Assert.assertEquals( 5, buf.position() );
+        Assert.assertEquals( 0, buf.get( 0 ) );
+        Assert.assertEquals( 0, buf.get( 1 ) );
+        Assert.assertEquals( 0, buf.get( 2 ) );
+        Assert.assertEquals( 1, buf.get( 3 ) );
+        Assert.assertEquals( 'A', buf.get( 4 ) );
+    }
+        
+    public void testPutPrefixedStringWithPadding() throws Exception
+    {
+        CharsetEncoder encoder = Charset.forName( "ISO-8859-1" ).newEncoder();
+        ByteBuffer buf = ByteBuffer.allocate( 16 ).sweep().setAutoExpand( true );
+        
+        buf.putPrefixedString( "A", 1, 2, ( byte ) 32, encoder );
+        Assert.assertEquals( 3, buf.position() );
+        Assert.assertEquals( 2, buf.get( 0 ) );
+        Assert.assertEquals( 'A', buf.get( 1 ) );
+        Assert.assertEquals( ' ', buf.get( 2 ) );
+        
+        buf.sweep();
+        buf.putPrefixedString( "A", 1, 4, ( byte ) 32, encoder );
+        Assert.assertEquals( 5, buf.position() );
+        Assert.assertEquals( 4, buf.get( 0 ) );
+        Assert.assertEquals( 'A', buf.get( 1 ) );
+        Assert.assertEquals( ' ', buf.get( 2 ) );
+        Assert.assertEquals( ' ', buf.get( 3 ) );
+        Assert.assertEquals( ' ', buf.get( 4 ) );
+    }
+        
     public void testObjectSerialization() throws Exception
     {
         ByteBuffer buf = ByteBuffer.allocate( 16 );