Skip to content

Commit 4d45311

Browse files
authored
Merge pull request graphql-java#1136 from graphql-java/type-registry-remove
add ability to remove definitions again from type registry
2 parents 901db94 + 9a6408d commit 4d45311

2 files changed

Lines changed: 169 additions & 7 deletions

File tree

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

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

3+
import graphql.Assert;
34
import graphql.GraphQLError;
45
import graphql.PublicApi;
56
import graphql.language.Definition;
@@ -10,6 +11,7 @@
1011
import graphql.language.InterfaceTypeExtensionDefinition;
1112
import graphql.language.ObjectTypeDefinition;
1213
import graphql.language.ObjectTypeExtensionDefinition;
14+
import graphql.language.SDLDefinition;
1315
import graphql.language.ScalarTypeDefinition;
1416
import graphql.language.ScalarTypeExtensionDefinition;
1517
import graphql.language.SchemaDefinition;
@@ -32,6 +34,7 @@
3234
import java.util.function.Function;
3335
import java.util.stream.Collectors;
3436

37+
import static graphql.Assert.assertNotNull;
3538
import static java.util.Optional.ofNullable;
3639

3740
/**
@@ -41,14 +44,15 @@
4144
@PublicApi
4245
public class TypeDefinitionRegistry {
4346

44-
private final Map<String, ScalarTypeDefinition> scalarTypes = new LinkedHashMap<>();
45-
private final Map<String, List<ObjectTypeExtensionDefinition>> typeExtensions = new LinkedHashMap<>();
47+
private final Map<String, List<ObjectTypeExtensionDefinition>> objectTypeExtensions = new LinkedHashMap<>();
4648
private final Map<String, List<InterfaceTypeExtensionDefinition>> interfaceTypeExtensions = new LinkedHashMap<>();
4749
private final Map<String, List<UnionTypeExtensionDefinition>> unionTypeExtensions = new LinkedHashMap<>();
4850
private final Map<String, List<EnumTypeExtensionDefinition>> enumTypeExtensions = new LinkedHashMap<>();
4951
private final Map<String, List<ScalarTypeExtensionDefinition>> scalarTypeExtensions = new LinkedHashMap<>();
5052
private final Map<String, List<InputObjectTypeExtensionDefinition>> inputObjectTypeExtensions = new LinkedHashMap<>();
53+
5154
private final Map<String, TypeDefinition> types = new LinkedHashMap<>();
55+
private final Map<String, ScalarTypeDefinition> scalarTypes = new LinkedHashMap<>();
5256
private final Map<String, DirectiveDefinition> directiveDefinitions = new LinkedHashMap<>();
5357
private SchemaDefinition schema;
5458

@@ -98,8 +102,8 @@ public TypeDefinitionRegistry merge(TypeDefinitionRegistry typeRegistry) throws
98102
this.directiveDefinitions.putAll(tempDirectiveDefs);
99103
//
100104
// merge type extensions since they can be redefined by design
101-
typeRegistry.typeExtensions.forEach((key, value) -> {
102-
List<ObjectTypeExtensionDefinition> currentList = this.typeExtensions
105+
typeRegistry.objectTypeExtensions.forEach((key, value) -> {
106+
List<ObjectTypeExtensionDefinition> currentList = this.objectTypeExtensions
103107
.computeIfAbsent(key, k -> new ArrayList<>());
104108
currentList.addAll(value);
105109
});
@@ -143,7 +147,7 @@ public Optional<GraphQLError> add(Definition definition) {
143147
// extensions
144148
if (definition instanceof ObjectTypeExtensionDefinition) {
145149
ObjectTypeExtensionDefinition newEntry = (ObjectTypeExtensionDefinition) definition;
146-
return defineExt(typeExtensions, newEntry, ObjectTypeExtensionDefinition::getName);
150+
return defineExt(objectTypeExtensions, newEntry, ObjectTypeExtensionDefinition::getName);
147151
} else if (definition instanceof InterfaceTypeExtensionDefinition) {
148152
InterfaceTypeExtensionDefinition newEntry = (InterfaceTypeExtensionDefinition) definition;
149153
return defineExt(interfaceTypeExtensions, newEntry, InterfaceTypeExtensionDefinition::getName);
@@ -181,6 +185,42 @@ public Optional<GraphQLError> add(Definition definition) {
181185
return Optional.empty();
182186
}
183187

188+
public void remove(SDLDefinition definition) {
189+
assertNotNull("definition to remove can't be null");
190+
if (definition instanceof ObjectTypeExtensionDefinition) {
191+
removeFromList(objectTypeExtensions, (TypeDefinition) definition);
192+
} else if (definition instanceof InterfaceTypeExtensionDefinition) {
193+
removeFromList(interfaceTypeExtensions, (TypeDefinition) definition);
194+
} else if (definition instanceof UnionTypeExtensionDefinition) {
195+
removeFromList(unionTypeExtensions, (TypeDefinition) definition);
196+
} else if (definition instanceof EnumTypeExtensionDefinition) {
197+
removeFromList(enumTypeExtensions, (TypeDefinition) definition);
198+
} else if (definition instanceof ScalarTypeExtensionDefinition) {
199+
removeFromList(scalarTypeExtensions, (TypeDefinition) definition);
200+
} else if (definition instanceof InputObjectTypeExtensionDefinition) {
201+
removeFromList(inputObjectTypeExtensions, (TypeDefinition) definition);
202+
} else if (definition instanceof ScalarTypeDefinition) {
203+
scalarTypes.remove(((ScalarTypeDefinition) definition).getName());
204+
} else if (definition instanceof TypeDefinition) {
205+
types.remove(((TypeDefinition) definition).getName());
206+
} else if (definition instanceof DirectiveDefinition) {
207+
directiveDefinitions.remove(((DirectiveDefinition) definition).getName());
208+
} else if (definition instanceof SchemaDefinition) {
209+
schema = null;
210+
} else {
211+
Assert.assertShouldNeverHappen();
212+
}
213+
}
214+
215+
private void removeFromList(Map source, TypeDefinition value) {
216+
List<TypeDefinition> list = (List<TypeDefinition>) source.get(value.getName());
217+
if (list == null) {
218+
return;
219+
}
220+
list.remove(value);
221+
}
222+
223+
184224
private <T extends TypeDefinition> Optional<GraphQLError> define(Map<String, T> source, Map<String, T> target, T newEntry) {
185225
String name = newEntry.getName();
186226

@@ -222,7 +262,7 @@ public Map<String, ScalarTypeDefinition> scalars() {
222262
}
223263

224264
public Map<String, List<ObjectTypeExtensionDefinition>> objectTypeExtensions() {
225-
return new LinkedHashMap<>(typeExtensions);
265+
return new LinkedHashMap<>(objectTypeExtensions);
226266
}
227267

228268
public Map<String, List<InterfaceTypeExtensionDefinition>> interfaceTypeExtensions() {
@@ -267,7 +307,7 @@ public Map<String, DirectiveDefinition> getDirectiveDefinitions() {
267307

268308
public boolean hasType(TypeName typeName) {
269309
String name = typeName.getName();
270-
return types.containsKey(name) || ScalarInfo.STANDARD_SCALAR_DEFINITIONS.containsKey(name) || scalarTypes.containsKey(name) || typeExtensions.containsKey(name);
310+
return types.containsKey(name) || ScalarInfo.STANDARD_SCALAR_DEFINITIONS.containsKey(name) || scalarTypes.containsKey(name) || objectTypeExtensions.containsKey(name);
271311
}
272312

273313
public Optional<TypeDefinition> getType(Type type) {

src/test/groovy/graphql/schema/idl/TypeDefinitionRegistryTest.groovy

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,27 @@
11
package graphql.schema.idl
22

3+
import graphql.language.DirectiveDefinition
4+
import graphql.language.EnumTypeDefinition
5+
import graphql.language.EnumTypeExtensionDefinition
6+
import graphql.language.InputObjectTypeDefinition
7+
import graphql.language.InputObjectTypeExtensionDefinition
38
import graphql.language.InterfaceTypeDefinition
9+
import graphql.language.InterfaceTypeExtensionDefinition
410
import graphql.language.ListType
511
import graphql.language.NonNullType
612
import graphql.language.ObjectTypeDefinition
13+
import graphql.language.ObjectTypeExtensionDefinition
14+
import graphql.language.ScalarTypeDefinition
15+
import graphql.language.ScalarTypeExtensionDefinition
716
import graphql.language.SchemaDefinition
817
import graphql.language.Type
918
import graphql.language.TypeName
19+
import graphql.language.UnionTypeDefinition
20+
import graphql.language.UnionTypeExtensionDefinition
1021
import graphql.schema.idl.errors.SchemaProblem
1122
import graphql.schema.idl.errors.SchemaRedefinitionError
1223
import spock.lang.Specification
24+
import spock.lang.Unroll
1325

1426
class TypeDefinitionRegistryTest extends Specification {
1527

@@ -465,4 +477,114 @@ class TypeDefinitionRegistryTest extends Specification {
465477
!registry.isSubTypeOf(listType(nonNullType(listType(type("Turtle")))), listType(nonNullType(listType(type("Mammal")))))
466478

467479
}
480+
481+
@Unroll
482+
def "remove a definition"() {
483+
given:
484+
def registry = new TypeDefinitionRegistry()
485+
registry.add(definition)
486+
when:
487+
registry.remove(definition)
488+
then:
489+
!registry.getType(definition.getName()).isPresent()
490+
491+
where:
492+
definition | _
493+
ObjectTypeDefinition.newObjectTypeDefinition().name("foo").build() | _
494+
InterfaceTypeDefinition.newInterfaceTypeDefinition().name("foo").build() | _
495+
UnionTypeDefinition.newUnionTypeDefinition().name("foo").build() | _
496+
EnumTypeDefinition.newEnumTypeDefinition().name("foo").build() | _
497+
ScalarTypeDefinition.newScalarTypeDefinition().name("foo").build() | _
498+
InputObjectTypeDefinition.newInputObjectDefinition().name("foo").build() | _
499+
}
500+
501+
def "remove directive definition"() {
502+
given:
503+
DirectiveDefinition definition = DirectiveDefinition.newDirectiveDefinition().name("foo").build()
504+
def registry = new TypeDefinitionRegistry()
505+
registry.add(definition)
506+
when:
507+
registry.remove(definition)
508+
then:
509+
!registry.getDirectiveDefinition(definition.getName()).isPresent()
510+
}
511+
512+
513+
def "remove object type extension"() {
514+
given:
515+
def extension = ObjectTypeExtensionDefinition.newObjectTypeExtensionDefinition().name("foo").build()
516+
def registry = new TypeDefinitionRegistry()
517+
registry.add(extension)
518+
when:
519+
registry.remove(extension)
520+
then:
521+
!registry.objectTypeExtensions().get(extension.getName()).contains(extension)
522+
}
523+
524+
def "remove interface type extension"() {
525+
given:
526+
def extension = InterfaceTypeExtensionDefinition.newInterfaceTypeExtensionDefinition().name("foo").build()
527+
def registry = new TypeDefinitionRegistry()
528+
registry.add(extension)
529+
when:
530+
registry.remove(extension)
531+
then:
532+
!registry.interfaceTypeExtensions().get(extension.getName()).contains(extension)
533+
}
534+
535+
def "remove union type extension"() {
536+
given:
537+
def extension = UnionTypeExtensionDefinition.newUnionTypeExtensionDefinition().name("foo").build()
538+
def registry = new TypeDefinitionRegistry()
539+
registry.add(extension)
540+
when:
541+
registry.remove(extension)
542+
then:
543+
!registry.unionTypeExtensions().get(extension.getName()).contains(extension)
544+
}
545+
546+
def "remove enum type extension"() {
547+
given:
548+
def extension = EnumTypeExtensionDefinition.newEnumTypeExtensionDefinition().name("foo").build()
549+
def registry = new TypeDefinitionRegistry()
550+
registry.add(extension)
551+
when:
552+
registry.remove(extension)
553+
then:
554+
!registry.enumTypeExtensions().get(extension.getName()).contains(extension)
555+
}
556+
557+
def "remove scalar type extension"() {
558+
given:
559+
def extension = ScalarTypeExtensionDefinition.newScalarTypeExtensionDefinition().name("foo").build()
560+
def registry = new TypeDefinitionRegistry()
561+
registry.add(extension)
562+
when:
563+
registry.remove(extension)
564+
then:
565+
!registry.scalarTypeExtensions().get(extension.getName()).contains(extension)
566+
}
567+
568+
def "remove input object type extension"() {
569+
given:
570+
def extension = InputObjectTypeExtensionDefinition.newInputObjectTypeExtensionDefinition().name("foo").build()
571+
def registry = new TypeDefinitionRegistry()
572+
registry.add(extension)
573+
when:
574+
registry.remove(extension)
575+
then:
576+
!registry.inputObjectTypeExtensions().get(extension.getName()).contains(extension)
577+
}
578+
579+
def "remove schema definition"() {
580+
given:
581+
def registry = new TypeDefinitionRegistry()
582+
def definition = SchemaDefinition.newSchemaDefintion().build()
583+
registry.add(definition)
584+
when:
585+
registry.remove(definition)
586+
then:
587+
!registry.schemaDefinition().isPresent()
588+
589+
}
468590
}

0 commit comments

Comments
 (0)