From 0ff5f9f1efc6a960087b3727d6be085b8f25915a Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Wed, 11 Oct 2023 19:01:14 -0700 Subject: [PATCH] Start prep work for #400 --- .../jackson/dataformat/avro/AvroGenerator.java | 13 ++++++++++++- .../avro/apacheimpl/ApacheCodecRecycler.java | 11 ++--------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/avro/src/main/java/com/fasterxml/jackson/dataformat/avro/AvroGenerator.java b/avro/src/main/java/com/fasterxml/jackson/dataformat/avro/AvroGenerator.java index dc56c521e..62098920e 100644 --- a/avro/src/main/java/com/fasterxml/jackson/dataformat/avro/AvroGenerator.java +++ b/avro/src/main/java/com/fasterxml/jackson/dataformat/avro/AvroGenerator.java @@ -6,6 +6,7 @@ import java.math.BigInteger; import org.apache.avro.io.BinaryEncoder; +import org.apache.avro.io.EncoderFactory; import com.fasterxml.jackson.core.*; import com.fasterxml.jackson.core.base.GeneratorBase; @@ -88,6 +89,11 @@ private Feature(boolean defaultState) { /********************************************************** */ + /** + * @since 2.16 + */ + protected final static EncoderFactory ENCODER_FACTORY = EncoderFactory.get(); + /** * @since 2.16 */ @@ -146,7 +152,12 @@ public AvroGenerator(IOContext ctxt, int jsonFeatures, int avroFeatures, _formatFeatures = avroFeatures; _output = output; _avroContext = AvroWriteContext.nullContext(); - _encoder = ApacheCodecRecycler.encoder(_output, isEnabled(Feature.AVRO_BUFFERING)); + + final boolean buffering = isEnabled(Feature.AVRO_BUFFERING); + BinaryEncoder encoderToReuse = ApacheCodecRecycler.acquireEncoder(); + _encoder = buffering + ? ENCODER_FACTORY.binaryEncoder(output, encoderToReuse) + : ENCODER_FACTORY.directBinaryEncoder(output, encoderToReuse); } public void setSchema(AvroSchema schema) diff --git a/avro/src/main/java/com/fasterxml/jackson/dataformat/avro/apacheimpl/ApacheCodecRecycler.java b/avro/src/main/java/com/fasterxml/jackson/dataformat/avro/apacheimpl/ApacheCodecRecycler.java index 5580ac696..e25603336 100644 --- a/avro/src/main/java/com/fasterxml/jackson/dataformat/avro/apacheimpl/ApacheCodecRecycler.java +++ b/avro/src/main/java/com/fasterxml/jackson/dataformat/avro/apacheimpl/ApacheCodecRecycler.java @@ -1,7 +1,6 @@ package com.fasterxml.jackson.dataformat.avro.apacheimpl; import java.io.InputStream; -import java.io.OutputStream; import java.lang.ref.SoftReference; import java.util.concurrent.atomic.AtomicReference; @@ -19,8 +18,6 @@ public final class ApacheCodecRecycler { protected final static DecoderFactory DECODER_FACTORY = DecoderFactory.get(); - protected final static EncoderFactory ENCODER_FACTORY = EncoderFactory.get(); - protected final static ThreadLocal> _recycler = new ThreadLocal>(); @@ -49,12 +46,8 @@ public static BinaryDecoder decoder(byte[] buffer, int offset, int len) return DECODER_FACTORY.binaryDecoder(buffer, offset, len, prev); } - public static BinaryEncoder encoder(OutputStream out, boolean buffering) - { - BinaryEncoder prev = _recycler().claimEncoder(); - return buffering - ? ENCODER_FACTORY.binaryEncoder(out, prev) - : ENCODER_FACTORY.directBinaryEncoder(out, prev); + public static BinaryEncoder acquireEncoder() { + return _recycler().claimEncoder(); } public static void release(BinaryDecoder dec) {