From 84e00282892c9e0e3c7ea28bcf8b714eedf6c38a Mon Sep 17 00:00:00 2001 From: Christophe Le Saec Date: Mon, 19 Jun 2023 18:09:17 +0200 Subject: [PATCH] AVRO-3644: keep up to date --- .../avro/generic/ConversionsContainer.java | 20 ++++++++- .../org/apache/avro/generic/GenericData.java | 41 +++++++++---------- .../generic/ConversionsContainerTest.java | 2 +- 3 files changed, 39 insertions(+), 24 deletions(-) diff --git a/lang/java/avro/src/main/java/org/apache/avro/generic/ConversionsContainer.java b/lang/java/avro/src/main/java/org/apache/avro/generic/ConversionsContainer.java index 5ff9a68152e..874db7b0ce0 100644 --- a/lang/java/avro/src/main/java/org/apache/avro/generic/ConversionsContainer.java +++ b/lang/java/avro/src/main/java/org/apache/avro/generic/ConversionsContainer.java @@ -25,6 +25,7 @@ import java.util.IdentityHashMap; import java.util.LinkedHashMap; import java.util.Map; +import java.util.ServiceLoader; public class ConversionsContainer { @@ -53,6 +54,21 @@ public Collection> getConversions() { return conversions.values(); } + public ConversionsContainer(ClassLoader classLoader) { + this.loadConversions(classLoader); + } + + /** + * Use the Java 6 ServiceLoader to load conversions. + * + * @see #addLogicalTypeConversion(Conversion) + */ + private void loadConversions(ClassLoader classLoader) { + for (Conversion conversion : ServiceLoader.load(Conversion.class, classLoader)) { + addLogicalTypeConversion(conversion); + } + } + /** * Registers the given conversion to be used when reading and writing with this * data model. @@ -107,11 +123,11 @@ public Conversion getConversionByClass(Class datumClass, LogicalType l * @return the conversion for the logical type, or null */ @SuppressWarnings("unchecked") - public Conversion getConversionFor(LogicalType logicalType) { + public Conversion getConversionFor(LogicalType logicalType) { if (logicalType == null) { return null; } - return (Conversion) conversions.get(logicalType.getName()); + return (Conversion) conversions.get(logicalType.getName()); } public ClassConversions forClass(Class clazz) { 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 f153a797b4e..3cdfcaca6ec 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 @@ -17,25 +17,6 @@ */ package org.apache.avro.generic; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.nio.Buffer; -import java.nio.ByteBuffer; -import java.nio.charset.StandardCharsets; -import java.time.temporal.Temporal; -import java.util.AbstractList; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; -import java.util.IdentityHashMap; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.ServiceLoader; -import java.util.UUID; -import java.util.concurrent.ConcurrentMap; - import org.apache.avro.AvroMissingFieldException; import org.apache.avro.AvroRuntimeException; import org.apache.avro.AvroTypeException; @@ -57,9 +38,26 @@ import org.apache.avro.io.FastReaderBuilder; import org.apache.avro.util.Utf8; import org.apache.avro.util.internal.Accessor; +import org.apache.avro.util.springframework.ConcurrentReferenceHashMap; import com.fasterxml.jackson.databind.JsonNode; -import org.apache.avro.util.springframework.ConcurrentReferenceHashMap; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.nio.Buffer; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import java.time.temporal.Temporal; +import java.util.AbstractList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.IdentityHashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentMap; import static org.apache.avro.util.springframework.ConcurrentReferenceHashMap.ReferenceType.WEAK; @@ -118,6 +116,7 @@ public GenericData() { /** For subclasses. GenericData does not use a ClassLoader. */ public GenericData(ClassLoader classLoader) { this.classLoader = (classLoader != null) ? classLoader : getClass().getClassLoader(); + this.conversions = new ConversionsContainer(classLoader); } /** Return the class loader that's used (by subclasses). */ @@ -125,7 +124,7 @@ public ClassLoader getClassLoader() { return classLoader; } - private final ConversionsContainer conversions = new ConversionsContainer(); + private final ConversionsContainer conversions; public Collection> getConversions() { return this.conversions.getConversions(); diff --git a/lang/java/avro/src/test/java/org/apache/avro/generic/ConversionsContainerTest.java b/lang/java/avro/src/test/java/org/apache/avro/generic/ConversionsContainerTest.java index 46022a14226..5b05251b060 100644 --- a/lang/java/avro/src/test/java/org/apache/avro/generic/ConversionsContainerTest.java +++ b/lang/java/avro/src/test/java/org/apache/avro/generic/ConversionsContainerTest.java @@ -30,7 +30,7 @@ class ConversionsContainerTest { @Test void getConversions() { - ConversionsContainer conversions = new ConversionsContainer(); + ConversionsContainer conversions = new ConversionsContainer(Thread.currentThread().getContextClassLoader()); // test for empty container. Assertions.assertNull(conversions.getConversionByClass(String.class));