@Override public void checkFragmentSpread(FragmentSpread fragmentSpread) { usedFragments.add(fragmentSpread.getName()); }
private List<Node> childrenOf(Node<?> node) { if (!(node instanceof FragmentSpread)) { return node.getChildren(); } FragmentSpread fragmentSpread = (FragmentSpread) node; return singletonList(fragmentsByName.get(fragmentSpread.getName())); }
private NodePrinter<FragmentSpread> fragmentSpread() { return (out, node) -> { String name = node.getName(); String directives = directives(node.getDirectives()); out.printf("...%s%s", name, directives); }; }
private void detectCycleRecursive(String fragmentName, String initialName, List<FragmentSpread> spreadPath) { List<FragmentSpread> fragmentSpreads = this.fragmentSpreads.get(fragmentName); if (fragmentSpreads == null) { // KnownFragmentNames will have picked this up. Lets not NPE return; } outer: for (FragmentSpread fragmentSpread : fragmentSpreads) { if (fragmentSpread.getName().equals(initialName)) { String message = "Fragment cycles not allowed"; addError(ValidationErrorType.FragmentCycle, spreadPath, message); continue; } for (FragmentSpread spread : spreadPath) { if (spread.equals(fragmentSpread)) { continue outer; } } spreadPath.add(fragmentSpread); detectCycleRecursive(fragmentSpread.getName(), initialName, spreadPath); spreadPath.remove(spreadPath.size() - 1); } } }
@Override public void checkFragmentSpread(FragmentSpread fragmentSpread) { FragmentDefinition fragmentDefinition = getValidationContext().getFragment(fragmentSpread.getName()); if (fragmentDefinition == null) { String message = String.format("Undefined fragment %s", fragmentSpread.getName()); addError(ValidationErrorType.UndefinedFragment, fragmentSpread.getSourceLocation(), message); } } }
private void collectFragmentSpread(FieldCollectorParameters parameters, List<String> visitedFragments, Map<String, MergedField> fields, FragmentSpread fragmentSpread) { if (visitedFragments.contains(fragmentSpread.getName())) { return; } if (!conditionalNodes.shouldInclude(parameters.getVariables(), fragmentSpread.getDirectives())) { return; } visitedFragments.add(fragmentSpread.getName()); FragmentDefinition fragmentDefinition = parameters.getFragmentsByName().get(fragmentSpread.getName()); if (!conditionalNodes.shouldInclude(parameters.getVariables(), fragmentDefinition.getDirectives())) { return; } if (!doesFragmentConditionMatch(parameters, fragmentDefinition)) { return; } collectFields(parameters, fragmentDefinition.getSelectionSet(), visitedFragments, fields); }
private void checkFragmentSpread(FragmentSpread fragmentSpread, List<AbstractRule> rules, List<Node> ancestors) { for (AbstractRule rule : rules) { rule.checkFragmentSpread(fragmentSpread); } List<AbstractRule> rulesVisitingFragmentSpreads = getRulesVisitingFragmentSpreads(rules); if (rulesVisitingFragmentSpreads.size() > 0) { FragmentDefinition fragment = validationContext.getFragment(fragmentSpread.getName()); if (fragment != null && !ancestors.contains(fragment)) { new LanguageTraversal(ancestors).traverse(fragment, new RulesVisitor(validationContext, rulesVisitingFragmentSpreads, true)); } } }
private Builder(FragmentSpread existing) { this.sourceLocation = existing.getSourceLocation(); this.comments = existing.getComments(); this.name = existing.getName(); this.directives = existing.getDirectives(); this.ignoredChars = existing.getIgnoredChars(); }
private Comparator<Selection> comparingSelections() { Function<Selection, String> byName = s -> { if (s instanceof FragmentSpread) { return ((FragmentSpread) s).getName(); } if (s instanceof Field) { return ((Field) s).getName(); } if (s instanceof InlineFragment) { TypeName typeCondition = ((InlineFragment) s).getTypeCondition(); return typeCondition == null ? "" : typeCondition.getName(); } return ""; }; Function<Selection, Integer> byType = s -> { if (s instanceof Field) { return 1; } if (s instanceof FragmentSpread) { return 2; } if (s instanceof InlineFragment) { return 3; } return 4; }; return comparing(byType).thenComparing(comparing(byName)); }
private void collectFieldsForFragmentSpread(Map<String, List<FieldAndType>> fieldMap, Set<String> visitedFragmentSpreads, FragmentSpread fragmentSpread) { FragmentDefinition fragment = getValidationContext().getFragment(fragmentSpread.getName()); if (fragment == null) { return; } if (visitedFragmentSpreads.contains(fragment.getName())) { return; } visitedFragmentSpreads.add(fragment.getName()); GraphQLOutputType graphQLType = (GraphQLOutputType) TypeFromAST.getTypeFromAST(getValidationContext().getSchema(), fragment.getTypeCondition()); collectFields(fieldMap, fragment.getSelectionSet(), graphQLType, visitedFragmentSpreads); }
@Override public void checkFragmentSpread(FragmentSpread fragmentSpread) { FragmentDefinition fragment = getValidationContext().getFragment(fragmentSpread.getName()); if (fragment == null) return; GraphQLType typeCondition = TypeFromAST.getTypeFromAST(getValidationContext().getSchema(), fragment.getTypeCondition()); GraphQLCompositeType parentType = getValidationContext().getParentType(); if (typeCondition == null || parentType == null) return; if (isValidTargetCompositeType(typeCondition) && isValidTargetCompositeType(parentType) && !doTypesOverlap(typeCondition, parentType)) { String message = String.format("Fragment %s cannot be spread here as objects of " + "type %s can never be of type %s", fragmentSpread.getName(), parentType.getName(), typeCondition.getName()); addError(ValidationErrorType.InvalidFragmentType, fragmentSpread.getSourceLocation(), message); } }
@Override public TraversalControl visitFragmentSpread(FragmentSpread fragmentSpread, TraverserContext<Node> context) { if (!conditionalNodes.shouldInclude(variables, fragmentSpread.getDirectives())) { return TraversalControl.ABORT; } FragmentDefinition fragmentDefinition = fragmentsByName.get(fragmentSpread.getName()); if (!conditionalNodes.shouldInclude(variables, fragmentDefinition.getDirectives())) { return TraversalControl.ABORT; } QueryVisitorFragmentSpreadEnvironment fragmentSpreadEnvironment = new QueryVisitorFragmentSpreadEnvironmentImpl(fragmentSpread, fragmentDefinition, context); if (context.getVar(NodeTraverser.LeaveOrEnter.class) == LEAVE) { postOrderCallback.visitFragmentSpread(fragmentSpreadEnvironment); return TraversalControl.CONTINUE; } preOrderCallback.visitFragmentSpread(fragmentSpreadEnvironment); QueryTraversalContext parentEnv = context.getVarFromParents(QueryTraversalContext.class); GraphQLCompositeType typeCondition = (GraphQLCompositeType) schema.getType(fragmentDefinition.getTypeCondition().getName()); assertNotNull(typeCondition, "Invalid type condition '%s' in fragment '%s'", fragmentDefinition.getTypeCondition().getName(), fragmentDefinition.getName()); context .setVar(QueryTraversalContext.class, new QueryTraversalContext(typeCondition, typeCondition, parentEnv.getEnvironment(), fragmentDefinition)); return TraversalControl.CONTINUE; }
@Override public void checkFragmentSpread(FragmentSpread fragmentSpread) { usedFragments.add(fragmentSpread.getName()); }
private List<Node> childrenOf(Node<?> node) { if (!(node instanceof FragmentSpread)) { return node.getChildren(); } FragmentSpread fragmentSpread = (FragmentSpread) node; return singletonList(fragmentsByName.get(fragmentSpread.getName())); }
private NodePrinter<FragmentSpread> fragmentSpread() { return (out, node) -> { String name = node.getName(); String directives = directives(node.getDirectives()); out.printf("...%s%s", name, directives); }; }
@Override public void checkFragmentSpread(FragmentSpread fragmentSpread) { FragmentDefinition fragmentDefinition = getValidationContext().getFragment(fragmentSpread.getName()); if (fragmentDefinition == null) { String message = String.format("Undefined fragment %s", fragmentSpread.getName()); addError(ValidationErrorType.UndefinedFragment, fragmentSpread.getSourceLocation(), message); } } }
private void checkFragmentSpread(FragmentSpread fragmentSpread, List<AbstractRule> rules, List<Node> ancestors) { for (AbstractRule rule : rules) { rule.checkFragmentSpread(fragmentSpread); } List<AbstractRule> rulesVisitingFragmentSpreads = getRulesVisitingFragmentSpreads(rules); if (rulesVisitingFragmentSpreads.size() > 0) { FragmentDefinition fragment = validationContext.getFragment(fragmentSpread.getName()); if (fragment != null && !ancestors.contains(fragment)) { new LanguageTraversal(ancestors).traverse(fragment, new RulesVisitor(validationContext, rulesVisitingFragmentSpreads, true)); } } }
private Builder(FragmentSpread existing) { this.sourceLocation = existing.getSourceLocation(); this.comments = existing.getComments(); this.name = existing.getName(); this.directives = existing.getDirectives(); this.ignoredChars = existing.getIgnoredChars(); }
private void collectFieldsForFragmentSpread(Map<String, List<FieldAndType>> fieldMap, Set<String> visitedFragmentSpreads, FragmentSpread fragmentSpread) { FragmentDefinition fragment = getValidationContext().getFragment(fragmentSpread.getName()); if (fragment == null) { return; } if (visitedFragmentSpreads.contains(fragment.getName())) { return; } visitedFragmentSpreads.add(fragment.getName()); GraphQLOutputType graphQLType = (GraphQLOutputType) TypeFromAST.getTypeFromAST(getValidationContext().getSchema(), fragment.getTypeCondition()); collectFields(fieldMap, fragment.getSelectionSet(), graphQLType, visitedFragmentSpreads); }
@Override public void checkFragmentSpread(FragmentSpread fragmentSpread) { FragmentDefinition fragment = getValidationContext().getFragment(fragmentSpread.getName()); if (fragment == null) return; GraphQLType typeCondition = TypeFromAST.getTypeFromAST(getValidationContext().getSchema(), fragment.getTypeCondition()); GraphQLCompositeType parentType = getValidationContext().getParentType(); if (typeCondition == null || parentType == null) return; if (isValidTargetCompositeType(typeCondition) && isValidTargetCompositeType(parentType) && !doTypesOverlap(typeCondition, parentType)) { String message = String.format("Fragment %s cannot be spread here as objects of " + "type %s can never be of type %s", fragmentSpread.getName(), parentType.getName(), typeCondition.getName()); addError(ValidationErrorType.InvalidFragmentType, fragmentSpread.getSourceLocation(), message); } }