[ 
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)

Reply via email to