Author: bryanduxbury
Date: Sat Apr  3 20:25:04 2010
New Revision: 930574

URL: http://svn.apache.org/viewvc?rev=930574&view=rev
Log:
java: Enhance TMemoryInputTransport to allow operation on specific range of a 
buffer rather than the whole thing. This will allow us to avoid making array 
copies in some instances.

Modified:
    incubator/thrift/trunk/lib/java/src/org/apache/thrift/TDeserializer.java
    
incubator/thrift/trunk/lib/java/src/org/apache/thrift/transport/TFramedTransport.java
    
incubator/thrift/trunk/lib/java/src/org/apache/thrift/transport/TMemoryInputTransport.java
    
incubator/thrift/trunk/lib/java/test/org/apache/thrift/transport/TestTMemoryInputTransport.java

Modified: 
incubator/thrift/trunk/lib/java/src/org/apache/thrift/TDeserializer.java
URL: 
http://svn.apache.org/viewvc/incubator/thrift/trunk/lib/java/src/org/apache/thrift/TDeserializer.java?rev=930574&r1=930573&r2=930574&view=diff
==============================================================================
--- incubator/thrift/trunk/lib/java/src/org/apache/thrift/TDeserializer.java 
(original)
+++ incubator/thrift/trunk/lib/java/src/org/apache/thrift/TDeserializer.java 
Sat Apr  3 20:25:04 2010
@@ -52,7 +52,7 @@ public class TDeserializer {
    * @param protocolFactory Factory to create a protocol
    */
   public TDeserializer(TProtocolFactory protocolFactory) {
-    trans_ = new TMemoryInputTransport(null);
+    trans_ = new TMemoryInputTransport();
     protocol_ = protocolFactory.getProtocol(trans_);
   }
 

Modified: 
incubator/thrift/trunk/lib/java/src/org/apache/thrift/transport/TFramedTransport.java
URL: 
http://svn.apache.org/viewvc/incubator/thrift/trunk/lib/java/src/org/apache/thrift/transport/TFramedTransport.java?rev=930574&r1=930573&r2=930574&view=diff
==============================================================================
--- 
incubator/thrift/trunk/lib/java/src/org/apache/thrift/transport/TFramedTransport.java
 (original)
+++ 
incubator/thrift/trunk/lib/java/src/org/apache/thrift/transport/TFramedTransport.java
 Sat Apr  3 20:25:04 2010
@@ -85,18 +85,22 @@ public class TFramedTransport extends TT
     return readBuffer_.read(buf, off, len);
   }
 
+  @Override
   public byte[] getBuffer() {
     return readBuffer_.getBuffer();
   }
 
+  @Override
   public int getBufferPosition() {
     return readBuffer_.getBufferPosition();
   }
 
+  @Override
   public int getBytesRemainingInBuffer() {
     return readBuffer_.getBytesRemainingInBuffer();
   }
 
+  @Override
   public void consumeBuffer(int len) {
     readBuffer_.consumeBuffer(len);
   }

Modified: 
incubator/thrift/trunk/lib/java/src/org/apache/thrift/transport/TMemoryInputTransport.java
URL: 
http://svn.apache.org/viewvc/incubator/thrift/trunk/lib/java/src/org/apache/thrift/transport/TMemoryInputTransport.java?rev=930574&r1=930573&r2=930574&view=diff
==============================================================================
--- 
incubator/thrift/trunk/lib/java/src/org/apache/thrift/transport/TMemoryInputTransport.java
 (original)
+++ 
incubator/thrift/trunk/lib/java/src/org/apache/thrift/transport/TMemoryInputTransport.java
 Sat Apr  3 20:25:04 2010
@@ -1,17 +1,30 @@
 package org.apache.thrift.transport;
 
-public class TMemoryInputTransport extends TTransport {
+public final class TMemoryInputTransport extends TTransport {
 
   private byte[] buf_;
   private int pos_;
+  private int endPos_;
+
+  public TMemoryInputTransport() {
+  }
 
   public TMemoryInputTransport(byte[] buf) {
     reset(buf);
   }
 
+  public TMemoryInputTransport(byte[] buf, int offset, int length) {
+    reset(buf, offset, length);
+  }
+
   public void reset(byte[] buf) {
+    reset(buf, 0, buf.length);
+  }
+
+  public void reset(byte[] buf, int offset, int length) {
     buf_ = buf;
-    pos_ = 0;
+    pos_ = offset;
+    endPos_ = offset + length;
   }
 
   @Override
@@ -51,7 +64,7 @@ public class TMemoryInputTransport exten
   }
 
   public int getBytesRemainingInBuffer() {
-    return buf_.length - pos_;
+    return endPos_ - pos_;
   }
 
   public void consumeBuffer(int len) {

Modified: 
incubator/thrift/trunk/lib/java/test/org/apache/thrift/transport/TestTMemoryInputTransport.java
URL: 
http://svn.apache.org/viewvc/incubator/thrift/trunk/lib/java/test/org/apache/thrift/transport/TestTMemoryInputTransport.java?rev=930574&r1=930573&r2=930574&view=diff
==============================================================================
--- 
incubator/thrift/trunk/lib/java/test/org/apache/thrift/transport/TestTMemoryInputTransport.java
 (original)
+++ 
incubator/thrift/trunk/lib/java/test/org/apache/thrift/transport/TestTMemoryInputTransport.java
 Sat Apr  3 20:25:04 2010
@@ -42,4 +42,26 @@ public class TestTMemoryInputTransport e
     assertEquals(new_buf, trans.getBuffer());
     assertEquals(3, trans.getBytesRemainingInBuffer());
   }
+
+  public void testWithOffsetAndLength() throws Exception {
+    byte[] input_buf = new byte[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
+    TMemoryInputTransport trans = new TMemoryInputTransport(input_buf, 1, 3);
+    assertEquals(1, trans.getBufferPosition());
+    assertEquals(3, trans.getBytesRemainingInBuffer());
+    byte[] readBuffer = new byte[3];
+    trans.readAll(readBuffer, 0, 3);
+    assertTrue(Arrays.equals(new byte[]{2, 3, 4}, readBuffer));
+
+    try {
+      assertEquals(0, trans.readAll(readBuffer, 0, 3));
+      fail("should have thrown an exception");
+    } catch (Exception e) {
+      // yay
+    }
+
+    trans.reset(input_buf, 3, 4);
+    readBuffer = new byte[4];
+    trans.readAll(readBuffer, 0, 4);
+    assertTrue(Arrays.equals(new byte[]{4, 5, 6, 7}, readBuffer));
+  }
 }


Reply via email to