core: fix java.nio.ByteBuffer Java 9+ incompatible usage

This commit is contained in:
ZHANG Dapeng 2020-03-18 16:07:20 -07:00 committed by GitHub
parent b06f888615
commit e739eeabf9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 16 additions and 11 deletions

View File

@ -18,6 +18,7 @@ package io.grpc.internal;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import java.nio.Buffer;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.ArrayDeque; import java.util.ArrayDeque;
import java.util.Queue; import java.util.Queue;
@ -101,16 +102,18 @@ public class CompositeReadableBuffer extends AbstractReadableBuffer {
@Override @Override
public void readBytes(final ByteBuffer dest) { public void readBytes(final ByteBuffer dest) {
// Use Buffer instead of ByteBuffer for JDK 9+ compatibility.
final Buffer destAsBuffer = dest;
execute(new ReadOperation() { execute(new ReadOperation() {
@Override @Override
public int readInternal(ReadableBuffer buffer, int length) { public int readInternal(ReadableBuffer buffer, int length) {
// Change the limit so that only lengthToCopy bytes are available. // Change the limit so that only lengthToCopy bytes are available.
int prevLimit = dest.limit(); int prevLimit = destAsBuffer.limit();
dest.limit(dest.position() + length); destAsBuffer.limit(destAsBuffer.position() + length);
// Write the bytes and restore the original limit. // Write the bytes and restore the original limit.
buffer.readBytes(dest); buffer.readBytes(dest);
dest.limit(prevLimit); destAsBuffer.limit(prevLimit);
return 0; return 0;
} }
}, dest.remaining()); }, dest.remaining());

View File

@ -23,6 +23,7 @@ import io.grpc.KnownLength;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.nio.Buffer;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.charset.Charset; import java.nio.charset.Charset;
@ -209,7 +210,8 @@ public final class ReadableBuffers {
* A {@link ReadableBuffer} that is backed by a {@link ByteBuffer}. * A {@link ReadableBuffer} that is backed by a {@link ByteBuffer}.
*/ */
private static class ByteReadableBufferWrapper extends AbstractReadableBuffer { private static class ByteReadableBufferWrapper extends AbstractReadableBuffer {
final ByteBuffer bytes; // Use Buffer instead of ByteBuffer for JDK 9+ compatibility.
final Buffer bytes;
ByteReadableBufferWrapper(ByteBuffer bytes) { ByteReadableBufferWrapper(ByteBuffer bytes) {
this.bytes = Preconditions.checkNotNull(bytes, "bytes"); this.bytes = Preconditions.checkNotNull(bytes, "bytes");
@ -223,7 +225,7 @@ public final class ReadableBuffers {
@Override @Override
public int readUnsignedByte() { public int readUnsignedByte() {
checkReadable(1); checkReadable(1);
return bytes.get() & 0xFF; return ((ByteBuffer) bytes).get() & 0xFF;
} }
@Override @Override
@ -235,7 +237,7 @@ public final class ReadableBuffers {
@Override @Override
public void readBytes(byte[] dest, int destOffset, int length) { public void readBytes(byte[] dest, int destOffset, int length) {
checkReadable(length); checkReadable(length);
bytes.get(dest, destOffset, length); ((ByteBuffer) bytes).get(dest, destOffset, length);
} }
@Override @Override
@ -249,7 +251,7 @@ public final class ReadableBuffers {
bytes.limit(bytes.position() + length); bytes.limit(bytes.position() + length);
// Write the bytes and restore the original limit. // Write the bytes and restore the original limit.
dest.put(bytes); dest.put((ByteBuffer) bytes);
bytes.limit(prevLimit); bytes.limit(prevLimit);
} }
@ -262,7 +264,7 @@ public final class ReadableBuffers {
} else { } else {
// The buffer doesn't support array(). Copy the data to an intermediate buffer. // The buffer doesn't support array(). Copy the data to an intermediate buffer.
byte[] array = new byte[length]; byte[] array = new byte[length];
bytes.get(array); ((ByteBuffer) bytes).get(array);
dest.write(array); dest.write(array);
} }
} }
@ -270,8 +272,8 @@ public final class ReadableBuffers {
@Override @Override
public ByteReadableBufferWrapper readBytes(int length) { public ByteReadableBufferWrapper readBytes(int length) {
checkReadable(length); checkReadable(length);
ByteBuffer buffer = bytes.duplicate(); ByteBuffer buffer = ((ByteBuffer) bytes).duplicate();
buffer.limit(bytes.position() + length); ((Buffer) buffer).limit(bytes.position() + length);
bytes.position(bytes.position() + length); bytes.position(bytes.position() + length);
return new ByteReadableBufferWrapper(buffer); return new ByteReadableBufferWrapper(buffer);
} }
@ -283,7 +285,7 @@ public final class ReadableBuffers {
@Override @Override
public byte[] array() { public byte[] array() {
return bytes.array(); return ((ByteBuffer) bytes).array();
} }
@Override @Override