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<>();