|
37 | 37 | import java.util.LinkedHashMap; |
38 | 38 | import java.util.List; |
39 | 39 | import java.util.Map; |
40 | | -import java.util.Objects; |
41 | 40 | import java.util.Optional; |
42 | 41 | import java.util.function.Function; |
| 42 | +import java.util.stream.Stream; |
43 | 43 |
|
44 | 44 | import static graphql.Assert.assertNotNull; |
45 | 45 | import static graphql.schema.idl.SchemaExtensionsChecker.defineOperationDefs; |
@@ -719,18 +719,7 @@ public <T extends TypeDefinition> Map<String, T> getTypesMap(Class<T> targetClas |
719 | 719 | public List<ImplementingTypeDefinition> getAllImplementationsOf(InterfaceTypeDefinition targetInterface) { |
720 | 720 | return ImmutableKit.filter( |
721 | 721 | getTypes(ImplementingTypeDefinition.class), |
722 | | - implementingTypeDefinition -> { |
723 | | - List<Type<?>> implementsList = implementingTypeDefinition.getImplements(); |
724 | | - for (Type iFace : implementsList) { |
725 | | - InterfaceTypeDefinition interfaceTypeDef = getTypeOrNull(iFace, InterfaceTypeDefinition.class); |
726 | | - if (interfaceTypeDef != null) { |
727 | | - if (interfaceTypeDef.getName().equals(targetInterface.getName())) { |
728 | | - return true; |
729 | | - } |
730 | | - } |
731 | | - } |
732 | | - return false; |
733 | | - }); |
| 722 | + implementingTypeDefinition -> implementsInterface(implementingTypeDefinition, targetInterface)); |
734 | 723 | } |
735 | 724 |
|
736 | 725 | /** |
@@ -765,37 +754,42 @@ public boolean isPossibleType(Type abstractType, Type possibleType) { |
765 | 754 | if (!isObjectTypeOrInterface(possibleType)) { |
766 | 755 | return false; |
767 | 756 | } |
768 | | - TypeDefinition targetObjectTypeDef = Objects.requireNonNull(getTypeOrNull(possibleType)); |
769 | | - TypeDefinition abstractTypeDef = Objects.requireNonNull(getTypeOrNull(abstractType)); |
| 757 | + TypeDefinition possibleTypeDef = assertNotNull(getTypeOrNull(possibleType)); |
| 758 | + TypeDefinition abstractTypeDef = assertNotNull(getTypeOrNull(abstractType)); |
770 | 759 | if (abstractTypeDef instanceof UnionTypeDefinition) { |
771 | | - List<Type> memberTypes = ((UnionTypeDefinition) abstractTypeDef).getMemberTypes(); |
772 | | - for (Type memberType : memberTypes) { |
773 | | - ObjectTypeDefinition checkType = getTypeOrNull(memberType, ObjectTypeDefinition.class); |
774 | | - if (checkType != null) { |
775 | | - if (checkType.getName().equals(targetObjectTypeDef.getName())) { |
776 | | - return true; |
777 | | - } |
778 | | - } |
779 | | - } |
780 | | - return false; |
781 | | - } else { |
782 | | - InterfaceTypeDefinition iFace = (InterfaceTypeDefinition) abstractTypeDef; |
783 | | - for (TypeDefinition<?> t : types.values()) { |
784 | | - if (t instanceof ImplementingTypeDefinition) { |
785 | | - if (t.getName().equals(targetObjectTypeDef.getName())) { |
786 | | - ImplementingTypeDefinition<?> itd = (ImplementingTypeDefinition<?>) t; |
787 | | - |
788 | | - for (Type implementsType : itd.getImplements()) { |
789 | | - TypeDefinition<?> matchingInterface = types.get(typeName(implementsType)); |
790 | | - if (matchingInterface != null && matchingInterface.getName().equals(iFace.getName())) { |
791 | | - return true; |
792 | | - } |
793 | | - } |
794 | | - } |
795 | | - } |
796 | | - } |
797 | | - return false; |
| 760 | + return isUnionMember((UnionTypeDefinition) abstractTypeDef, possibleTypeDef); |
| 761 | + } |
| 762 | + return implementsInterface( |
| 763 | + (ImplementingTypeDefinition<?>) possibleTypeDef, |
| 764 | + (InterfaceTypeDefinition) abstractTypeDef); |
| 765 | + } |
| 766 | + |
| 767 | + private boolean implementsInterface( |
| 768 | + ImplementingTypeDefinition<?> implementingType, |
| 769 | + InterfaceTypeDefinition targetInterface) { |
| 770 | + return Stream.concat( |
| 771 | + Stream.of(implementingType), |
| 772 | + getImplementingTypeExtensions(implementingType).stream()) |
| 773 | + .flatMap(type -> type.getImplements().stream()) |
| 774 | + .map(TypeInfo::typeName) |
| 775 | + .anyMatch(targetInterface.getName()::equals); |
| 776 | + } |
| 777 | + |
| 778 | + private List<? extends ImplementingTypeDefinition<?>> getImplementingTypeExtensions( |
| 779 | + ImplementingTypeDefinition<?> implementingType) { |
| 780 | + if (implementingType instanceof InterfaceTypeDefinition) { |
| 781 | + return interfaceTypeExtensions.getOrDefault(implementingType.getName(), List.of()); |
798 | 782 | } |
| 783 | + return objectTypeExtensions.getOrDefault(implementingType.getName(), List.of()); |
| 784 | + } |
| 785 | + |
| 786 | + private boolean isUnionMember(UnionTypeDefinition unionType, TypeDefinition<?> possibleType) { |
| 787 | + return Stream.concat( |
| 788 | + unionType.getMemberTypes().stream(), |
| 789 | + unionTypeExtensions.getOrDefault(unionType.getName(), List.of()).stream() |
| 790 | + .flatMap(extension -> extension.getMemberTypes().stream())) |
| 791 | + .map(TypeInfo::typeName) |
| 792 | + .anyMatch(possibleType.getName()::equals); |
799 | 793 | } |
800 | 794 |
|
801 | 795 | /** |
|
0 commit comments