Skip to content

Commit ef1d168

Browse files
committed
graphql-java#476 - use of environment pattern in Wiring Factory
1 parent 962fecc commit ef1d168

14 files changed

Lines changed: 283 additions & 158 deletions
Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
package graphql.schema.idl;
22

3-
import graphql.language.InterfaceTypeDefinition;
4-
import graphql.language.UnionTypeDefinition;
53
import graphql.schema.DataFetcher;
64
import graphql.schema.TypeResolver;
75

86
import java.util.ArrayList;
97
import java.util.List;
108

119
import static graphql.Assert.assertNotNull;
10+
import static graphql.Assert.assertShouldNeverHappen;
1211

1312
/**
1413
* This combines a number of {@link WiringFactory}s together to act as one. It asks each one
@@ -23,62 +22,62 @@ public CombinedWiringFactory(List<WiringFactory> factories) {
2322
}
2423

2524
@Override
26-
public boolean providesTypeResolver(TypeDefinitionRegistry registry, InterfaceTypeDefinition definition) {
25+
public boolean providesTypeResolver(InterfaceWiringEnvironment environment) {
2726
for (WiringFactory factory : factories) {
28-
if (factory.providesTypeResolver(registry, definition)) {
27+
if (factory.providesTypeResolver(environment)) {
2928
return true;
3029
}
3130
}
3231
return false;
3332
}
3433

3534
@Override
36-
public boolean providesTypeResolver(TypeDefinitionRegistry registry, UnionTypeDefinition definition) {
35+
public TypeResolver getTypeResolver(InterfaceWiringEnvironment environment) {
3736
for (WiringFactory factory : factories) {
38-
if (factory.providesTypeResolver(registry, definition)) {
39-
return true;
37+
if (factory.providesTypeResolver(environment)) {
38+
return factory.getTypeResolver(environment);
4039
}
4140
}
42-
return false;
41+
return assertShouldNeverHappen();
4342
}
4443

4544
@Override
46-
public TypeResolver getTypeResolver(TypeDefinitionRegistry registry, InterfaceTypeDefinition definition) {
45+
public boolean providesTypeResolver(UnionWiringEnvironment environment) {
4746
for (WiringFactory factory : factories) {
48-
if (factory.providesTypeResolver(registry, definition)) {
49-
return factory.getTypeResolver(registry, definition);
47+
if (factory.providesTypeResolver(environment)) {
48+
return true;
5049
}
5150
}
52-
return null;
51+
return false;
5352
}
5453

5554
@Override
56-
public TypeResolver getTypeResolver(TypeDefinitionRegistry registry, UnionTypeDefinition definition) {
55+
public TypeResolver getTypeResolver(UnionWiringEnvironment environment) {
5756
for (WiringFactory factory : factories) {
58-
if (factory.providesTypeResolver(registry, definition)) {
59-
return factory.getTypeResolver(registry, definition);
57+
if (factory.providesTypeResolver(environment)) {
58+
return factory.getTypeResolver(environment);
6059
}
6160
}
62-
return null;
61+
return assertShouldNeverHappen();
6362
}
6463

6564
@Override
66-
public boolean providesDataFetcher(WiringContext context) {
65+
public boolean providesDataFetcher(FieldWiringEnvironment environment) {
6766
for (WiringFactory factory : factories) {
68-
if (factory.providesDataFetcher(context)) {
67+
if (factory.providesDataFetcher(environment)) {
6968
return true;
7069
}
7170
}
7271
return false;
7372
}
7473

7574
@Override
76-
public DataFetcher getDataFetcher(WiringContext context) {
75+
public DataFetcher getDataFetcher(FieldWiringEnvironment environment) {
7776
for (WiringFactory factory : factories) {
78-
if (factory.providesDataFetcher(context)) {
79-
return factory.getDataFetcher(context);
77+
if (factory.providesDataFetcher(environment)) {
78+
return factory.getDataFetcher(environment);
8079
}
8180
}
82-
return null;
81+
return assertShouldNeverHappen();
8382
}
8483
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package graphql.schema.idl;
2+
3+
import graphql.PublicApi;
4+
import graphql.language.FieldDefinition;
5+
import graphql.language.TypeDefinition;
6+
7+
@PublicApi
8+
public class FieldWiringEnvironment extends WiringEnvironment {
9+
10+
private final FieldDefinition fieldDefinition;
11+
private final TypeDefinition parentType;
12+
13+
FieldWiringEnvironment(TypeDefinitionRegistry registry, TypeDefinition parentType, FieldDefinition fieldDefinition) {
14+
super(registry);
15+
this.fieldDefinition = fieldDefinition;
16+
this.parentType = parentType;
17+
}
18+
19+
public FieldDefinition getFieldDefinition() {
20+
return fieldDefinition;
21+
}
22+
23+
public TypeDefinition getParentType() {
24+
return parentType;
25+
}
26+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package graphql.schema.idl;
2+
3+
import graphql.PublicApi;
4+
import graphql.language.InterfaceTypeDefinition;
5+
6+
@PublicApi
7+
public class InterfaceWiringEnvironment extends WiringEnvironment {
8+
9+
private final InterfaceTypeDefinition interfaceTypeDefinition;
10+
11+
InterfaceWiringEnvironment(TypeDefinitionRegistry registry, InterfaceTypeDefinition interfaceTypeDefinition) {
12+
super(registry);
13+
this.interfaceTypeDefinition = interfaceTypeDefinition;
14+
}
15+
16+
public InterfaceTypeDefinition getInterfaceTypeDefinition() {
17+
return interfaceTypeDefinition;
18+
}
19+
}
Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,40 @@
11
package graphql.schema.idl;
22

3-
import graphql.language.InterfaceTypeDefinition;
4-
import graphql.language.UnionTypeDefinition;
3+
import graphql.schema.DataFetcher;
54
import graphql.schema.TypeResolver;
65

7-
import static graphql.Assert.assertNeverCalled;
6+
import static graphql.Assert.assertShouldNeverHappen;
87

98
public class NoopWiringFactory implements WiringFactory {
9+
1010
@Override
11-
public boolean providesTypeResolver(TypeDefinitionRegistry registry, InterfaceTypeDefinition interfaceType) {
11+
public boolean providesTypeResolver(InterfaceWiringEnvironment environment) {
1212
return false;
1313
}
1414

1515
@Override
16-
public boolean providesTypeResolver(TypeDefinitionRegistry registry, UnionTypeDefinition unionType) {
16+
public TypeResolver getTypeResolver(InterfaceWiringEnvironment environment) {
17+
return assertShouldNeverHappen();
18+
}
19+
20+
@Override
21+
public boolean providesTypeResolver(UnionWiringEnvironment environment) {
1722
return false;
1823
}
1924

2025
@Override
21-
public TypeResolver getTypeResolver(TypeDefinitionRegistry registry, InterfaceTypeDefinition interfaceType) {
22-
return assertNeverCalled();
26+
public TypeResolver getTypeResolver(UnionWiringEnvironment environment) {
27+
return assertShouldNeverHappen();
2328
}
2429

2530
@Override
26-
public TypeResolver getTypeResolver(TypeDefinitionRegistry registry, UnionTypeDefinition unionType) {
27-
return assertNeverCalled();
31+
public boolean providesDataFetcher(FieldWiringEnvironment environment) {
32+
return false;
2833
}
34+
35+
@Override
36+
public DataFetcher getDataFetcher(FieldWiringEnvironment environment) {
37+
return assertShouldNeverHappen();
38+
}
39+
2940
}

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

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -463,11 +463,11 @@ private DataFetcher buildDataFetcher(BuildContext buildCtx, TypeDefinition paren
463463
RuntimeWiring wiring = buildCtx.getWiring();
464464
WiringFactory wiringFactory = wiring.getWiringFactory();
465465

466-
WiringContext wiringContext = new WiringContext(typeRegistry, parentType, fieldDef);
466+
FieldWiringEnvironment wiringEnvironment = new FieldWiringEnvironment(typeRegistry, parentType, fieldDef);
467467

468468
DataFetcher dataFetcher;
469-
if (wiringFactory.providesDataFetcher(wiringContext)) {
470-
dataFetcher = wiringFactory.getDataFetcher(wiringContext);
469+
if (wiringFactory.providesDataFetcher(wiringEnvironment)) {
470+
dataFetcher = wiringFactory.getDataFetcher(wiringEnvironment);
471471
assertNotNull(dataFetcher, "The WiringFactory indicated it provides a data fetcher but then returned null");
472472
} else {
473473
dataFetcher = wiring.getDataFetcherForType(parentType.getName()).get(fieldName);
@@ -550,9 +550,11 @@ private TypeResolver getTypeResolverForUnion(BuildContext buildCtx, UnionTypeDef
550550
WiringFactory wiringFactory = wiring.getWiringFactory();
551551

552552
TypeResolver typeResolver;
553-
if (wiringFactory.providesTypeResolver(typeRegistry, unionType)) {
554-
typeResolver = wiringFactory.getTypeResolver(typeRegistry, unionType);
555-
assertNotNull(typeResolver, "The WiringFactory indicated it provides a type resolver but then returned null");
553+
UnionWiringEnvironment environment = new UnionWiringEnvironment(typeRegistry, unionType);
554+
555+
if (wiringFactory.providesTypeResolver(environment)) {
556+
typeResolver = wiringFactory.getTypeResolver(environment);
557+
assertNotNull(typeResolver, "The WiringFactory indicated it union provides a type resolver but then returned null");
556558

557559
} else {
558560
typeResolver = wiring.getTypeResolvers().get(unionType.getName());
@@ -571,9 +573,12 @@ private TypeResolver getTypeResolverForInterface(BuildContext buildCtx, Interfac
571573
WiringFactory wiringFactory = wiring.getWiringFactory();
572574

573575
TypeResolver typeResolver;
574-
if (wiringFactory.providesTypeResolver(typeRegistry, interfaceType)) {
575-
typeResolver = wiringFactory.getTypeResolver(typeRegistry, interfaceType);
576-
assertNotNull(typeResolver, "The WiringFactory indicated it provides a type resolver but then returned null");
576+
577+
InterfaceWiringEnvironment environment = new InterfaceWiringEnvironment(typeRegistry, interfaceType);
578+
579+
if (wiringFactory.providesTypeResolver(environment)) {
580+
typeResolver = wiringFactory.getTypeResolver(environment);
581+
assertNotNull(typeResolver, "The WiringFactory indicated it provides a interface type resolver but then returned null");
577582

578583
} else {
579584
typeResolver = wiring.getTypeResolvers().get(interfaceType.getName());
@@ -582,7 +587,6 @@ private TypeResolver getTypeResolverForInterface(BuildContext buildCtx, Interfac
582587
typeResolver = new TypeResolverProxy();
583588
}
584589
}
585-
586590
return typeResolver;
587591
}
588592

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,8 +162,8 @@ private void checkScalarImplementationsArePresent(List<GraphQLError> errors, Typ
162162

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

165-
Predicate<InterfaceTypeDefinition> noDynamicResolverForInterface = interaceTypeDef -> !wiring.getWiringFactory().providesTypeResolver(typeRegistry, interaceTypeDef);
166-
Predicate<UnionTypeDefinition> noDynamicResolverForUnion = unionTypeDef -> !wiring.getWiringFactory().providesTypeResolver(typeRegistry, unionTypeDef);
165+
Predicate<InterfaceTypeDefinition> noDynamicResolverForInterface = interaceTypeDef -> !wiring.getWiringFactory().providesTypeResolver(new InterfaceWiringEnvironment(typeRegistry,interaceTypeDef));
166+
Predicate<UnionTypeDefinition> noDynamicResolverForUnion = unionTypeDef -> !wiring.getWiringFactory().providesTypeResolver(new UnionWiringEnvironment(typeRegistry,unionTypeDef));
167167

168168
Predicate<TypeDefinition> noTypeResolver = typeDefinition -> !wiring.getTypeResolvers().containsKey(typeDefinition.getName());
169169
Consumer<TypeDefinition> addError = typeDefinition -> errors.add(new MissingTypeResolverError(typeDefinition));
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package graphql.schema.idl;
2+
3+
import graphql.PublicApi;
4+
import graphql.language.UnionTypeDefinition;
5+
6+
@PublicApi
7+
public class UnionWiringEnvironment extends WiringEnvironment {
8+
9+
private final UnionTypeDefinition unionTypeDefinition;
10+
11+
UnionWiringEnvironment(TypeDefinitionRegistry registry, UnionTypeDefinition unionTypeDefinition) {
12+
super(registry);
13+
this.unionTypeDefinition = unionTypeDefinition;
14+
}
15+
16+
public UnionTypeDefinition getUnionTypeDefinition() {
17+
return unionTypeDefinition;
18+
}
19+
}

‎src/main/java/graphql/schema/idl/WiringContext.java‎

Lines changed: 0 additions & 29 deletions
This file was deleted.
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package graphql.schema.idl;
2+
3+
abstract class WiringEnvironment {
4+
5+
private final TypeDefinitionRegistry registry;
6+
7+
WiringEnvironment(TypeDefinitionRegistry registry) {
8+
this.registry = registry;
9+
}
10+
11+
public TypeDefinitionRegistry getRegistry() {
12+
return registry;
13+
}
14+
}

0 commit comments

Comments
 (0)