THRIFT-4702: Improve AutoExpandingBuffer
diff --git a/lib/java/README.md b/lib/java/README.md
index 1e4aed2..cdd4059 100644
--- a/lib/java/README.md
+++ b/lib/java/README.md
@@ -161,3 +161,12 @@
Gradle
http://gradle.org/
+
+# Breaking Changes
+
+## 0.12.0
+
+The access modifier of the AutoExpandingBuffer class has been changed from
+public to default (package) and will no longer be accessible by third-party
+libraries.
+
diff --git a/lib/java/src/org/apache/thrift/transport/AutoExpandingBuffer.java b/lib/java/src/org/apache/thrift/transport/AutoExpandingBuffer.java
index b02905f..fc3aa92 100644
--- a/lib/java/src/org/apache/thrift/transport/AutoExpandingBuffer.java
+++ b/lib/java/src/org/apache/thrift/transport/AutoExpandingBuffer.java
@@ -18,6 +18,8 @@
*/
package org.apache.thrift.transport;
+import java.util.Arrays;
+
/**
* Helper class that wraps a byte[] so that it can expand and be reused. Users
* should call resizeIfNecessary to make sure the buffer has suitable capacity,
@@ -25,28 +27,24 @@
* rate slightly faster than the requested capacity with the (untested)
* objective of avoiding expensive buffer allocations and copies.
*/
-public class AutoExpandingBuffer {
+class AutoExpandingBuffer {
private byte[] array;
- private final double growthCoefficient;
-
- public AutoExpandingBuffer(int initialCapacity, double growthCoefficient) {
- if (growthCoefficient < 1.0) {
- throw new IllegalArgumentException("Growth coefficient must be >= 1.0");
- }
- array = new byte[initialCapacity];
- this.growthCoefficient = growthCoefficient;
+ public AutoExpandingBuffer(int initialCapacity) {
+ this.array = new byte[initialCapacity];
}
public void resizeIfNecessary(int size) {
- if (array.length < size) {
- byte[] newBuf = new byte[(int)(size * growthCoefficient)];
- System.arraycopy(array, 0, newBuf, 0, array.length);
- array = newBuf;
+ final int currentCapacity = this.array.length;
+ if (currentCapacity < size) {
+ // Increase by a factor of 1.5x
+ int growCapacity = currentCapacity + (currentCapacity >> 1);
+ int newCapacity = Math.max(growCapacity, size);
+ this.array = Arrays.copyOf(array, newCapacity);
}
}
public byte[] array() {
- return array;
+ return this.array;
}
}
diff --git a/lib/java/src/org/apache/thrift/transport/AutoExpandingBufferReadTransport.java b/lib/java/src/org/apache/thrift/transport/AutoExpandingBufferReadTransport.java
index 081bc48..a28d254 100644
--- a/lib/java/src/org/apache/thrift/transport/AutoExpandingBufferReadTransport.java
+++ b/lib/java/src/org/apache/thrift/transport/AutoExpandingBufferReadTransport.java
@@ -28,8 +28,8 @@
private int pos = 0;
private int limit = 0;
- public AutoExpandingBufferReadTransport(int initialCapacity, double overgrowthCoefficient) {
- this.buf = new AutoExpandingBuffer(initialCapacity, overgrowthCoefficient);
+ public AutoExpandingBufferReadTransport(int initialCapacity) {
+ this.buf = new AutoExpandingBuffer(initialCapacity);
}
public void fill(TTransport inTrans, int length) throws TTransportException {
diff --git a/lib/java/src/org/apache/thrift/transport/AutoExpandingBufferWriteTransport.java b/lib/java/src/org/apache/thrift/transport/AutoExpandingBufferWriteTransport.java
index 9b35693..ad2ec55 100644
--- a/lib/java/src/org/apache/thrift/transport/AutoExpandingBufferWriteTransport.java
+++ b/lib/java/src/org/apache/thrift/transport/AutoExpandingBufferWriteTransport.java
@@ -26,8 +26,8 @@
private final AutoExpandingBuffer buf;
private int pos;
- public AutoExpandingBufferWriteTransport(int initialCapacity, double growthCoefficient) {
- this.buf = new AutoExpandingBuffer(initialCapacity, growthCoefficient);
+ public AutoExpandingBufferWriteTransport(int initialCapacity) {
+ this.buf = new AutoExpandingBuffer(initialCapacity);
this.pos = 0;
}
diff --git a/lib/java/src/org/apache/thrift/transport/TFastFramedTransport.java b/lib/java/src/org/apache/thrift/transport/TFastFramedTransport.java
index d265600..891d798 100644
--- a/lib/java/src/org/apache/thrift/transport/TFastFramedTransport.java
+++ b/lib/java/src/org/apache/thrift/transport/TFastFramedTransport.java
@@ -106,8 +106,8 @@
this.underlying = underlying;
this.maxLength = maxLength;
this.initialBufferCapacity = initialBufferCapacity;
- writeBuffer = new AutoExpandingBufferWriteTransport(initialBufferCapacity, 1.5);
- readBuffer = new AutoExpandingBufferReadTransport(initialBufferCapacity, 1.5);
+ writeBuffer = new AutoExpandingBufferWriteTransport(initialBufferCapacity);
+ readBuffer = new AutoExpandingBufferReadTransport(initialBufferCapacity);
}
@Override
@@ -167,7 +167,7 @@
}
public void clear() {
- readBuffer = new AutoExpandingBufferReadTransport(initialBufferCapacity, 1.5);
+ readBuffer = new AutoExpandingBufferReadTransport(initialBufferCapacity);
}
@Override
diff --git a/lib/java/test/org/apache/thrift/transport/TestAutoExpandingBuffer.java b/lib/java/test/org/apache/thrift/transport/TestAutoExpandingBuffer.java
index 337dcf8..c353489 100644
--- a/lib/java/test/org/apache/thrift/transport/TestAutoExpandingBuffer.java
+++ b/lib/java/test/org/apache/thrift/transport/TestAutoExpandingBuffer.java
@@ -23,7 +23,7 @@
public class TestAutoExpandingBuffer extends TestCase {
public void testExpands() throws Exception {
// has expected initial capacity
- AutoExpandingBuffer b = new AutoExpandingBuffer(10, 1.5);
+ AutoExpandingBuffer b = new AutoExpandingBuffer(10);
assertEquals(10, b.array().length);
// doesn't shrink
diff --git a/lib/java/test/org/apache/thrift/transport/TestAutoExpandingBufferReadTransport.java b/lib/java/test/org/apache/thrift/transport/TestAutoExpandingBufferReadTransport.java
index 2e1f947..83ebc2d 100644
--- a/lib/java/test/org/apache/thrift/transport/TestAutoExpandingBufferReadTransport.java
+++ b/lib/java/test/org/apache/thrift/transport/TestAutoExpandingBufferReadTransport.java
@@ -32,7 +32,7 @@
}
public void testIt() throws Exception {
- AutoExpandingBufferReadTransport t = new AutoExpandingBufferReadTransport(150, 1.5);
+ AutoExpandingBufferReadTransport t = new AutoExpandingBufferReadTransport(150);
TMemoryInputTransport membuf = new TMemoryInputTransport(HUNDRED_BYTES);
diff --git a/lib/java/test/org/apache/thrift/transport/TestAutoExpandingBufferWriteTransport.java b/lib/java/test/org/apache/thrift/transport/TestAutoExpandingBufferWriteTransport.java
index d5f239d..6b04feb 100644
--- a/lib/java/test/org/apache/thrift/transport/TestAutoExpandingBufferWriteTransport.java
+++ b/lib/java/test/org/apache/thrift/transport/TestAutoExpandingBufferWriteTransport.java
@@ -25,7 +25,7 @@
public class TestAutoExpandingBufferWriteTransport extends TestCase {
public void testIt() throws Exception {
- AutoExpandingBufferWriteTransport t = new AutoExpandingBufferWriteTransport(1, 1.5);
+ AutoExpandingBufferWriteTransport t = new AutoExpandingBufferWriteTransport(1);
assertEquals(1, t.getBuf().array().length);
byte[] b1 = new byte[]{1,2,3};
t.write(b1);