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

opwvhk pushed a commit to branch branch-1.12
in repository https://gitbox.apache.org/repos/asf/avro.git

commit 753a2dd26e89b9cb479df2251e9f79dc2b8ab402
Author: Benedikt Werner <1benediktwer...@gmail.com>
AuthorDate: Sat May 3 09:15:49 2025 +0200

    AVRO-4119: [java] Make Nullable and NotNull annotations configurable (#3312)
    
    Add nullSafeAnnotationNullable and nullSafeAnnotationNotNull
    configuration options to allow specifying the exact annotations
    to use when createNullSafeAnnotations is enabled.
    
    This allows using annotations besides the JetBrains annotations
    (which remain the default for backward-compatibility).
    
    Co-authored-by: Oscar Westra van Holthe - Kind <opw...@apache.org>
    (cherry picked from commit 067c44024c3db832e731c051ba0178f0c4f18a04)
---
 .../avro/compiler/specific/SpecificCompiler.java   |  35 ++++++-
 .../specific/templates/java/classic/record.vm      |  10 +-
 .../org/apache/avro/mojo/AbstractAvroMojo.java     |  35 ++++++-
 .../org/apache/avro/tool/SpecificCompilerTool.java |  31 +++++-
 .../jetbrainsnullsafeannotationsfieldstest.avsc    |   8 ++
 .../jspecifynullsafeannotationsfieldstest.avsc     |   8 ++
 .../input/nullsafeannotationsfieldstest.avsc       |   8 --
 ... => JSpecifyNullSafeAnnotationsFieldsTest.java} | 114 ++++++++++-----------
 ...=> JetBrainsNullSafeAnnotationsFieldsTest.java} |  96 ++++++++---------
 .../apache/avro/tool/TestSpecificCompilerTool.java |  33 ++++--
 pom.xml                                            |   3 +-
 11 files changed, 247 insertions(+), 134 deletions(-)

diff --git 
a/lang/java/compiler/src/main/java/org/apache/avro/compiler/specific/SpecificCompiler.java
 
b/lang/java/compiler/src/main/java/org/apache/avro/compiler/specific/SpecificCompiler.java
index 53675f4a01..8ee062c372 100644
--- 
a/lang/java/compiler/src/main/java/org/apache/avro/compiler/specific/SpecificCompiler.java
+++ 
b/lang/java/compiler/src/main/java/org/apache/avro/compiler/specific/SpecificCompiler.java
@@ -130,6 +130,9 @@ public class SpecificCompiler {
   private String suffix = ".java";
   private List<Object> additionalVelocityTools = Collections.emptyList();
 
+  private String nullSafeAnnotationNullable = 
"org.jetbrains.annotations.Nullable";
+  private String nullSafeAnnotationNotNull = 
"org.jetbrains.annotations.NotNull";
+
   private String recordSpecificClass = 
"org.apache.avro.specific.SpecificRecordBase";
 
   private String errorSpecificClass = 
"org.apache.avro.specific.SpecificExceptionBase";
@@ -243,12 +246,42 @@ public class SpecificCompiler {
   }
 
   /**
-   * Set to true to add jetbrains @Nullable and @NotNull annotations
+   * Set to true to add @Nullable and @NotNull annotations. By default, 
JetBrains
+   * annotations are used (org.jetbrains.annotations.Nullable and
+   * org.jetbrains.annotations.NotNull) but this can be overridden using
+   * {@link #setNullSafeAnnotationNullable)} and
+   * {@link #setNullSafeAnnotationNotNull)}.
    */
   public void setCreateNullSafeAnnotations(boolean createNullSafeAnnotations) {
     this.createNullSafeAnnotations = createNullSafeAnnotations;
   }
 
+  public String getNullSafeAnnotationNullable() {
+    return this.nullSafeAnnotationNullable;
+  }
+
+  /**
+   * Sets the annotation to use for nullable fields. Default is
+   * "org.jetbrains.annotations.Nullable". The annotation must include the full
+   * package path.
+   */
+  public void setNullSafeAnnotationNullable(String nullSafeAnnotationNullable) 
{
+    this.nullSafeAnnotationNullable = nullSafeAnnotationNullable;
+  }
+
+  public String getNullSafeAnnotationNotNull() {
+    return this.nullSafeAnnotationNotNull;
+  }
+
+  /**
+   * Sets the annotation to use for non-nullable fields. Default is
+   * "org.jetbrains.annotations.NotNull". The annotation must include the full
+   * package path.
+   */
+  public void setNullSafeAnnotationNotNull(String nullSafeAnnotationNotNull) {
+    this.nullSafeAnnotationNotNull = nullSafeAnnotationNotNull;
+  }
+
   public boolean isCreateOptionalGetters() {
     return this.createOptionalGetters;
   }
diff --git 
a/lang/java/compiler/src/main/velocity/org/apache/avro/compiler/specific/templates/java/classic/record.vm
 
b/lang/java/compiler/src/main/velocity/org/apache/avro/compiler/specific/templates/java/classic/record.vm
index ec1e6c3ca7..9c3e8dc332 100755
--- 
a/lang/java/compiler/src/main/velocity/org/apache/avro/compiler/specific/templates/java/classic/record.vm
+++ 
b/lang/java/compiler/src/main/velocity/org/apache/avro/compiler/specific/templates/java/classic/record.vm
@@ -160,7 +160,7 @@ public class 
${this.mangleTypeIdentifier($schema.getName())} extends ${this.getS
 #end
 #end
    */
-  public ${this.mangleTypeIdentifier($schema.getName())}(#foreach($field in 
$schema.getFields())#if(${this.createNullSafeAnnotations})#if(${field.schema().isNullable()})@org.jetbrains.annotations.Nullable#else@org.jetbrains.annotations.NotNull#end
 #end${this.javaType($field.schema())} 
${this.mangle($field.name())}#if($foreach.count < $schema.getFields().size()), 
#end#end) {
+  public ${this.mangleTypeIdentifier($schema.getName())}(#foreach($field in 
$schema.getFields())#if(${this.createNullSafeAnnotations})#if(${field.schema().isNullable()})@${this.nullSafeAnnotationNullable}#else@${this.nullSafeAnnotationNotNull}#end
 #end${this.javaType($field.schema())} 
${this.mangle($field.name())}#if($foreach.count < $schema.getFields().size()), 
#end#end) {
 #foreach ($field in $schema.getFields())
     ${this.generateSetterCode($field.schema(), ${this.mangle($field.name())}, 
${this.mangle($field.name())})}
 #end
@@ -244,9 +244,9 @@ public class 
${this.mangleTypeIdentifier($schema.getName())} extends ${this.getS
    */
 #if(${this.createNullSafeAnnotations})
 #if (${field.schema().isNullable()})
-  @org.jetbrains.annotations.Nullable
+  @${this.nullSafeAnnotationNullable}
 #else
-  @org.jetbrains.annotations.NotNull
+  @${this.nullSafeAnnotationNotNull}
 #end
 #end
   public ${this.javaUnbox($field.schema(), false)} 
${this.generateGetMethod($schema, $field)}() {
@@ -273,7 +273,7 @@ public class 
${this.mangleTypeIdentifier($schema.getName())} extends ${this.getS
 #end
    * @param value the value to set.
    */
-  public void ${this.generateSetMethod($schema, 
$field)}(#if(${this.createNullSafeAnnotations})#if(${field.schema().isNullable()})@org.jetbrains.annotations.Nullable#else@org.jetbrains.annotations.NotNull#end
 #end${this.javaUnbox($field.schema(), false)} value) {
+  public void ${this.generateSetMethod($schema, 
$field)}(#if(${this.createNullSafeAnnotations})#if(${field.schema().isNullable()})@${this.nullSafeAnnotationNullable}#else@${this.nullSafeAnnotationNotNull}#end
 #end${this.javaUnbox($field.schema(), false)} value) {
     ${this.generateSetterCode($field.schema(), ${this.mangle($field.name(), 
$schema.isError())}, "value")}
   }
 #end
@@ -429,7 +429,7 @@ public class 
${this.mangleTypeIdentifier($schema.getName())} extends ${this.getS
       * @param value The value of '${this.mangle($field.name(), 
$schema.isError())}'.
       * @return This builder.
       */
-    public #if 
($schema.getNamespace())$this.mangle($schema.getNamespace()).#end${this.mangleTypeIdentifier($schema.getName())}.Builder
 ${this.generateSetMethod($schema, 
$field)}(#if(${this.createNullSafeAnnotations})#if(${field.schema().isNullable()})@org.jetbrains.annotations.Nullable#else@org.jetbrains.annotations.NotNull#end
 #end${this.javaUnbox($field.schema(), false)} value) {
+    public #if 
($schema.getNamespace())$this.mangle($schema.getNamespace()).#end${this.mangleTypeIdentifier($schema.getName())}.Builder
 ${this.generateSetMethod($schema, 
$field)}(#if(${this.createNullSafeAnnotations})#if(${field.schema().isNullable()})@${this.nullSafeAnnotationNullable}#else@${this.nullSafeAnnotationNotNull}#end
 #end${this.javaUnbox($field.schema(), false)} value) {
       validate(fields()[$field.pos()], value);
 #if (${this.hasBuilder($field.schema())})
       this.${this.mangle($field.name(), $schema.isError())}Builder = null;
diff --git 
a/lang/java/maven-plugin/src/main/java/org/apache/avro/mojo/AbstractAvroMojo.java
 
b/lang/java/maven-plugin/src/main/java/org/apache/avro/mojo/AbstractAvroMojo.java
index 7dc203b035..282801cbbf 100644
--- 
a/lang/java/maven-plugin/src/main/java/org/apache/avro/mojo/AbstractAvroMojo.java
+++ 
b/lang/java/maven-plugin/src/main/java/org/apache/avro/mojo/AbstractAvroMojo.java
@@ -183,9 +183,10 @@ public abstract class AbstractAvroMojo extends 
AbstractMojo {
   protected boolean createSetters;
 
   /**
-   * The createNullSafeAnnotations parameter adds JetBrains {@literal 
@}Nullable
-   * and {@literal @}NotNull annotations for fhe fields of the record. The 
default
-   * is to not include annotations.
+   * If set to true, {@literal @}Nullable and {@literal @}NotNull annotations 
are
+   * added to fields of the record. The default is false. If enabled, JetBrains
+   * annotations are used by default but other annotations can be specified via
+   * the nullSafeAnnotationNullable and nullSafeAnnotationNotNull parameters.
    *
    * @parameter property="createNullSafeAnnotations"
    *
@@ -195,6 +196,32 @@ public abstract class AbstractAvroMojo extends 
AbstractMojo {
    */
   protected boolean createNullSafeAnnotations = false;
 
+  /**
+   * Controls which annotation should be added to nullable fields if
+   * createNullSafeAnnotations is enabled. The default is
+   * org.jetbrains.annotations.Nullable.
+   *
+   * @parameter property="nullSafeAnnotationNullable"
+   *
+   * @see <a href=
+   *      
"https://www.jetbrains.com/help/idea/annotating-source-code.html#nullability-annotations";>
+   *      JetBrains nullability annotations</a>
+   */
+  protected String nullSafeAnnotationNullable = 
"org.jetbrains.annotations.Nullable";
+
+  /**
+   * Controls which annotation should be added to non-nullable fields if
+   * createNullSafeAnnotations is enabled. The default is
+   * org.jetbrains.annotations.NotNull.
+   *
+   * @parameter property="nullSafeAnnotationNotNull"
+   *
+   * @see <a href=
+   *      
"https://www.jetbrains.com/help/idea/annotating-source-code.html#nullability-annotations";>
+   *      JetBrains nullability annotations</a>
+   */
+  protected String nullSafeAnnotationNotNull = 
"org.jetbrains.annotations.NotNull";
+
   /**
    * A set of fully qualified class names of custom
    * {@link org.apache.avro.Conversion} implementations to add to the compiler.
@@ -405,6 +432,8 @@ public abstract class AbstractAvroMojo extends AbstractMojo 
{
     
compiler.setOptionalGettersForNullableFieldsOnly(optionalGettersForNullableFieldsOnly);
     compiler.setCreateSetters(createSetters);
     compiler.setCreateNullSafeAnnotations(createNullSafeAnnotations);
+    compiler.setNullSafeAnnotationNullable(nullSafeAnnotationNullable);
+    compiler.setNullSafeAnnotationNotNull(nullSafeAnnotationNotNull);
     compiler.setEnableDecimalLogicalType(enableDecimalLogicalType);
     try {
       for (String customConversion : customConversions) {
diff --git 
a/lang/java/tools/src/main/java/org/apache/avro/tool/SpecificCompilerTool.java 
b/lang/java/tools/src/main/java/org/apache/avro/tool/SpecificCompilerTool.java
index d82929e940..ed55c4ff47 100644
--- 
a/lang/java/tools/src/main/java/org/apache/avro/tool/SpecificCompilerTool.java
+++ 
b/lang/java/tools/src/main/java/org/apache/avro/tool/SpecificCompilerTool.java
@@ -50,8 +50,10 @@ public class SpecificCompilerTool implements Tool {
     if (origArgs.size() < 3) {
       System.err
           .println("Usage: [-encoding <outputencoding>] [-string] 
[-bigDecimal] [-fieldVisibility <visibilityType>] "
-              + "[-noSetters] [-nullSafeAnnotations] 
[-addExtraOptionalGetters] [-optionalGetters <optionalGettersType>] "
-              + "[-templateDir <templateDir>] (schema|protocol) input... 
outputdir");
+              + "[-noSetters] [-nullSafeAnnotations] 
[-nullSafeAnnotationNullable <nullableAnnotation>] "
+              + "[-nullSafeAnnotationNotNull <notNullAnnotation>] 
[-addExtraOptionalGetters] "
+              + "[-optionalGetters <optionalGettersType>] [-templateDir 
<templateDir>] "
+              + "(schema|protocol) input... outputdir");
       System.err.println(" input - input files or directories");
       System.err.println(" outputdir - directory to write generated java");
       System.err.println(" -encoding <outputencoding> - set the encoding of " 
+ "output file(s)");
@@ -59,6 +61,9 @@ public class SpecificCompilerTool implements Tool {
       System.err.println(" -fieldVisibility [private|public] - use either and 
default private");
       System.err.println(" -noSetters - do not generate setters");
       System.err.println(" -nullSafeAnnotations - add @Nullable and @NotNull 
annotations");
+      System.err.println(" -nullSafeAnnotationNullable - full package path of 
annotation to use for nullable fields");
+      System.err
+          .println(" -nullSafeAnnotationNotNull - full package path of 
annotation to use for non-nullable fields");
       System.err
           .println(" -addExtraOptionalGetters - generate extra getters with 
this format: 'getOptional<FieldName>'");
       System.err.println(
@@ -74,6 +79,8 @@ public class SpecificCompilerTool implements Tool {
     compilerOpts.useLogicalDecimal = false;
     compilerOpts.createSetters = true;
     compilerOpts.createNullSafeAnnotations = false;
+    compilerOpts.nullSafeAnnotationNullable = Optional.empty();
+    compilerOpts.nullSafeAnnotationNotNull = Optional.empty();
     compilerOpts.optionalGettersType = Optional.empty();
     compilerOpts.addExtraOptionalGetters = false;
     compilerOpts.encoding = Optional.empty();
@@ -81,6 +88,7 @@ public class SpecificCompilerTool implements Tool {
     compilerOpts.fieldVisibility = Optional.empty();
 
     List<String> args = new ArrayList<>(origArgs);
+    int arg = 0;
 
     if (args.contains("-noSetters")) {
       compilerOpts.createSetters = false;
@@ -92,11 +100,24 @@ public class SpecificCompilerTool implements Tool {
       args.remove(args.indexOf("-nullSafeAnnotations"));
     }
 
+    if (args.contains("-nullSafeAnnotationNullable")) {
+      arg = args.indexOf("-nullSafeAnnotationNullable") + 1;
+      compilerOpts.nullSafeAnnotationNullable = Optional.of(args.get(arg));
+      args.remove(arg);
+      args.remove(arg - 1);
+    }
+
+    if (args.contains("-nullSafeAnnotationNotNull")) {
+      arg = args.indexOf("-nullSafeAnnotationNotNull") + 1;
+      compilerOpts.nullSafeAnnotationNotNull = Optional.of(args.get(arg));
+      args.remove(arg);
+      args.remove(arg - 1);
+    }
+
     if (args.contains("-addExtraOptionalGetters")) {
       compilerOpts.addExtraOptionalGetters = true;
       args.remove(args.indexOf("-addExtraOptionalGetters"));
     }
-    int arg = 0;
 
     if (args.contains("-optionalGetters")) {
       arg = args.indexOf("-optionalGetters") + 1;
@@ -180,6 +201,8 @@ public class SpecificCompilerTool implements Tool {
     compiler.setStringType(opts.stringType);
     compiler.setCreateSetters(opts.createSetters);
     compiler.setCreateNullSafeAnnotations(opts.createNullSafeAnnotations);
+    
opts.nullSafeAnnotationNullable.ifPresent(compiler::setNullSafeAnnotationNullable);
+    
opts.nullSafeAnnotationNotNull.ifPresent(compiler::setNullSafeAnnotationNotNull);
 
     opts.optionalGettersType.ifPresent(choice -> {
       compiler.setGettersReturnOptional(true);
@@ -276,6 +299,8 @@ public class SpecificCompilerTool implements Tool {
     boolean useLogicalDecimal;
     boolean createSetters;
     boolean createNullSafeAnnotations;
+    Optional<String> nullSafeAnnotationNullable;
+    Optional<String> nullSafeAnnotationNotNull;
     boolean addExtraOptionalGetters;
     Optional<OptionalGettersType> optionalGettersType;
     Optional<String> templateDir;
diff --git 
a/lang/java/tools/src/test/compiler/input/jetbrainsnullsafeannotationsfieldstest.avsc
 
b/lang/java/tools/src/test/compiler/input/jetbrainsnullsafeannotationsfieldstest.avsc
new file mode 100644
index 0000000000..07d9d904be
--- /dev/null
+++ 
b/lang/java/tools/src/test/compiler/input/jetbrainsnullsafeannotationsfieldstest.avsc
@@ -0,0 +1,8 @@
+{"type":"record", "name":"JetBrainsNullSafeAnnotationsFieldsTest", 
"namespace": "avro.examples.baseball", "doc":"Test that 
@org.jetbrains.annotations.Nullable and @org.jetbrains.annotations.NotNull 
annotations are created for all fields",
+  "fields": [
+    {"name": "name", "type": "string"},
+    {"name": "nullable_name",  "type": ["string", "null"]},
+    {"name": "favorite_number",  "type": "int"},
+    {"name": "nullable_favorite_number", "type": ["int", "null"]}
+  ]
+}
diff --git 
a/lang/java/tools/src/test/compiler/input/jspecifynullsafeannotationsfieldstest.avsc
 
b/lang/java/tools/src/test/compiler/input/jspecifynullsafeannotationsfieldstest.avsc
new file mode 100644
index 0000000000..e20ad36b1b
--- /dev/null
+++ 
b/lang/java/tools/src/test/compiler/input/jspecifynullsafeannotationsfieldstest.avsc
@@ -0,0 +1,8 @@
+{"type":"record", "name":"JSpecifyNullSafeAnnotationsFieldsTest", "namespace": 
"avro.examples.baseball", "doc":"Test that @org.jspecify.annotations.Nullable 
and @org.jspecify.annotations.NonNull annotations are created for all fields",
+  "fields": [
+    {"name": "name", "type": "string"},
+    {"name": "nullable_name",  "type": ["string", "null"]},
+    {"name": "favorite_number",  "type": "int"},
+    {"name": "nullable_favorite_number", "type": ["int", "null"]}
+  ]
+}
diff --git 
a/lang/java/tools/src/test/compiler/input/nullsafeannotationsfieldstest.avsc 
b/lang/java/tools/src/test/compiler/input/nullsafeannotationsfieldstest.avsc
deleted file mode 100644
index 04ef43e34e..0000000000
--- a/lang/java/tools/src/test/compiler/input/nullsafeannotationsfieldstest.avsc
+++ /dev/null
@@ -1,8 +0,0 @@
-{"type":"record", "name":"NullSafeAnnotationsFieldsTest", "namespace": 
"avro.examples.baseball", "doc":"Test that @org.jetbrains.annotations.Nullable 
and @org.jetbrains.annotations.NotNull annotations are created for all fields",
-  "fields": [
-    {"name": "name", "type": "string"},
-    {"name": "nullable_name",  "type": ["string", "null"]},
-    {"name": "favorite_number",  "type": "int"},
-    {"name": "nullable_favorite_number", "type": ["int", "null"]}
-  ]
-}
diff --git 
a/lang/java/tools/src/test/compiler/output-string/avro/examples/baseball/NullSafeAnnotationsFieldsTest.java
 
b/lang/java/tools/src/test/compiler/output-string/avro/examples/baseball/JSpecifyNullSafeAnnotationsFieldsTest.java
similarity index 70%
copy from 
lang/java/tools/src/test/compiler/output-string/avro/examples/baseball/NullSafeAnnotationsFieldsTest.java
copy to 
lang/java/tools/src/test/compiler/output-string/avro/examples/baseball/JSpecifyNullSafeAnnotationsFieldsTest.java
index 1da1fcde0e..1fa56857f8 100644
--- 
a/lang/java/tools/src/test/compiler/output-string/avro/examples/baseball/NullSafeAnnotationsFieldsTest.java
+++ 
b/lang/java/tools/src/test/compiler/output-string/avro/examples/baseball/JSpecifyNullSafeAnnotationsFieldsTest.java
@@ -11,28 +11,28 @@ import org.apache.avro.message.BinaryMessageEncoder;
 import org.apache.avro.message.BinaryMessageDecoder;
 import org.apache.avro.message.SchemaStore;
 
-/** Test that @org.jetbrains.annotations.Nullable and 
@org.jetbrains.annotations.NotNull annotations are created for all fields */
+/** Test that @org.jspecify.annotations.Nullable and 
@org.jspecify.annotations.NonNull 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 class JSpecifyNullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.SpecificRecordBase implements 
org.apache.avro.specific.SpecificRecord {
+  private static final long serialVersionUID = 2433229483110849489L;
 
 
-  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 @org.jetbrains.annotations.Nullable and 
@org.jetbrains.annotations.NotNull annotations are created for all 
fields\",\"fields\":[{\"name\":\"name\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"nullable_name\",\"type\":[{\"type\":\"string\"
 [...]
+  public static final org.apache.avro.Schema SCHEMA$ = new 
org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"JSpecifyNullSafeAnnotationsFieldsTest\",\"namespace\":\"avro.examples.baseball\",\"doc\":\"Test
 that @org.jspecify.annotations.Nullable and @org.jspecify.annotations.NonNull 
annotations are created for all 
fields\",\"fields\":[{\"name\":\"name\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"nullable_name\",\"type\":[{\"type\":\"st
 [...]
   public static org.apache.avro.Schema getClassSchema() { return SCHEMA$; }
 
   private static final SpecificData MODEL$ = new SpecificData();
 
-  private static final BinaryMessageEncoder<NullSafeAnnotationsFieldsTest> 
ENCODER =
+  private static final 
BinaryMessageEncoder<JSpecifyNullSafeAnnotationsFieldsTest> ENCODER =
       new BinaryMessageEncoder<>(MODEL$, SCHEMA$);
 
-  private static final BinaryMessageDecoder<NullSafeAnnotationsFieldsTest> 
DECODER =
+  private static final 
BinaryMessageDecoder<JSpecifyNullSafeAnnotationsFieldsTest> 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() {
+  public static BinaryMessageEncoder<JSpecifyNullSafeAnnotationsFieldsTest> 
getEncoder() {
     return ENCODER;
   }
 
@@ -40,7 +40,7 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
    * Return the BinaryMessageDecoder instance used by this class.
    * @return the message decoder used by this class
    */
-  public static BinaryMessageDecoder<NullSafeAnnotationsFieldsTest> 
getDecoder() {
+  public static BinaryMessageDecoder<JSpecifyNullSafeAnnotationsFieldsTest> 
getDecoder() {
     return DECODER;
   }
 
@@ -49,12 +49,12 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
    * @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) {
+  public static BinaryMessageDecoder<JSpecifyNullSafeAnnotationsFieldsTest> 
createDecoder(SchemaStore resolver) {
     return new BinaryMessageDecoder<>(MODEL$, SCHEMA$, resolver);
   }
 
   /**
-   * Serializes this NullSafeAnnotationsFieldsTest to a ByteBuffer.
+   * Serializes this JSpecifyNullSafeAnnotationsFieldsTest to a ByteBuffer.
    * @return a buffer holding the serialized data for this instance
    * @throws java.io.IOException if this instance could not be serialized
    */
@@ -63,12 +63,12 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
   }
 
   /**
-   * Deserializes a NullSafeAnnotationsFieldsTest from a ByteBuffer.
+   * Deserializes a JSpecifyNullSafeAnnotationsFieldsTest 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
+   * @return a JSpecifyNullSafeAnnotationsFieldsTest 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(
+  public static JSpecifyNullSafeAnnotationsFieldsTest fromByteBuffer(
       java.nio.ByteBuffer b) throws java.io.IOException {
     return DECODER.decode(b);
   }
@@ -83,7 +83,7 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
    * to their default values from the schema.  If that is desired then
    * one should use <code>newBuilder()</code>.
    */
-  public NullSafeAnnotationsFieldsTest() {}
+  public JSpecifyNullSafeAnnotationsFieldsTest() {}
 
   /**
    * All-args constructor.
@@ -92,7 +92,7 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
    * @param favorite_number The new value for favorite_number
    * @param nullable_favorite_number The new value for nullable_favorite_number
    */
-  public NullSafeAnnotationsFieldsTest(@org.jetbrains.annotations.NotNull 
java.lang.String name, @org.jetbrains.annotations.Nullable java.lang.String 
nullable_name, @org.jetbrains.annotations.NotNull java.lang.Integer 
favorite_number, @org.jetbrains.annotations.Nullable java.lang.Integer 
nullable_favorite_number) {
+  public 
JSpecifyNullSafeAnnotationsFieldsTest(@org.jspecify.annotations.NonNull 
java.lang.String name, @org.jspecify.annotations.Nullable java.lang.String 
nullable_name, @org.jspecify.annotations.NonNull java.lang.Integer 
favorite_number, @org.jspecify.annotations.Nullable java.lang.Integer 
nullable_favorite_number) {
     this.name = name;
     this.nullable_name = nullable_name;
     this.favorite_number = favorite_number;
@@ -134,7 +134,7 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
    * Gets the value of the 'name' field.
    * @return The value of the 'name' field.
    */
-  @org.jetbrains.annotations.NotNull
+  @org.jspecify.annotations.NonNull
   public java.lang.String getName() {
     return name;
   }
@@ -144,7 +144,7 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
    * Sets the value of the 'name' field.
    * @param value the value to set.
    */
-  public void setName(@org.jetbrains.annotations.NotNull java.lang.String 
value) {
+  public void setName(@org.jspecify.annotations.NonNull java.lang.String 
value) {
     this.name = value;
   }
 
@@ -152,7 +152,7 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
    * Gets the value of the 'nullable_name' field.
    * @return The value of the 'nullable_name' field.
    */
-  @org.jetbrains.annotations.Nullable
+  @org.jspecify.annotations.Nullable
   public java.lang.String getNullableName() {
     return nullable_name;
   }
@@ -162,7 +162,7 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
    * Sets the value of the 'nullable_name' field.
    * @param value the value to set.
    */
-  public void setNullableName(@org.jetbrains.annotations.Nullable 
java.lang.String value) {
+  public void setNullableName(@org.jspecify.annotations.Nullable 
java.lang.String value) {
     this.nullable_name = value;
   }
 
@@ -170,7 +170,7 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
    * Gets the value of the 'favorite_number' field.
    * @return The value of the 'favorite_number' field.
    */
-  @org.jetbrains.annotations.NotNull
+  @org.jspecify.annotations.NonNull
   public int getFavoriteNumber() {
     return favorite_number;
   }
@@ -180,7 +180,7 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
    * Sets the value of the 'favorite_number' field.
    * @param value the value to set.
    */
-  public void setFavoriteNumber(@org.jetbrains.annotations.NotNull int value) {
+  public void setFavoriteNumber(@org.jspecify.annotations.NonNull int value) {
     this.favorite_number = value;
   }
 
@@ -188,7 +188,7 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
    * Gets the value of the 'nullable_favorite_number' field.
    * @return The value of the 'nullable_favorite_number' field.
    */
-  @org.jetbrains.annotations.Nullable
+  @org.jspecify.annotations.Nullable
   public java.lang.Integer getNullableFavoriteNumber() {
     return nullable_favorite_number;
   }
@@ -198,50 +198,50 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
    * Sets the value of the 'nullable_favorite_number' field.
    * @param value the value to set.
    */
-  public void setNullableFavoriteNumber(@org.jetbrains.annotations.Nullable 
java.lang.Integer value) {
+  public void setNullableFavoriteNumber(@org.jspecify.annotations.Nullable 
java.lang.Integer value) {
     this.nullable_favorite_number = value;
   }
 
   /**
-   * Creates a new NullSafeAnnotationsFieldsTest RecordBuilder.
-   * @return A new NullSafeAnnotationsFieldsTest RecordBuilder
+   * Creates a new JSpecifyNullSafeAnnotationsFieldsTest RecordBuilder.
+   * @return A new JSpecifyNullSafeAnnotationsFieldsTest RecordBuilder
    */
-  public static avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder 
newBuilder() {
-    return new avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder();
+  public static 
avro.examples.baseball.JSpecifyNullSafeAnnotationsFieldsTest.Builder 
newBuilder() {
+    return new 
avro.examples.baseball.JSpecifyNullSafeAnnotationsFieldsTest.Builder();
   }
 
   /**
-   * Creates a new NullSafeAnnotationsFieldsTest RecordBuilder by copying an 
existing Builder.
+   * Creates a new JSpecifyNullSafeAnnotationsFieldsTest RecordBuilder by 
copying an existing Builder.
    * @param other The existing builder to copy.
-   * @return A new NullSafeAnnotationsFieldsTest RecordBuilder
+   * @return A new JSpecifyNullSafeAnnotationsFieldsTest RecordBuilder
    */
-  public static avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder 
newBuilder(avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder other) {
+  public static 
avro.examples.baseball.JSpecifyNullSafeAnnotationsFieldsTest.Builder 
newBuilder(avro.examples.baseball.JSpecifyNullSafeAnnotationsFieldsTest.Builder 
other) {
     if (other == null) {
-      return new 
avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder();
+      return new 
avro.examples.baseball.JSpecifyNullSafeAnnotationsFieldsTest.Builder();
     } else {
-      return new 
avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder(other);
+      return new 
avro.examples.baseball.JSpecifyNullSafeAnnotationsFieldsTest.Builder(other);
     }
   }
 
   /**
-   * Creates a new NullSafeAnnotationsFieldsTest RecordBuilder by copying an 
existing NullSafeAnnotationsFieldsTest instance.
+   * Creates a new JSpecifyNullSafeAnnotationsFieldsTest RecordBuilder by 
copying an existing JSpecifyNullSafeAnnotationsFieldsTest instance.
    * @param other The existing instance to copy.
-   * @return A new NullSafeAnnotationsFieldsTest RecordBuilder
+   * @return A new JSpecifyNullSafeAnnotationsFieldsTest RecordBuilder
    */
-  public static avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder 
newBuilder(avro.examples.baseball.NullSafeAnnotationsFieldsTest other) {
+  public static 
avro.examples.baseball.JSpecifyNullSafeAnnotationsFieldsTest.Builder 
newBuilder(avro.examples.baseball.JSpecifyNullSafeAnnotationsFieldsTest other) {
     if (other == null) {
-      return new 
avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder();
+      return new 
avro.examples.baseball.JSpecifyNullSafeAnnotationsFieldsTest.Builder();
     } else {
-      return new 
avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder(other);
+      return new 
avro.examples.baseball.JSpecifyNullSafeAnnotationsFieldsTest.Builder(other);
     }
   }
 
   /**
-   * RecordBuilder for NullSafeAnnotationsFieldsTest instances.
+   * RecordBuilder for JSpecifyNullSafeAnnotationsFieldsTest instances.
    */
   @org.apache.avro.specific.AvroGenerated
-  public static class Builder extends 
org.apache.avro.specific.SpecificRecordBuilderBase<NullSafeAnnotationsFieldsTest>
-    implements 
org.apache.avro.data.RecordBuilder<NullSafeAnnotationsFieldsTest> {
+  public static class Builder extends 
org.apache.avro.specific.SpecificRecordBuilderBase<JSpecifyNullSafeAnnotationsFieldsTest>
+    implements 
org.apache.avro.data.RecordBuilder<JSpecifyNullSafeAnnotationsFieldsTest> {
 
     private java.lang.String name;
     private java.lang.String nullable_name;
@@ -257,7 +257,7 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
      * Creates a Builder by copying an existing Builder.
      * @param other The existing Builder to copy.
      */
-    private 
Builder(avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder other) {
+    private 
Builder(avro.examples.baseball.JSpecifyNullSafeAnnotationsFieldsTest.Builder 
other) {
       super(other);
       if (isValidValue(fields()[0], other.name)) {
         this.name = data().deepCopy(fields()[0].schema(), other.name);
@@ -278,10 +278,10 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
     }
 
     /**
-     * Creates a Builder by copying an existing NullSafeAnnotationsFieldsTest 
instance
+     * Creates a Builder by copying an existing 
JSpecifyNullSafeAnnotationsFieldsTest instance
      * @param other The existing instance to copy.
      */
-    private Builder(avro.examples.baseball.NullSafeAnnotationsFieldsTest 
other) {
+    private 
Builder(avro.examples.baseball.JSpecifyNullSafeAnnotationsFieldsTest other) {
       super(SCHEMA$, MODEL$);
       if (isValidValue(fields()[0], other.name)) {
         this.name = data().deepCopy(fields()[0].schema(), other.name);
@@ -315,7 +315,7 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
       * @param value The value of 'name'.
       * @return This builder.
       */
-    public avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder 
setName(@org.jetbrains.annotations.NotNull java.lang.String value) {
+    public 
avro.examples.baseball.JSpecifyNullSafeAnnotationsFieldsTest.Builder 
setName(@org.jspecify.annotations.NonNull java.lang.String value) {
       validate(fields()[0], value);
       this.name = value;
       fieldSetFlags()[0] = true;
@@ -335,7 +335,7 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
       * Clears the value of the 'name' field.
       * @return This builder.
       */
-    public avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder 
clearName() {
+    public 
avro.examples.baseball.JSpecifyNullSafeAnnotationsFieldsTest.Builder 
clearName() {
       name = null;
       fieldSetFlags()[0] = false;
       return this;
@@ -355,7 +355,7 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
       * @param value The value of 'nullable_name'.
       * @return This builder.
       */
-    public avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder 
setNullableName(@org.jetbrains.annotations.Nullable java.lang.String value) {
+    public 
avro.examples.baseball.JSpecifyNullSafeAnnotationsFieldsTest.Builder 
setNullableName(@org.jspecify.annotations.Nullable java.lang.String value) {
       validate(fields()[1], value);
       this.nullable_name = value;
       fieldSetFlags()[1] = true;
@@ -375,7 +375,7 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
       * Clears the value of the 'nullable_name' field.
       * @return This builder.
       */
-    public avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder 
clearNullableName() {
+    public 
avro.examples.baseball.JSpecifyNullSafeAnnotationsFieldsTest.Builder 
clearNullableName() {
       nullable_name = null;
       fieldSetFlags()[1] = false;
       return this;
@@ -395,7 +395,7 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
       * @param value The value of 'favorite_number'.
       * @return This builder.
       */
-    public avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder 
setFavoriteNumber(@org.jetbrains.annotations.NotNull int value) {
+    public 
avro.examples.baseball.JSpecifyNullSafeAnnotationsFieldsTest.Builder 
setFavoriteNumber(@org.jspecify.annotations.NonNull int value) {
       validate(fields()[2], value);
       this.favorite_number = value;
       fieldSetFlags()[2] = true;
@@ -415,7 +415,7 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
       * Clears the value of the 'favorite_number' field.
       * @return This builder.
       */
-    public avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder 
clearFavoriteNumber() {
+    public 
avro.examples.baseball.JSpecifyNullSafeAnnotationsFieldsTest.Builder 
clearFavoriteNumber() {
       fieldSetFlags()[2] = false;
       return this;
     }
@@ -434,7 +434,7 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
       * @param value The value of 'nullable_favorite_number'.
       * @return This builder.
       */
-    public avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder 
setNullableFavoriteNumber(@org.jetbrains.annotations.Nullable java.lang.Integer 
value) {
+    public 
avro.examples.baseball.JSpecifyNullSafeAnnotationsFieldsTest.Builder 
setNullableFavoriteNumber(@org.jspecify.annotations.Nullable java.lang.Integer 
value) {
       validate(fields()[3], value);
       this.nullable_favorite_number = value;
       fieldSetFlags()[3] = true;
@@ -454,7 +454,7 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
       * Clears the value of the 'nullable_favorite_number' field.
       * @return This builder.
       */
-    public avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder 
clearNullableFavoriteNumber() {
+    public 
avro.examples.baseball.JSpecifyNullSafeAnnotationsFieldsTest.Builder 
clearNullableFavoriteNumber() {
       nullable_favorite_number = null;
       fieldSetFlags()[3] = false;
       return this;
@@ -462,9 +462,9 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
 
     @Override
     @SuppressWarnings("unchecked")
-    public NullSafeAnnotationsFieldsTest build() {
+    public JSpecifyNullSafeAnnotationsFieldsTest build() {
       try {
-        NullSafeAnnotationsFieldsTest record = new 
NullSafeAnnotationsFieldsTest();
+        JSpecifyNullSafeAnnotationsFieldsTest record = new 
JSpecifyNullSafeAnnotationsFieldsTest();
         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]);
@@ -479,8 +479,8 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
   }
 
   @SuppressWarnings("unchecked")
-  private static final 
org.apache.avro.io.DatumWriter<NullSafeAnnotationsFieldsTest>
-    WRITER$ = 
(org.apache.avro.io.DatumWriter<NullSafeAnnotationsFieldsTest>)MODEL$.createDatumWriter(SCHEMA$);
+  private static final 
org.apache.avro.io.DatumWriter<JSpecifyNullSafeAnnotationsFieldsTest>
+    WRITER$ = 
(org.apache.avro.io.DatumWriter<JSpecifyNullSafeAnnotationsFieldsTest>)MODEL$.createDatumWriter(SCHEMA$);
 
   @Override public void writeExternal(java.io.ObjectOutput out)
     throws java.io.IOException {
@@ -488,8 +488,8 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
   }
 
   @SuppressWarnings("unchecked")
-  private static final 
org.apache.avro.io.DatumReader<NullSafeAnnotationsFieldsTest>
-    READER$ = 
(org.apache.avro.io.DatumReader<NullSafeAnnotationsFieldsTest>)MODEL$.createDatumReader(SCHEMA$);
+  private static final 
org.apache.avro.io.DatumReader<JSpecifyNullSafeAnnotationsFieldsTest>
+    READER$ = 
(org.apache.avro.io.DatumReader<JSpecifyNullSafeAnnotationsFieldsTest>)MODEL$.createDatumReader(SCHEMA$);
 
   @Override public void readExternal(java.io.ObjectInput in)
     throws java.io.IOException {
diff --git 
a/lang/java/tools/src/test/compiler/output-string/avro/examples/baseball/NullSafeAnnotationsFieldsTest.java
 
b/lang/java/tools/src/test/compiler/output-string/avro/examples/baseball/JetBrainsNullSafeAnnotationsFieldsTest.java
similarity index 73%
rename from 
lang/java/tools/src/test/compiler/output-string/avro/examples/baseball/NullSafeAnnotationsFieldsTest.java
rename to 
lang/java/tools/src/test/compiler/output-string/avro/examples/baseball/JetBrainsNullSafeAnnotationsFieldsTest.java
index 1da1fcde0e..44db6edcae 100644
--- 
a/lang/java/tools/src/test/compiler/output-string/avro/examples/baseball/NullSafeAnnotationsFieldsTest.java
+++ 
b/lang/java/tools/src/test/compiler/output-string/avro/examples/baseball/JetBrainsNullSafeAnnotationsFieldsTest.java
@@ -13,26 +13,26 @@ import org.apache.avro.message.SchemaStore;
 
 /** Test that @org.jetbrains.annotations.Nullable and 
@org.jetbrains.annotations.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 class JetBrainsNullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.SpecificRecordBase implements 
org.apache.avro.specific.SpecificRecord {
+  private static final long serialVersionUID = 4199351420542345651L;
 
 
-  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 @org.jetbrains.annotations.Nullable and 
@org.jetbrains.annotations.NotNull annotations are created for all 
fields\",\"fields\":[{\"name\":\"name\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"nullable_name\",\"type\":[{\"type\":\"string\"
 [...]
+  public static final org.apache.avro.Schema SCHEMA$ = new 
org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"JetBrainsNullSafeAnnotationsFieldsTest\",\"namespace\":\"avro.examples.baseball\",\"doc\":\"Test
 that @org.jetbrains.annotations.Nullable and 
@org.jetbrains.annotations.NotNull annotations are created for all 
fields\",\"fields\":[{\"name\":\"name\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"nullable_name\",\"type\":[{\"type\":\
 [...]
   public static org.apache.avro.Schema getClassSchema() { return SCHEMA$; }
 
   private static final SpecificData MODEL$ = new SpecificData();
 
-  private static final BinaryMessageEncoder<NullSafeAnnotationsFieldsTest> 
ENCODER =
+  private static final 
BinaryMessageEncoder<JetBrainsNullSafeAnnotationsFieldsTest> ENCODER =
       new BinaryMessageEncoder<>(MODEL$, SCHEMA$);
 
-  private static final BinaryMessageDecoder<NullSafeAnnotationsFieldsTest> 
DECODER =
+  private static final 
BinaryMessageDecoder<JetBrainsNullSafeAnnotationsFieldsTest> 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() {
+  public static BinaryMessageEncoder<JetBrainsNullSafeAnnotationsFieldsTest> 
getEncoder() {
     return ENCODER;
   }
 
@@ -40,7 +40,7 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
    * Return the BinaryMessageDecoder instance used by this class.
    * @return the message decoder used by this class
    */
-  public static BinaryMessageDecoder<NullSafeAnnotationsFieldsTest> 
getDecoder() {
+  public static BinaryMessageDecoder<JetBrainsNullSafeAnnotationsFieldsTest> 
getDecoder() {
     return DECODER;
   }
 
@@ -49,12 +49,12 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
    * @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) {
+  public static BinaryMessageDecoder<JetBrainsNullSafeAnnotationsFieldsTest> 
createDecoder(SchemaStore resolver) {
     return new BinaryMessageDecoder<>(MODEL$, SCHEMA$, resolver);
   }
 
   /**
-   * Serializes this NullSafeAnnotationsFieldsTest to a ByteBuffer.
+   * Serializes this JetBrainsNullSafeAnnotationsFieldsTest to a ByteBuffer.
    * @return a buffer holding the serialized data for this instance
    * @throws java.io.IOException if this instance could not be serialized
    */
@@ -63,12 +63,12 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
   }
 
   /**
-   * Deserializes a NullSafeAnnotationsFieldsTest from a ByteBuffer.
+   * Deserializes a JetBrainsNullSafeAnnotationsFieldsTest 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
+   * @return a JetBrainsNullSafeAnnotationsFieldsTest 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(
+  public static JetBrainsNullSafeAnnotationsFieldsTest fromByteBuffer(
       java.nio.ByteBuffer b) throws java.io.IOException {
     return DECODER.decode(b);
   }
@@ -83,7 +83,7 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
    * to their default values from the schema.  If that is desired then
    * one should use <code>newBuilder()</code>.
    */
-  public NullSafeAnnotationsFieldsTest() {}
+  public JetBrainsNullSafeAnnotationsFieldsTest() {}
 
   /**
    * All-args constructor.
@@ -92,7 +92,7 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
    * @param favorite_number The new value for favorite_number
    * @param nullable_favorite_number The new value for nullable_favorite_number
    */
-  public NullSafeAnnotationsFieldsTest(@org.jetbrains.annotations.NotNull 
java.lang.String name, @org.jetbrains.annotations.Nullable java.lang.String 
nullable_name, @org.jetbrains.annotations.NotNull java.lang.Integer 
favorite_number, @org.jetbrains.annotations.Nullable java.lang.Integer 
nullable_favorite_number) {
+  public 
JetBrainsNullSafeAnnotationsFieldsTest(@org.jetbrains.annotations.NotNull 
java.lang.String name, @org.jetbrains.annotations.Nullable java.lang.String 
nullable_name, @org.jetbrains.annotations.NotNull java.lang.Integer 
favorite_number, @org.jetbrains.annotations.Nullable java.lang.Integer 
nullable_favorite_number) {
     this.name = name;
     this.nullable_name = nullable_name;
     this.favorite_number = favorite_number;
@@ -203,45 +203,45 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
   }
 
   /**
-   * Creates a new NullSafeAnnotationsFieldsTest RecordBuilder.
-   * @return A new NullSafeAnnotationsFieldsTest RecordBuilder
+   * Creates a new JetBrainsNullSafeAnnotationsFieldsTest RecordBuilder.
+   * @return A new JetBrainsNullSafeAnnotationsFieldsTest RecordBuilder
    */
-  public static avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder 
newBuilder() {
-    return new avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder();
+  public static 
avro.examples.baseball.JetBrainsNullSafeAnnotationsFieldsTest.Builder 
newBuilder() {
+    return new 
avro.examples.baseball.JetBrainsNullSafeAnnotationsFieldsTest.Builder();
   }
 
   /**
-   * Creates a new NullSafeAnnotationsFieldsTest RecordBuilder by copying an 
existing Builder.
+   * Creates a new JetBrainsNullSafeAnnotationsFieldsTest RecordBuilder by 
copying an existing Builder.
    * @param other The existing builder to copy.
-   * @return A new NullSafeAnnotationsFieldsTest RecordBuilder
+   * @return A new JetBrainsNullSafeAnnotationsFieldsTest RecordBuilder
    */
-  public static avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder 
newBuilder(avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder other) {
+  public static 
avro.examples.baseball.JetBrainsNullSafeAnnotationsFieldsTest.Builder 
newBuilder(avro.examples.baseball.JetBrainsNullSafeAnnotationsFieldsTest.Builder
 other) {
     if (other == null) {
-      return new 
avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder();
+      return new 
avro.examples.baseball.JetBrainsNullSafeAnnotationsFieldsTest.Builder();
     } else {
-      return new 
avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder(other);
+      return new 
avro.examples.baseball.JetBrainsNullSafeAnnotationsFieldsTest.Builder(other);
     }
   }
 
   /**
-   * Creates a new NullSafeAnnotationsFieldsTest RecordBuilder by copying an 
existing NullSafeAnnotationsFieldsTest instance.
+   * Creates a new JetBrainsNullSafeAnnotationsFieldsTest RecordBuilder by 
copying an existing JetBrainsNullSafeAnnotationsFieldsTest instance.
    * @param other The existing instance to copy.
-   * @return A new NullSafeAnnotationsFieldsTest RecordBuilder
+   * @return A new JetBrainsNullSafeAnnotationsFieldsTest RecordBuilder
    */
-  public static avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder 
newBuilder(avro.examples.baseball.NullSafeAnnotationsFieldsTest other) {
+  public static 
avro.examples.baseball.JetBrainsNullSafeAnnotationsFieldsTest.Builder 
newBuilder(avro.examples.baseball.JetBrainsNullSafeAnnotationsFieldsTest other) 
{
     if (other == null) {
-      return new 
avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder();
+      return new 
avro.examples.baseball.JetBrainsNullSafeAnnotationsFieldsTest.Builder();
     } else {
-      return new 
avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder(other);
+      return new 
avro.examples.baseball.JetBrainsNullSafeAnnotationsFieldsTest.Builder(other);
     }
   }
 
   /**
-   * RecordBuilder for NullSafeAnnotationsFieldsTest instances.
+   * RecordBuilder for JetBrainsNullSafeAnnotationsFieldsTest instances.
    */
   @org.apache.avro.specific.AvroGenerated
-  public static class Builder extends 
org.apache.avro.specific.SpecificRecordBuilderBase<NullSafeAnnotationsFieldsTest>
-    implements 
org.apache.avro.data.RecordBuilder<NullSafeAnnotationsFieldsTest> {
+  public static class Builder extends 
org.apache.avro.specific.SpecificRecordBuilderBase<JetBrainsNullSafeAnnotationsFieldsTest>
+    implements 
org.apache.avro.data.RecordBuilder<JetBrainsNullSafeAnnotationsFieldsTest> {
 
     private java.lang.String name;
     private java.lang.String nullable_name;
@@ -257,7 +257,7 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
      * Creates a Builder by copying an existing Builder.
      * @param other The existing Builder to copy.
      */
-    private 
Builder(avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder other) {
+    private 
Builder(avro.examples.baseball.JetBrainsNullSafeAnnotationsFieldsTest.Builder 
other) {
       super(other);
       if (isValidValue(fields()[0], other.name)) {
         this.name = data().deepCopy(fields()[0].schema(), other.name);
@@ -278,10 +278,10 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
     }
 
     /**
-     * Creates a Builder by copying an existing NullSafeAnnotationsFieldsTest 
instance
+     * Creates a Builder by copying an existing 
JetBrainsNullSafeAnnotationsFieldsTest instance
      * @param other The existing instance to copy.
      */
-    private Builder(avro.examples.baseball.NullSafeAnnotationsFieldsTest 
other) {
+    private 
Builder(avro.examples.baseball.JetBrainsNullSafeAnnotationsFieldsTest other) {
       super(SCHEMA$, MODEL$);
       if (isValidValue(fields()[0], other.name)) {
         this.name = data().deepCopy(fields()[0].schema(), other.name);
@@ -315,7 +315,7 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
       * @param value The value of 'name'.
       * @return This builder.
       */
-    public avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder 
setName(@org.jetbrains.annotations.NotNull java.lang.String value) {
+    public 
avro.examples.baseball.JetBrainsNullSafeAnnotationsFieldsTest.Builder 
setName(@org.jetbrains.annotations.NotNull java.lang.String value) {
       validate(fields()[0], value);
       this.name = value;
       fieldSetFlags()[0] = true;
@@ -335,7 +335,7 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
       * Clears the value of the 'name' field.
       * @return This builder.
       */
-    public avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder 
clearName() {
+    public 
avro.examples.baseball.JetBrainsNullSafeAnnotationsFieldsTest.Builder 
clearName() {
       name = null;
       fieldSetFlags()[0] = false;
       return this;
@@ -355,7 +355,7 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
       * @param value The value of 'nullable_name'.
       * @return This builder.
       */
-    public avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder 
setNullableName(@org.jetbrains.annotations.Nullable java.lang.String value) {
+    public 
avro.examples.baseball.JetBrainsNullSafeAnnotationsFieldsTest.Builder 
setNullableName(@org.jetbrains.annotations.Nullable java.lang.String value) {
       validate(fields()[1], value);
       this.nullable_name = value;
       fieldSetFlags()[1] = true;
@@ -375,7 +375,7 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
       * Clears the value of the 'nullable_name' field.
       * @return This builder.
       */
-    public avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder 
clearNullableName() {
+    public 
avro.examples.baseball.JetBrainsNullSafeAnnotationsFieldsTest.Builder 
clearNullableName() {
       nullable_name = null;
       fieldSetFlags()[1] = false;
       return this;
@@ -395,7 +395,7 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
       * @param value The value of 'favorite_number'.
       * @return This builder.
       */
-    public avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder 
setFavoriteNumber(@org.jetbrains.annotations.NotNull int value) {
+    public 
avro.examples.baseball.JetBrainsNullSafeAnnotationsFieldsTest.Builder 
setFavoriteNumber(@org.jetbrains.annotations.NotNull int value) {
       validate(fields()[2], value);
       this.favorite_number = value;
       fieldSetFlags()[2] = true;
@@ -415,7 +415,7 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
       * Clears the value of the 'favorite_number' field.
       * @return This builder.
       */
-    public avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder 
clearFavoriteNumber() {
+    public 
avro.examples.baseball.JetBrainsNullSafeAnnotationsFieldsTest.Builder 
clearFavoriteNumber() {
       fieldSetFlags()[2] = false;
       return this;
     }
@@ -434,7 +434,7 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
       * @param value The value of 'nullable_favorite_number'.
       * @return This builder.
       */
-    public avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder 
setNullableFavoriteNumber(@org.jetbrains.annotations.Nullable java.lang.Integer 
value) {
+    public 
avro.examples.baseball.JetBrainsNullSafeAnnotationsFieldsTest.Builder 
setNullableFavoriteNumber(@org.jetbrains.annotations.Nullable java.lang.Integer 
value) {
       validate(fields()[3], value);
       this.nullable_favorite_number = value;
       fieldSetFlags()[3] = true;
@@ -454,7 +454,7 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
       * Clears the value of the 'nullable_favorite_number' field.
       * @return This builder.
       */
-    public avro.examples.baseball.NullSafeAnnotationsFieldsTest.Builder 
clearNullableFavoriteNumber() {
+    public 
avro.examples.baseball.JetBrainsNullSafeAnnotationsFieldsTest.Builder 
clearNullableFavoriteNumber() {
       nullable_favorite_number = null;
       fieldSetFlags()[3] = false;
       return this;
@@ -462,9 +462,9 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
 
     @Override
     @SuppressWarnings("unchecked")
-    public NullSafeAnnotationsFieldsTest build() {
+    public JetBrainsNullSafeAnnotationsFieldsTest build() {
       try {
-        NullSafeAnnotationsFieldsTest record = new 
NullSafeAnnotationsFieldsTest();
+        JetBrainsNullSafeAnnotationsFieldsTest record = new 
JetBrainsNullSafeAnnotationsFieldsTest();
         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]);
@@ -479,8 +479,8 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
   }
 
   @SuppressWarnings("unchecked")
-  private static final 
org.apache.avro.io.DatumWriter<NullSafeAnnotationsFieldsTest>
-    WRITER$ = 
(org.apache.avro.io.DatumWriter<NullSafeAnnotationsFieldsTest>)MODEL$.createDatumWriter(SCHEMA$);
+  private static final 
org.apache.avro.io.DatumWriter<JetBrainsNullSafeAnnotationsFieldsTest>
+    WRITER$ = 
(org.apache.avro.io.DatumWriter<JetBrainsNullSafeAnnotationsFieldsTest>)MODEL$.createDatumWriter(SCHEMA$);
 
   @Override public void writeExternal(java.io.ObjectOutput out)
     throws java.io.IOException {
@@ -488,8 +488,8 @@ public class NullSafeAnnotationsFieldsTest extends 
org.apache.avro.specific.Spec
   }
 
   @SuppressWarnings("unchecked")
-  private static final 
org.apache.avro.io.DatumReader<NullSafeAnnotationsFieldsTest>
-    READER$ = 
(org.apache.avro.io.DatumReader<NullSafeAnnotationsFieldsTest>)MODEL$.createDatumReader(SCHEMA$);
+  private static final 
org.apache.avro.io.DatumReader<JetBrainsNullSafeAnnotationsFieldsTest>
+    READER$ = 
(org.apache.avro.io.DatumReader<JetBrainsNullSafeAnnotationsFieldsTest>)MODEL$.createDatumReader(SCHEMA$);
 
   @Override public void readExternal(java.io.ObjectInput in)
     throws java.io.IOException {
diff --git 
a/lang/java/tools/src/test/java/org/apache/avro/tool/TestSpecificCompilerTool.java
 
b/lang/java/tools/src/test/java/org/apache/avro/tool/TestSpecificCompilerTool.java
index 03768fea4b..1f4aac91f9 100644
--- 
a/lang/java/tools/src/test/java/org/apache/avro/tool/TestSpecificCompilerTool.java
+++ 
b/lang/java/tools/src/test/java/org/apache/avro/tool/TestSpecificCompilerTool.java
@@ -58,8 +58,10 @@ public class TestSpecificCompilerTool {
       "avro/examples/baseball/Position.java");
   private static final File TEST_EXPECTED_STRING_PLAYER = new 
File(TEST_EXPECTED_STRING_OUTPUT_DIR,
       "avro/examples/baseball/Player.java");
-  private static final File TEST_EXPECTED_STRING_NULL_SAFE_ANNOTATIONS_TEST = 
new File(TEST_EXPECTED_STRING_OUTPUT_DIR,
-      "avro/examples/baseball/NullSafeAnnotationsFieldsTest.java");
+  private static final File 
TEST_EXPECTED_STRING_JET_BRAINS_NULL_SAFE_ANNOTATIONS_TEST = new File(
+      TEST_EXPECTED_STRING_OUTPUT_DIR, 
"avro/examples/baseball/JetBrainsNullSafeAnnotationsFieldsTest.java");
+  private static final File 
TEST_EXPECTED_STRING_JSPECIFY_NULL_SAFE_ANNOTATIONS_TEST = new File(
+      TEST_EXPECTED_STRING_OUTPUT_DIR, 
"avro/examples/baseball/JSpecifyNullSafeAnnotationsFieldsTest.java");
   private static final File TEST_EXPECTED_STRING_FIELDTEST = new 
File(TEST_EXPECTED_STRING_OUTPUT_DIR,
       "avro/examples/baseball/FieldTest.java");
   private static final File TEST_EXPECTED_STRING_PROTO = new 
File(TEST_EXPECTED_STRING_OUTPUT_DIR,
@@ -85,8 +87,10 @@ public class TestSpecificCompilerTool {
       "avro/examples/baseball/Position.java");
   private static final File TEST_OUTPUT_STRING_FIELDTEST = new 
File(TEST_OUTPUT_STRING_DIR,
       "avro/examples/baseball/FieldTest.java");
-  private static final File TEST_OUTPUT_STRING_NULL_SAFE_ANNOTATIONS_TEST = 
new File(TEST_OUTPUT_STRING_DIR,
-      "avro/examples/baseball/NullSafeAnnotationsFieldsTest.java");
+  private static final File 
TEST_OUTPUT_STRING_JET_BRAINS_NULL_SAFE_ANNOTATIONS_TEST = new 
File(TEST_OUTPUT_STRING_DIR,
+      "avro/examples/baseball/JetBrainsNullSafeAnnotationsFieldsTest.java");
+  private static final File 
TEST_OUTPUT_STRING_JSPECIFY_NULL_SAFE_ANNOTATIONS_TEST = new 
File(TEST_OUTPUT_STRING_DIR,
+      "avro/examples/baseball/JSpecifyNullSafeAnnotationsFieldsTest.java");
   private static final File TEST_OUTPUT_STRING_PROTO = new 
File(TEST_OUTPUT_STRING_DIR,
       "avro/examples/baseball/Proto.java");
 
@@ -114,12 +118,25 @@ public class TestSpecificCompilerTool {
   }
 
   @Test
-  void compileSchemaWithNullSafeAnnotationsFields() throws Exception {
+  void compileSchemaWithJetBrainsNullSafeAnnotationsFields() throws Exception {
 
-    TEST_OUTPUT_STRING_NULL_SAFE_ANNOTATIONS_TEST.delete();
+    TEST_OUTPUT_STRING_JET_BRAINS_NULL_SAFE_ANNOTATIONS_TEST.delete();
     doCompile(new String[] { "-encoding", "UTF-8", "-nullSafeAnnotations", 
"-string", "schema",
-        TEST_INPUT_DIR.toString() + "/nullsafeannotationsfieldstest.avsc", 
TEST_OUTPUT_STRING_DIR.getPath() });
-    assertFileMatch(TEST_EXPECTED_STRING_NULL_SAFE_ANNOTATIONS_TEST, 
TEST_OUTPUT_STRING_NULL_SAFE_ANNOTATIONS_TEST);
+        TEST_INPUT_DIR.toString() + 
"/jetbrainsnullsafeannotationsfieldstest.avsc", 
TEST_OUTPUT_STRING_DIR.getPath() });
+    assertFileMatch(TEST_EXPECTED_STRING_JET_BRAINS_NULL_SAFE_ANNOTATIONS_TEST,
+        TEST_OUTPUT_STRING_JET_BRAINS_NULL_SAFE_ANNOTATIONS_TEST);
+  }
+
+  @Test
+  void compileSchemaWithJSpecifyNullSafeAnnotationsFields() throws Exception {
+
+    TEST_OUTPUT_STRING_JSPECIFY_NULL_SAFE_ANNOTATIONS_TEST.delete();
+    doCompile(new String[] { "-encoding", "UTF-8", "-nullSafeAnnotations", 
"-nullSafeAnnotationNullable",
+        "org.jspecify.annotations.Nullable", "-nullSafeAnnotationNotNull", 
"org.jspecify.annotations.NonNull",
+        "-string", "schema", TEST_INPUT_DIR.toString() + 
"/jspecifynullsafeannotationsfieldstest.avsc",
+        TEST_OUTPUT_STRING_DIR.getPath() });
+    assertFileMatch(TEST_EXPECTED_STRING_JSPECIFY_NULL_SAFE_ANNOTATIONS_TEST,
+        TEST_OUTPUT_STRING_JSPECIFY_NULL_SAFE_ANNOTATIONS_TEST);
   }
 
   @Test
diff --git a/pom.xml b/pom.xml
index 220fab8b98..9dac476883 100644
--- a/pom.xml
+++ b/pom.xml
@@ -459,7 +459,8 @@
                 
<exclude>lang/java/avro/src/test/java/org/apache/avro/specific/TestRecordWithoutLogicalTypes.java</exclude>
                 
<exclude>lang/java/avro/src/test/java/org/apache/avro/specific/int$.java</exclude>
                 
<exclude>lang/java/ipc-netty/src/test/resources/**/*.txt</exclude>
-                
<exclude>lang/java/tools/src/test/compiler/output-string/avro/examples/baseball/NullSafeAnnotationsFieldsTest.java</exclude>
+                
<exclude>lang/java/tools/src/test/compiler/output-string/avro/examples/baseball/JetBrainsNullSafeAnnotationsFieldsTest.java</exclude>
+                
<exclude>lang/java/tools/src/test/compiler/output-string/avro/examples/baseball/JSpecifyNullSafeAnnotationsFieldsTest.java</exclude>
                 
<exclude>lang/java/tools/src/test/compiler/output-string/avro/examples/baseball/Player.java</exclude>
                 
<exclude>lang/java/tools/src/test/compiler/output-string/avro/examples/baseball/Position.java</exclude>
                 
<exclude>lang/java/tools/src/test/compiler/output-string/avro/examples/baseball/FieldTest.java</exclude>

Reply via email to