diff --git a/README.md b/README.md index 31cc9f7c..aac8d3ef 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ If you would like to use a tool that creates a graphql spring boot server using ```groovy dependencies { - compile "io.github.graphql-java:graphql-java-annotations:21.5" + compile "io.github.graphql-java:graphql-java-annotations:24.3" } ``` @@ -47,7 +47,7 @@ dependencies { io.github.graphql-java graphql-java-annotations - 21.5 + 24.3 ``` diff --git a/build.gradle b/build.gradle index cc8d0e72..62210f2b 100644 --- a/build.gradle +++ b/build.gradle @@ -59,8 +59,8 @@ gradle.projectsEvaluated { dependencies { implementation 'javax.validation:validation-api:1.1.0.Final' - implementation 'com.graphql-java:graphql-java:21.5' - implementation 'com.graphql-java:graphql-java-extended-scalars:21.0' + implementation 'com.graphql-java:graphql-java:24.3' + implementation 'com.graphql-java:graphql-java-extended-scalars:24.0' implementation 'javax.xml.bind:jaxb-api:2.3.1' // OSGi diff --git a/gradle.properties b/gradle.properties index 1648a9b2..f4698408 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,4 +5,4 @@ org.gradle.daemon=true org.gradle.parallel=true org.gradle.jvmargs=-Dfile.encoding=UTF-8 -version = 21.5 \ No newline at end of file +version = 24.3 diff --git a/src/main/java/graphql/annotations/processor/retrievers/fieldBuilders/DirectivesBuilder.java b/src/main/java/graphql/annotations/processor/retrievers/fieldBuilders/DirectivesBuilder.java index f17810af..1e7c5e99 100644 --- a/src/main/java/graphql/annotations/processor/retrievers/fieldBuilders/DirectivesBuilder.java +++ b/src/main/java/graphql/annotations/processor/retrievers/fieldBuilders/DirectivesBuilder.java @@ -26,6 +26,8 @@ import graphql.annotations.processor.ProcessingElementsContainer; import graphql.annotations.processor.exceptions.GraphQLAnnotationsException; import graphql.annotations.processor.util.DirectiveJavaAnnotationUtil; +import graphql.schema.GraphQLAppliedDirective; +import graphql.schema.GraphQLAppliedDirectiveArgument; import graphql.schema.GraphQLArgument; import graphql.schema.GraphQLDirective; import graphql.schema.GraphQLScalarType; @@ -135,7 +137,7 @@ private void transformArgument(Annotation annotation, GraphQLDirective.Builder d Object value; if ( graphQLArgument.getType() instanceof GraphQLScalarType ) { - value = ((GraphQLScalarType) graphQLArgument.getType()).getCoercing().parseValue(argumentValue); + value = ((GraphQLScalarType) graphQLArgument.getType()).getCoercing().serialize(argumentValue); } else { @@ -161,8 +163,8 @@ private void transformArgument(String[] argumentValues, GraphQLDirective.Builder if (graphQLArgument.getType() instanceof GraphQLScalarType) { try { - Object value = ((GraphQLScalarType) graphQLArgument.getType()).getCoercing().parseValue(argumentValue); - builder.value( value ); + Object value = ((GraphQLScalarType) graphQLArgument.getType()).getCoercing().serialize(argumentValue); + builder.value(value); } catch (Exception e) { throw new GraphQLAnnotationsException(COULD_NOT_PARSE_ARGUMENT_VALUE_TO_ARGUMENT_TYPE, e); } diff --git a/src/main/java/graphql/annotations/processor/util/CodeRegistryUtil.java b/src/main/java/graphql/annotations/processor/util/CodeRegistryUtil.java index 77d9c29b..ee675fa9 100644 --- a/src/main/java/graphql/annotations/processor/util/CodeRegistryUtil.java +++ b/src/main/java/graphql/annotations/processor/util/CodeRegistryUtil.java @@ -43,6 +43,6 @@ public static void wrapDataFetcher(GraphQLFieldDefinition fieldDefinition, Annot * @return the data fetcher */ public static DataFetcher getDataFetcher(GraphQLCodeRegistry.Builder codeRegistryBuilder, GraphQLSchemaElement parentElement, GraphQLFieldDefinition fieldDefinition) { - return codeRegistryBuilder.getDataFetcher((GraphQLFieldsContainer) parentElement, fieldDefinition); + return codeRegistryBuilder.getDataFetcher(FieldCoordinates.coordinates((GraphQLFieldsContainer) parentElement, fieldDefinition), fieldDefinition); } } diff --git a/src/main/java/graphql/annotations/strategies/EnhancedExecutionStrategy.java b/src/main/java/graphql/annotations/strategies/EnhancedExecutionStrategy.java index 465ff79d..7b16d3ad 100644 --- a/src/main/java/graphql/annotations/strategies/EnhancedExecutionStrategy.java +++ b/src/main/java/graphql/annotations/strategies/EnhancedExecutionStrategy.java @@ -23,53 +23,34 @@ import java.util.HashMap; import java.util.Optional; -import java.util.concurrent.CompletableFuture; public class EnhancedExecutionStrategy extends AsyncSerialExecutionStrategy { private static final String CLIENT_MUTATION_ID = "clientMutationId"; @Override - protected CompletableFuture resolveField(ExecutionContext executionContext, ExecutionStrategyParameters parameters) { - GraphQLObjectType parentType = (GraphQLObjectType) parameters.getExecutionStepInfo().getUnwrappedNonNullType(); - GraphQLFieldDefinition fieldDef = getFieldDef(executionContext.getGraphQLSchema(), parentType, parameters.getField().getSingleField()); - if (fieldDef == null) return null; + protected FieldValueInfo completeValue(ExecutionContext executionContext, ExecutionStrategyParameters parameters) throws NonNullableFieldWasNullException { + graphql.schema.GraphQLType fieldType = parameters.getExecutionStepInfo().getType(); - if (fieldDef.getName().contentEquals(CLIENT_MUTATION_ID)) { + if (parameters.getExecutionStepInfo().getFieldDefinition().getName().contentEquals(CLIENT_MUTATION_ID)) { Field field = (Field) executionContext.getOperationDefinition().getSelectionSet().getSelections().get(0); Argument argument = field.getArguments().get(0); Object clientMutationId; if (argument.getValue() instanceof VariableReference) { VariableReference ref = (VariableReference) argument.getValue(); - HashMap mutationInputVariables = (HashMap) executionContext.getVariables().get(ref.getName()); + HashMap mutationInputVariables = (HashMap) executionContext.getCoercedVariables().get(ref.getName()); clientMutationId = mutationInputVariables.get(CLIENT_MUTATION_ID); } else { ObjectValue value = (ObjectValue) field.getArguments().get(0).getValue(); StringValue clientMutationIdVal = (StringValue) value.getObjectFields().stream() - .filter(f -> f.getName().contentEquals(CLIENT_MUTATION_ID)) - .findFirst().get().getValue(); + .filter(f -> f.getName().contentEquals(CLIENT_MUTATION_ID)) + .findFirst().get().getValue(); clientMutationId = clientMutationIdVal.getValue(); } - - ExecutionStepInfo fieldTypeInfo = ExecutionStepInfo.newExecutionStepInfo().type(fieldDef.getType()).parentInfo(parameters.getExecutionStepInfo()).build(); - ExecutionStrategyParameters newParameters = ExecutionStrategyParameters.newParameters() - .fields(parameters.getFields()) - .nonNullFieldValidator(parameters.getNonNullFieldValidator()) - .executionStepInfo(fieldTypeInfo) - .source(clientMutationId) - .build(); - - - return completeValue(executionContext, newParameters).getFieldValue(); - } else { - return super.resolveField(executionContext, parameters); + return super.completeValue(executionContext, withSource(parameters, clientMutationId)); } - } - @Override - protected FieldValueInfo completeValue(ExecutionContext executionContext, ExecutionStrategyParameters parameters) throws NonNullableFieldWasNullException { - graphql.schema.GraphQLType fieldType = parameters.getExecutionStepInfo().getType(); Object result = parameters.getSource(); if (result instanceof Enum && fieldType instanceof GraphQLEnumType) { Object value = ((GraphQLEnumType) fieldType).parseValue(((Enum) result).name()); diff --git a/src/test/java/graphql/annotations/GraphQLIterableAndArrayTest.java b/src/test/java/graphql/annotations/GraphQLIterableAndArrayTest.java index 6cb8bb04..9f65ad75 100644 --- a/src/test/java/graphql/annotations/GraphQLIterableAndArrayTest.java +++ b/src/test/java/graphql/annotations/GraphQLIterableAndArrayTest.java @@ -138,10 +138,10 @@ public void queryWithArrayWithinAnArray() { } private Object getQueryResultAtIndex(ExecutionResult result, String queryName, int index) { - return ((ArrayList) (((LinkedHashMap) result.getData()).get(queryName))).get(index); + return ((List) (((LinkedHashMap) result.getData()).get(queryName))).get(index); } private Object getQueryResultAtCell(ExecutionResult result, String queryName, int rowIndex, int columnIndex) { - return (((ArrayList) (getQueryResultAtIndex(result, queryName, rowIndex))).get(columnIndex)); + return (((List) (getQueryResultAtIndex(result, queryName, rowIndex))).get(columnIndex)); } } diff --git a/src/test/java/graphql/annotations/directives/DirectiveWiringMapRetrieverTest.java b/src/test/java/graphql/annotations/directives/DirectiveWiringMapRetrieverTest.java index bc89d1fa..d521baae 100644 --- a/src/test/java/graphql/annotations/directives/DirectiveWiringMapRetrieverTest.java +++ b/src/test/java/graphql/annotations/directives/DirectiveWiringMapRetrieverTest.java @@ -19,6 +19,7 @@ import graphql.annotations.processor.DirectiveAndWiring; import graphql.annotations.processor.ProcessingElementsContainer; import graphql.annotations.processor.exceptions.GraphQLAnnotationsException; +import graphql.introspection.Introspection; import graphql.schema.GraphQLDirective; import org.testng.annotations.Test; @@ -67,8 +68,8 @@ public void getDirectiveWiringMap_noDirectivesInRegistry_throwAGraphQLAnnotation public void getDirectiveWiringMap_wiringClassIsPrivate_throwAGraphQLAnnotationsException() throws Exception { // Arrange DirectiveWiringMapRetriever directiveWiringMapRetriever = new DirectiveWiringMapRetriever(); - GraphQLDirective upperCase = newDirective().name("upperCase").build(); - GraphQLDirective lowerCase = newDirective().name("lowerCase").build(); + GraphQLDirective upperCase = newDirective().name("upperCase").validLocation(Introspection.DirectiveLocation.FIELD).build(); + GraphQLDirective lowerCase = newDirective().name("lowerCase").validLocation(Introspection.DirectiveLocation.FIELD).build(); ProcessingElementsContainer container = new ProcessingElementsContainer(); container.getDirectiveRegistry().put("upperCase", new DirectiveAndWiring(upperCase, ThirdWiringClass.class)); container.getDirectiveRegistry().put("lowerCase", new DirectiveAndWiring(lowerCase, SecondWiringClass.class)); @@ -87,8 +88,8 @@ public void getDirectiveWiringMap_wiringClassIsPrivate_throwAGraphQLAnnotationsE public void getDirectiveWiringMap_directivesAreInRegistry_returnCorrectMap() throws Exception { // Arrange DirectiveWiringMapRetriever directiveWiringMapRetriever = new DirectiveWiringMapRetriever(); - GraphQLDirective upperCase = newDirective().name("upperCase").build(); - GraphQLDirective lowerCase = newDirective().name("lowerCase").build(); + GraphQLDirective upperCase = newDirective().name("upperCase").validLocation(Introspection.DirectiveLocation.FIELD).build(); + GraphQLDirective lowerCase = newDirective().name("lowerCase").validLocation(Introspection.DirectiveLocation.FIELD).build(); ProcessingElementsContainer container = new ProcessingElementsContainer(); container.getDirectiveRegistry().put("upperCase", new DirectiveAndWiring(upperCase, WiringClass.class)); container.getDirectiveRegistry().put("lowerCase", new DirectiveAndWiring(lowerCase, SecondWiringClass.class)); diff --git a/src/test/java/graphql/annotations/processor/retrievers/fieldBuilders/DirectivesBuilderTest.java b/src/test/java/graphql/annotations/processor/retrievers/fieldBuilders/DirectivesBuilderTest.java index fc170f48..2e27b01d 100644 --- a/src/test/java/graphql/annotations/processor/retrievers/fieldBuilders/DirectivesBuilderTest.java +++ b/src/test/java/graphql/annotations/processor/retrievers/fieldBuilders/DirectivesBuilderTest.java @@ -95,9 +95,16 @@ public void testDecoratedField_noDirectiveInRegistry_throwAGraphQLAnnotationsExc public void testDecoratedField_directivesAreInRegistry_directivesAreBuilt() throws Exception { // Arrange ProcessingElementsContainer processingElementsContainer = new ProcessingElementsContainer(); - GraphQLDirective upperCase = newDirective().name("upperCase").argument(builder -> builder.name("myArg").type(GraphQLString).defaultValue("DefaultString")).build(); - GraphQLDirective lowerCase = newDirective().name("lowerCase").build(); - GraphQLDirective annotationDirective = newDirective().name("anno").build(); + GraphQLDirective upperCase = newDirective().name("upperCase") + .argument(builder -> builder.name("myArg").type(GraphQLString).defaultValueProgrammatic("DefaultString")) + .validLocation(Introspection.DirectiveLocation.FIELD) + .build(); + GraphQLDirective lowerCase = newDirective().name("lowerCase") + .validLocation(Introspection.DirectiveLocation.FIELD) + .build(); + GraphQLDirective annotationDirective = newDirective().name("anno") + .validLocation(Introspection.DirectiveLocation.FIELD) + .build(); processingElementsContainer.getDirectiveRegistry().put("upperCase", new DirectiveAndWiring(upperCase, WiringClass.class)); processingElementsContainer.getDirectiveRegistry().put("lowerCase", new DirectiveAndWiring(lowerCase, WiringClass.class)); @@ -126,8 +133,13 @@ public void testDecoratedField_directivesAreInRegistry_directivesAreBuilt() thro public void testDecoratedFieldWithArguments_directivesAreInRegistry_directivesAreBuilt() throws Exception { // Arrange ProcessingElementsContainer processingElementsContainer = new ProcessingElementsContainer(); - GraphQLDirective upperCase = newDirective().name("upperCase").argument(builder -> builder.name("myArg").type(GraphQLString)).build(); - GraphQLDirective lowerCase = newDirective().name("lowerCase").build(); + GraphQLDirective upperCase = newDirective().name("upperCase") + .argument(builder -> builder.name("myArg").type(GraphQLString)) + .validLocation(Introspection.DirectiveLocation.FIELD) + .build(); + GraphQLDirective lowerCase = newDirective().name("lowerCase") + .validLocation(Introspection.DirectiveLocation.FIELD) + .build(); processingElementsContainer.getDirectiveRegistry().put("upperCase", new DirectiveAndWiring(upperCase, WiringClass.class)); processingElementsContainer.getDirectiveRegistry().put("lowerCase", new DirectiveAndWiring(lowerCase, WiringClass.class)); @@ -150,8 +162,12 @@ public void testDecoratedFieldWithArguments_directivesAreInRegistry_directivesAr public void testDecoratedFieldWithArguments_argumentsValuesLongerThanArgumentsNumber_throwAGraphQLAnnotationsException() throws Exception { // Arrange ProcessingElementsContainer processingElementsContainer = new ProcessingElementsContainer(); - GraphQLDirective upperCase = newDirective().name("upperCase").build(); - GraphQLDirective lowerCase = newDirective().name("lowerCase").build(); + GraphQLDirective upperCase = newDirective().name("upperCase") + .validLocation(Introspection.DirectiveLocation.FIELD) + .build(); + GraphQLDirective lowerCase = newDirective().name("lowerCase") + .validLocation(Introspection.DirectiveLocation.FIELD) + .build(); processingElementsContainer.getDirectiveRegistry().put("upperCase", new DirectiveAndWiring(upperCase, WiringClass.class)); processingElementsContainer.getDirectiveRegistry().put("lowerCase", new DirectiveAndWiring(lowerCase, WiringClass.class)); @@ -171,7 +187,10 @@ public void testDecoratedFieldWithArguments_directiveArgumentIsNotAScalarType_th // Arrange ProcessingElementsContainer processingElementsContainer = new ProcessingElementsContainer(); GraphQLInputObjectType inputField = GraphQLInputObjectType.newInputObject().name("inputField").build(); - GraphQLDirective upperCase = newDirective().name("upperCase").argument(builder -> builder.name("arg").type(inputField)).build(); + GraphQLDirective upperCase = newDirective().name("upperCase") + .argument(builder -> builder.name("arg").type(inputField)) + .validLocation(Introspection.DirectiveLocation.FIELD) + .build(); processingElementsContainer.getDirectiveRegistry().put("upperCase", new DirectiveAndWiring(upperCase, WiringClass.class)); DirectivesBuilder directivesBuilder = new DirectivesBuilder(this.getClass().getField("decoratedFieldWithArguments"), processingElementsContainer); @@ -189,7 +208,10 @@ public void testDecoratedFieldWithArguments_directiveArgumentIsNotAScalarType_th public void testDecoratedFieldWithArguments_argumentValueIsNotTheSameTypeAsArgument_throwAGraphQLAnnotationsException() throws Exception { // Arrange ProcessingElementsContainer processingElementsContainer = new ProcessingElementsContainer(); - GraphQLDirective upperCase = newDirective().name("upperCase").argument(builder -> builder.name("arg").type(GraphQLInt)).build(); + GraphQLDirective upperCase = newDirective().name("upperCase") + .argument(builder -> builder.name("arg").type(GraphQLInt)) + .validLocation(Introspection.DirectiveLocation.FIELD) + .build(); processingElementsContainer.getDirectiveRegistry().put("upperCase", new DirectiveAndWiring(upperCase, WiringClass.class)); DirectivesBuilder directivesBuilder = new DirectivesBuilder(this.getClass().getField("decoratedFieldWithArguments"), processingElementsContainer); @@ -207,9 +229,14 @@ public void testDecoratedFieldWithArguments_argumentValueIsNotTheSameTypeAsArgum public void testDecoratedFieldWithArguments_moreArgumentsThanArgumentsValues_directivesAreBuilt() throws Exception { // Arrange ProcessingElementsContainer processingElementsContainer = new ProcessingElementsContainer(); - GraphQLDirective upperCase = newDirective().name("upperCase").argument(builder -> builder.name("arg").type(GraphQLString)) - .argument(builder -> builder.name("arg2").type(GraphQLInt).defaultValue("5")).build(); - GraphQLDirective lowerCase = newDirective().name("lowerCase").build(); + GraphQLDirective upperCase = newDirective().name("upperCase") + .argument(builder -> builder.name("arg").type(GraphQLString)) + .argument(builder -> builder.name("arg2").type(GraphQLInt).defaultValueProgrammatic("5")) + .validLocation(Introspection.DirectiveLocation.FIELD) + .build(); + GraphQLDirective lowerCase = newDirective().name("lowerCase") + .validLocation(Introspection.DirectiveLocation.FIELD) + .build(); processingElementsContainer.getDirectiveRegistry().put("upperCase", new DirectiveAndWiring(upperCase, WiringClass.class)); processingElementsContainer.getDirectiveRegistry().put("lowerCase", new DirectiveAndWiring(lowerCase, WiringClass.class)); @@ -242,9 +269,16 @@ public void testDecoratedArgument_noDirectiveInRegistry_throwAGraphQLAnnotations public void testDecoratedArgument_directivesAreInRegistry_directivesAreBuilt() throws Exception { // Arrange ProcessingElementsContainer processingElementsContainer = new ProcessingElementsContainer(); - GraphQLDirective upperCase = newDirective().name("upperCase").argument(builder -> builder.name("myArg").type(GraphQLString).defaultValue("DefaultString")).build(); - GraphQLDirective lowerCase = newDirective().name("lowerCase").build(); - GraphQLDirective anno = newDirective().name("anno").build(); + GraphQLDirective upperCase = newDirective().name("upperCase") + .argument(builder -> builder.name("myArg").type(GraphQLString).defaultValueProgrammatic("DefaultString")) + .validLocation(Introspection.DirectiveLocation.ARGUMENT_DEFINITION) + .build(); + GraphQLDirective lowerCase = newDirective().name("lowerCase") + .validLocation(Introspection.DirectiveLocation.ARGUMENT_DEFINITION) + .build(); + GraphQLDirective anno = newDirective().name("anno") + .validLocation(Introspection.DirectiveLocation.ARGUMENT_DEFINITION) + .build(); processingElementsContainer.getDirectiveRegistry().put("upperCase", new DirectiveAndWiring(upperCase, WiringClass.class)); processingElementsContainer.getDirectiveRegistry().put("lowerCase", new DirectiveAndWiring(lowerCase, WiringClass.class)); @@ -271,8 +305,11 @@ public void testDecoratedArgument_directivesAreInRegistry_directivesAreBuilt() t public void testDecoratedParameterWithArguments_directivesAreInRegistry_directivesAreBuilt() throws Exception { // Arrange ProcessingElementsContainer processingElementsContainer = new ProcessingElementsContainer(); - GraphQLDirective upperCase = newDirective().name("upperCase").argument(builder -> builder.name("myArg").type(GraphQLString)).build(); - GraphQLDirective lowerCase = newDirective().name("lowerCase").build(); + GraphQLDirective upperCase = newDirective().name("upperCase") + .argument(builder -> builder.name("myArg").type(GraphQLString)) + .validLocation(Introspection.DirectiveLocation.ARGUMENT_DEFINITION).build(); + GraphQLDirective lowerCase = newDirective().name("lowerCase").validLocation( + Introspection.DirectiveLocation.ARGUMENT_DEFINITION).build(); processingElementsContainer.getDirectiveRegistry().put("upperCase", new DirectiveAndWiring(upperCase, WiringClass.class)); processingElementsContainer.getDirectiveRegistry().put("lowerCase", new DirectiveAndWiring(lowerCase, WiringClass.class)); @@ -304,9 +341,11 @@ public void testDecoratedClass_noDirectiveInRegistry_throwAGraphQLAnnotationsExc public void testDecoratedClass_directivesAreInRegistry_directivesAreBuilt() throws Exception { // Arrange ProcessingElementsContainer processingElementsContainer = new ProcessingElementsContainer(); - GraphQLDirective upperCase = newDirective().name("upperCase").argument(builder -> builder.name("myArg").type(GraphQLString).defaultValue("DefaultString")).build(); - GraphQLDirective lowerCase = newDirective().name("lowerCase").build(); - GraphQLDirective anno = newDirective().name("anno").build(); + GraphQLDirective upperCase = newDirective().name("upperCase").argument(builder -> builder.name("myArg") + .type(GraphQLString).defaultValueProgrammatic("DefaultString")) + .validLocation(Introspection.DirectiveLocation.OBJECT).build(); + GraphQLDirective lowerCase = newDirective().name("lowerCase").validLocation(Introspection.DirectiveLocation.OBJECT).build(); + GraphQLDirective anno = newDirective().name("anno").validLocation(Introspection.DirectiveLocation.FIELD).build(); processingElementsContainer.getDirectiveRegistry().put("upperCase", new DirectiveAndWiring(upperCase, WiringClass.class)); processingElementsContainer.getDirectiveRegistry().put("lowerCase", new DirectiveAndWiring(lowerCase, WiringClass.class)); @@ -337,8 +376,10 @@ public void testDecoratedClass_directivesAreInRegistry_directivesAreBuilt() thro public void testDecoratedClassWithArguments_directivesAreInRegistry_directivesAreBuilt() throws Exception { // Arrange ProcessingElementsContainer processingElementsContainer = new ProcessingElementsContainer(); - GraphQLDirective upperCase = newDirective().name("upperCase").argument(builder -> builder.name("myArg").type(GraphQLString)).build(); - GraphQLDirective lowerCase = newDirective().name("lowerCase").build(); + GraphQLDirective upperCase = newDirective().name("upperCase").argument(builder -> builder.name("myArg").type(GraphQLString)).validLocation( + Introspection.DirectiveLocation.OBJECT).build(); + GraphQLDirective lowerCase = newDirective().name("lowerCase").validLocation( + Introspection.DirectiveLocation.OBJECT).build(); processingElementsContainer.getDirectiveRegistry().put("upperCase", new DirectiveAndWiring(upperCase, WiringClass.class)); processingElementsContainer.getDirectiveRegistry().put("lowerCase", new DirectiveAndWiring(lowerCase, WiringClass.class));