You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@avro.apache.org by "peknu (via GitHub)" <gi...@apache.org> on 2023/03/13 09:37:50 UTC

[GitHub] [avro] peknu opened a new pull request, #2142: AVRO-3641: Adds support for nullSafeAnnotations to java SpecificCompiler

peknu opened a new pull request, #2142:
URL: https://github.com/apache/avro/pull/2142

   <!--
   
   *Thank you very much for contributing to Apache Avro - we are happy that you want to help us improve Avro. To help the community review your contribution in the best possible way, please go through the checklist below, which will get the contribution into a shape in which it can be best reviewed.*
   
   *Please understand that we do not do this to make contributions to Avro a hassle. In order to uphold a high standard of quality for code contributions, while at the same time managing a large number of contributions, we need contributors to prepare the contributions well, and give reviewers enough contextual information for the review. Please also understand that contributions that do not follow this guide will take longer to review and thus typically be picked up with lower priority by the community.*
   
   ## Contribution Checklist
   
     - Make sure that the pull request corresponds to a [JIRA issue](https://issues.apache.org/jira/projects/AVRO/issues). Exceptions are made for typos in JavaDoc or documentation files, which need no JIRA issue.
     
     - Name the pull request in the form "AVRO-XXXX: [component] Title of the pull request", where *AVRO-XXXX* should be replaced by the actual issue number. 
       The *component* is optional, but can help identify the correct reviewers faster: either the language ("java", "python") or subsystem such as "build" or "doc" are good candidates.  
   
     - Fill out the template below to describe the changes contributed by the pull request. That will give reviewers the context they need to do the review.
     
     - Make sure that the change passes the automated tests. You can [build the entire project](https://github.com/apache/avro/blob/master/BUILD.md) or just the [language-specific SDK](https://avro.apache.org/project/how-to-contribute/#unit-tests).
   
     - Each pull request should address only one issue, not mix up code from multiple issues.
     
     - Each commit in the pull request has a meaningful commit message (including the JIRA id)
   
     - Every commit message references Jira issues in their subject lines. In addition, commits follow the guidelines from [How to write a good git commit message](https://chris.beams.io/posts/git-commit/)
       1. Subject is separated from body by a blank line
       1. Subject is limited to 50 characters (not including Jira issue reference)
       1. Subject does not end with a period
       1. Subject uses the imperative mood ("add", not "adding")
       1. Body wraps at 72 characters
       1. Body explains "what" and "why", not "how"
   
   -->
   
   ## What is the purpose of the change
   
   *(For example: This pull request improves file read performance by buffering data, fixing AVRO-XXXX.)*
   
   
   ## Verifying this change
   
   *(Please pick one of the following options)*
   
   This change is a trivial rework / code cleanup without any test coverage.
   
   *(or)*
   
   This change is already covered by existing tests, such as *(please describe tests)*.
   
   *(or)*
   
   This change added tests and can be verified as follows:
   
   *(example:)*
   - *Extended interop tests to verify consistent valid schema names between SDKs*
   - *Added test that validates that Java throws an AvroRuntimeException on invalid binary data*
   - *Manually verified the change by building the website and checking the new redirect*
   
   
   ## Documentation
   
   - Does this pull request introduce a new feature? (yes / no)
   - If yes, how is the feature documented? (not applicable / docs / JavaDocs / not documented)
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: dev-unsubscribe@avro.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [avro] opwvhk commented on a diff in pull request #2142: AVRO-3641: Adds support for nullSafeAnnotations to java SpecificCompiler

Posted by "opwvhk (via GitHub)" <gi...@apache.org>.
opwvhk commented on code in PR #2142:
URL: https://github.com/apache/avro/pull/2142#discussion_r1296022489


##########
lang/java/maven-plugin/src/main/java/org/apache/avro/mojo/AbstractAvroMojo.java:
##########
@@ -164,6 +164,15 @@ public abstract class AbstractAvroMojo extends AbstractMojo {
    */
   protected boolean createSetters;
 
+  /**
+   * The createNullSafeAnnotations parameters adds @Nullable and @NotNull
+   * annotations for fhe fields of the record. The default is to not include
+   * annotations.

Review Comment:
   At this point in time, there are no other places on the website that document the maven plugin, or code generation options. It's only mentioned in passing on the "Getting started" page for Java.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@avro.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] AVRO-3641: Adds support for nullSafeAnnotations to java SpecificCompiler [avro]

Posted by "peknu (via GitHub)" <gi...@apache.org>.
peknu commented on PR #2142:
URL: https://github.com/apache/avro/pull/2142#issuecomment-1748396529

   Any chance to get this merged?


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@avro.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [avro] peknu commented on a diff in pull request #2142: AVRO-3641: Adds support for nullSafeAnnotations to java SpecificCompiler

Posted by "peknu (via GitHub)" <gi...@apache.org>.
peknu commented on code in PR #2142:
URL: https://github.com/apache/avro/pull/2142#discussion_r1190668090


##########
lang/java/tools/src/test/compiler/output-string/avro/examples/baseball/NullSafeAnnotationsFieldsTest.java:
##########
@@ -0,0 +1,597 @@
+/**
+ * Autogenerated by Avro
+ *
+ * DO NOT EDIT DIRECTLY
+ */
+package avro.examples.baseball;
+
+import org.apache.avro.generic.GenericArray;
+import org.apache.avro.specific.SpecificData;
+import org.apache.avro.util.Utf8;
+import org.apache.avro.message.BinaryMessageEncoder;
+import org.apache.avro.message.BinaryMessageDecoder;
+import org.apache.avro.message.SchemaStore;
+import org.jetbrains.annotations.Nullable;
+import org.jetbrains.annotations.NotNull;
+
+/** Test that @Nullable and @NotNull annotations are created for all fields */
+@org.apache.avro.specific.AvroGenerated
+public class NullSafeAnnotationsFieldsTest extends org.apache.avro.specific.SpecificRecordBase implements org.apache.avro.specific.SpecificRecord {
+  private static final long serialVersionUID = 2020521726426674816L;
+
+
+  public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"NullSafeAnnotationsFieldsTest\",\"namespace\":\"avro.examples.baseball\",\"doc\":\"Test that @Nullable and @NotNull annotations are created for all fields\",\"fields\":[{\"name\":\"name\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"nullable_name\",\"type\":[{\"type\":\"string\",\"avro.java.string\":\"String\"},\"null\"]},{\"name\":\"favorite_number\",\"type\":\"int\"},{\"name\":\"nullable_favorite_number\",\"type\":[\"int\",\"null\"]}]}");
+  public static org.apache.avro.Schema getClassSchema() { return SCHEMA$; }
+
+  private static final SpecificData MODEL$ = new SpecificData();
+
+  private static final BinaryMessageEncoder<NullSafeAnnotationsFieldsTest> ENCODER =
+      new BinaryMessageEncoder<>(MODEL$, SCHEMA$);
+
+  private static final BinaryMessageDecoder<NullSafeAnnotationsFieldsTest> DECODER =
+      new BinaryMessageDecoder<>(MODEL$, SCHEMA$);
+
+  /**
+   * Return the BinaryMessageEncoder instance used by this class.
+   * @return the message encoder used by this class
+   */
+  public static BinaryMessageEncoder<NullSafeAnnotationsFieldsTest> getEncoder() {
+    return ENCODER;
+  }
+
+  /**
+   * Return the BinaryMessageDecoder instance used by this class.
+   * @return the message decoder used by this class
+   */
+  public static BinaryMessageDecoder<NullSafeAnnotationsFieldsTest> getDecoder() {
+    return DECODER;
+  }
+
+  /**
+   * Create a new BinaryMessageDecoder instance for this class that uses the specified {@link SchemaStore}.
+   * @param resolver a {@link SchemaStore} used to find schemas by fingerprint
+   * @return a BinaryMessageDecoder instance for this class backed by the given SchemaStore
+   */
+  public static BinaryMessageDecoder<NullSafeAnnotationsFieldsTest> createDecoder(SchemaStore resolver) {
+    return new BinaryMessageDecoder<>(MODEL$, SCHEMA$, resolver);
+  }
+
+  /**
+   * Serializes this NullSafeAnnotationsFieldsTest to a ByteBuffer.
+   * @return a buffer holding the serialized data for this instance
+   * @throws java.io.IOException if this instance could not be serialized
+   */
+  public java.nio.ByteBuffer toByteBuffer() throws java.io.IOException {
+    return ENCODER.encode(this);
+  }
+
+  /**
+   * Deserializes a NullSafeAnnotationsFieldsTest from a ByteBuffer.
+   * @param b a byte buffer holding serialized data for an instance of this class
+   * @return a NullSafeAnnotationsFieldsTest instance decoded from the given buffer
+   * @throws java.io.IOException if the given bytes could not be deserialized into an instance of this class
+   */
+  public static NullSafeAnnotationsFieldsTest fromByteBuffer(
+      java.nio.ByteBuffer b) throws java.io.IOException {
+    return DECODER.decode(b);
+  }
+
+  private java.lang.String name;
+  private java.lang.String nullable_name;
+  private int favorite_number;
+  private java.lang.Integer nullable_favorite_number;
+
+  /**
+   * Default constructor.  Note that this does not initialize fields
+   * to their default values from the schema.  If that is desired then
+   * one should use <code>newBuilder()</code>.
+   */
+  public NullSafeAnnotationsFieldsTest() {}
+
+  /**
+   * All-args constructor.
+   * @param name The new value for name
+   * @param nullable_name The new value for nullable_name
+   * @param favorite_number The new value for favorite_number
+   * @param nullable_favorite_number The new value for nullable_favorite_number
+   */
+  public NullSafeAnnotationsFieldsTest(@NotNull java.lang.String name, @Nullable java.lang.String nullable_name, @NotNull java.lang.Integer favorite_number, @Nullable java.lang.Integer nullable_favorite_number) {
+    this.name = name;
+    this.nullable_name = nullable_name;
+    this.favorite_number = favorite_number;
+    this.nullable_favorite_number = nullable_favorite_number;
+  }
+
+  @Override
+  public org.apache.avro.specific.SpecificData getSpecificData() { return MODEL$; }
+
+  @Override
+  public org.apache.avro.Schema getSchema() { return SCHEMA$; }
+
+  // Used by DatumWriter.  Applications should not call.
+  @Override
+  public java.lang.Object get(int field$) {
+    switch (field$) {
+    case 0: return name;
+    case 1: return nullable_name;
+    case 2: return favorite_number;
+    case 3: return nullable_favorite_number;
+    default: throw new IndexOutOfBoundsException("Invalid index: " + field$);
+    }
+  }
+
+  // Used by DatumReader.  Applications should not call.
+  @Override
+  @SuppressWarnings(value="unchecked")
+  public void put(int field$, java.lang.Object value$) {
+    switch (field$) {
+    case 0: name = value$ != null ? value$.toString() : null; break;
+    case 1: nullable_name = value$ != null ? value$.toString() : null; break;
+    case 2: favorite_number = (java.lang.Integer)value$; break;
+    case 3: nullable_favorite_number = (java.lang.Integer)value$; break;
+    default: throw new IndexOutOfBoundsException("Invalid index: " + field$);
+    }
+  }
+
+  /**
+   * Gets the value of the 'name' field.
+   * @return The value of the 'name' field.
+   */
+  @NotNull
+  public java.lang.String getName() {
+    return name;
+  }
+
+
+  /**
+   * Sets the value of the 'name' field.
+   * @param value the value to set.
+   */
+  public void setName(@NotNull java.lang.String value) {
+    this.name = value;
+  }
+
+  /**
+   * Gets the value of the 'nullable_name' field.
+   * @return The value of the 'nullable_name' field.
+   */
+  @Nullable
+  public java.lang.String getNullableName() {
+    return nullable_name;
+  }
+
+
+  /**
+   * Sets the value of the 'nullable_name' field.
+   * @param value the value to set.
+   */
+  public void setNullableName(@Nullable java.lang.String value) {
+    this.nullable_name = value;
+  }
+
+  /**
+   * Gets the value of the 'favorite_number' field.
+   * @return The value of the 'favorite_number' field.
+   */
+  @NotNull
+  public int getFavoriteNumber() {
+    return favorite_number;
+  }
+
+
+  /**
+   * Sets the value of the 'favorite_number' field.
+   * @param value the value to set.
+   */
+  public void setFavoriteNumber(@NotNull int value) {
+    this.favorite_number = value;
+  }
+
+  /**
+   * Gets the value of the 'nullable_favorite_number' field.
+   * @return The value of the 'nullable_favorite_number' field.
+   */
+  @Nullable
+  public java.lang.Integer getNullableFavoriteNumber() {
+    return nullable_favorite_number;
+  }
+
+
+  /**
+   * Sets the value of the 'nullable_favorite_number' field.
+   * @param value the value to set.
+   */
+  public void setNullableFavoriteNumber(@Nullable java.lang.Integer value) {
+    this.nullable_favorite_number = value;
+  }
+
+  /**
+   * Creates a new NullSafeAnnotationsFieldsTest RecordBuilder.
+   * @return A new NullSafeAnnotationsFieldsTest RecordBuilder
+   */
+  public static avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder newBuilder() {
+    return new avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder();
+  }
+
+  /**
+   * Creates a new NullSafeAnnotationsFieldsTest RecordBuilder by copying an existing Builder.
+   * @param other The existing builder to copy.
+   * @return A new NullSafeAnnotationsFieldsTest RecordBuilder
+   */
+  public static avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder newBuilder(avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder other) {
+    if (other == null) {
+      return new avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder();
+    } else {
+      return new avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder(other);
+    }
+  }
+
+  /**
+   * Creates a new NullSafeAnnotationsFieldsTest RecordBuilder by copying an existing NullSafeAnnotationsFieldsTest instance.
+   * @param other The existing instance to copy.
+   * @return A new NullSafeAnnotationsFieldsTest RecordBuilder
+   */
+  public static avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder newBuilder(avro.examples.baseball.NullSafeAnnotationsFieldsTest other) {
+    if (other == null) {
+      return new avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder();
+    } else {
+      return new avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder(other);
+    }
+  }
+
+  /**
+   * RecordBuilder for NullSafeAnnotationsFieldsTest instances.
+   */
+  @org.apache.avro.specific.AvroGenerated
+  public static class Builder extends org.apache.avro.specific.SpecificRecordBuilderBase<NullSafeAnnotationsFieldsTest>
+    implements org.apache.avro.data.RecordBuilder<NullSafeAnnotationsFieldsTest> {
+
+    private java.lang.String name;
+    private java.lang.String nullable_name;
+    private int favorite_number;
+    private java.lang.Integer nullable_favorite_number;
+
+    /** Creates a new Builder */
+    private Builder() {
+      super(SCHEMA$, MODEL$);
+    }
+
+    /**
+     * Creates a Builder by copying an existing Builder.
+     * @param other The existing Builder to copy.
+     */
+    private Builder(avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder other) {
+      super(other);
+      if (isValidValue(fields()[0], other.name)) {
+        this.name = data().deepCopy(fields()[0].schema(), other.name);
+        fieldSetFlags()[0] = other.fieldSetFlags()[0];
+      }
+      if (isValidValue(fields()[1], other.nullable_name)) {
+        this.nullable_name = data().deepCopy(fields()[1].schema(), other.nullable_name);
+        fieldSetFlags()[1] = other.fieldSetFlags()[1];
+      }
+      if (isValidValue(fields()[2], other.favorite_number)) {
+        this.favorite_number = data().deepCopy(fields()[2].schema(), other.favorite_number);
+        fieldSetFlags()[2] = other.fieldSetFlags()[2];
+      }
+      if (isValidValue(fields()[3], other.nullable_favorite_number)) {
+        this.nullable_favorite_number = data().deepCopy(fields()[3].schema(), other.nullable_favorite_number);
+        fieldSetFlags()[3] = other.fieldSetFlags()[3];
+      }
+    }
+
+    /**
+     * Creates a Builder by copying an existing NullSafeAnnotationsFieldsTest instance
+     * @param other The existing instance to copy.
+     */
+    private Builder(avro.examples.baseball.NullSafeAnnotationsFieldsTest other) {
+      super(SCHEMA$, MODEL$);
+      if (isValidValue(fields()[0], other.name)) {
+        this.name = data().deepCopy(fields()[0].schema(), other.name);
+        fieldSetFlags()[0] = true;
+      }
+      if (isValidValue(fields()[1], other.nullable_name)) {
+        this.nullable_name = data().deepCopy(fields()[1].schema(), other.nullable_name);
+        fieldSetFlags()[1] = true;
+      }
+      if (isValidValue(fields()[2], other.favorite_number)) {
+        this.favorite_number = data().deepCopy(fields()[2].schema(), other.favorite_number);
+        fieldSetFlags()[2] = true;
+      }
+      if (isValidValue(fields()[3], other.nullable_favorite_number)) {
+        this.nullable_favorite_number = data().deepCopy(fields()[3].schema(), other.nullable_favorite_number);
+        fieldSetFlags()[3] = true;
+      }
+    }
+
+    /**
+      * Gets the value of the 'name' field.
+      * @return The value.
+      */
+    public java.lang.String getName() {
+      return name;
+    }
+
+
+    /**
+      * Sets the value of the 'name' field.
+      * @param value The value of 'name'.
+      * @return This builder.
+      */
+    public avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder setName(@NotNull java.lang.String value) {
+      validate(fields()[0], value);
+      this.name = value;
+      fieldSetFlags()[0] = true;
+      return this;
+    }
+
+    /**
+      * Checks whether the 'name' field has been set.
+      * @return True if the 'name' field has been set, false otherwise.
+      */
+    public boolean hasName() {
+      return fieldSetFlags()[0];
+    }
+
+
+    /**
+      * Clears the value of the 'name' field.
+      * @return This builder.
+      */
+    public avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder clearName() {
+      name = null;
+      fieldSetFlags()[0] = false;
+      return this;
+    }
+
+    /**
+      * Gets the value of the 'nullable_name' field.
+      * @return The value.
+      */
+    public java.lang.String getNullableName() {
+      return nullable_name;
+    }
+
+
+    /**
+      * Sets the value of the 'nullable_name' field.
+      * @param value The value of 'nullable_name'.
+      * @return This builder.
+      */
+    public avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder setNullableName(@Nullable java.lang.String value) {
+      validate(fields()[1], value);
+      this.nullable_name = value;
+      fieldSetFlags()[1] = true;
+      return this;
+    }
+
+    /**
+      * Checks whether the 'nullable_name' field has been set.
+      * @return True if the 'nullable_name' field has been set, false otherwise.
+      */
+    public boolean hasNullableName() {
+      return fieldSetFlags()[1];
+    }
+
+
+    /**
+      * Clears the value of the 'nullable_name' field.
+      * @return This builder.
+      */
+    public avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder clearNullableName() {
+      nullable_name = null;
+      fieldSetFlags()[1] = false;
+      return this;
+    }
+
+    /**
+      * Gets the value of the 'favorite_number' field.
+      * @return The value.
+      */
+    public int getFavoriteNumber() {
+      return favorite_number;
+    }
+
+
+    /**
+      * Sets the value of the 'favorite_number' field.
+      * @param value The value of 'favorite_number'.
+      * @return This builder.
+      */
+    public avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder setFavoriteNumber(@NotNull int value) {
+      validate(fields()[2], value);
+      this.favorite_number = value;
+      fieldSetFlags()[2] = true;
+      return this;
+    }
+
+    /**
+      * Checks whether the 'favorite_number' field has been set.
+      * @return True if the 'favorite_number' field has been set, false otherwise.
+      */
+    public boolean hasFavoriteNumber() {
+      return fieldSetFlags()[2];
+    }
+
+
+    /**
+      * Clears the value of the 'favorite_number' field.
+      * @return This builder.
+      */
+    public avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder clearFavoriteNumber() {
+      fieldSetFlags()[2] = false;
+      return this;
+    }
+
+    /**
+      * Gets the value of the 'nullable_favorite_number' field.
+      * @return The value.
+      */
+    public java.lang.Integer getNullableFavoriteNumber() {
+      return nullable_favorite_number;
+    }
+
+
+    /**
+      * Sets the value of the 'nullable_favorite_number' field.
+      * @param value The value of 'nullable_favorite_number'.
+      * @return This builder.
+      */
+    public avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder setNullableFavoriteNumber(@Nullable java.lang.Integer value) {
+      validate(fields()[3], value);
+      this.nullable_favorite_number = value;
+      fieldSetFlags()[3] = true;
+      return this;
+    }
+
+    /**
+      * Checks whether the 'nullable_favorite_number' field has been set.
+      * @return True if the 'nullable_favorite_number' field has been set, false otherwise.
+      */
+    public boolean hasNullableFavoriteNumber() {
+      return fieldSetFlags()[3];
+    }
+
+
+    /**
+      * Clears the value of the 'nullable_favorite_number' field.
+      * @return This builder.
+      */
+    public avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder clearNullableFavoriteNumber() {
+      nullable_favorite_number = null;
+      fieldSetFlags()[3] = false;
+      return this;
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public NullSafeAnnotationsFieldsTest build() {
+      try {
+        NullSafeAnnotationsFieldsTest record = new NullSafeAnnotationsFieldsTest();
+        record.name = fieldSetFlags()[0] ? this.name : (java.lang.String) defaultValue(fields()[0]);
+        record.nullable_name = fieldSetFlags()[1] ? this.nullable_name : (java.lang.String) defaultValue(fields()[1]);
+        record.favorite_number = fieldSetFlags()[2] ? this.favorite_number : (java.lang.Integer) defaultValue(fields()[2]);
+        record.nullable_favorite_number = fieldSetFlags()[3] ? this.nullable_favorite_number : (java.lang.Integer) defaultValue(fields()[3]);
+        return record;
+      } catch (org.apache.avro.AvroMissingFieldException e) {
+        throw e;
+      } catch (java.lang.Exception e) {
+        throw new org.apache.avro.AvroRuntimeException(e);
+      }
+    }
+  }
+
+  @SuppressWarnings("unchecked")
+  private static final org.apache.avro.io.DatumWriter<NullSafeAnnotationsFieldsTest>
+    WRITER$ = (org.apache.avro.io.DatumWriter<NullSafeAnnotationsFieldsTest>)MODEL$.createDatumWriter(SCHEMA$);
+
+  @Override public void writeExternal(java.io.ObjectOutput out)
+    throws java.io.IOException {
+    WRITER$.write(this, SpecificData.getEncoder(out));
+  }
+
+  @SuppressWarnings("unchecked")
+  private static final org.apache.avro.io.DatumReader<NullSafeAnnotationsFieldsTest>
+    READER$ = (org.apache.avro.io.DatumReader<NullSafeAnnotationsFieldsTest>)MODEL$.createDatumReader(SCHEMA$);
+
+  @Override public void readExternal(java.io.ObjectInput in)
+    throws java.io.IOException {
+    READER$.read(this, SpecificData.getDecoder(in));
+  }
+
+  @Override protected boolean hasCustomCoders() { return true; }
+
+  @Override public void customEncode(org.apache.avro.io.Encoder out)
+    throws java.io.IOException
+  {
+    out.writeString(this.name);
+
+    if (this.nullable_name == null) {
+      out.writeIndex(1);
+      out.writeNull();
+    } else {
+      out.writeIndex(0);
+      out.writeString(this.nullable_name);
+    }
+
+    out.writeInt(this.favorite_number);
+
+    if (this.nullable_favorite_number == null) {
+      out.writeIndex(1);
+      out.writeNull();
+    } else {
+      out.writeIndex(0);
+      out.writeInt(this.nullable_favorite_number);
+    }
+
+  }
+
+  @Override public void customDecode(org.apache.avro.io.ResolvingDecoder in)
+    throws java.io.IOException
+  {
+    org.apache.avro.Schema.Field[] fieldOrder = in.readFieldOrderIfDiff();
+    if (fieldOrder == null) {
+      this.name = in.readString();
+
+      if (in.readIndex() != 0) {
+        in.readNull();
+        this.nullable_name = null;
+      } else {
+        this.nullable_name = in.readString();
+      }
+
+      this.favorite_number = in.readInt();
+
+      if (in.readIndex() != 0) {
+        in.readNull();
+        this.nullable_favorite_number = null;
+      } else {
+        this.nullable_favorite_number = in.readInt();
+      }
+
+    } else {
+      for (int i = 0; i < 4; i++) {
+        switch (fieldOrder[i].pos()) {
+        case 0:
+          this.name = in.readString();
+          break;
+
+        case 1:
+          if (in.readIndex() != 0) {
+            in.readNull();
+            this.nullable_name = null;
+          } else {
+            this.nullable_name = in.readString();
+          }
+          break;
+
+        case 2:
+          this.favorite_number = in.readInt();
+          break;
+
+        case 3:
+          if (in.readIndex() != 0) {
+            in.readNull();
+            this.nullable_favorite_number = null;
+          } else {
+            this.nullable_favorite_number = in.readInt();
+          }
+          break;
+
+        default:
+          throw new java.io.IOException("Corrupt ResolvingDecoder.");
+        }
+      }
+    }
+  }
+}
+
+
+
+
+
+
+
+
+
+

Review Comment:
   Some problem with the build status made me revert the change.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@avro.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [avro] peknu commented on pull request #2142: AVRO-3641: Adds support for nullSafeAnnotations to java SpecificCompiler

Posted by "peknu (via GitHub)" <gi...@apache.org>.
peknu commented on PR #2142:
URL: https://github.com/apache/avro/pull/2142#issuecomment-1542328560

   The JSR to develop standard annotations (such as @NonNull) for Java is dead since August 2006: https://jcp.org/en/jsr/detail?id=305
   
   Maybe this PR can be merged so that the most commonly used @Nullable and @NotNull annotations can be used. This would be especially useful for Kotlin based projects, since it would add compile time safety when using Avro.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@avro.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [avro] opwvhk commented on a diff in pull request #2142: AVRO-3641: Adds support for nullSafeAnnotations to java SpecificCompiler

Posted by "opwvhk (via GitHub)" <gi...@apache.org>.
opwvhk commented on code in PR #2142:
URL: https://github.com/apache/avro/pull/2142#discussion_r1138345189


##########
lang/java/compiler/pom.xml:
##########
@@ -232,6 +232,10 @@
       <groupId>com.fasterxml.jackson.core</groupId>
       <artifactId>jackson-databind</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.jetbrains</groupId>
+      <artifactId>annotations</artifactId>
+    </dependency>

Review Comment:
   I only see the dependency being used in the test code (which is perfect IMHO). Can we please reduce the scope to test?



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@avro.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [avro] artheus commented on pull request #2142: AVRO-3641: Adds support for nullSafeAnnotations to java SpecificCompiler

Posted by "artheus (via GitHub)" <gi...@apache.org>.
artheus commented on PR #2142:
URL: https://github.com/apache/avro/pull/2142#issuecomment-1466187732

   👍🏻 


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@avro.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [avro] peknu commented on pull request #2142: AVRO-3641: Adds support for nullSafeAnnotations to java SpecificCompiler

Posted by "peknu (via GitHub)" <gi...@apache.org>.
peknu commented on PR #2142:
URL: https://github.com/apache/avro/pull/2142#issuecomment-1680488435

   Is there anything I can do to get this PR merged? It has been ready to merge for quite some time now?


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@avro.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [avro] opwvhk commented on a diff in pull request #2142: AVRO-3641: Adds support for nullSafeAnnotations to java SpecificCompiler

Posted by "opwvhk (via GitHub)" <gi...@apache.org>.
opwvhk commented on code in PR #2142:
URL: https://github.com/apache/avro/pull/2142#discussion_r1296001033


##########
lang/java/maven-plugin/src/main/java/org/apache/avro/mojo/AbstractAvroMojo.java:
##########
@@ -164,6 +164,15 @@ public abstract class AbstractAvroMojo extends AbstractMojo {
    */
   protected boolean createSetters;
 
+  /**
+   * The createNullSafeAnnotations parameters adds @Nullable and @NotNull
+   * annotations for fhe fields of the record. The default is to not include
+   * annotations.

Review Comment:
   Can we please mention here that the annotations are JetBrains annotations?
   
   Then it'll automatically be documented by the plugin help. Ideally, it also lists the dependency coordinates / package-url (`pkg:maven/org.jetbrains/annotations@24.0.1`).



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@avro.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [avro] opwvhk commented on pull request #2142: AVRO-3641: Adds support for nullSafeAnnotations to java SpecificCompiler

Posted by "opwvhk (via GitHub)" <gi...@apache.org>.
opwvhk commented on PR #2142:
URL: https://github.com/apache/avro/pull/2142#issuecomment-1471582001

   > As there are many nullable annotations around, would it make sense to make it configurable?
   
   I think it does. Also, your question triggered me to take a closer look at the code & dependencies. It would actually be a good change, and relatively easy to do as well.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@avro.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [avro] opwvhk commented on a diff in pull request #2142: AVRO-3641: Adds support for nullSafeAnnotations to java SpecificCompiler

Posted by "opwvhk (via GitHub)" <gi...@apache.org>.
opwvhk commented on code in PR #2142:
URL: https://github.com/apache/avro/pull/2142#discussion_r1135209276


##########
lang/java/tools/src/test/compiler/output-string/avro/examples/baseball/NullSafeAnnotationsFieldsTest.java:
##########
@@ -0,0 +1,597 @@
+/**
+ * Autogenerated by Avro
+ *
+ * DO NOT EDIT DIRECTLY
+ */
+package avro.examples.baseball;
+
+import org.apache.avro.generic.GenericArray;
+import org.apache.avro.specific.SpecificData;
+import org.apache.avro.util.Utf8;
+import org.apache.avro.message.BinaryMessageEncoder;
+import org.apache.avro.message.BinaryMessageDecoder;
+import org.apache.avro.message.SchemaStore;
+import org.jetbrains.annotations.Nullable;
+import org.jetbrains.annotations.NotNull;
+
+/** Test that @Nullable and @NotNull annotations are created for all fields */
+@org.apache.avro.specific.AvroGenerated
+public class NullSafeAnnotationsFieldsTest extends org.apache.avro.specific.SpecificRecordBase implements org.apache.avro.specific.SpecificRecord {
+  private static final long serialVersionUID = 2020521726426674816L;
+
+
+  public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"NullSafeAnnotationsFieldsTest\",\"namespace\":\"avro.examples.baseball\",\"doc\":\"Test that @Nullable and @NotNull annotations are created for all fields\",\"fields\":[{\"name\":\"name\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"nullable_name\",\"type\":[{\"type\":\"string\",\"avro.java.string\":\"String\"},\"null\"]},{\"name\":\"favorite_number\",\"type\":\"int\"},{\"name\":\"nullable_favorite_number\",\"type\":[\"int\",\"null\"]}]}");
+  public static org.apache.avro.Schema getClassSchema() { return SCHEMA$; }
+
+  private static final SpecificData MODEL$ = new SpecificData();
+
+  private static final BinaryMessageEncoder<NullSafeAnnotationsFieldsTest> ENCODER =
+      new BinaryMessageEncoder<>(MODEL$, SCHEMA$);
+
+  private static final BinaryMessageDecoder<NullSafeAnnotationsFieldsTest> DECODER =
+      new BinaryMessageDecoder<>(MODEL$, SCHEMA$);
+
+  /**
+   * Return the BinaryMessageEncoder instance used by this class.
+   * @return the message encoder used by this class
+   */
+  public static BinaryMessageEncoder<NullSafeAnnotationsFieldsTest> getEncoder() {
+    return ENCODER;
+  }
+
+  /**
+   * Return the BinaryMessageDecoder instance used by this class.
+   * @return the message decoder used by this class
+   */
+  public static BinaryMessageDecoder<NullSafeAnnotationsFieldsTest> getDecoder() {
+    return DECODER;
+  }
+
+  /**
+   * Create a new BinaryMessageDecoder instance for this class that uses the specified {@link SchemaStore}.
+   * @param resolver a {@link SchemaStore} used to find schemas by fingerprint
+   * @return a BinaryMessageDecoder instance for this class backed by the given SchemaStore
+   */
+  public static BinaryMessageDecoder<NullSafeAnnotationsFieldsTest> createDecoder(SchemaStore resolver) {
+    return new BinaryMessageDecoder<>(MODEL$, SCHEMA$, resolver);
+  }
+
+  /**
+   * Serializes this NullSafeAnnotationsFieldsTest to a ByteBuffer.
+   * @return a buffer holding the serialized data for this instance
+   * @throws java.io.IOException if this instance could not be serialized
+   */
+  public java.nio.ByteBuffer toByteBuffer() throws java.io.IOException {
+    return ENCODER.encode(this);
+  }
+
+  /**
+   * Deserializes a NullSafeAnnotationsFieldsTest from a ByteBuffer.
+   * @param b a byte buffer holding serialized data for an instance of this class
+   * @return a NullSafeAnnotationsFieldsTest instance decoded from the given buffer
+   * @throws java.io.IOException if the given bytes could not be deserialized into an instance of this class
+   */
+  public static NullSafeAnnotationsFieldsTest fromByteBuffer(
+      java.nio.ByteBuffer b) throws java.io.IOException {
+    return DECODER.decode(b);
+  }
+
+  private java.lang.String name;
+  private java.lang.String nullable_name;
+  private int favorite_number;
+  private java.lang.Integer nullable_favorite_number;
+
+  /**
+   * Default constructor.  Note that this does not initialize fields
+   * to their default values from the schema.  If that is desired then
+   * one should use <code>newBuilder()</code>.
+   */
+  public NullSafeAnnotationsFieldsTest() {}
+
+  /**
+   * All-args constructor.
+   * @param name The new value for name
+   * @param nullable_name The new value for nullable_name
+   * @param favorite_number The new value for favorite_number
+   * @param nullable_favorite_number The new value for nullable_favorite_number
+   */
+  public NullSafeAnnotationsFieldsTest(@NotNull java.lang.String name, @Nullable java.lang.String nullable_name, @NotNull java.lang.Integer favorite_number, @Nullable java.lang.Integer nullable_favorite_number) {
+    this.name = name;
+    this.nullable_name = nullable_name;
+    this.favorite_number = favorite_number;
+    this.nullable_favorite_number = nullable_favorite_number;
+  }
+
+  @Override
+  public org.apache.avro.specific.SpecificData getSpecificData() { return MODEL$; }
+
+  @Override
+  public org.apache.avro.Schema getSchema() { return SCHEMA$; }
+
+  // Used by DatumWriter.  Applications should not call.
+  @Override
+  public java.lang.Object get(int field$) {
+    switch (field$) {
+    case 0: return name;
+    case 1: return nullable_name;
+    case 2: return favorite_number;
+    case 3: return nullable_favorite_number;
+    default: throw new IndexOutOfBoundsException("Invalid index: " + field$);
+    }
+  }
+
+  // Used by DatumReader.  Applications should not call.
+  @Override
+  @SuppressWarnings(value="unchecked")
+  public void put(int field$, java.lang.Object value$) {
+    switch (field$) {
+    case 0: name = value$ != null ? value$.toString() : null; break;
+    case 1: nullable_name = value$ != null ? value$.toString() : null; break;
+    case 2: favorite_number = (java.lang.Integer)value$; break;
+    case 3: nullable_favorite_number = (java.lang.Integer)value$; break;
+    default: throw new IndexOutOfBoundsException("Invalid index: " + field$);
+    }
+  }
+
+  /**
+   * Gets the value of the 'name' field.
+   * @return The value of the 'name' field.
+   */
+  @NotNull
+  public java.lang.String getName() {
+    return name;
+  }
+
+
+  /**
+   * Sets the value of the 'name' field.
+   * @param value the value to set.
+   */
+  public void setName(@NotNull java.lang.String value) {
+    this.name = value;
+  }
+
+  /**
+   * Gets the value of the 'nullable_name' field.
+   * @return The value of the 'nullable_name' field.
+   */
+  @Nullable
+  public java.lang.String getNullableName() {
+    return nullable_name;
+  }
+
+
+  /**
+   * Sets the value of the 'nullable_name' field.
+   * @param value the value to set.
+   */
+  public void setNullableName(@Nullable java.lang.String value) {
+    this.nullable_name = value;
+  }
+
+  /**
+   * Gets the value of the 'favorite_number' field.
+   * @return The value of the 'favorite_number' field.
+   */
+  @NotNull
+  public int getFavoriteNumber() {
+    return favorite_number;
+  }
+
+
+  /**
+   * Sets the value of the 'favorite_number' field.
+   * @param value the value to set.
+   */
+  public void setFavoriteNumber(@NotNull int value) {
+    this.favorite_number = value;
+  }
+
+  /**
+   * Gets the value of the 'nullable_favorite_number' field.
+   * @return The value of the 'nullable_favorite_number' field.
+   */
+  @Nullable
+  public java.lang.Integer getNullableFavoriteNumber() {
+    return nullable_favorite_number;
+  }
+
+
+  /**
+   * Sets the value of the 'nullable_favorite_number' field.
+   * @param value the value to set.
+   */
+  public void setNullableFavoriteNumber(@Nullable java.lang.Integer value) {
+    this.nullable_favorite_number = value;
+  }
+
+  /**
+   * Creates a new NullSafeAnnotationsFieldsTest RecordBuilder.
+   * @return A new NullSafeAnnotationsFieldsTest RecordBuilder
+   */
+  public static avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder newBuilder() {
+    return new avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder();
+  }
+
+  /**
+   * Creates a new NullSafeAnnotationsFieldsTest RecordBuilder by copying an existing Builder.
+   * @param other The existing builder to copy.
+   * @return A new NullSafeAnnotationsFieldsTest RecordBuilder
+   */
+  public static avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder newBuilder(avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder other) {
+    if (other == null) {
+      return new avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder();
+    } else {
+      return new avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder(other);
+    }
+  }
+
+  /**
+   * Creates a new NullSafeAnnotationsFieldsTest RecordBuilder by copying an existing NullSafeAnnotationsFieldsTest instance.
+   * @param other The existing instance to copy.
+   * @return A new NullSafeAnnotationsFieldsTest RecordBuilder
+   */
+  public static avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder newBuilder(avro.examples.baseball.NullSafeAnnotationsFieldsTest other) {
+    if (other == null) {
+      return new avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder();
+    } else {
+      return new avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder(other);
+    }
+  }
+
+  /**
+   * RecordBuilder for NullSafeAnnotationsFieldsTest instances.
+   */
+  @org.apache.avro.specific.AvroGenerated
+  public static class Builder extends org.apache.avro.specific.SpecificRecordBuilderBase<NullSafeAnnotationsFieldsTest>
+    implements org.apache.avro.data.RecordBuilder<NullSafeAnnotationsFieldsTest> {
+
+    private java.lang.String name;
+    private java.lang.String nullable_name;
+    private int favorite_number;
+    private java.lang.Integer nullable_favorite_number;
+
+    /** Creates a new Builder */
+    private Builder() {
+      super(SCHEMA$, MODEL$);
+    }
+
+    /**
+     * Creates a Builder by copying an existing Builder.
+     * @param other The existing Builder to copy.
+     */
+    private Builder(avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder other) {
+      super(other);
+      if (isValidValue(fields()[0], other.name)) {
+        this.name = data().deepCopy(fields()[0].schema(), other.name);
+        fieldSetFlags()[0] = other.fieldSetFlags()[0];
+      }
+      if (isValidValue(fields()[1], other.nullable_name)) {
+        this.nullable_name = data().deepCopy(fields()[1].schema(), other.nullable_name);
+        fieldSetFlags()[1] = other.fieldSetFlags()[1];
+      }
+      if (isValidValue(fields()[2], other.favorite_number)) {
+        this.favorite_number = data().deepCopy(fields()[2].schema(), other.favorite_number);
+        fieldSetFlags()[2] = other.fieldSetFlags()[2];
+      }
+      if (isValidValue(fields()[3], other.nullable_favorite_number)) {
+        this.nullable_favorite_number = data().deepCopy(fields()[3].schema(), other.nullable_favorite_number);
+        fieldSetFlags()[3] = other.fieldSetFlags()[3];
+      }
+    }
+
+    /**
+     * Creates a Builder by copying an existing NullSafeAnnotationsFieldsTest instance
+     * @param other The existing instance to copy.
+     */
+    private Builder(avro.examples.baseball.NullSafeAnnotationsFieldsTest other) {
+      super(SCHEMA$, MODEL$);
+      if (isValidValue(fields()[0], other.name)) {
+        this.name = data().deepCopy(fields()[0].schema(), other.name);
+        fieldSetFlags()[0] = true;
+      }
+      if (isValidValue(fields()[1], other.nullable_name)) {
+        this.nullable_name = data().deepCopy(fields()[1].schema(), other.nullable_name);
+        fieldSetFlags()[1] = true;
+      }
+      if (isValidValue(fields()[2], other.favorite_number)) {
+        this.favorite_number = data().deepCopy(fields()[2].schema(), other.favorite_number);
+        fieldSetFlags()[2] = true;
+      }
+      if (isValidValue(fields()[3], other.nullable_favorite_number)) {
+        this.nullable_favorite_number = data().deepCopy(fields()[3].schema(), other.nullable_favorite_number);
+        fieldSetFlags()[3] = true;
+      }
+    }
+
+    /**
+      * Gets the value of the 'name' field.
+      * @return The value.
+      */
+    public java.lang.String getName() {
+      return name;
+    }
+
+
+    /**
+      * Sets the value of the 'name' field.
+      * @param value The value of 'name'.
+      * @return This builder.
+      */
+    public avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder setName(@NotNull java.lang.String value) {
+      validate(fields()[0], value);
+      this.name = value;
+      fieldSetFlags()[0] = true;
+      return this;
+    }
+
+    /**
+      * Checks whether the 'name' field has been set.
+      * @return True if the 'name' field has been set, false otherwise.
+      */
+    public boolean hasName() {
+      return fieldSetFlags()[0];
+    }
+
+
+    /**
+      * Clears the value of the 'name' field.
+      * @return This builder.
+      */
+    public avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder clearName() {
+      name = null;
+      fieldSetFlags()[0] = false;
+      return this;
+    }
+
+    /**
+      * Gets the value of the 'nullable_name' field.
+      * @return The value.
+      */
+    public java.lang.String getNullableName() {
+      return nullable_name;
+    }
+
+
+    /**
+      * Sets the value of the 'nullable_name' field.
+      * @param value The value of 'nullable_name'.
+      * @return This builder.
+      */
+    public avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder setNullableName(@Nullable java.lang.String value) {
+      validate(fields()[1], value);
+      this.nullable_name = value;
+      fieldSetFlags()[1] = true;
+      return this;
+    }
+
+    /**
+      * Checks whether the 'nullable_name' field has been set.
+      * @return True if the 'nullable_name' field has been set, false otherwise.
+      */
+    public boolean hasNullableName() {
+      return fieldSetFlags()[1];
+    }
+
+
+    /**
+      * Clears the value of the 'nullable_name' field.
+      * @return This builder.
+      */
+    public avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder clearNullableName() {
+      nullable_name = null;
+      fieldSetFlags()[1] = false;
+      return this;
+    }
+
+    /**
+      * Gets the value of the 'favorite_number' field.
+      * @return The value.
+      */
+    public int getFavoriteNumber() {
+      return favorite_number;
+    }
+
+
+    /**
+      * Sets the value of the 'favorite_number' field.
+      * @param value The value of 'favorite_number'.
+      * @return This builder.
+      */
+    public avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder setFavoriteNumber(@NotNull int value) {
+      validate(fields()[2], value);
+      this.favorite_number = value;
+      fieldSetFlags()[2] = true;
+      return this;
+    }
+
+    /**
+      * Checks whether the 'favorite_number' field has been set.
+      * @return True if the 'favorite_number' field has been set, false otherwise.
+      */
+    public boolean hasFavoriteNumber() {
+      return fieldSetFlags()[2];
+    }
+
+
+    /**
+      * Clears the value of the 'favorite_number' field.
+      * @return This builder.
+      */
+    public avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder clearFavoriteNumber() {
+      fieldSetFlags()[2] = false;
+      return this;
+    }
+
+    /**
+      * Gets the value of the 'nullable_favorite_number' field.
+      * @return The value.
+      */
+    public java.lang.Integer getNullableFavoriteNumber() {
+      return nullable_favorite_number;
+    }
+
+
+    /**
+      * Sets the value of the 'nullable_favorite_number' field.
+      * @param value The value of 'nullable_favorite_number'.
+      * @return This builder.
+      */
+    public avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder setNullableFavoriteNumber(@Nullable java.lang.Integer value) {
+      validate(fields()[3], value);
+      this.nullable_favorite_number = value;
+      fieldSetFlags()[3] = true;
+      return this;
+    }
+
+    /**
+      * Checks whether the 'nullable_favorite_number' field has been set.
+      * @return True if the 'nullable_favorite_number' field has been set, false otherwise.
+      */
+    public boolean hasNullableFavoriteNumber() {
+      return fieldSetFlags()[3];
+    }
+
+
+    /**
+      * Clears the value of the 'nullable_favorite_number' field.
+      * @return This builder.
+      */
+    public avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder clearNullableFavoriteNumber() {
+      nullable_favorite_number = null;
+      fieldSetFlags()[3] = false;
+      return this;
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public NullSafeAnnotationsFieldsTest build() {
+      try {
+        NullSafeAnnotationsFieldsTest record = new NullSafeAnnotationsFieldsTest();
+        record.name = fieldSetFlags()[0] ? this.name : (java.lang.String) defaultValue(fields()[0]);
+        record.nullable_name = fieldSetFlags()[1] ? this.nullable_name : (java.lang.String) defaultValue(fields()[1]);
+        record.favorite_number = fieldSetFlags()[2] ? this.favorite_number : (java.lang.Integer) defaultValue(fields()[2]);
+        record.nullable_favorite_number = fieldSetFlags()[3] ? this.nullable_favorite_number : (java.lang.Integer) defaultValue(fields()[3]);
+        return record;
+      } catch (org.apache.avro.AvroMissingFieldException e) {
+        throw e;
+      } catch (java.lang.Exception e) {
+        throw new org.apache.avro.AvroRuntimeException(e);
+      }
+    }
+  }
+
+  @SuppressWarnings("unchecked")
+  private static final org.apache.avro.io.DatumWriter<NullSafeAnnotationsFieldsTest>
+    WRITER$ = (org.apache.avro.io.DatumWriter<NullSafeAnnotationsFieldsTest>)MODEL$.createDatumWriter(SCHEMA$);
+
+  @Override public void writeExternal(java.io.ObjectOutput out)
+    throws java.io.IOException {
+    WRITER$.write(this, SpecificData.getEncoder(out));
+  }
+
+  @SuppressWarnings("unchecked")
+  private static final org.apache.avro.io.DatumReader<NullSafeAnnotationsFieldsTest>
+    READER$ = (org.apache.avro.io.DatumReader<NullSafeAnnotationsFieldsTest>)MODEL$.createDatumReader(SCHEMA$);
+
+  @Override public void readExternal(java.io.ObjectInput in)
+    throws java.io.IOException {
+    READER$.read(this, SpecificData.getDecoder(in));
+  }
+
+  @Override protected boolean hasCustomCoders() { return true; }
+
+  @Override public void customEncode(org.apache.avro.io.Encoder out)
+    throws java.io.IOException
+  {
+    out.writeString(this.name);
+
+    if (this.nullable_name == null) {
+      out.writeIndex(1);
+      out.writeNull();
+    } else {
+      out.writeIndex(0);
+      out.writeString(this.nullable_name);
+    }
+
+    out.writeInt(this.favorite_number);
+
+    if (this.nullable_favorite_number == null) {
+      out.writeIndex(1);
+      out.writeNull();
+    } else {
+      out.writeIndex(0);
+      out.writeInt(this.nullable_favorite_number);
+    }
+
+  }
+
+  @Override public void customDecode(org.apache.avro.io.ResolvingDecoder in)
+    throws java.io.IOException
+  {
+    org.apache.avro.Schema.Field[] fieldOrder = in.readFieldOrderIfDiff();
+    if (fieldOrder == null) {
+      this.name = in.readString();
+
+      if (in.readIndex() != 0) {
+        in.readNull();
+        this.nullable_name = null;
+      } else {
+        this.nullable_name = in.readString();
+      }
+
+      this.favorite_number = in.readInt();
+
+      if (in.readIndex() != 0) {
+        in.readNull();
+        this.nullable_favorite_number = null;
+      } else {
+        this.nullable_favorite_number = in.readInt();
+      }
+
+    } else {
+      for (int i = 0; i < 4; i++) {
+        switch (fieldOrder[i].pos()) {
+        case 0:
+          this.name = in.readString();
+          break;
+
+        case 1:
+          if (in.readIndex() != 0) {
+            in.readNull();
+            this.nullable_name = null;
+          } else {
+            this.nullable_name = in.readString();
+          }
+          break;
+
+        case 2:
+          this.favorite_number = in.readInt();
+          break;
+
+        case 3:
+          if (in.readIndex() != 0) {
+            in.readNull();
+            this.nullable_favorite_number = null;
+          } else {
+            this.nullable_favorite_number = in.readInt();
+          }
+          break;
+
+        default:
+          throw new java.io.IOException("Corrupt ResolvingDecoder.");
+        }
+      }
+    }
+  }
+}
+
+
+
+
+
+
+
+
+
+

Review Comment:
   Minor issue: we can to with less newlines here, can we?



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@avro.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [avro] opwvhk commented on a diff in pull request #2142: AVRO-3641: Adds support for nullSafeAnnotations to java SpecificCompiler

Posted by "opwvhk (via GitHub)" <gi...@apache.org>.
opwvhk commented on code in PR #2142:
URL: https://github.com/apache/avro/pull/2142#discussion_r1138344060


##########
lang/java/ipc/pom.xml:
##########
@@ -168,6 +168,10 @@
       <groupId>org.apache.velocity</groupId>
       <artifactId>velocity-engine-core</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.jetbrains</groupId>
+      <artifactId>annotations</artifactId>
+    </dependency>

Review Comment:
   Is this dependency actually used here?



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@avro.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [avro] karlll commented on pull request #2142: AVRO-3641: Adds support for nullSafeAnnotations to java SpecificCompiler

Posted by "karlll (via GitHub)" <gi...@apache.org>.
karlll commented on PR #2142:
URL: https://github.com/apache/avro/pull/2142#issuecomment-1483837112

   👍 


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@avro.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [avro] opwvhk commented on a diff in pull request #2142: AVRO-3641: Adds support for nullSafeAnnotations to java SpecificCompiler

Posted by "opwvhk (via GitHub)" <gi...@apache.org>.
opwvhk commented on code in PR #2142:
URL: https://github.com/apache/avro/pull/2142#discussion_r1212971467


##########
lang/java/compiler/src/main/velocity/org/apache/avro/compiler/specific/templates/java/classic/record.vm:
##########
@@ -28,6 +28,9 @@ import org.apache.avro.message.BinaryMessageDecoder;
 import org.apache.avro.message.SchemaStore;
 #end
 #if (${this.gettersReturnOptional} || ${this.createOptionalGetters})import java.util.Optional;#end
+#if (${this.createNullSafeAnnotations})import org.jetbrains.annotations.Nullable;
+import org.jetbrains.annotations.NotNull;
+#end

Review Comment:
   Instead of an import, can we please use the same pattern as for other types?
   
   Instead of `String`, the code used `java.lang.String` as well, because this makes name clashes less likely.
   
   Additionally, using explicit annotation classes allows us to make the annotations configurable.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@avro.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] AVRO-3641: Adds support for nullSafeAnnotations to java SpecificCompiler [avro]

Posted by "opwvhk (via GitHub)" <gi...@apache.org>.
opwvhk merged PR #2142:
URL: https://github.com/apache/avro/pull/2142


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: dev-unsubscribe@avro.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [avro] opwvhk commented on pull request #2142: AVRO-3641: Adds support for nullSafeAnnotations to java SpecificCompiler

Posted by "opwvhk (via GitHub)" <gi...@apache.org>.
opwvhk commented on PR #2142:
URL: https://github.com/apache/avro/pull/2142#issuecomment-1467675094

   Given that this package main use case are the command line tools / build plugins, I'm fine with adding the jetbrains dependency.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@avro.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [avro] peknu commented on a diff in pull request #2142: AVRO-3641: Adds support for nullSafeAnnotations to java SpecificCompiler

Posted by "peknu (via GitHub)" <gi...@apache.org>.
peknu commented on code in PR #2142:
URL: https://github.com/apache/avro/pull/2142#discussion_r1190086631


##########
lang/java/tools/src/test/compiler/output-string/avro/examples/baseball/NullSafeAnnotationsFieldsTest.java:
##########
@@ -0,0 +1,597 @@
+/**
+ * Autogenerated by Avro
+ *
+ * DO NOT EDIT DIRECTLY
+ */
+package avro.examples.baseball;
+
+import org.apache.avro.generic.GenericArray;
+import org.apache.avro.specific.SpecificData;
+import org.apache.avro.util.Utf8;
+import org.apache.avro.message.BinaryMessageEncoder;
+import org.apache.avro.message.BinaryMessageDecoder;
+import org.apache.avro.message.SchemaStore;
+import org.jetbrains.annotations.Nullable;
+import org.jetbrains.annotations.NotNull;
+
+/** Test that @Nullable and @NotNull annotations are created for all fields */
+@org.apache.avro.specific.AvroGenerated
+public class NullSafeAnnotationsFieldsTest extends org.apache.avro.specific.SpecificRecordBase implements org.apache.avro.specific.SpecificRecord {
+  private static final long serialVersionUID = 2020521726426674816L;
+
+
+  public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"NullSafeAnnotationsFieldsTest\",\"namespace\":\"avro.examples.baseball\",\"doc\":\"Test that @Nullable and @NotNull annotations are created for all fields\",\"fields\":[{\"name\":\"name\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"nullable_name\",\"type\":[{\"type\":\"string\",\"avro.java.string\":\"String\"},\"null\"]},{\"name\":\"favorite_number\",\"type\":\"int\"},{\"name\":\"nullable_favorite_number\",\"type\":[\"int\",\"null\"]}]}");
+  public static org.apache.avro.Schema getClassSchema() { return SCHEMA$; }
+
+  private static final SpecificData MODEL$ = new SpecificData();
+
+  private static final BinaryMessageEncoder<NullSafeAnnotationsFieldsTest> ENCODER =
+      new BinaryMessageEncoder<>(MODEL$, SCHEMA$);
+
+  private static final BinaryMessageDecoder<NullSafeAnnotationsFieldsTest> DECODER =
+      new BinaryMessageDecoder<>(MODEL$, SCHEMA$);
+
+  /**
+   * Return the BinaryMessageEncoder instance used by this class.
+   * @return the message encoder used by this class
+   */
+  public static BinaryMessageEncoder<NullSafeAnnotationsFieldsTest> getEncoder() {
+    return ENCODER;
+  }
+
+  /**
+   * Return the BinaryMessageDecoder instance used by this class.
+   * @return the message decoder used by this class
+   */
+  public static BinaryMessageDecoder<NullSafeAnnotationsFieldsTest> getDecoder() {
+    return DECODER;
+  }
+
+  /**
+   * Create a new BinaryMessageDecoder instance for this class that uses the specified {@link SchemaStore}.
+   * @param resolver a {@link SchemaStore} used to find schemas by fingerprint
+   * @return a BinaryMessageDecoder instance for this class backed by the given SchemaStore
+   */
+  public static BinaryMessageDecoder<NullSafeAnnotationsFieldsTest> createDecoder(SchemaStore resolver) {
+    return new BinaryMessageDecoder<>(MODEL$, SCHEMA$, resolver);
+  }
+
+  /**
+   * Serializes this NullSafeAnnotationsFieldsTest to a ByteBuffer.
+   * @return a buffer holding the serialized data for this instance
+   * @throws java.io.IOException if this instance could not be serialized
+   */
+  public java.nio.ByteBuffer toByteBuffer() throws java.io.IOException {
+    return ENCODER.encode(this);
+  }
+
+  /**
+   * Deserializes a NullSafeAnnotationsFieldsTest from a ByteBuffer.
+   * @param b a byte buffer holding serialized data for an instance of this class
+   * @return a NullSafeAnnotationsFieldsTest instance decoded from the given buffer
+   * @throws java.io.IOException if the given bytes could not be deserialized into an instance of this class
+   */
+  public static NullSafeAnnotationsFieldsTest fromByteBuffer(
+      java.nio.ByteBuffer b) throws java.io.IOException {
+    return DECODER.decode(b);
+  }
+
+  private java.lang.String name;
+  private java.lang.String nullable_name;
+  private int favorite_number;
+  private java.lang.Integer nullable_favorite_number;
+
+  /**
+   * Default constructor.  Note that this does not initialize fields
+   * to their default values from the schema.  If that is desired then
+   * one should use <code>newBuilder()</code>.
+   */
+  public NullSafeAnnotationsFieldsTest() {}
+
+  /**
+   * All-args constructor.
+   * @param name The new value for name
+   * @param nullable_name The new value for nullable_name
+   * @param favorite_number The new value for favorite_number
+   * @param nullable_favorite_number The new value for nullable_favorite_number
+   */
+  public NullSafeAnnotationsFieldsTest(@NotNull java.lang.String name, @Nullable java.lang.String nullable_name, @NotNull java.lang.Integer favorite_number, @Nullable java.lang.Integer nullable_favorite_number) {
+    this.name = name;
+    this.nullable_name = nullable_name;
+    this.favorite_number = favorite_number;
+    this.nullable_favorite_number = nullable_favorite_number;
+  }
+
+  @Override
+  public org.apache.avro.specific.SpecificData getSpecificData() { return MODEL$; }
+
+  @Override
+  public org.apache.avro.Schema getSchema() { return SCHEMA$; }
+
+  // Used by DatumWriter.  Applications should not call.
+  @Override
+  public java.lang.Object get(int field$) {
+    switch (field$) {
+    case 0: return name;
+    case 1: return nullable_name;
+    case 2: return favorite_number;
+    case 3: return nullable_favorite_number;
+    default: throw new IndexOutOfBoundsException("Invalid index: " + field$);
+    }
+  }
+
+  // Used by DatumReader.  Applications should not call.
+  @Override
+  @SuppressWarnings(value="unchecked")
+  public void put(int field$, java.lang.Object value$) {
+    switch (field$) {
+    case 0: name = value$ != null ? value$.toString() : null; break;
+    case 1: nullable_name = value$ != null ? value$.toString() : null; break;
+    case 2: favorite_number = (java.lang.Integer)value$; break;
+    case 3: nullable_favorite_number = (java.lang.Integer)value$; break;
+    default: throw new IndexOutOfBoundsException("Invalid index: " + field$);
+    }
+  }
+
+  /**
+   * Gets the value of the 'name' field.
+   * @return The value of the 'name' field.
+   */
+  @NotNull
+  public java.lang.String getName() {
+    return name;
+  }
+
+
+  /**
+   * Sets the value of the 'name' field.
+   * @param value the value to set.
+   */
+  public void setName(@NotNull java.lang.String value) {
+    this.name = value;
+  }
+
+  /**
+   * Gets the value of the 'nullable_name' field.
+   * @return The value of the 'nullable_name' field.
+   */
+  @Nullable
+  public java.lang.String getNullableName() {
+    return nullable_name;
+  }
+
+
+  /**
+   * Sets the value of the 'nullable_name' field.
+   * @param value the value to set.
+   */
+  public void setNullableName(@Nullable java.lang.String value) {
+    this.nullable_name = value;
+  }
+
+  /**
+   * Gets the value of the 'favorite_number' field.
+   * @return The value of the 'favorite_number' field.
+   */
+  @NotNull
+  public int getFavoriteNumber() {
+    return favorite_number;
+  }
+
+
+  /**
+   * Sets the value of the 'favorite_number' field.
+   * @param value the value to set.
+   */
+  public void setFavoriteNumber(@NotNull int value) {
+    this.favorite_number = value;
+  }
+
+  /**
+   * Gets the value of the 'nullable_favorite_number' field.
+   * @return The value of the 'nullable_favorite_number' field.
+   */
+  @Nullable
+  public java.lang.Integer getNullableFavoriteNumber() {
+    return nullable_favorite_number;
+  }
+
+
+  /**
+   * Sets the value of the 'nullable_favorite_number' field.
+   * @param value the value to set.
+   */
+  public void setNullableFavoriteNumber(@Nullable java.lang.Integer value) {
+    this.nullable_favorite_number = value;
+  }
+
+  /**
+   * Creates a new NullSafeAnnotationsFieldsTest RecordBuilder.
+   * @return A new NullSafeAnnotationsFieldsTest RecordBuilder
+   */
+  public static avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder newBuilder() {
+    return new avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder();
+  }
+
+  /**
+   * Creates a new NullSafeAnnotationsFieldsTest RecordBuilder by copying an existing Builder.
+   * @param other The existing builder to copy.
+   * @return A new NullSafeAnnotationsFieldsTest RecordBuilder
+   */
+  public static avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder newBuilder(avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder other) {
+    if (other == null) {
+      return new avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder();
+    } else {
+      return new avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder(other);
+    }
+  }
+
+  /**
+   * Creates a new NullSafeAnnotationsFieldsTest RecordBuilder by copying an existing NullSafeAnnotationsFieldsTest instance.
+   * @param other The existing instance to copy.
+   * @return A new NullSafeAnnotationsFieldsTest RecordBuilder
+   */
+  public static avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder newBuilder(avro.examples.baseball.NullSafeAnnotationsFieldsTest other) {
+    if (other == null) {
+      return new avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder();
+    } else {
+      return new avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder(other);
+    }
+  }
+
+  /**
+   * RecordBuilder for NullSafeAnnotationsFieldsTest instances.
+   */
+  @org.apache.avro.specific.AvroGenerated
+  public static class Builder extends org.apache.avro.specific.SpecificRecordBuilderBase<NullSafeAnnotationsFieldsTest>
+    implements org.apache.avro.data.RecordBuilder<NullSafeAnnotationsFieldsTest> {
+
+    private java.lang.String name;
+    private java.lang.String nullable_name;
+    private int favorite_number;
+    private java.lang.Integer nullable_favorite_number;
+
+    /** Creates a new Builder */
+    private Builder() {
+      super(SCHEMA$, MODEL$);
+    }
+
+    /**
+     * Creates a Builder by copying an existing Builder.
+     * @param other The existing Builder to copy.
+     */
+    private Builder(avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder other) {
+      super(other);
+      if (isValidValue(fields()[0], other.name)) {
+        this.name = data().deepCopy(fields()[0].schema(), other.name);
+        fieldSetFlags()[0] = other.fieldSetFlags()[0];
+      }
+      if (isValidValue(fields()[1], other.nullable_name)) {
+        this.nullable_name = data().deepCopy(fields()[1].schema(), other.nullable_name);
+        fieldSetFlags()[1] = other.fieldSetFlags()[1];
+      }
+      if (isValidValue(fields()[2], other.favorite_number)) {
+        this.favorite_number = data().deepCopy(fields()[2].schema(), other.favorite_number);
+        fieldSetFlags()[2] = other.fieldSetFlags()[2];
+      }
+      if (isValidValue(fields()[3], other.nullable_favorite_number)) {
+        this.nullable_favorite_number = data().deepCopy(fields()[3].schema(), other.nullable_favorite_number);
+        fieldSetFlags()[3] = other.fieldSetFlags()[3];
+      }
+    }
+
+    /**
+     * Creates a Builder by copying an existing NullSafeAnnotationsFieldsTest instance
+     * @param other The existing instance to copy.
+     */
+    private Builder(avro.examples.baseball.NullSafeAnnotationsFieldsTest other) {
+      super(SCHEMA$, MODEL$);
+      if (isValidValue(fields()[0], other.name)) {
+        this.name = data().deepCopy(fields()[0].schema(), other.name);
+        fieldSetFlags()[0] = true;
+      }
+      if (isValidValue(fields()[1], other.nullable_name)) {
+        this.nullable_name = data().deepCopy(fields()[1].schema(), other.nullable_name);
+        fieldSetFlags()[1] = true;
+      }
+      if (isValidValue(fields()[2], other.favorite_number)) {
+        this.favorite_number = data().deepCopy(fields()[2].schema(), other.favorite_number);
+        fieldSetFlags()[2] = true;
+      }
+      if (isValidValue(fields()[3], other.nullable_favorite_number)) {
+        this.nullable_favorite_number = data().deepCopy(fields()[3].schema(), other.nullable_favorite_number);
+        fieldSetFlags()[3] = true;
+      }
+    }
+
+    /**
+      * Gets the value of the 'name' field.
+      * @return The value.
+      */
+    public java.lang.String getName() {
+      return name;
+    }
+
+
+    /**
+      * Sets the value of the 'name' field.
+      * @param value The value of 'name'.
+      * @return This builder.
+      */
+    public avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder setName(@NotNull java.lang.String value) {
+      validate(fields()[0], value);
+      this.name = value;
+      fieldSetFlags()[0] = true;
+      return this;
+    }
+
+    /**
+      * Checks whether the 'name' field has been set.
+      * @return True if the 'name' field has been set, false otherwise.
+      */
+    public boolean hasName() {
+      return fieldSetFlags()[0];
+    }
+
+
+    /**
+      * Clears the value of the 'name' field.
+      * @return This builder.
+      */
+    public avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder clearName() {
+      name = null;
+      fieldSetFlags()[0] = false;
+      return this;
+    }
+
+    /**
+      * Gets the value of the 'nullable_name' field.
+      * @return The value.
+      */
+    public java.lang.String getNullableName() {
+      return nullable_name;
+    }
+
+
+    /**
+      * Sets the value of the 'nullable_name' field.
+      * @param value The value of 'nullable_name'.
+      * @return This builder.
+      */
+    public avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder setNullableName(@Nullable java.lang.String value) {
+      validate(fields()[1], value);
+      this.nullable_name = value;
+      fieldSetFlags()[1] = true;
+      return this;
+    }
+
+    /**
+      * Checks whether the 'nullable_name' field has been set.
+      * @return True if the 'nullable_name' field has been set, false otherwise.
+      */
+    public boolean hasNullableName() {
+      return fieldSetFlags()[1];
+    }
+
+
+    /**
+      * Clears the value of the 'nullable_name' field.
+      * @return This builder.
+      */
+    public avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder clearNullableName() {
+      nullable_name = null;
+      fieldSetFlags()[1] = false;
+      return this;
+    }
+
+    /**
+      * Gets the value of the 'favorite_number' field.
+      * @return The value.
+      */
+    public int getFavoriteNumber() {
+      return favorite_number;
+    }
+
+
+    /**
+      * Sets the value of the 'favorite_number' field.
+      * @param value The value of 'favorite_number'.
+      * @return This builder.
+      */
+    public avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder setFavoriteNumber(@NotNull int value) {
+      validate(fields()[2], value);
+      this.favorite_number = value;
+      fieldSetFlags()[2] = true;
+      return this;
+    }
+
+    /**
+      * Checks whether the 'favorite_number' field has been set.
+      * @return True if the 'favorite_number' field has been set, false otherwise.
+      */
+    public boolean hasFavoriteNumber() {
+      return fieldSetFlags()[2];
+    }
+
+
+    /**
+      * Clears the value of the 'favorite_number' field.
+      * @return This builder.
+      */
+    public avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder clearFavoriteNumber() {
+      fieldSetFlags()[2] = false;
+      return this;
+    }
+
+    /**
+      * Gets the value of the 'nullable_favorite_number' field.
+      * @return The value.
+      */
+    public java.lang.Integer getNullableFavoriteNumber() {
+      return nullable_favorite_number;
+    }
+
+
+    /**
+      * Sets the value of the 'nullable_favorite_number' field.
+      * @param value The value of 'nullable_favorite_number'.
+      * @return This builder.
+      */
+    public avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder setNullableFavoriteNumber(@Nullable java.lang.Integer value) {
+      validate(fields()[3], value);
+      this.nullable_favorite_number = value;
+      fieldSetFlags()[3] = true;
+      return this;
+    }
+
+    /**
+      * Checks whether the 'nullable_favorite_number' field has been set.
+      * @return True if the 'nullable_favorite_number' field has been set, false otherwise.
+      */
+    public boolean hasNullableFavoriteNumber() {
+      return fieldSetFlags()[3];
+    }
+
+
+    /**
+      * Clears the value of the 'nullable_favorite_number' field.
+      * @return This builder.
+      */
+    public avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder clearNullableFavoriteNumber() {
+      nullable_favorite_number = null;
+      fieldSetFlags()[3] = false;
+      return this;
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public NullSafeAnnotationsFieldsTest build() {
+      try {
+        NullSafeAnnotationsFieldsTest record = new NullSafeAnnotationsFieldsTest();
+        record.name = fieldSetFlags()[0] ? this.name : (java.lang.String) defaultValue(fields()[0]);
+        record.nullable_name = fieldSetFlags()[1] ? this.nullable_name : (java.lang.String) defaultValue(fields()[1]);
+        record.favorite_number = fieldSetFlags()[2] ? this.favorite_number : (java.lang.Integer) defaultValue(fields()[2]);
+        record.nullable_favorite_number = fieldSetFlags()[3] ? this.nullable_favorite_number : (java.lang.Integer) defaultValue(fields()[3]);
+        return record;
+      } catch (org.apache.avro.AvroMissingFieldException e) {
+        throw e;
+      } catch (java.lang.Exception e) {
+        throw new org.apache.avro.AvroRuntimeException(e);
+      }
+    }
+  }
+
+  @SuppressWarnings("unchecked")
+  private static final org.apache.avro.io.DatumWriter<NullSafeAnnotationsFieldsTest>
+    WRITER$ = (org.apache.avro.io.DatumWriter<NullSafeAnnotationsFieldsTest>)MODEL$.createDatumWriter(SCHEMA$);
+
+  @Override public void writeExternal(java.io.ObjectOutput out)
+    throws java.io.IOException {
+    WRITER$.write(this, SpecificData.getEncoder(out));
+  }
+
+  @SuppressWarnings("unchecked")
+  private static final org.apache.avro.io.DatumReader<NullSafeAnnotationsFieldsTest>
+    READER$ = (org.apache.avro.io.DatumReader<NullSafeAnnotationsFieldsTest>)MODEL$.createDatumReader(SCHEMA$);
+
+  @Override public void readExternal(java.io.ObjectInput in)
+    throws java.io.IOException {
+    READER$.read(this, SpecificData.getDecoder(in));
+  }
+
+  @Override protected boolean hasCustomCoders() { return true; }
+
+  @Override public void customEncode(org.apache.avro.io.Encoder out)
+    throws java.io.IOException
+  {
+    out.writeString(this.name);
+
+    if (this.nullable_name == null) {
+      out.writeIndex(1);
+      out.writeNull();
+    } else {
+      out.writeIndex(0);
+      out.writeString(this.nullable_name);
+    }
+
+    out.writeInt(this.favorite_number);
+
+    if (this.nullable_favorite_number == null) {
+      out.writeIndex(1);
+      out.writeNull();
+    } else {
+      out.writeIndex(0);
+      out.writeInt(this.nullable_favorite_number);
+    }
+
+  }
+
+  @Override public void customDecode(org.apache.avro.io.ResolvingDecoder in)
+    throws java.io.IOException
+  {
+    org.apache.avro.Schema.Field[] fieldOrder = in.readFieldOrderIfDiff();
+    if (fieldOrder == null) {
+      this.name = in.readString();
+
+      if (in.readIndex() != 0) {
+        in.readNull();
+        this.nullable_name = null;
+      } else {
+        this.nullable_name = in.readString();
+      }
+
+      this.favorite_number = in.readInt();
+
+      if (in.readIndex() != 0) {
+        in.readNull();
+        this.nullable_favorite_number = null;
+      } else {
+        this.nullable_favorite_number = in.readInt();
+      }
+
+    } else {
+      for (int i = 0; i < 4; i++) {
+        switch (fieldOrder[i].pos()) {
+        case 0:
+          this.name = in.readString();
+          break;
+
+        case 1:
+          if (in.readIndex() != 0) {
+            in.readNull();
+            this.nullable_name = null;
+          } else {
+            this.nullable_name = in.readString();
+          }
+          break;
+
+        case 2:
+          this.favorite_number = in.readInt();
+          break;
+
+        case 3:
+          if (in.readIndex() != 0) {
+            in.readNull();
+            this.nullable_favorite_number = null;
+          } else {
+            this.nullable_favorite_number = in.readInt();
+          }
+          break;
+
+        default:
+          throw new java.io.IOException("Corrupt ResolvingDecoder.");
+        }
+      }
+    }
+  }
+}
+
+
+
+
+
+
+
+
+
+

Review Comment:
   Removed the empty lines now. They are generated by Velocity but the result matches anyway.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@avro.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [avro] phile314 commented on pull request #2142: AVRO-3641: Adds support for nullSafeAnnotations to java SpecificCompiler

Posted by "phile314 (via GitHub)" <gi...@apache.org>.
phile314 commented on PR #2142:
URL: https://github.com/apache/avro/pull/2142#issuecomment-1468018988

   I was just now looking for this feature, great to see that this is already worked on :-)
   
   As there are many nullable annotations around, would it make sense to make it configurable?
   ![image](https://user-images.githubusercontent.com/1640697/225001174-d0f66b0b-afe4-44dc-92dc-cfbdafbd2e4e.png)
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@avro.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] AVRO-3641: Adds support for nullSafeAnnotations to java SpecificCompiler [avro]

Posted by "opwvhk (via GitHub)" <gi...@apache.org>.
opwvhk commented on PR #2142:
URL: https://github.com/apache/avro/pull/2142#issuecomment-1906735079

   @m-kay It will be in the next release, version 1.12.0. The most authoritative source on it is the dev mailing list.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@avro.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] AVRO-3641: Adds support for nullSafeAnnotations to java SpecificCompiler [avro]

Posted by "m-kay (via GitHub)" <gi...@apache.org>.
m-kay commented on PR #2142:
URL: https://github.com/apache/avro/pull/2142#issuecomment-1898177559

   @opwvhk Is there any planned version where this will be released? This would really help us a lot when working with Avro in Kotlin projects.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@avro.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org