[
https://issues.apache.org/jira/browse/AVRO-3126?focusedWorklogId=772762&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-772762
]
ASF GitHub Bot logged work on AVRO-3126:
----------------------------------------
Author: ASF GitHub Bot
Created on: 20/May/22 10:34
Start Date: 20/May/22 10:34
Worklog Time Spent: 10m
Work Description: martin-g commented on code in PR #1680:
URL: https://github.com/apache/avro/pull/1680#discussion_r877998855
##########
lang/java/avro/src/main/java/org/apache/avro/specific/SpecificData.java:
##########
@@ -61,6 +65,20 @@ public class SpecificData extends GenericData {
private static final Class<?>[] NO_ARG = new Class[] {};
private static final Class<?>[] SCHEMA_ARG = new Class[] { Schema.class };
+ private static final Method IS_RECORD;
Review Comment:
```suggestion
private static final Method IS_RECORD_METHOD;
```
##########
lang/java/avro/src/main/java/org/apache/avro/reflect/ReflectDatumReader.java:
##########
@@ -70,6 +70,21 @@ public ReflectDatumReader(ReflectData data) {
super(data);
}
+ /** Called to read data. */
+ protected Object read(Object old, Schema expected, ResolvingDecoder in)
throws IOException {
Review Comment:
```suggestion
@Override
protected Object read(Object old, Schema expected, ResolvingDecoder in)
throws IOException {
```
##########
lang/java/avro/src/main/java/org/apache/avro/reflect/ReflectRecordEncoding.java:
##########
@@ -0,0 +1,140 @@
+package org.apache.avro.reflect;
+
+import java.io.IOException;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import org.apache.avro.AvroMissingFieldException;
+import org.apache.avro.AvroRuntimeException;
+import org.apache.avro.Schema;
+import org.apache.avro.io.Decoder;
+import org.apache.avro.io.Encoder;
+import org.apache.avro.io.ResolvingDecoder;
+
+public class ReflectRecordEncoding extends CustomEncoding {
+
+ private final List<FieldWriter> writer;
+ private final Constructor<?> constructor;
+ private List<FieldReader> reader;
+
+ public ReflectRecordEncoding(Schema schema, Class<?> type) {
+ this.schema = schema;
+
+ this.writer = schema.getFields().stream().map(field -> {
+ try {
+ Method method = type.getMethod(field.name());
+ return new FieldWriter(method, field.schema());
+ } catch (ReflectiveOperationException e) {
+ throw new AvroMissingFieldException("Field does not exist", field);
+ }
+
+ }).collect(Collectors.toList());
+
+ // order of this matches default constructor find order mapping
+
+ Field[] fields = type.getDeclaredFields();
+
+ List<Class<?>> parameterTypes = new ArrayList<>(fields.length);
+
+ Map<String, Integer> offsets = new HashMap<>();
+
+ // need to know offset for mapping
+ for (Field field : fields) {
+ if (Modifier.isStatic(field.getModifiers())) {
+ continue;
+ }
+ offsets.put(field.getName(), parameterTypes.size());
+ parameterTypes.add(field.getType());
+ }
+
+ try {
+ this.constructor =
type.getDeclaredConstructor(parameterTypes.toArray(Class[]::new));
+
+ } catch (NoSuchMethodException e) {
+ throw new AvroRuntimeException(e);
+ }
+
+ this.reader = schema.getFields().stream().map(field -> {
+ int offset = offsets.get(field.name());
+ return new FieldReader(offset, field.schema());
+
+ }).collect(Collectors.toList());
+
+ }
+
+ @Override
+ protected void write(Object datum, Encoder out) throws IOException {
+ throw new UnsupportedOperationException("No writer specified");
+ }
+
+ @Override
+ protected void write(Object datum, Encoder out, ReflectDatumWriter writer)
throws IOException {
+ for (FieldWriter field : this.writer) {
+ field.write(datum, out, writer);
+ }
+ }
+
+ @Override
+ protected Object read(Object reuse, Decoder in) throws IOException {
+ throw new UnsupportedOperationException("No writer specified");
Review Comment:
```suggestion
throw new UnsupportedOperationException("No reader specified");
```
Issue Time Tracking
-------------------
Worklog Id: (was: 772762)
Time Spent: 20m (was: 10m)
> Create a module to integrate Java 17 specific features (like Java Records)
> with Avro
> ------------------------------------------------------------------------------------
>
> Key: AVRO-3126
> URL: https://issues.apache.org/jira/browse/AVRO-3126
> Project: Apache Avro
> Issue Type: Improvement
> Components: java
> Reporter: Ismaël Mejía
> Priority: Major
> Labels: pull-request-available
> Time Spent: 20m
> Remaining Estimate: 0h
>
> Java introduced [records|https://openjdk.java.net/jeps/359] on Java 14. It is
> a good idea to explore how we can make users life easier using modern Java
> APIs for example when mapping Java Records from/to Avro Records.
>
--
This message was sent by Atlassian Jira
(v8.20.7#820007)