Skip to content

Commit 1086e38

Browse files
authored
Merge pull request #140 from graphql-java/fix-input-children-bug
Fix input children bug
2 parents ced7548 + 00fdb8b commit 1086e38

File tree

15 files changed

+285
-203
lines changed

15 files changed

+285
-203
lines changed

src/main/java/graphql/annotations/processor/graphQLProcessors/GraphQLInputProcessor.java

Lines changed: 7 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,12 @@
1515
package graphql.annotations.processor.graphQLProcessors;
1616

1717

18-
import graphql.annotations.processor.retrievers.GraphQLInputObjectRetriever;
1918
import graphql.annotations.processor.ProcessingElementsContainer;
2019
import graphql.annotations.processor.retrievers.GraphQLObjectInfoRetriever;
2120
import graphql.annotations.processor.retrievers.GraphQLTypeRetriever;
22-
import graphql.schema.GraphQLInputObjectType;
2321
import graphql.schema.GraphQLInputType;
2422
import graphql.schema.GraphQLType;
23+
import graphql.schema.GraphQLTypeReference;
2524

2625
import java.util.Map;
2726

@@ -31,17 +30,15 @@ public class GraphQLInputProcessor {
3130

3231

3332
private GraphQLObjectInfoRetriever graphQLObjectInfoRetriever;
34-
private GraphQLTypeRetriever graphQLOutputObjectRetriever;
35-
private GraphQLInputObjectRetriever graphQLInputObjectRetriever;
33+
private GraphQLTypeRetriever graphQLTypeRetriever;
3634

37-
public GraphQLInputProcessor(GraphQLObjectInfoRetriever graphQLObjectInfoRetriever, GraphQLTypeRetriever graphQLOutputObjectRetriever, GraphQLInputObjectRetriever graphQLInputObjectRetriever) {
35+
public GraphQLInputProcessor(GraphQLObjectInfoRetriever graphQLObjectInfoRetriever, GraphQLTypeRetriever graphQLTypeRetriever) {
3836
this.graphQLObjectInfoRetriever = graphQLObjectInfoRetriever;
39-
this.graphQLOutputObjectRetriever = graphQLOutputObjectRetriever;
40-
this.graphQLInputObjectRetriever = graphQLInputObjectRetriever;
37+
this.graphQLTypeRetriever = graphQLTypeRetriever;
4138
}
4239

4340
public GraphQLInputProcessor() {
44-
this(new GraphQLObjectInfoRetriever(), new GraphQLTypeRetriever(), new GraphQLInputObjectRetriever());
41+
this(new GraphQLObjectInfoRetriever(), new GraphQLTypeRetriever());
4542
}
4643

4744
/**
@@ -52,27 +49,11 @@ public GraphQLInputProcessor() {
5249
* @return a {@link GraphQLInputType} that represents that object class
5350
*/
5451

55-
public GraphQLInputType getInputType(Class<?> object, ProcessingElementsContainer container) {
52+
public GraphQLInputType getInputTypeOrRef(Class<?> object, ProcessingElementsContainer container) {
5653
boolean considerAsInput = true;
5754
if (Enum.class.isAssignableFrom(object)) {
5855
considerAsInput = false;
5956
}
60-
61-
String typeName = graphQLObjectInfoRetriever.getTypeName(object);
62-
63-
if (considerAsInput)
64-
typeName = DEFAULT_INPUT_PREFIX + typeName;
65-
66-
Map<String, GraphQLType> typeRegistry = container.getTypeRegistry();
67-
68-
if (typeRegistry.containsKey(typeName)) {
69-
return (GraphQLInputType) container.getTypeRegistry().get(typeName);
70-
} else {
71-
72-
graphql.schema.GraphQLType graphQLType = graphQLOutputObjectRetriever.getGraphQLType(object, container, considerAsInput);
73-
GraphQLInputType inputObject = graphQLInputObjectRetriever.getInputObject(graphQLType, DEFAULT_INPUT_PREFIX, typeRegistry);
74-
typeRegistry.put(inputObject.getName(), inputObject);
75-
return inputObject;
76-
}
57+
return (GraphQLInputType) graphQLTypeRetriever.getGraphQLType(object, container, considerAsInput);
7758
}
7859
}

src/main/java/graphql/annotations/processor/graphQLProcessors/GraphQLOutputProcessor.java

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,12 @@
2525
public class GraphQLOutputProcessor {
2626

2727
private GraphQLObjectInfoRetriever graphQLObjectInfoRetriever;
28-
private GraphQLTypeRetriever outputObjectRetriever;
28+
private GraphQLTypeRetriever graphQLTypeRetriever;
2929

3030

31-
public GraphQLOutputProcessor(GraphQLObjectInfoRetriever graphQLObjectInfoRetriever, GraphQLTypeRetriever outputObjectRetriever) {
31+
public GraphQLOutputProcessor(GraphQLObjectInfoRetriever graphQLObjectInfoRetriever, GraphQLTypeRetriever graphQLTypeRetriever) {
3232
this.graphQLObjectInfoRetriever = graphQLObjectInfoRetriever;
33-
this.outputObjectRetriever = outputObjectRetriever;
33+
this.graphQLTypeRetriever = graphQLTypeRetriever;
3434
}
3535

3636
public GraphQLOutputProcessor() {
@@ -50,12 +50,7 @@ public GraphQLOutputProcessor() {
5050
*/
5151

5252
public GraphQLOutputType getOutputTypeOrRef(Class<?> object, ProcessingElementsContainer container) throws GraphQLAnnotationsException {
53-
String typeName = graphQLObjectInfoRetriever.getTypeName(object);
54-
if (container.getProcessing().contains(typeName)) {
55-
return new GraphQLTypeReference(typeName);
56-
}
57-
58-
return (GraphQLOutputType) outputObjectRetriever.getGraphQLType(object, container, false);
53+
return (GraphQLOutputType) graphQLTypeRetriever.getGraphQLType(object, container, false);
5954
}
6055

6156
}

src/main/java/graphql/annotations/processor/retrievers/GraphQLFieldRetriever.java

Lines changed: 50 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
import graphql.annotations.GraphQLFieldDefinitionWrapper;
1919
import graphql.annotations.annotationTypes.GraphQLRelayMutation;
20-
import graphql.annotations.annotationTypes.GraphQLType;
2120
import graphql.annotations.connection.GraphQLConnection;
2221
import graphql.annotations.processor.ProcessingElementsContainer;
2322
import graphql.annotations.processor.exceptions.CannotCastMemberException;
@@ -47,7 +46,7 @@
4746
import java.util.List;
4847
import java.util.Map;
4948
import java.util.stream.Collectors;
50-
49+
import graphql.schema.GraphQLType;
5150
import static graphql.annotations.processor.util.ObjectUtil.getAllFields;
5251
import static graphql.annotations.processor.util.ReflectionKit.newInstance;
5352
import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
@@ -59,23 +58,21 @@ public class GraphQLFieldRetriever {
5958
private GraphQLObjectInfoRetriever graphQLObjectInfoRetriever;
6059
private BreadthFirstSearch breadthFirstSearch;
6160
private ParentalSearch parentalSearch;
62-
private GraphQLInputObjectRetriever graphQLInputObjectRetriever;
6361
private DataFetcherConstructor dataFetcherConstructor;
6462

6563
public GraphQLFieldRetriever(GraphQLObjectInfoRetriever graphQLObjectInfoRetriever, BreadthFirstSearch breadthFirstSearch, ParentalSearch parentalSearch,
66-
GraphQLInputObjectRetriever graphQLInputObjectRetriever, DataFetcherConstructor dataFetcherConstructor) {
64+
DataFetcherConstructor dataFetcherConstructor) {
6765
this.graphQLObjectInfoRetriever = graphQLObjectInfoRetriever;
6866
this.breadthFirstSearch = breadthFirstSearch;
6967
this.parentalSearch = parentalSearch;
70-
this.graphQLInputObjectRetriever = graphQLInputObjectRetriever;
7168
this.dataFetcherConstructor = dataFetcherConstructor;
7269
}
7370

7471
public GraphQLFieldRetriever() {
75-
this(new GraphQLObjectInfoRetriever(), new BreadthFirstSearch(new GraphQLObjectInfoRetriever()), new ParentalSearch(new GraphQLObjectInfoRetriever()), new GraphQLInputObjectRetriever(), new DataFetcherConstructor());
72+
this(new GraphQLObjectInfoRetriever(), new BreadthFirstSearch(new GraphQLObjectInfoRetriever()), new ParentalSearch(new GraphQLObjectInfoRetriever()), new DataFetcherConstructor());
7673
}
7774

78-
public List<GraphQLFieldDefinition> getExtensionFields(Class<?> object, List<String> fieldsDefined, ProcessingElementsContainer container) throws CannotCastMemberException {
75+
public List<GraphQLFieldDefinition> getExtensionFields(Class<?> object, List<String> definedFields, ProcessingElementsContainer container) throws CannotCastMemberException {
7976
List<GraphQLFieldDefinition> fields = new ArrayList<>();
8077
if (container.getExtensionsTypeRegistry().containsKey(object)) {
8178
for (Class<?> aClass : container.getExtensionsTypeRegistry().get(object)) {
@@ -84,15 +81,15 @@ public List<GraphQLFieldDefinition> getExtensionFields(Class<?> object, List<Str
8481
continue;
8582
}
8683
if (breadthFirstSearch.isFound(method)) {
87-
addExtensionField(getField(method, container), fields, fieldsDefined);
84+
addExtensionField(getField(method, container), fields, definedFields);
8885
}
8986
}
9087
for (Field field : getAllFields(aClass).values()) {
9188
if (Modifier.isStatic(field.getModifiers())) {
9289
continue;
9390
}
9491
if (parentalSearch.isFound(field)) {
95-
addExtensionField(getField(field, container), fields, fieldsDefined);
92+
addExtensionField(getField(field, container), fields, definedFields);
9693
}
9794
}
9895
}
@@ -104,28 +101,62 @@ public GraphQLFieldDefinition getField(Method method, ProcessingElementsContaine
104101
GraphQLFieldDefinition.Builder builder = newFieldDefinition();
105102
TypeFunction typeFunction = getTypeFunction(method, container);
106103
builder.name(new MethodNameBuilder(method).build());
107-
GraphQLOutputType outputType = new MethodTypeBuilder(method, typeFunction, container).build();
104+
GraphQLOutputType outputType = (GraphQLOutputType) new MethodTypeBuilder(method, typeFunction, container, false).build();
108105

109106
boolean isConnection = ConnectionUtil.isConnection(method, outputType);
110107
if (isConnection) {
111108
outputType = getGraphQLConnection(method, outputType, container.getRelay(), container.getTypeRegistry());
112109
}
113110
builder.type(outputType);
114111
handleConnectionArgument(container, builder, isConnection);
115-
List<GraphQLArgument> args = new ArgumentBuilder(method, typeFunction, graphQLInputObjectRetriever, builder, container, outputType).build();
112+
List<GraphQLArgument> args = new ArgumentBuilder(method, typeFunction, builder, container, outputType).build();
116113
GraphQLFieldDefinition relayFieldDefinition = handleRelayArguments(method, container, builder, outputType, args);
117114
builder.description(new DescriptionBuilder(method).build())
118115
.deprecate(new DeprecateBuilder(method).build())
119116
.dataFetcher(new MethodDataFetcherBuilder(method, outputType, typeFunction, container, relayFieldDefinition, args, dataFetcherConstructor, isConnection).build());
120117
return new GraphQLFieldDefinitionWrapper(builder.build());
121118
}
122119

120+
public GraphQLFieldDefinition getField(Field field, ProcessingElementsContainer container) throws GraphQLAnnotationsException {
121+
GraphQLFieldDefinition.Builder builder = newFieldDefinition();
122+
builder.name(new FieldNameBuilder(field).build());
123+
TypeFunction typeFunction = getTypeFunction(field, container);
124+
125+
GraphQLType outputType = typeFunction.buildType(field.getType(), field.getAnnotatedType(), container);
126+
boolean isConnection = ConnectionUtil.isConnection(field, outputType);
127+
if (isConnection) {
128+
outputType = getGraphQLConnection(field, outputType, container.getRelay(), container.getTypeRegistry());
129+
builder.argument(container.getRelay().getConnectionFieldArguments());
130+
}
131+
132+
builder.type((GraphQLOutputType) outputType).description(new DescriptionBuilder(field).build())
133+
.deprecate(new DeprecateBuilder(field).build())
134+
.dataFetcher(new FieldDataFetcherBuilder(field, dataFetcherConstructor, outputType, typeFunction, container, isConnection).build());
135+
136+
return new GraphQLFieldDefinitionWrapper(builder.build());
137+
}
138+
139+
public GraphQLInputObjectField getInputField(Method method, ProcessingElementsContainer container) throws GraphQLAnnotationsException {
140+
GraphQLInputObjectField.Builder builder = newInputObjectField();
141+
builder.name(new MethodNameBuilder(method).build());
142+
TypeFunction typeFunction = getTypeFunction(method, container);
143+
GraphQLInputType inputType = (GraphQLInputType) new MethodTypeBuilder(method, typeFunction, container, true).build();
144+
return builder.type(inputType).description(new DescriptionBuilder(method).build()).build();
145+
}
146+
147+
public GraphQLInputObjectField getInputField(Field field, ProcessingElementsContainer container) throws GraphQLAnnotationsException {
148+
GraphQLInputObjectField.Builder builder = newInputObjectField();
149+
builder.name(new FieldNameBuilder(field).build());
150+
TypeFunction typeFunction = getTypeFunction(field, container);
151+
GraphQLType graphQLType = typeFunction.buildType(true,field.getType(), field.getAnnotatedType(), container);
152+
return builder.type((GraphQLInputType) graphQLType).description(new DescriptionBuilder(field).build()).build();
153+
}
154+
123155
private GraphQLFieldDefinition handleRelayArguments(Method method, ProcessingElementsContainer container, GraphQLFieldDefinition.Builder builder, GraphQLOutputType outputType, List<GraphQLArgument> args) {
124156
GraphQLFieldDefinition relayFieldDefinition = null;
125157
if (method.isAnnotationPresent(GraphQLRelayMutation.class)) {
126158
relayFieldDefinition = buildRelayMutation(method, container, builder, outputType, args);
127-
}
128-
else {
159+
} else {
129160
builder.argument(args);
130161
}
131162
return relayFieldDefinition;
@@ -138,7 +169,7 @@ private void handleConnectionArgument(ProcessingElementsContainer container, Gra
138169
}
139170

140171
private TypeFunction getTypeFunction(Method method, ProcessingElementsContainer container) {
141-
GraphQLType annotation = method.getAnnotation(GraphQLType.class);
172+
graphql.annotations.annotationTypes.GraphQLType annotation = method.getAnnotation(graphql.annotations.annotationTypes.GraphQLType.class);
142173
TypeFunction typeFunction = container.getDefaultTypeFunction();
143174

144175
if (annotation != null) {
@@ -166,27 +197,9 @@ private GraphQLFieldDefinition buildRelayMutation(Method method, ProcessingEleme
166197
return relayFieldDefinition;
167198
}
168199

169-
public GraphQLFieldDefinition getField(Field field, ProcessingElementsContainer container) throws GraphQLAnnotationsException {
170-
GraphQLFieldDefinition.Builder builder = newFieldDefinition();
171-
builder.name(new FieldNameBuilder(field).build());
172-
TypeFunction typeFunction = getTypeFunction(field, container);
173-
174-
GraphQLOutputType outputType = (GraphQLOutputType) typeFunction.buildType(field.getType(), field.getAnnotatedType(), container);
175-
boolean isConnection = ConnectionUtil.isConnection(field, outputType);
176-
if (isConnection) {
177-
outputType = getGraphQLConnection(field, outputType, container.getRelay(), container.getTypeRegistry());
178-
builder.argument(container.getRelay().getConnectionFieldArguments());
179-
}
180-
181-
builder.type(outputType).description(new DescriptionBuilder(field).build())
182-
.deprecate(new DeprecateBuilder(field).build())
183-
.dataFetcher(new FieldDataFetcherBuilder(field, dataFetcherConstructor, outputType, typeFunction, container, isConnection).build());
184-
185-
return new GraphQLFieldDefinitionWrapper(builder.build());
186-
}
187200

188201
private TypeFunction getTypeFunction(Field field, ProcessingElementsContainer container) {
189-
GraphQLType annotation = field.getAnnotation(GraphQLType.class);
202+
graphql.annotations.annotationTypes.GraphQLType annotation = field.getAnnotation(graphql.annotations.annotationTypes.GraphQLType.class);
190203

191204
TypeFunction typeFunction = container.getDefaultTypeFunction();
192205

@@ -196,7 +209,7 @@ private TypeFunction getTypeFunction(Field field, ProcessingElementsContainer co
196209
return typeFunction;
197210
}
198211

199-
private GraphQLOutputType getGraphQLConnection(AccessibleObject field, GraphQLOutputType type, Relay relay, Map<String, graphql.schema.GraphQLType> typeRegistry) {
212+
private GraphQLOutputType getGraphQLConnection(AccessibleObject field, graphql.schema.GraphQLType type, Relay relay, Map<String, graphql.schema.GraphQLType> typeRegistry) {
200213
if (type instanceof GraphQLNonNull) {
201214
GraphQLList listType = (GraphQLList) ((GraphQLNonNull) type).getWrappedType();
202215
return new GraphQLNonNull(internalGetGraphQLConnection(field, listType, relay, typeRegistry));
@@ -213,9 +226,9 @@ private GraphQLOutputType internalGetGraphQLConnection(AccessibleObject field, G
213226
return getActualType(relay.connectionType(connectionName, edgeType, Collections.emptyList()), typeRegistry);
214227
}
215228

216-
private void addExtensionField(GraphQLFieldDefinition gqlField, List<GraphQLFieldDefinition> fields, List<String> fieldsDefined) {
217-
if (!fieldsDefined.contains(gqlField.getName())) {
218-
fieldsDefined.add(gqlField.getName());
229+
private void addExtensionField(GraphQLFieldDefinition gqlField, List<GraphQLFieldDefinition> fields, List<String> definedFields) {
230+
if (!definedFields.contains(gqlField.getName())) {
231+
definedFields.add(gqlField.getName());
219232
fields.add(gqlField);
220233
} else {
221234
throw new GraphQLAnnotationsException("Duplicate field found in extension : " + gqlField.getName(), null);
@@ -231,5 +244,4 @@ private GraphQLObjectType getActualType(GraphQLObjectType type, Map<String, grap
231244
return type;
232245
}
233246

234-
235247
}

0 commit comments

Comments
 (0)