From 91ae3d067f18c648a363f5ffd33430907c387ab1 Mon Sep 17 00:00:00 2001 From: Ryan Blue Date: Sun, 21 Feb 2016 18:16:07 -0800 Subject: [PATCH] AVRO-1799: Fix GenericRecord#toString ByteBuffer bug. Reading the ByteBuffer to return a string representaton modified the buffer's position. The solution is to duplicate the buffer before reading its content. --- .../src/main/java/org/apache/avro/generic/GenericData.java | 2 +- .../test/java/org/apache/avro/generic/TestGenericData.java | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lang/java/avro/src/main/java/org/apache/avro/generic/GenericData.java b/lang/java/avro/src/main/java/org/apache/avro/generic/GenericData.java index 7c70631df52..2b01de408c0 100644 --- a/lang/java/avro/src/main/java/org/apache/avro/generic/GenericData.java +++ b/lang/java/avro/src/main/java/org/apache/avro/generic/GenericData.java @@ -547,7 +547,7 @@ protected void toString(Object datum, StringBuilder buffer) { buffer.append("\""); } else if (isBytes(datum)) { buffer.append("{\"bytes\": \""); - ByteBuffer bytes = (ByteBuffer)datum; + ByteBuffer bytes = ((ByteBuffer) datum).duplicate(); writeEscapedString(StandardCharsets.ISO_8859_1.decode(bytes), buffer); buffer.append("\"}"); } else if (((datum instanceof Float) && // quote Nan & Infinity diff --git a/lang/java/avro/src/test/java/org/apache/avro/generic/TestGenericData.java b/lang/java/avro/src/test/java/org/apache/avro/generic/TestGenericData.java index 68c33b61632..b8b59e244c7 100644 --- a/lang/java/avro/src/test/java/org/apache/avro/generic/TestGenericData.java +++ b/lang/java/avro/src/test/java/org/apache/avro/generic/TestGenericData.java @@ -321,7 +321,9 @@ public void testToStringIsJson() throws JsonParseException, IOException { @Test public void testToStringEscapesControlCharsInBytes() throws Exception { GenericData data = GenericData.get(); - assertEquals("{\"bytes\": \"a\\nb\"}", data.toString(ByteBuffer.wrap(new byte[] {'a', '\n', 'b'}))); + ByteBuffer bytes = ByteBuffer.wrap(new byte[] {'a', '\n', 'b'}); + assertEquals("{\"bytes\": \"a\\nb\"}", data.toString(bytes)); + assertEquals("{\"bytes\": \"a\\nb\"}", data.toString(bytes)); } @Test public void testToStringFixed() throws Exception {