From 6fe11d3791eff71fc6d798de89f9dcad55cb1e3e Mon Sep 17 00:00:00 2001 From: Maciej Kucharczyk Date: Sat, 5 Apr 2025 18:14:53 +0200 Subject: [PATCH 1/3] Specify nullness for graphql.schema.idl classes --- src/main/java/graphql/Assert.java | 30 +++++++++++-------- .../schema/idl/FieldWiringEnvironment.java | 4 ++- .../idl/InterfaceWiringEnvironment.java | 4 ++- .../java/graphql/schema/idl/ScalarInfo.java | 2 ++ .../schema/idl/ScalarWiringEnvironment.java | 2 ++ .../java/graphql/schema/idl/SchemaParser.java | 7 +++-- .../schema/idl/TypeDefinitionRegistry.java | 2 ++ .../schema/idl/UnionWiringEnvironment.java | 4 ++- .../graphql/schema/idl/WiringEnvironment.java | 2 ++ 9 files changed, 39 insertions(+), 18 deletions(-) diff --git a/src/main/java/graphql/Assert.java b/src/main/java/graphql/Assert.java index 872e19c05e..8d00ccc6ba 100644 --- a/src/main/java/graphql/Assert.java +++ b/src/main/java/graphql/Assert.java @@ -1,5 +1,8 @@ package graphql; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + import java.util.Collection; import java.util.function.Supplier; import java.util.regex.Pattern; @@ -8,51 +11,52 @@ @SuppressWarnings("TypeParameterUnusedInFormals") @Internal +@NullMarked public class Assert { - public static T assertNotNullWithNPE(T object, Supplier msg) { + public static T assertNotNullWithNPE(@Nullable T object, Supplier msg) { if (object != null) { return object; } throw new NullPointerException(msg.get()); } - public static T assertNotNull(T object) { + public static T assertNotNull(@Nullable T object) { if (object != null) { return object; } return throwAssert("Object required to be not null"); } - public static T assertNotNull(T object, Supplier msg) { + public static T assertNotNull(@Nullable T object, Supplier msg) { if (object != null) { return object; } return throwAssert(msg.get()); } - public static T assertNotNull(T object, String constantMsg) { + public static T assertNotNull(@Nullable T object, String constantMsg) { if (object != null) { return object; } return throwAssert(constantMsg); } - public static T assertNotNull(T object, String msgFmt, Object arg1) { + public static T assertNotNull(@Nullable T object, String msgFmt, Object arg1) { if (object != null) { return object; } return throwAssert(msgFmt, arg1); } - public static T assertNotNull(T object, String msgFmt, Object arg1, Object arg2) { + public static T assertNotNull(@Nullable T object, String msgFmt, Object arg1, Object arg2) { if (object != null) { return object; } return throwAssert(msgFmt, arg1, arg2); } - public static T assertNotNull(T object, String msgFmt, Object arg1, Object arg2, Object arg3) { + public static T assertNotNull(@Nullable T object, String msgFmt, Object arg1, Object arg2, Object arg3) { if (object != null) { return object; } @@ -60,14 +64,14 @@ public static T assertNotNull(T object, String msgFmt, Object arg1, Object a } - public static void assertNull(T object, Supplier msg) { + public static void assertNull(@Nullable T object, Supplier msg) { if (object == null) { return; } throwAssert(msg.get()); } - public static void assertNull(T object) { + public static void assertNull(@Nullable T object) { if (object == null) { return; } @@ -86,14 +90,14 @@ public static T assertShouldNeverHappen() { return throwAssert("Internal error: should never happen"); } - public static Collection assertNotEmpty(Collection collection) { + public static Collection assertNotEmpty(@Nullable Collection collection) { if (collection == null || collection.isEmpty()) { throwAssert("collection must be not null and not empty"); } return collection; } - public static Collection assertNotEmpty(Collection collection, Supplier msg) { + public static Collection assertNotEmpty(@Nullable Collection collection, Supplier msg) { if (collection == null || collection.isEmpty()) { throwAssert(msg.get()); } @@ -196,14 +200,14 @@ public static void assertFalse(boolean condition, String msgFmt, Object arg1, Ob * * @return the name if valid, or AssertException if invalid. */ - public static String assertValidName(String name) { + public static String assertValidName(@Nullable String name) { if (name != null && !name.isEmpty() && validNamePattern.matcher(name).matches()) { return name; } return throwAssert(invalidNameErrorMessage, name); } - private static T throwAssert(String format, Object... args) { + private static T throwAssert(String format, @Nullable Object... args) { throw new AssertException(format(format, args)); } } diff --git a/src/main/java/graphql/schema/idl/FieldWiringEnvironment.java b/src/main/java/graphql/schema/idl/FieldWiringEnvironment.java index c64b64d71f..8dffb025ed 100644 --- a/src/main/java/graphql/schema/idl/FieldWiringEnvironment.java +++ b/src/main/java/graphql/schema/idl/FieldWiringEnvironment.java @@ -6,10 +6,12 @@ import graphql.schema.GraphQLAppliedDirective; import graphql.schema.GraphQLDirective; import graphql.schema.GraphQLOutputType; +import org.jspecify.annotations.NullMarked; import java.util.List; @PublicApi +@NullMarked public class FieldWiringEnvironment extends WiringEnvironment { private final FieldDefinition fieldDefinition; @@ -46,4 +48,4 @@ public List getDirectives() { public List getAppliedDirectives() { return appliedDirectives; } -} \ No newline at end of file +} diff --git a/src/main/java/graphql/schema/idl/InterfaceWiringEnvironment.java b/src/main/java/graphql/schema/idl/InterfaceWiringEnvironment.java index 6c635883db..a336b371d7 100644 --- a/src/main/java/graphql/schema/idl/InterfaceWiringEnvironment.java +++ b/src/main/java/graphql/schema/idl/InterfaceWiringEnvironment.java @@ -2,8 +2,10 @@ import graphql.PublicApi; import graphql.language.InterfaceTypeDefinition; +import org.jspecify.annotations.NullMarked; @PublicApi +@NullMarked public class InterfaceWiringEnvironment extends WiringEnvironment { private final InterfaceTypeDefinition interfaceTypeDefinition; @@ -16,4 +18,4 @@ public class InterfaceWiringEnvironment extends WiringEnvironment { public InterfaceTypeDefinition getInterfaceTypeDefinition() { return interfaceTypeDefinition; } -} \ No newline at end of file +} diff --git a/src/main/java/graphql/schema/idl/ScalarInfo.java b/src/main/java/graphql/schema/idl/ScalarInfo.java index 910b78f4ba..fca5ee7509 100644 --- a/src/main/java/graphql/schema/idl/ScalarInfo.java +++ b/src/main/java/graphql/schema/idl/ScalarInfo.java @@ -6,6 +6,7 @@ import graphql.Scalars; import graphql.language.ScalarTypeDefinition; import graphql.schema.GraphQLScalarType; +import org.jspecify.annotations.NullMarked; import java.util.List; import java.util.Map; @@ -14,6 +15,7 @@ * Info on all the standard scalar objects provided by graphql-java */ @PublicApi +@NullMarked public class ScalarInfo { /** diff --git a/src/main/java/graphql/schema/idl/ScalarWiringEnvironment.java b/src/main/java/graphql/schema/idl/ScalarWiringEnvironment.java index df8dad7935..ec39199a48 100644 --- a/src/main/java/graphql/schema/idl/ScalarWiringEnvironment.java +++ b/src/main/java/graphql/schema/idl/ScalarWiringEnvironment.java @@ -3,10 +3,12 @@ import graphql.PublicApi; import graphql.language.ScalarTypeDefinition; import graphql.language.ScalarTypeExtensionDefinition; +import org.jspecify.annotations.NullMarked; import java.util.List; @PublicApi +@NullMarked public class ScalarWiringEnvironment extends WiringEnvironment { private final ScalarTypeDefinition scalarTypeDefinition; diff --git a/src/main/java/graphql/schema/idl/SchemaParser.java b/src/main/java/graphql/schema/idl/SchemaParser.java index 8fc0932367..0d6c071282 100644 --- a/src/main/java/graphql/schema/idl/SchemaParser.java +++ b/src/main/java/graphql/schema/idl/SchemaParser.java @@ -12,6 +12,8 @@ import graphql.parser.ParserOptions; import graphql.schema.idl.errors.NonSDLDefinitionError; import graphql.schema.idl.errors.SchemaProblem; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.io.File; import java.io.IOException; @@ -32,6 +34,7 @@ * definitions ready to be placed into {@link SchemaGenerator} say */ @PublicApi +@NullMarked public class SchemaParser { /** @@ -87,7 +90,7 @@ public TypeDefinitionRegistry parse(Reader reader) throws SchemaProblem { * * @throws SchemaProblem if there are problems compiling the schema definitions */ - public TypeDefinitionRegistry parse(Reader reader, ParserOptions parserOptions) throws SchemaProblem { + public TypeDefinitionRegistry parse(Reader reader, @Nullable ParserOptions parserOptions) throws SchemaProblem { try (Reader input = reader) { return parseImpl(input, parserOptions); } catch (IOException e) { @@ -113,7 +116,7 @@ public TypeDefinitionRegistry parseImpl(Reader schemaInput) { return parseImpl(schemaInput, null); } - private TypeDefinitionRegistry parseImpl(Reader schemaInput, ParserOptions parseOptions) { + private TypeDefinitionRegistry parseImpl(Reader schemaInput, @Nullable ParserOptions parseOptions) { try { if (parseOptions == null) { parseOptions = ParserOptions.getDefaultSdlParserOptions(); diff --git a/src/main/java/graphql/schema/idl/TypeDefinitionRegistry.java b/src/main/java/graphql/schema/idl/TypeDefinitionRegistry.java index d90ab190ba..698f588f4c 100644 --- a/src/main/java/graphql/schema/idl/TypeDefinitionRegistry.java +++ b/src/main/java/graphql/schema/idl/TypeDefinitionRegistry.java @@ -27,6 +27,7 @@ import graphql.schema.idl.errors.SchemaRedefinitionError; import graphql.schema.idl.errors.TypeRedefinitionError; import graphql.util.FpKit; +import org.jspecify.annotations.NullMarked; import java.io.Serializable; import java.util.ArrayList; @@ -49,6 +50,7 @@ */ @SuppressWarnings("rawtypes") @PublicApi +@NullMarked public class TypeDefinitionRegistry implements Serializable { private final Map> objectTypeExtensions = new LinkedHashMap<>(); diff --git a/src/main/java/graphql/schema/idl/UnionWiringEnvironment.java b/src/main/java/graphql/schema/idl/UnionWiringEnvironment.java index bde774b7f4..54eba63d1a 100644 --- a/src/main/java/graphql/schema/idl/UnionWiringEnvironment.java +++ b/src/main/java/graphql/schema/idl/UnionWiringEnvironment.java @@ -2,8 +2,10 @@ import graphql.PublicApi; import graphql.language.UnionTypeDefinition; +import org.jspecify.annotations.NullMarked; @PublicApi +@NullMarked public class UnionWiringEnvironment extends WiringEnvironment { private final UnionTypeDefinition unionTypeDefinition; @@ -16,4 +18,4 @@ public class UnionWiringEnvironment extends WiringEnvironment { public UnionTypeDefinition getUnionTypeDefinition() { return unionTypeDefinition; } -} \ No newline at end of file +} diff --git a/src/main/java/graphql/schema/idl/WiringEnvironment.java b/src/main/java/graphql/schema/idl/WiringEnvironment.java index 37078fbab4..76f5e89db2 100644 --- a/src/main/java/graphql/schema/idl/WiringEnvironment.java +++ b/src/main/java/graphql/schema/idl/WiringEnvironment.java @@ -2,8 +2,10 @@ import graphql.PublicApi; +import org.jspecify.annotations.NullMarked; @PublicApi +@NullMarked abstract class WiringEnvironment { private final TypeDefinitionRegistry registry; From 551c0d8d752885bc662bd92457bab2ff4dce464d Mon Sep 17 00:00:00 2001 From: Maciej Kucharczyk Date: Mon, 7 Apr 2025 17:36:15 +0200 Subject: [PATCH 2/3] graphql.Assert parameters marked as non-null --- src/main/java/graphql/Assert.java | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/src/main/java/graphql/Assert.java b/src/main/java/graphql/Assert.java index 8d00ccc6ba..90af6820b8 100644 --- a/src/main/java/graphql/Assert.java +++ b/src/main/java/graphql/Assert.java @@ -1,7 +1,6 @@ package graphql; import org.jspecify.annotations.NullMarked; -import org.jspecify.annotations.Nullable; import java.util.Collection; import java.util.function.Supplier; @@ -14,49 +13,49 @@ @NullMarked public class Assert { - public static T assertNotNullWithNPE(@Nullable T object, Supplier msg) { + public static T assertNotNullWithNPE(T object, Supplier msg) { if (object != null) { return object; } throw new NullPointerException(msg.get()); } - public static T assertNotNull(@Nullable T object) { + public static T assertNotNull(T object) { if (object != null) { return object; } return throwAssert("Object required to be not null"); } - public static T assertNotNull(@Nullable T object, Supplier msg) { + public static T assertNotNull(T object, Supplier msg) { if (object != null) { return object; } return throwAssert(msg.get()); } - public static T assertNotNull(@Nullable T object, String constantMsg) { + public static T assertNotNull(T object, String constantMsg) { if (object != null) { return object; } return throwAssert(constantMsg); } - public static T assertNotNull(@Nullable T object, String msgFmt, Object arg1) { + public static T assertNotNull(T object, String msgFmt, Object arg1) { if (object != null) { return object; } return throwAssert(msgFmt, arg1); } - public static T assertNotNull(@Nullable T object, String msgFmt, Object arg1, Object arg2) { + public static T assertNotNull(T object, String msgFmt, Object arg1, Object arg2) { if (object != null) { return object; } return throwAssert(msgFmt, arg1, arg2); } - public static T assertNotNull(@Nullable T object, String msgFmt, Object arg1, Object arg2, Object arg3) { + public static T assertNotNull(T object, String msgFmt, Object arg1, Object arg2, Object arg3) { if (object != null) { return object; } @@ -64,14 +63,14 @@ public static T assertNotNull(@Nullable T object, String msgFmt, Object arg1 } - public static void assertNull(@Nullable T object, Supplier msg) { + public static void assertNull(T object, Supplier msg) { if (object == null) { return; } throwAssert(msg.get()); } - public static void assertNull(@Nullable T object) { + public static void assertNull(T object) { if (object == null) { return; } @@ -90,14 +89,14 @@ public static T assertShouldNeverHappen() { return throwAssert("Internal error: should never happen"); } - public static Collection assertNotEmpty(@Nullable Collection collection) { + public static Collection assertNotEmpty(Collection collection) { if (collection == null || collection.isEmpty()) { throwAssert("collection must be not null and not empty"); } return collection; } - public static Collection assertNotEmpty(@Nullable Collection collection, Supplier msg) { + public static Collection assertNotEmpty(Collection collection, Supplier msg) { if (collection == null || collection.isEmpty()) { throwAssert(msg.get()); } @@ -200,14 +199,14 @@ public static void assertFalse(boolean condition, String msgFmt, Object arg1, Ob * * @return the name if valid, or AssertException if invalid. */ - public static String assertValidName(@Nullable String name) { + public static String assertValidName(String name) { if (name != null && !name.isEmpty() && validNamePattern.matcher(name).matches()) { return name; } return throwAssert(invalidNameErrorMessage, name); } - private static T throwAssert(String format, @Nullable Object... args) { + private static T throwAssert(String format, Object... args) { throw new AssertException(format(format, args)); } } From 652777904e79ec9f0822fd6c0f36d812ec5a1492 Mon Sep 17 00:00:00 2001 From: Maciej Kucharczyk Date: Mon, 14 Apr 2025 19:33:18 +0200 Subject: [PATCH 3/3] Apply @Nullable on TypeDefinitionRegistry#schema --- src/main/java/graphql/schema/idl/TypeDefinitionRegistry.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/graphql/schema/idl/TypeDefinitionRegistry.java b/src/main/java/graphql/schema/idl/TypeDefinitionRegistry.java index 698f588f4c..599c3a1340 100644 --- a/src/main/java/graphql/schema/idl/TypeDefinitionRegistry.java +++ b/src/main/java/graphql/schema/idl/TypeDefinitionRegistry.java @@ -28,6 +28,7 @@ import graphql.schema.idl.errors.TypeRedefinitionError; import graphql.util.FpKit; import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.io.Serializable; import java.util.ArrayList; @@ -63,7 +64,7 @@ public class TypeDefinitionRegistry implements Serializable { private final Map types = new LinkedHashMap<>(); private final Map scalarTypes = new LinkedHashMap<>(); private final Map directiveDefinitions = new LinkedHashMap<>(); - private SchemaDefinition schema; + private @Nullable SchemaDefinition schema; private final List schemaExtensionDefinitions = new ArrayList<>(); private final SchemaParseOrder schemaParseOrder = new SchemaParseOrder();