diff --git a/helper/helper-common/src/main/java/com/linkedin/avroutil1/compatibility/AvroAdapter.java b/helper/helper-common/src/main/java/com/linkedin/avroutil1/compatibility/AvroAdapter.java
index 1e2f6b601..312d41246 100644
--- a/helper/helper-common/src/main/java/com/linkedin/avroutil1/compatibility/AvroAdapter.java
+++ b/helper/helper-common/src/main/java/com/linkedin/avroutil1/compatibility/AvroAdapter.java
@@ -37,6 +37,9 @@ public interface AvroAdapter {
BinaryDecoder newBinaryDecoder(ObjectInput in);
+ BinaryDecoder newBinaryDecoder(byte[] bytes, int offset,
+ int length, BinaryDecoder reuse);
+
JsonEncoder newJsonEncoder(Schema schema, OutputStream out, boolean pretty) throws IOException;
JsonDecoder newJsonDecoder(Schema schema, InputStream in) throws IOException;
diff --git a/helper/helper/src/main/java/com/linkedin/avroutil1/compatibility/AvroCompatibilityHelper.java b/helper/helper/src/main/java/com/linkedin/avroutil1/compatibility/AvroCompatibilityHelper.java
index cced6df2d..3fcd6537d 100644
--- a/helper/helper/src/main/java/com/linkedin/avroutil1/compatibility/AvroCompatibilityHelper.java
+++ b/helper/helper/src/main/java/com/linkedin/avroutil1/compatibility/AvroCompatibilityHelper.java
@@ -133,6 +133,22 @@ public static BinaryDecoder newBinaryDecoder(InputStream in, boolean buffered, B
return ADAPTER.newBinaryDecoder(in, buffered, reuse);
}
+ /**
+ * constructs or reinitializes a {@link BinaryDecoder} with the byte array
+ * provided as the source of data.
+ * @param bytes The byte array to initialize to
+ * @param offset The offset to start reading from
+ * @param length The maximum number of bytes to read from the byte array
+ * @param reuse The BinaryDecoder to attempt to reinitialize.
+ * @return A BinaryDecoder that uses bytes as its source of data. If
+ * reuse is null, this will be a new instance.
+ */
+ public static BinaryDecoder newBinaryDecoder(byte[] bytes, int offset,
+ int length, BinaryDecoder reuse) {
+ assertAvroAvailable();
+ return ADAPTER.newBinaryDecoder(bytes, offset, length, reuse);
+ }
+
/**
* convenience method for getting a {@link BinaryDecoder} for a given byte[]
* @param in byte array with data
diff --git a/helper/impls/helper-impl-14/src/main/java/com/linkedin/avroutil1/compatibility/avro14/Avro14Adapter.java b/helper/impls/helper-impl-14/src/main/java/com/linkedin/avroutil1/compatibility/avro14/Avro14Adapter.java
index 570525169..e5efb4dd0 100644
--- a/helper/impls/helper-impl-14/src/main/java/com/linkedin/avroutil1/compatibility/avro14/Avro14Adapter.java
+++ b/helper/impls/helper-impl-14/src/main/java/com/linkedin/avroutil1/compatibility/avro14/Avro14Adapter.java
@@ -36,6 +36,7 @@
import org.apache.avro.AvroRuntimeException;
import org.apache.avro.Schema;
import org.apache.avro.generic.GenericData;
+import org.apache.avro.io.Avro14BinaryDecoderAccessUtil;
import org.apache.avro.io.BinaryDecoder;
import org.apache.avro.io.BinaryEncoder;
import org.apache.avro.io.DecoderFactory;
@@ -106,6 +107,11 @@ public BinaryDecoder newBinaryDecoder(ObjectInput in) {
return newBinaryDecoder(new ObjectInputToInputStreamAdapter(in), false, null);
}
+ @Override
+ public BinaryDecoder newBinaryDecoder(byte[] bytes, int offset, int length, BinaryDecoder reuse) {
+ return Avro14BinaryDecoderAccessUtil.newBinaryDecoder(bytes, offset, length, reuse);
+ }
+
@Override
public JsonEncoder newJsonEncoder(Schema schema, OutputStream out, boolean pretty) throws IOException {
return new JsonEncoder(schema, out);
diff --git a/helper/impls/helper-impl-14/src/main/java/org/apache/avro/io/Avro14BinaryDecoderAccessUtil.java b/helper/impls/helper-impl-14/src/main/java/org/apache/avro/io/Avro14BinaryDecoderAccessUtil.java
new file mode 100644
index 000000000..1c8e9d4ce
--- /dev/null
+++ b/helper/impls/helper-impl-14/src/main/java/org/apache/avro/io/Avro14BinaryDecoderAccessUtil.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2020 LinkedIn Corp.
+ * Licensed under the BSD 2-Clause License (the "License").
+ * See License in the project root for license information.
+ */
+
+package org.apache.avro.io;
+
+/**
+ * this class exists to allow us access to package-private classes and methods on class {@link BinaryDecoder}
+ *
+ * the difference between this method and {@link DecoderFactory#createBinaryDecoder(byte[], int, int, BinaryDecoder)}
+ * is that this method supports configuring custom BinaryDecoder since it does not check class type of BinaryDecoder.
+ */
+public class Avro14BinaryDecoderAccessUtil {
+ public static BinaryDecoder newBinaryDecoder(byte[] bytes, int offset,
+ int length, BinaryDecoder reuse) {
+ if (null != reuse) {
+ reuse.init(bytes, offset, length);
+ return reuse;
+ } else {
+ return new BinaryDecoder(bytes, offset, length);
+ }
+ }
+}
diff --git a/helper/impls/helper-impl-15/src/main/java/com/linkedin/avroutil1/compatibility/avro15/Avro15Adapter.java b/helper/impls/helper-impl-15/src/main/java/com/linkedin/avroutil1/compatibility/avro15/Avro15Adapter.java
index 7bc0c31c0..39d72aea6 100644
--- a/helper/impls/helper-impl-15/src/main/java/com/linkedin/avroutil1/compatibility/avro15/Avro15Adapter.java
+++ b/helper/impls/helper-impl-15/src/main/java/com/linkedin/avroutil1/compatibility/avro15/Avro15Adapter.java
@@ -37,6 +37,7 @@
import java.util.stream.Collectors;
import org.apache.avro.Schema;
import org.apache.avro.generic.GenericData;
+import org.apache.avro.io.Avro15BinaryDecoderAccessUtil;
import org.apache.avro.io.BinaryDecoder;
import org.apache.avro.io.BinaryEncoder;
import org.apache.avro.io.DecoderFactory;
@@ -109,6 +110,11 @@ public BinaryDecoder newBinaryDecoder(ObjectInput in) {
return newBinaryDecoder(new ObjectInputToInputStreamAdapter(in), false, null);
}
+ @Override
+ public BinaryDecoder newBinaryDecoder(byte[] bytes, int offset, int length, BinaryDecoder reuse) {
+ return Avro15BinaryDecoderAccessUtil.newBinaryDecoder(bytes, offset, length, reuse);
+ }
+
@Override
public JsonEncoder newJsonEncoder(Schema schema, OutputStream out, boolean pretty) throws IOException {
return EncoderFactory.get().jsonEncoder(schema, out);
diff --git a/helper/impls/helper-impl-15/src/main/java/org/apache/avro/io/Avro15BinaryDecoderAccessUtil.java b/helper/impls/helper-impl-15/src/main/java/org/apache/avro/io/Avro15BinaryDecoderAccessUtil.java
new file mode 100644
index 000000000..8adab2856
--- /dev/null
+++ b/helper/impls/helper-impl-15/src/main/java/org/apache/avro/io/Avro15BinaryDecoderAccessUtil.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2020 LinkedIn Corp.
+ * Licensed under the BSD 2-Clause License (the "License").
+ * See License in the project root for license information.
+ */
+
+package org.apache.avro.io;
+
+/**
+ * this class exists to allow us access to package-private classes and methods on class {@link BinaryDecoder}
+ *
+ * the difference between this method and {@link DecoderFactory#binaryDecoder(byte[], int, int, BinaryDecoder)}
+ * is that this method supports configuring custom BinaryDecoder since it does not check class type of BinaryDecoder.
+ */
+public class Avro15BinaryDecoderAccessUtil {
+ public static BinaryDecoder newBinaryDecoder(byte[] bytes, int offset,
+ int length, BinaryDecoder reuse) {
+ if (null == reuse) {
+ return new BinaryDecoder(bytes, offset, length);
+ } else {
+ return reuse.configure(bytes, offset, length);
+ }
+ }
+}
diff --git a/helper/impls/helper-impl-16/src/main/java/com/linkedin/avroutil1/compatibility/avro16/Avro16Adapter.java b/helper/impls/helper-impl-16/src/main/java/com/linkedin/avroutil1/compatibility/avro16/Avro16Adapter.java
index a434fcec5..fcac6eca3 100644
--- a/helper/impls/helper-impl-16/src/main/java/com/linkedin/avroutil1/compatibility/avro16/Avro16Adapter.java
+++ b/helper/impls/helper-impl-16/src/main/java/com/linkedin/avroutil1/compatibility/avro16/Avro16Adapter.java
@@ -36,6 +36,7 @@
import java.util.stream.Collectors;
import org.apache.avro.Schema;
import org.apache.avro.generic.GenericData;
+import org.apache.avro.io.Avro16BinaryDecoderAccessUtil;
import org.apache.avro.io.BinaryDecoder;
import org.apache.avro.io.BinaryEncoder;
import org.apache.avro.io.DecoderFactory;
@@ -115,6 +116,11 @@ public BinaryDecoder newBinaryDecoder(ObjectInput in) {
return newBinaryDecoder(new ObjectInputToInputStreamAdapter(in), false, null);
}
+ @Override
+ public BinaryDecoder newBinaryDecoder(byte[] bytes, int offset, int length, BinaryDecoder reuse) {
+ return Avro16BinaryDecoderAccessUtil.newBinaryDecoder(bytes, offset, length, reuse);
+ }
+
@Override
public JsonEncoder newJsonEncoder(Schema schema, OutputStream out, boolean pretty) throws IOException {
return EncoderFactory.get().jsonEncoder(schema, out);
diff --git a/helper/impls/helper-impl-16/src/main/java/org/apache/avro/io/Avro16BinaryDecoderAccessUtil.java b/helper/impls/helper-impl-16/src/main/java/org/apache/avro/io/Avro16BinaryDecoderAccessUtil.java
new file mode 100644
index 000000000..48c0836f1
--- /dev/null
+++ b/helper/impls/helper-impl-16/src/main/java/org/apache/avro/io/Avro16BinaryDecoderAccessUtil.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2020 LinkedIn Corp.
+ * Licensed under the BSD 2-Clause License (the "License").
+ * See License in the project root for license information.
+ */
+
+package org.apache.avro.io;
+
+/**
+ * this class exists to allow us access to package-private classes and methods on class {@link BinaryDecoder}
+ *
+ * the difference between this method and {@link DecoderFactory#binaryDecoder(byte[], int, int, BinaryDecoder)}
+ * is that this method supports configuring custom BinaryDecoder since it does not check class type of BinaryDecoder.
+ */
+public class Avro16BinaryDecoderAccessUtil {
+ public static BinaryDecoder newBinaryDecoder(byte[] bytes, int offset,
+ int length, BinaryDecoder reuse) {
+ if (null == reuse) {
+ return new BinaryDecoder(bytes, offset, length);
+ } else {
+ return reuse.configure(bytes, offset, length);
+ }
+ }
+}
diff --git a/helper/impls/helper-impl-17/src/main/java/com/linkedin/avroutil1/compatibility/avro17/Avro17Adapter.java b/helper/impls/helper-impl-17/src/main/java/com/linkedin/avroutil1/compatibility/avro17/Avro17Adapter.java
index 6742dd987..e52f0bd69 100644
--- a/helper/impls/helper-impl-17/src/main/java/com/linkedin/avroutil1/compatibility/avro17/Avro17Adapter.java
+++ b/helper/impls/helper-impl-17/src/main/java/com/linkedin/avroutil1/compatibility/avro17/Avro17Adapter.java
@@ -36,6 +36,7 @@
import org.apache.avro.Schema;
import org.apache.avro.SchemaNormalization;
import org.apache.avro.generic.GenericData;
+import org.apache.avro.io.Avro17BinaryDecoderAccessUtil;
import org.apache.avro.io.BinaryDecoder;
import org.apache.avro.io.BinaryEncoder;
import org.apache.avro.io.DecoderFactory;
@@ -158,6 +159,11 @@ public BinaryDecoder newBinaryDecoder(ObjectInput in) {
return newBinaryDecoder(new ObjectInputToInputStreamAdapter(in), false, null);
}
+ @Override
+ public BinaryDecoder newBinaryDecoder(byte[] bytes, int offset, int length, BinaryDecoder reuse) {
+ return Avro17BinaryDecoderAccessUtil.newBinaryDecoder(bytes, offset, length, reuse);
+ }
+
@Override
public JsonEncoder newJsonEncoder(Schema schema, OutputStream out, boolean pretty) throws IOException {
return EncoderFactory.get().jsonEncoder(schema, out, pretty);
diff --git a/helper/impls/helper-impl-17/src/main/java/org/apache/avro/io/Avro17BinaryDecoderAccessUtil.java b/helper/impls/helper-impl-17/src/main/java/org/apache/avro/io/Avro17BinaryDecoderAccessUtil.java
new file mode 100644
index 000000000..eaa66c921
--- /dev/null
+++ b/helper/impls/helper-impl-17/src/main/java/org/apache/avro/io/Avro17BinaryDecoderAccessUtil.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2020 LinkedIn Corp.
+ * Licensed under the BSD 2-Clause License (the "License").
+ * See License in the project root for license information.
+ */
+
+package org.apache.avro.io;
+
+/**
+ * this class exists to allow us access to package-private classes and methods on class {@link BinaryDecoder}
+ *
+ * the difference between this method and {@link DecoderFactory#binaryDecoder(byte[], int, int, BinaryDecoder)}
+ * is that this method supports configuring custom BinaryDecoder since it does not check class type of BinaryDecoder.
+ */
+public class Avro17BinaryDecoderAccessUtil {
+ public static BinaryDecoder newBinaryDecoder(byte[] bytes, int offset,
+ int length, BinaryDecoder reuse) {
+ if (null == reuse) {
+ return new BinaryDecoder(bytes, offset, length);
+ } else {
+ return reuse.configure(bytes, offset, length);
+ }
+ }
+}
diff --git a/helper/impls/helper-impl-18/src/main/java/com/linkedin/avroutil1/compatibility/avro18/Avro18Adapter.java b/helper/impls/helper-impl-18/src/main/java/com/linkedin/avroutil1/compatibility/avro18/Avro18Adapter.java
index 5f7232dd4..414bbc592 100644
--- a/helper/impls/helper-impl-18/src/main/java/com/linkedin/avroutil1/compatibility/avro18/Avro18Adapter.java
+++ b/helper/impls/helper-impl-18/src/main/java/com/linkedin/avroutil1/compatibility/avro18/Avro18Adapter.java
@@ -32,6 +32,7 @@
import org.apache.avro.Schema;
import org.apache.avro.SchemaNormalization;
import org.apache.avro.generic.GenericData;
+import org.apache.avro.io.Avro18BinaryDecoderAccessUtil;
import org.apache.avro.io.BinaryDecoder;
import org.apache.avro.io.BinaryEncoder;
import org.apache.avro.io.DecoderFactory;
@@ -117,6 +118,11 @@ public BinaryDecoder newBinaryDecoder(ObjectInput in) {
return newBinaryDecoder(new ObjectInputToInputStreamAdapter(in), false, null);
}
+ @Override
+ public BinaryDecoder newBinaryDecoder(byte[] bytes, int offset, int length, BinaryDecoder reuse) {
+ return Avro18BinaryDecoderAccessUtil.newBinaryDecoder(bytes, offset, length, reuse);
+ }
+
@Override
public JsonEncoder newJsonEncoder(Schema schema, OutputStream out, boolean pretty) throws IOException {
return EncoderFactory.get().jsonEncoder(schema, out, pretty);
diff --git a/helper/impls/helper-impl-18/src/main/java/org/apache/avro/io/Avro18BinaryDecoderAccessUtil.java b/helper/impls/helper-impl-18/src/main/java/org/apache/avro/io/Avro18BinaryDecoderAccessUtil.java
new file mode 100644
index 000000000..10896b309
--- /dev/null
+++ b/helper/impls/helper-impl-18/src/main/java/org/apache/avro/io/Avro18BinaryDecoderAccessUtil.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2020 LinkedIn Corp.
+ * Licensed under the BSD 2-Clause License (the "License").
+ * See License in the project root for license information.
+ */
+
+package org.apache.avro.io;
+
+/**
+ * this class exists to allow us access to package-private classes and methods on class {@link BinaryDecoder}
+ *
+ * the difference between this method and {@link DecoderFactory#binaryDecoder(byte[], int, int, BinaryDecoder)}
+ * is that this method supports configuring custom BinaryDecoder since it does not check class type of BinaryDecoder.
+ */
+public class Avro18BinaryDecoderAccessUtil {
+ public static BinaryDecoder newBinaryDecoder(byte[] bytes, int offset,
+ int length, BinaryDecoder reuse) {
+ if (null == reuse) {
+ return new BinaryDecoder(bytes, offset, length);
+ } else {
+ return reuse.configure(bytes, offset, length);
+ }
+ }
+}
diff --git a/helper/impls/helper-impl-19/src/main/java/com/linkedin/avroutil1/compatibility/avro19/Avro19Adapter.java b/helper/impls/helper-impl-19/src/main/java/com/linkedin/avroutil1/compatibility/avro19/Avro19Adapter.java
index 2a3b37930..22abff87d 100644
--- a/helper/impls/helper-impl-19/src/main/java/com/linkedin/avroutil1/compatibility/avro19/Avro19Adapter.java
+++ b/helper/impls/helper-impl-19/src/main/java/com/linkedin/avroutil1/compatibility/avro19/Avro19Adapter.java
@@ -32,6 +32,7 @@
import org.apache.avro.Schema;
import org.apache.avro.SchemaNormalization;
import org.apache.avro.generic.GenericData;
+import org.apache.avro.io.Avro19BinaryDecoderAccessUtil;
import org.apache.avro.io.BinaryDecoder;
import org.apache.avro.io.BinaryEncoder;
import org.apache.avro.io.DecoderFactory;
@@ -117,6 +118,11 @@ public BinaryDecoder newBinaryDecoder(ObjectInput in) {
return newBinaryDecoder(new ObjectInputToInputStreamAdapter(in), false, null);
}
+ @Override
+ public BinaryDecoder newBinaryDecoder(byte[] bytes, int offset, int length, BinaryDecoder reuse) {
+ return Avro19BinaryDecoderAccessUtil.newBinaryDecoder(bytes, offset, length, reuse);
+ }
+
@Override
public JsonEncoder newJsonEncoder(Schema schema, OutputStream out, boolean pretty) throws IOException {
return EncoderFactory.get().jsonEncoder(schema, out, pretty);
diff --git a/helper/impls/helper-impl-19/src/main/java/org/apache/avro/io/Avro19BinaryDecoderAccessUtil.java b/helper/impls/helper-impl-19/src/main/java/org/apache/avro/io/Avro19BinaryDecoderAccessUtil.java
new file mode 100644
index 000000000..0a1a9b8e6
--- /dev/null
+++ b/helper/impls/helper-impl-19/src/main/java/org/apache/avro/io/Avro19BinaryDecoderAccessUtil.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2020 LinkedIn Corp.
+ * Licensed under the BSD 2-Clause License (the "License").
+ * See License in the project root for license information.
+ */
+
+package org.apache.avro.io;
+
+/**
+ * this class exists to allow us access to package-private classes and methods on class {@link BinaryDecoder}
+ *
+ * the difference between this method and {@link DecoderFactory#binaryDecoder(byte[], int, int, BinaryDecoder)}
+ * is that this method supports configuring custom BinaryDecoder since it does not check class type of BinaryDecoder.
+ */
+public class Avro19BinaryDecoderAccessUtil {
+ public static BinaryDecoder newBinaryDecoder(byte[] bytes, int offset,
+ int length, BinaryDecoder reuse) {
+ if (null == reuse) {
+ return new BinaryDecoder(bytes, offset, length);
+ } else {
+ return reuse.configure(bytes, offset, length);
+ }
+ }
+}
\ No newline at end of file