You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@avro.apache.org by dk...@apache.org on 2023/03/13 15:02:36 UTC

[avro] branch master updated: AVRO-3721: add method to JsonProperties

This is an automated email from the ASF dual-hosted git repository.

dkulp pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/avro.git


The following commit(s) were added to refs/heads/master by this push:
     new c2e6e1319 AVRO-3721: add method to JsonProperties
c2e6e1319 is described below

commit c2e6e13194cb4f1879b8c98ff896c048caf6b8e5
Author: Christophe Le Saec <cl...@talend.com>
AuthorDate: Thu Mar 9 16:21:28 2023 +0100

    AVRO-3721: add method to JsonProperties
---
 .../src/main/java/org/apache/avro/JsonProperties.java   | 17 +++++++++++++++++
 .../src/main/java/org/apache/avro/LogicalTypes.java     |  2 +-
 .../main/java/org/apache/avro/reflect/ReflectData.java  |  4 ++--
 .../test/java/org/apache/avro/TestSchemaBuilder.java    |  3 +++
 .../java/org/apache/avro/compiler/schema/Schemas.java   |  6 +-----
 .../apache/avro/compiler/specific/SpecificCompiler.java |  4 +---
 6 files changed, 25 insertions(+), 11 deletions(-)

diff --git a/lang/java/avro/src/main/java/org/apache/avro/JsonProperties.java b/lang/java/avro/src/main/java/org/apache/avro/JsonProperties.java
index b53bc6cb2..300e583b4 100644
--- a/lang/java/avro/src/main/java/org/apache/avro/JsonProperties.java
+++ b/lang/java/avro/src/main/java/org/apache/avro/JsonProperties.java
@@ -30,6 +30,7 @@ import java.util.concurrent.ConcurrentLinkedQueue;
 import java.util.concurrent.ConcurrentMap;
 
 import java.io.IOException;
+import java.util.function.BiConsumer;
 
 import org.apache.avro.util.internal.Accessor;
 import org.apache.avro.util.internal.Accessor.JsonPropertiesAccessor;
@@ -241,6 +242,11 @@ public abstract class JsonProperties {
     return JacksonUtils.toObject(props.get(name));
   }
 
+  public Object getObjectProp(String name, Object defaultValue) {
+    final JsonNode json = props.get(name);
+    return json != null ? JacksonUtils.toObject(json) : defaultValue;
+  }
+
   /**
    * Adds a property with the given name <tt>name</tt> and value <tt>value</tt>.
    * Neither <tt>name</tt> nor <tt>value</tt> can be <tt>null</tt>. It is illegal
@@ -307,6 +313,17 @@ public abstract class JsonProperties {
     return Collections.unmodifiableMap(result);
   }
 
+  public boolean propsContainsKey(String key) {
+    return this.props.containsKey(key);
+  }
+
+  public void forEachProperty(BiConsumer<String, Object> consumer) {
+    for (Map.Entry<String, JsonNode> entry : this.props.entrySet()) {
+      final Object value = JacksonUtils.toObject(entry.getValue());
+      consumer.accept(entry.getKey(), value);
+    }
+  }
+
   void writeProps(JsonGenerator gen) throws IOException {
     for (Map.Entry<String, JsonNode> e : props.entrySet())
       gen.writeObjectField(e.getKey(), e.getValue());
diff --git a/lang/java/avro/src/main/java/org/apache/avro/LogicalTypes.java b/lang/java/avro/src/main/java/org/apache/avro/LogicalTypes.java
index 7bb00f819..086c5d266 100644
--- a/lang/java/avro/src/main/java/org/apache/avro/LogicalTypes.java
+++ b/lang/java/avro/src/main/java/org/apache/avro/LogicalTypes.java
@@ -329,7 +329,7 @@ public class LogicalTypes {
     }
 
     private boolean hasProperty(Schema schema, String name) {
-      return (schema.getObjectProp(name) != null);
+      return schema.propsContainsKey(name);
     }
 
     private int getInt(Schema schema, String name) {
diff --git a/lang/java/avro/src/main/java/org/apache/avro/reflect/ReflectData.java b/lang/java/avro/src/main/java/org/apache/avro/reflect/ReflectData.java
index ec4909794..9271cfa98 100644
--- a/lang/java/avro/src/main/java/org/apache/avro/reflect/ReflectData.java
+++ b/lang/java/avro/src/main/java/org/apache/avro/reflect/ReflectData.java
@@ -756,7 +756,7 @@ public class ReflectData extends SpecificData {
 
               AvroMeta[] metadata = field.getAnnotationsByType(AvroMeta.class); // add metadata
               for (AvroMeta meta : metadata) {
-                if (recordField.getObjectProps().containsKey(meta.key())) {
+                if (recordField.propsContainsKey(meta.key())) {
                   throw new AvroTypeException("Duplicate field prop key: " + meta.key());
                 }
                 recordField.addProp(meta.key(), meta.value());
@@ -775,7 +775,7 @@ public class ReflectData extends SpecificData {
           schema.setFields(fields);
           AvroMeta[] metadata = c.getAnnotationsByType(AvroMeta.class);
           for (AvroMeta meta : metadata) {
-            if (schema.getObjectProps().containsKey(meta.key())) {
+            if (schema.propsContainsKey(meta.key())) {
               throw new AvroTypeException("Duplicate type prop key: " + meta.key());
             }
             schema.addProp(meta.key(), meta.value());
diff --git a/lang/java/avro/src/test/java/org/apache/avro/TestSchemaBuilder.java b/lang/java/avro/src/test/java/org/apache/avro/TestSchemaBuilder.java
index ddfbe7229..784bfba02 100644
--- a/lang/java/avro/src/test/java/org/apache/avro/TestSchemaBuilder.java
+++ b/lang/java/avro/src/test/java/org/apache/avro/TestSchemaBuilder.java
@@ -149,6 +149,9 @@ public class TestSchemaBuilder {
     assertEquals("ABC", f.getObjectProp("byteProp"));
     assertTrue(f.getObjectProp("stringProp") instanceof String);
     assertEquals("abc", f.getObjectProp("stringProp"));
+
+    assertEquals("abc", f.getObjectProp("stringProp", "default"));
+    assertEquals("default", f.getObjectProp("unknwon", "default"));
   }
 
   @Test
diff --git a/lang/java/compiler/src/main/java/org/apache/avro/compiler/schema/Schemas.java b/lang/java/compiler/src/main/java/org/apache/avro/compiler/schema/Schemas.java
index b35adbd93..ec8ff7789 100644
--- a/lang/java/compiler/src/main/java/org/apache/avro/compiler/schema/Schemas.java
+++ b/lang/java/compiler/src/main/java/org/apache/avro/compiler/schema/Schemas.java
@@ -21,7 +21,6 @@ import java.util.ArrayDeque;
 import java.util.Collections;
 import java.util.Deque;
 import java.util.IdentityHashMap;
-import java.util.Map;
 import java.util.Set;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
@@ -67,10 +66,7 @@ public final class Schemas {
   }
 
   public static void copyProperties(final JsonProperties from, final JsonProperties to) {
-    Map<String, Object> objectProps = from.getObjectProps();
-    for (Map.Entry<String, Object> entry : objectProps.entrySet()) {
-      to.addProp(entry.getKey(), entry.getValue());
-    }
+    from.forEachProperty(to::addProp);
   }
 
   public static boolean hasGeneratedJavaClass(final Schema schema) {
diff --git a/lang/java/compiler/src/main/java/org/apache/avro/compiler/specific/SpecificCompiler.java b/lang/java/compiler/src/main/java/org/apache/avro/compiler/specific/SpecificCompiler.java
index baa2fd793..a62b5c25f 100644
--- a/lang/java/compiler/src/main/java/org/apache/avro/compiler/specific/SpecificCompiler.java
+++ b/lang/java/compiler/src/main/java/org/apache/avro/compiler/specific/SpecificCompiler.java
@@ -664,9 +664,7 @@ public class SpecificCompiler {
     Protocol newP = new Protocol(p.getName(), p.getDoc(), p.getNamespace());
     Map<Schema, Schema> types = new LinkedHashMap<>();
 
-    for (Map.Entry<String, Object> a : p.getObjectProps().entrySet()) {
-      newP.addProp(a.getKey(), a.getValue());
-    }
+    p.forEachProperty(newP::addProp);
 
     // annotate types
     Collection<Schema> namedTypes = new LinkedHashSet<>();