Skip to content

Commit 2d071a4

Browse files
committed
AutoRegistrationRuntimeWiringConfigurer refactoring
1 parent 3ebdce0 commit 2d071a4

File tree

3 files changed

+93
-30
lines changed

3 files changed

+93
-30
lines changed

spring-graphql/src/main/java/org/springframework/graphql/data/query/AutoRegistrationRuntimeWiringConfigurer.java

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

1818
import java.util.List;
1919
import java.util.Map;
20-
import java.util.function.Function;
2120
import java.util.function.Predicate;
2221

2322
import graphql.language.FieldDefinition;
@@ -49,19 +48,15 @@ class AutoRegistrationRuntimeWiringConfigurer implements RuntimeWiringConfigurer
4948
private final static Log logger = LogFactory.getLog(AutoRegistrationRuntimeWiringConfigurer.class);
5049

5150

52-
private final Map<String, Function<Boolean, DataFetcher<?>>> dataFetcherFactories;
51+
private final Map<String, DataFetcherFactory> dataFetcherFactories;
5352

5453

5554
/**
56-
* Constructor with a Map of GraphQL type names for which auto-registration
57-
* can be performed.
58-
* @param dataFetcherFactories Map with GraphQL type names as keys, and
59-
* functions to create a corresponding {@link DataFetcher} as values.
55+
* Constructor with a Map of GraphQL type names as keys, and
56+
* {@code DataFetcher} factories as values.
6057
*/
61-
AutoRegistrationRuntimeWiringConfigurer(
62-
Map<String, Function<Boolean, DataFetcher<?>>> dataFetcherFactories) {
63-
64-
this.dataFetcherFactories = dataFetcherFactories;
58+
AutoRegistrationRuntimeWiringConfigurer(Map<String, DataFetcherFactory> factories) {
59+
this.dataFetcherFactories = factories;
6560
}
6661

6762

@@ -75,6 +70,24 @@ public void configure(RuntimeWiring.Builder builder, List<WiringFactory> contain
7570
}
7671

7772

73+
/**
74+
* Callback interface to create the desired type of {@code DataFetcher}.
75+
*/
76+
interface DataFetcherFactory {
77+
78+
/**
79+
* Create a singe item {@code DataFetcher}.
80+
*/
81+
DataFetcher<?> single();
82+
83+
/**
84+
* Create {@code DataFetcher} for multiple items.
85+
*/
86+
DataFetcher<?> many();
87+
88+
}
89+
90+
7891
private class AutoRegistrationWiringFactory implements WiringFactory {
7992

8093
private final RuntimeWiring.Builder builder;
@@ -112,16 +125,21 @@ public boolean providesDataFetcher(FieldWiringEnvironment environment) {
112125

113126
@Nullable
114127
private String getOutputTypeName(FieldWiringEnvironment environment) {
115-
GraphQLType outputType = (environment.getFieldType() instanceof GraphQLList ?
116-
((GraphQLList) environment.getFieldType()).getWrappedType() :
117-
environment.getFieldType());
128+
GraphQLType outputType = removeNonNullWrapper(environment.getFieldType());
129+
130+
if (outputType instanceof GraphQLList) {
131+
outputType = removeNonNullWrapper(((GraphQLList) outputType).getWrappedType());
132+
}
118133

119-
if (outputType instanceof GraphQLNonNull) {
120-
outputType = ((GraphQLNonNull) outputType).getWrappedType();
134+
if (outputType instanceof GraphQLNamedOutputType namedType) {
135+
return namedType.getName();
121136
}
122137

123-
return (outputType instanceof GraphQLNamedOutputType ?
124-
((GraphQLNamedOutputType) outputType).getName() : null);
138+
return null;
139+
}
140+
141+
private GraphQLType removeNonNullWrapper(GraphQLType outputType) {
142+
return (outputType instanceof GraphQLNonNull wrapper ? wrapper.getWrappedType() : outputType);
125143
}
126144

127145
private boolean hasDataFetcherFor(FieldDefinition fieldDefinition) {
@@ -132,13 +150,11 @@ private boolean hasDataFetcherFor(FieldDefinition fieldDefinition) {
132150
return this.existingQueryDataFetcherPredicate.test(fieldDefinition.getName());
133151
}
134152

135-
private void logTraceMessage(
136-
FieldWiringEnvironment environment, @Nullable String outputTypeName, boolean match) {
137-
153+
private void logTraceMessage(FieldWiringEnvironment environment, @Nullable String typeName, boolean match) {
138154
if (logger.isTraceEnabled()) {
139155
String query = environment.getFieldDefinition().getName();
140156
logger.trace((match ? "Matched" : "Skipped") +
141-
" output typeName " + (outputTypeName != null ? "'" + outputTypeName + "'" : "null") +
157+
" output typeName " + (typeName != null ? "'" + typeName + "'" : "null") +
142158
" for query '" + query + "'");
143159
}
144160
}
@@ -149,11 +165,16 @@ public DataFetcher<?> getDataFetcher(FieldWiringEnvironment environment) {
149165
String outputTypeName = getOutputTypeName(environment);
150166
logTraceMessage(environment, outputTypeName, true);
151167

152-
Function<Boolean, DataFetcher<?>> factory = dataFetcherFactories.get(outputTypeName);
168+
DataFetcherFactory factory = dataFetcherFactories.get(outputTypeName);
153169
Assert.notNull(factory, "Expected DataFetcher factory for typeName '" + outputTypeName + "'");
154170

155-
boolean single = !(environment.getFieldType() instanceof GraphQLList);
156-
return factory.apply(single);
171+
GraphQLType outputType = removeNonNullWrapper(environment.getFieldType());
172+
if (outputType instanceof GraphQLList) {
173+
return factory.many();
174+
}
175+
else {
176+
return factory.single();
177+
}
157178
}
158179

159180
}

spring-graphql/src/main/java/org/springframework/graphql/data/query/QueryByExampleDataFetcher.java

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import org.springframework.data.util.TypeInformation;
4343
import org.springframework.graphql.data.GraphQlArgumentBinder;
4444
import org.springframework.graphql.data.GraphQlRepository;
45+
import org.springframework.graphql.data.query.AutoRegistrationRuntimeWiringConfigurer.DataFetcherFactory;
4546
import org.springframework.graphql.execution.RuntimeWiringConfigurer;
4647
import org.springframework.graphql.execution.SelfDescribingDataFetcher;
4748
import org.springframework.lang.Nullable;
@@ -195,21 +196,41 @@ public static RuntimeWiringConfigurer autoRegistrationConfigurer(
195196
List<QueryByExampleExecutor<?>> executors,
196197
List<ReactiveQueryByExampleExecutor<?>> reactiveExecutors) {
197198

198-
Map<String, Function<Boolean, DataFetcher<?>>> factories = new HashMap<>();
199+
Map<String, DataFetcherFactory> factories = new HashMap<>();
199200

200201
for (QueryByExampleExecutor<?> executor : executors) {
201202
String typeName = RepositoryUtils.getGraphQlTypeName(executor);
202203
if (typeName != null) {
203204
Builder<?, ?> builder = customize(executor, builder(executor));
204-
factories.put(typeName, single -> single ? builder.single() : builder.many());
205+
factories.put(typeName, new DataFetcherFactory() {
206+
@Override
207+
public DataFetcher<?> single() {
208+
return builder.single();
209+
}
210+
211+
@Override
212+
public DataFetcher<?> many() {
213+
return builder.many();
214+
}
215+
});
205216
}
206217
}
207218

208219
for (ReactiveQueryByExampleExecutor<?> executor : reactiveExecutors) {
209220
String typeName = RepositoryUtils.getGraphQlTypeName(executor);
210221
if (typeName != null) {
211222
ReactiveBuilder<?, ?> builder = customize(executor, builder(executor));
212-
factories.put(typeName, single -> single ? builder.single() : builder.many());
223+
factories.put(typeName, new DataFetcherFactory() {
224+
@Override
225+
public DataFetcher<?> single() {
226+
return builder.single();
227+
}
228+
229+
@Override
230+
public DataFetcher<?> many() {
231+
return builder.many();
232+
}
233+
});
213234
}
214235
}
215236

spring-graphql/src/main/java/org/springframework/graphql/data/query/QuerydslDataFetcher.java

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import org.springframework.data.repository.query.FluentQuery.FetchableFluentQuery;
4848
import org.springframework.data.util.TypeInformation;
4949
import org.springframework.graphql.data.GraphQlRepository;
50+
import org.springframework.graphql.data.query.AutoRegistrationRuntimeWiringConfigurer.DataFetcherFactory;
5051
import org.springframework.graphql.execution.RuntimeWiringConfigurer;
5152
import org.springframework.graphql.execution.SelfDescribingDataFetcher;
5253
import org.springframework.util.Assert;
@@ -219,21 +220,41 @@ public static RuntimeWiringConfigurer autoRegistrationConfigurer(
219220
List<QuerydslPredicateExecutor<?>> executors,
220221
List<ReactiveQuerydslPredicateExecutor<?>> reactiveExecutors) {
221222

222-
Map<String, Function<Boolean, DataFetcher<?>>> factories = new HashMap<>();
223+
Map<String, DataFetcherFactory> factories = new HashMap<>();
223224

224225
for (QuerydslPredicateExecutor<?> executor : executors) {
225226
String typeName = RepositoryUtils.getGraphQlTypeName(executor);
226227
if (typeName != null) {
227228
Builder builder = customize(executor, QuerydslDataFetcher.builder(executor).customizer(customizer(executor)));
228-
factories.put(typeName, single -> single ? builder.single() : builder.many());
229+
factories.put(typeName, new DataFetcherFactory() {
230+
@Override
231+
public DataFetcher<?> single() {
232+
return builder.single();
233+
}
234+
235+
@Override
236+
public DataFetcher<?> many() {
237+
return builder.many();
238+
}
239+
});
229240
}
230241
}
231242

232243
for (ReactiveQuerydslPredicateExecutor<?> executor : reactiveExecutors) {
233244
String typeName = RepositoryUtils.getGraphQlTypeName(executor);
234245
if (typeName != null) {
235246
ReactiveBuilder builder = customize(executor, QuerydslDataFetcher.builder(executor).customizer(customizer(executor)));
236-
factories.put(typeName, single -> single ? builder.single() : builder.many());
247+
factories.put(typeName, new DataFetcherFactory() {
248+
@Override
249+
public DataFetcher<?> single() {
250+
return builder.single();
251+
}
252+
253+
@Override
254+
public DataFetcher<?> many() {
255+
return builder.many();
256+
}
257+
});
237258
}
238259
}
239260

0 commit comments

Comments
 (0)