Skip to content

Commit 4c1196b

Browse files
committed
refactoring: removed ResolvedTypeInterface
1 parent 1394cf2 commit 4c1196b

14 files changed

+201
-87
lines changed

src/main/java/graphql/Assert.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ public static <T> T assertNotNull(T object, String errorMessage) {
1010
throw new AssertException(errorMessage);
1111
}
1212

13+
public static void assertNeverCalled() {
14+
throw new AssertException("Should never been called");
15+
}
16+
1317
public static <T> Collection<T> assertNotEmpty(Collection<T> c, String errorMessage) {
1418
if (c == null || c.isEmpty()) throw new AssertException(errorMessage);
1519
return c;

src/main/java/graphql/language/InterfaceTypeDefinition.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import java.util.ArrayList;
55
import java.util.List;
66

7-
public class InterfaceTypeDefinition extends AbstractNode implements TypeDefinition, ResolvedTypeDefinition {
7+
public class InterfaceTypeDefinition extends AbstractNode implements TypeDefinition {
88
private String name;
99
private List<FieldDefinition> definitions = new ArrayList<>();
1010
private List<Directive> directives = new ArrayList<>();

src/main/java/graphql/language/ResolvedTypeDefinition.java

Lines changed: 0 additions & 8 deletions
This file was deleted.

src/main/java/graphql/language/UnionTypeDefinition.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import java.util.ArrayList;
55
import java.util.List;
66

7-
public class UnionTypeDefinition extends AbstractNode implements TypeDefinition, ResolvedTypeDefinition {
7+
public class UnionTypeDefinition extends AbstractNode implements TypeDefinition {
88
private String name;
99
private List<Directive> directives = new ArrayList<>();
1010
private List<Type> memberTypes = new ArrayList<>();

src/main/java/graphql/schema/idl/CombinedWiringFactory.java

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package graphql.schema.idl;
22

33
import graphql.language.FieldDefinition;
4-
import graphql.language.ResolvedTypeDefinition;
4+
import graphql.language.InterfaceTypeDefinition;
5+
import graphql.language.UnionTypeDefinition;
56
import graphql.schema.DataFetcher;
67
import graphql.schema.TypeResolver;
78

@@ -23,7 +24,7 @@ public CombinedWiringFactory(List<WiringFactory> factories) {
2324
}
2425

2526
@Override
26-
public boolean providesTypeResolver(TypeDefinitionRegistry registry, ResolvedTypeDefinition definition) {
27+
public boolean providesTypeResolver(TypeDefinitionRegistry registry, InterfaceTypeDefinition definition) {
2728
for (WiringFactory factory : factories) {
2829
if (factory.providesTypeResolver(registry, definition)) {
2930
return true;
@@ -33,7 +34,27 @@ public boolean providesTypeResolver(TypeDefinitionRegistry registry, ResolvedTyp
3334
}
3435

3536
@Override
36-
public TypeResolver getTypeResolver(TypeDefinitionRegistry registry, ResolvedTypeDefinition definition) {
37+
public boolean providesTypeResolver(TypeDefinitionRegistry registry, UnionTypeDefinition definition) {
38+
for (WiringFactory factory : factories) {
39+
if (factory.providesTypeResolver(registry, definition)) {
40+
return true;
41+
}
42+
}
43+
return false;
44+
}
45+
46+
@Override
47+
public TypeResolver getTypeResolver(TypeDefinitionRegistry registry, InterfaceTypeDefinition definition) {
48+
for (WiringFactory factory : factories) {
49+
if (factory.providesTypeResolver(registry, definition)) {
50+
return factory.getTypeResolver(registry, definition);
51+
}
52+
}
53+
return null;
54+
}
55+
56+
@Override
57+
public TypeResolver getTypeResolver(TypeDefinitionRegistry registry, UnionTypeDefinition definition) {
3758
for (WiringFactory factory : factories) {
3859
if (factory.providesTypeResolver(registry, definition)) {
3960
return factory.getTypeResolver(registry, definition);
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package graphql.schema.idl;
2+
3+
import graphql.Assert;
4+
import graphql.language.FieldDefinition;
5+
import graphql.language.InterfaceTypeDefinition;
6+
import graphql.language.UnionTypeDefinition;
7+
import graphql.schema.DataFetcher;
8+
import graphql.schema.TypeResolver;
9+
10+
public class NoopWiringFactory implements WiringFactory {
11+
@Override
12+
public boolean providesTypeResolver(TypeDefinitionRegistry registry, InterfaceTypeDefinition interfaceType) {
13+
return false;
14+
}
15+
16+
@Override
17+
public boolean providesTypeResolver(TypeDefinitionRegistry registry, UnionTypeDefinition unionType) {
18+
return false;
19+
}
20+
21+
@Override
22+
public TypeResolver getTypeResolver(TypeDefinitionRegistry registry, InterfaceTypeDefinition interfaceType) {
23+
Assert.assertNeverCalled();
24+
return null;
25+
}
26+
27+
@Override
28+
public TypeResolver getTypeResolver(TypeDefinitionRegistry registry, UnionTypeDefinition unionType) {
29+
Assert.assertNeverCalled();
30+
return null;
31+
}
32+
33+
@Override
34+
public boolean providesDataFetcher(TypeDefinitionRegistry registry, FieldDefinition definition) {
35+
return false;
36+
}
37+
38+
@Override
39+
public DataFetcher getDataFetcher(TypeDefinitionRegistry registry, FieldDefinition definition) {
40+
return null;
41+
}
42+
}

src/main/java/graphql/schema/idl/RuntimeWiring.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
import graphql.Assert;
44
import graphql.PublicApi;
5-
import graphql.language.FieldDefinition;
6-
import graphql.language.ResolvedTypeDefinition;
75
import graphql.schema.DataFetcher;
86
import graphql.schema.GraphQLScalarType;
97
import graphql.schema.GraphQLSchema;
@@ -64,7 +62,7 @@ public static class Builder {
6462
private final Map<String, Map<String, DataFetcher>> dataFetchers = new LinkedHashMap<>();
6563
private final Map<String, GraphQLScalarType> scalars = new LinkedHashMap<>();
6664
private final Map<String, TypeResolver> typeResolvers = new LinkedHashMap<>();
67-
private WiringFactory wiringFactory = WiringFactory.NOOP_WIRING_FACTORY;
65+
private WiringFactory wiringFactory = new NoopWiringFactory();
6866

6967
private Builder() {
7068
ScalarInfo.STANDARD_SCALARS.forEach(this::scalar);

src/main/java/graphql/schema/idl/SchemaGenerator.java

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
import graphql.language.ObjectTypeDefinition;
1717
import graphql.language.ObjectValue;
1818
import graphql.language.OperationTypeDefinition;
19-
import graphql.language.ResolvedTypeDefinition;
2019
import graphql.language.ScalarTypeDefinition;
2120
import graphql.language.SchemaDefinition;
2221
import graphql.language.StringValue;
@@ -338,7 +337,7 @@ private GraphQLInterfaceType buildInterfaceType(BuildContext buildCtx, Interface
338337
builder.name(typeDefinition.getName());
339338
builder.description(buildDescription(typeDefinition));
340339

341-
builder.typeResolver(getTypeResolver(buildCtx, typeDefinition));
340+
builder.typeResolver(getTypeResolverForInterface(buildCtx, typeDefinition));
342341

343342
typeDefinition.getFieldDefinitions().forEach(fieldDef ->
344343
builder.field(buildField(buildCtx, typeDefinition, fieldDef)));
@@ -349,7 +348,7 @@ private GraphQLUnionType buildUnionType(BuildContext buildCtx, UnionTypeDefiniti
349348
GraphQLUnionType.Builder builder = GraphQLUnionType.newUnionType();
350349
builder.name(typeDefinition.getName());
351350
builder.description(buildDescription(typeDefinition));
352-
builder.typeResolver(getTypeResolver(buildCtx, typeDefinition));
351+
builder.typeResolver(getTypeResolverForUnion(buildCtx, typeDefinition));
353352

354353
typeDefinition.getMemberTypes().forEach(mt -> {
355354
GraphQLOutputType outputType = buildOutputType(buildCtx, mt);
@@ -474,18 +473,39 @@ private Object buildObjectValue(ObjectValue defaultValue) {
474473
return map;
475474
}
476475

477-
private TypeResolver getTypeResolver(BuildContext buildCtx, ResolvedTypeDefinition typeDefinition) {
476+
private TypeResolver getTypeResolverForUnion(BuildContext buildCtx, UnionTypeDefinition unionType) {
478477
TypeDefinitionRegistry typeRegistry = buildCtx.getTypeRegistry();
479478
RuntimeWiring wiring = buildCtx.getWiring();
480479
WiringFactory wiringFactory = wiring.getWiringFactory();
481480

482481
TypeResolver typeResolver;
483-
if (wiringFactory.providesTypeResolver(typeRegistry, typeDefinition)) {
484-
typeResolver = wiringFactory.getTypeResolver(typeRegistry, typeDefinition);
482+
if (wiringFactory.providesTypeResolver(typeRegistry, unionType)) {
483+
typeResolver = wiringFactory.getTypeResolver(typeRegistry, unionType);
485484
assertNotNull(typeResolver, "The WiringFactory indicated it provides a type resolver but then returned null");
486485

487486
} else {
488-
typeResolver = wiring.getTypeResolvers().get(typeDefinition.getName());
487+
typeResolver = wiring.getTypeResolvers().get(unionType.getName());
488+
if (typeResolver == null) {
489+
// this really should be checked earlier via a pre-flight check
490+
typeResolver = new TypeResolverProxy();
491+
}
492+
}
493+
494+
return typeResolver;
495+
}
496+
497+
private TypeResolver getTypeResolverForInterface(BuildContext buildCtx, InterfaceTypeDefinition interfaceType) {
498+
TypeDefinitionRegistry typeRegistry = buildCtx.getTypeRegistry();
499+
RuntimeWiring wiring = buildCtx.getWiring();
500+
WiringFactory wiringFactory = wiring.getWiringFactory();
501+
502+
TypeResolver typeResolver;
503+
if (wiringFactory.providesTypeResolver(typeRegistry, interfaceType)) {
504+
typeResolver = wiringFactory.getTypeResolver(typeRegistry, interfaceType);
505+
assertNotNull(typeResolver, "The WiringFactory indicated it provides a type resolver but then returned null");
506+
507+
} else {
508+
typeResolver = wiring.getTypeResolvers().get(interfaceType.getName());
489509
if (typeResolver == null) {
490510
// this really should be checked earlier via a pre-flight check
491511
typeResolver = new TypeResolverProxy();

src/main/java/graphql/schema/idl/SchemaTypeChecker.java

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import graphql.language.InterfaceTypeDefinition;
99
import graphql.language.ObjectTypeDefinition;
1010
import graphql.language.OperationTypeDefinition;
11-
import graphql.language.ResolvedTypeDefinition;
1211
import graphql.language.SchemaDefinition;
1312
import graphql.language.Type;
1413
import graphql.language.TypeDefinition;
@@ -37,11 +36,12 @@
3736
import java.util.Optional;
3837
import java.util.function.Consumer;
3938
import java.util.function.Function;
39+
import java.util.function.Predicate;
4040
import java.util.stream.Collectors;
4141

4242
/**
4343
* This helps pre check the state of the type system to ensure it can be made into an executable schema.
44-
*
44+
* <p>
4545
* It looks for missing types and ensure certain invariants are true before a schema can be made.
4646
*/
4747
public class SchemaTypeChecker {
@@ -154,20 +154,25 @@ private void checkScalarImplementationsArePresent(List<GraphQLError> errors, Typ
154154

155155
private void checkTypeResolversArePresent(List<GraphQLError> errors, TypeDefinitionRegistry typeRegistry, RuntimeWiring wiring) {
156156

157-
Consumer<ResolvedTypeDefinition> checkForResolver = typeDef -> {
158-
boolean hasTypeResolver = wiring.getWiringFactory().providesTypeResolver(typeRegistry,typeDef);
159-
if (! hasTypeResolver) {
160-
hasTypeResolver = wiring.getTypeResolvers().containsKey(typeDef.getName());
161-
}
162-
if (! hasTypeResolver) {
163-
errors.add(new MissingTypeResolverError(typeDef));
164-
}
165-
};
157+
Predicate<InterfaceTypeDefinition> noDynamicResolverForInterface = interaceTypeDef -> !wiring.getWiringFactory().providesTypeResolver(typeRegistry, interaceTypeDef);
158+
Predicate<UnionTypeDefinition> noDynamicResolverForUnion = unionTypeDef -> !wiring.getWiringFactory().providesTypeResolver(typeRegistry, unionTypeDef);
159+
160+
Predicate<TypeDefinition> noTypeResolver = typeDefinition -> !wiring.getTypeResolvers().containsKey(typeDefinition.getName());
161+
Consumer<TypeDefinition> addError = typeDefinition -> errors.add(new MissingTypeResolverError(typeDefinition));
162+
163+
typeRegistry.types().values().stream()
164+
.filter(typeDef -> typeDef instanceof InterfaceTypeDefinition)
165+
.map(InterfaceTypeDefinition.class::cast)
166+
.filter(noDynamicResolverForInterface)
167+
.filter(noTypeResolver)
168+
.forEach(addError);
166169

167170
typeRegistry.types().values().stream()
168-
.filter(typeDef -> typeDef instanceof ResolvedTypeDefinition)
169-
.map(ResolvedTypeDefinition.class::cast)
170-
.forEach(checkForResolver);
171+
.filter(typeDef -> typeDef instanceof UnionTypeDefinition)
172+
.map(UnionTypeDefinition.class::cast)
173+
.filter(noDynamicResolverForUnion)
174+
.filter(noTypeResolver)
175+
.forEach(addError);
171176

172177
}
173178

Lines changed: 25 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package graphql.schema.idl;
22

33
import graphql.language.FieldDefinition;
4-
import graphql.language.ResolvedTypeDefinition;
4+
import graphql.language.InterfaceTypeDefinition;
5+
import graphql.language.UnionTypeDefinition;
56
import graphql.schema.DataFetcher;
67
import graphql.schema.TypeResolver;
78

@@ -13,31 +14,46 @@
1314
public interface WiringFactory {
1415

1516
/**
16-
* This is called to ask if this factory can provide a type resolver for the definition
17+
* This is called to ask if this factory can provide a type resolver for the interface
1718
*
18-
* @param registry the registry of all types
19-
* @param definition the definition to be resolved
19+
* @param registry the registry of all types
20+
* @param interfaceType the definition to be resolved
21+
* @return true if the factory can give out a type resolver
22+
*/
23+
boolean providesTypeResolver(TypeDefinitionRegistry registry, InterfaceTypeDefinition interfaceType);
24+
25+
/**
26+
* This is called to ask if this factory can provide a type resolver for the union
2027
*
28+
* @param registry the registry of all types
29+
* @param unionType the definition to be resolved
2130
* @return true if the factory can give out a type resolver
2231
*/
23-
boolean providesTypeResolver(TypeDefinitionRegistry registry, ResolvedTypeDefinition definition);
32+
boolean providesTypeResolver(TypeDefinitionRegistry registry, UnionTypeDefinition unionType);
2433

2534
/**
26-
* Returns a {@link TypeResolver} given the type definition
35+
* Returns a {@link TypeResolver} given the type interface
2736
*
2837
* @param registry the registry of all types
29-
* @param definition the definition to be resolved
38+
* @param interfaceType the definition to be resolved
39+
* @return a {@link TypeResolver}
40+
*/
41+
TypeResolver getTypeResolver(TypeDefinitionRegistry registry, InterfaceTypeDefinition interfaceType);
42+
43+
/**
44+
* Returns a {@link TypeResolver} given the type union
3045
*
46+
* @param registry the registry of all types
47+
* @param unionType the definition to be resolved
3148
* @return a {@link TypeResolver}
3249
*/
33-
TypeResolver getTypeResolver(TypeDefinitionRegistry registry, ResolvedTypeDefinition definition);
50+
TypeResolver getTypeResolver(TypeDefinitionRegistry registry, UnionTypeDefinition unionType);
3451

3552
/**
3653
* This is called to ask if this factory can provide a data fetcher for the definition
3754
*
3855
* @param registry the registry of all types
3956
* @param definition the field definition in play
40-
*
4157
* @return true if the factory can give out a date fetcher
4258
*/
4359
boolean providesDataFetcher(TypeDefinitionRegistry registry, FieldDefinition definition);
@@ -47,34 +63,8 @@ public interface WiringFactory {
4763
*
4864
* @param registry the registry of all types
4965
* @param definition the definition to be resolved
50-
*
5166
* @return a {@link DataFetcher}
5267
*/
5368
DataFetcher getDataFetcher(TypeDefinitionRegistry registry, FieldDefinition definition);
5469

55-
56-
/**
57-
* A {@link WiringFactory} that never wires anything and never says it can wire anything
58-
*/
59-
WiringFactory NOOP_WIRING_FACTORY = new WiringFactory() {
60-
@Override
61-
public boolean providesTypeResolver(TypeDefinitionRegistry registry, ResolvedTypeDefinition definition) {
62-
return false;
63-
}
64-
65-
@Override
66-
public boolean providesDataFetcher(TypeDefinitionRegistry registry, FieldDefinition definition) {
67-
return false;
68-
}
69-
70-
@Override
71-
public TypeResolver getTypeResolver(TypeDefinitionRegistry registry, ResolvedTypeDefinition definition) {
72-
return null;
73-
}
74-
75-
@Override
76-
public DataFetcher getDataFetcher(TypeDefinitionRegistry registry, FieldDefinition definition) {
77-
return null;
78-
}
79-
};
8070
}

0 commit comments

Comments
 (0)