Search in sources :

Example 1 with SchemaTraverser

use of graphql.schema.SchemaTraverser in project graphql-java by graphql-java.

the class SchemaUtil method replaceTypeReferences.

public static void replaceTypeReferences(GraphQLSchema schema) {
    final Map<String, GraphQLNamedType> typeMap = schema.getTypeMap();
    List<GraphQLSchemaElement> roots = new ArrayList<>(typeMap.values());
    roots.addAll(schema.getDirectives());
    SchemaTraverser schemaTraverser = new SchemaTraverser(schemaElement -> schemaElement.getChildrenWithTypeReferences().getChildrenAsList());
    schemaTraverser.depthFirst(new GraphQLTypeResolvingVisitor(typeMap), roots);
}
Also used : GraphQLTypeResolvingVisitor(graphql.schema.GraphQLTypeResolvingVisitor) GraphQLSchemaElement(graphql.schema.GraphQLSchemaElement) ArrayList(java.util.ArrayList) GraphQLNamedType(graphql.schema.GraphQLNamedType) SchemaTraverser(graphql.schema.SchemaTraverser)

Example 2 with SchemaTraverser

use of graphql.schema.SchemaTraverser in project graphql-java by graphql-java.

the class SchemaUtil method visitPartiallySchema.

/**
 * Called to visit a partially build schema (during {@link GraphQLSchema} build phases) with a set of visitors
 *
 * Each visitor is expected to hold its own side effects that might be last used to construct a full schema
 *
 * @param partiallyBuiltSchema the partially built schema
 * @param visitors             the visitors to call
 */
public static void visitPartiallySchema(final GraphQLSchema partiallyBuiltSchema, GraphQLTypeVisitor... visitors) {
    List<GraphQLSchemaElement> roots = new ArrayList<>();
    roots.add(partiallyBuiltSchema.getQueryType());
    if (partiallyBuiltSchema.isSupportingMutations()) {
        roots.add(partiallyBuiltSchema.getMutationType());
    }
    if (partiallyBuiltSchema.isSupportingSubscriptions()) {
        roots.add(partiallyBuiltSchema.getSubscriptionType());
    }
    if (partiallyBuiltSchema.getAdditionalTypes() != null) {
        roots.addAll(partiallyBuiltSchema.getAdditionalTypes());
    }
    if (partiallyBuiltSchema.getDirectives() != null) {
        roots.addAll(partiallyBuiltSchema.getDirectives());
    }
    roots.add(partiallyBuiltSchema.getIntrospectionSchemaType());
    GraphQLTypeVisitor visitor = new MultiReadOnlyGraphQLTypeVisitor(Arrays.asList(visitors));
    SchemaTraverser traverser;
    traverser = new SchemaTraverser(schemaElement -> schemaElement.getChildrenWithTypeReferences().getChildrenAsList());
    traverser.depthFirst(visitor, roots);
}
Also used : GraphQLObjectType(graphql.schema.GraphQLObjectType) GraphQLSchemaElement(graphql.schema.GraphQLSchemaElement) GraphQLNamedType(graphql.schema.GraphQLNamedType) Arrays(java.util.Arrays) Internal(graphql.Internal) GraphQLNamedOutputType(graphql.schema.GraphQLNamedOutputType) ImmutableMap(com.google.common.collect.ImmutableMap) GraphQLTypeResolvingVisitor(graphql.schema.GraphQLTypeResolvingVisitor) GraphQLType(graphql.schema.GraphQLType) GraphQLImplementingType(graphql.schema.GraphQLImplementingType) ArrayList(java.util.ArrayList) LinkedHashMap(java.util.LinkedHashMap) List(java.util.List) TreeMap(java.util.TreeMap) GraphQLTypeVisitor(graphql.schema.GraphQLTypeVisitor) Map(java.util.Map) GraphQLSchema(graphql.schema.GraphQLSchema) SchemaTraverser(graphql.schema.SchemaTraverser) GraphQLSchemaElement(graphql.schema.GraphQLSchemaElement) GraphQLTypeVisitor(graphql.schema.GraphQLTypeVisitor) ArrayList(java.util.ArrayList) SchemaTraverser(graphql.schema.SchemaTraverser)

Example 3 with SchemaTraverser

use of graphql.schema.SchemaTraverser in project graphql-java by graphql-java.

the class SchemaValidator method validateSchema.

public Set<SchemaValidationError> validateSchema(GraphQLSchema schema) {
    SchemaValidationErrorCollector validationErrorCollector = new SchemaValidationErrorCollector();
    Map<Class<?>, Object> rootVars = new LinkedHashMap<>();
    rootVars.put(GraphQLSchema.class, schema);
    rootVars.put(SchemaValidationErrorCollector.class, validationErrorCollector);
    new SchemaTraverser().depthFirstFullSchema(rules, schema, rootVars);
    return validationErrorCollector.getErrors();
}
Also used : SchemaTraverser(graphql.schema.SchemaTraverser) LinkedHashMap(java.util.LinkedHashMap)

Example 4 with SchemaTraverser

use of graphql.schema.SchemaTraverser in project spring-graphql by spring-projects.

the class DefaultGraphQlSourceBuilder method applyTypeVisitors.

private GraphQLSchema applyTypeVisitors(GraphQLSchema schema) {
    List<GraphQLTypeVisitor> visitors = new ArrayList<>(this.typeVisitors);
    visitors.add(ContextDataFetcherDecorator.TYPE_VISITOR);
    GraphQLCodeRegistry.Builder codeRegistry = GraphQLCodeRegistry.newCodeRegistry(schema.getCodeRegistry());
    Map<Class<?>, Object> vars = Collections.singletonMap(GraphQLCodeRegistry.Builder.class, codeRegistry);
    SchemaTraverser traverser = new SchemaTraverser();
    traverser.depthFirstFullSchema(visitors, schema, vars);
    return schema.transformWithoutTypes(builder -> builder.codeRegistry(codeRegistry));
}
Also used : GraphQLTypeVisitor(graphql.schema.GraphQLTypeVisitor) ArrayList(java.util.ArrayList) GraphQLCodeRegistry(graphql.schema.GraphQLCodeRegistry) SchemaTraverser(graphql.schema.SchemaTraverser)

Example 5 with SchemaTraverser

use of graphql.schema.SchemaTraverser in project graphql-java by graphql-java.

the class SchemaUsageSupport method getSchemaUsage.

/**
 * This builds out {@link SchemaUsage} statistics about the usage of types and directives within a schema
 *
 * @param schema the schema to check
 *
 * @return usage stats
 */
public static SchemaUsage getSchemaUsage(GraphQLSchema schema) {
    assertNotNull(schema);
    SchemaUsage.Builder builder = new SchemaUsage.Builder();
    GraphQLTypeVisitor visitor = new GraphQLTypeVisitorStub() {

        private BiFunction<String, Integer, Integer> incCount() {
            return (k, v) -> v == null ? 1 : v + 1;
        }

        private void recordBackReference(GraphQLNamedSchemaElement referencedElement, GraphQLSchemaElement referencingElement) {
            String referencedElementName = referencedElement.getName();
            if (referencingElement instanceof GraphQLType) {
                String typeName = (GraphQLTypeUtil.unwrapAll((GraphQLType) referencingElement)).getName();
                builder.elementBackReferences.computeIfAbsent(referencedElementName, k -> new HashSet<>()).add(typeName);
            }
            if (referencingElement instanceof GraphQLDirective) {
                String typeName = ((GraphQLDirective) referencingElement).getName();
                builder.elementBackReferences.computeIfAbsent(referencedElementName, k -> new HashSet<>()).add(typeName);
            }
        }

        private void memberInterfaces(GraphQLNamedType containingType, List<GraphQLNamedOutputType> members) {
            for (GraphQLNamedOutputType member : members) {
                builder.interfaceReferenceCount.compute(member.getName(), incCount());
                builder.interfaceImplementors.computeIfAbsent(member.getName(), k -> new HashSet<>()).add(containingType.getName());
                recordBackReference(containingType, member);
            }
        }

        @Override
        public TraversalControl visitGraphQLArgument(GraphQLArgument node, TraverserContext<GraphQLSchemaElement> context) {
            GraphQLNamedType inputType = GraphQLTypeUtil.unwrapAll(node.getType());
            builder.argReferenceCount.compute(inputType.getName(), incCount());
            GraphQLSchemaElement parentElement = context.getParentNode();
            if (parentElement instanceof GraphQLFieldDefinition) {
                parentElement = context.getParentContext().getParentNode();
            }
            recordBackReference(inputType, parentElement);
            return CONTINUE;
        }

        @Override
        public TraversalControl visitGraphQLFieldDefinition(GraphQLFieldDefinition node, TraverserContext<GraphQLSchemaElement> context) {
            GraphQLNamedType fieldType = GraphQLTypeUtil.unwrapAll(node.getType());
            builder.fieldReferenceCounts.compute(fieldType.getName(), incCount());
            builder.outputFieldReferenceCounts.compute(fieldType.getName(), incCount());
            recordBackReference(fieldType, context.getParentNode());
            return CONTINUE;
        }

        @Override
        public TraversalControl visitGraphQLInputObjectField(GraphQLInputObjectField node, TraverserContext<GraphQLSchemaElement> context) {
            GraphQLNamedType fieldType = GraphQLTypeUtil.unwrapAll(node.getType());
            builder.fieldReferenceCounts.compute(fieldType.getName(), incCount());
            builder.inputFieldReferenceCounts.compute(fieldType.getName(), incCount());
            recordBackReference(fieldType, context.getParentNode());
            return CONTINUE;
        }

        @Override
        public TraversalControl visitGraphQLDirective(GraphQLDirective directive, TraverserContext<GraphQLSchemaElement> context) {
            GraphQLSchemaElement parentElement = context.getParentNode();
            if (parentElement != null) {
                // a null parent is a directive definition
                // we record a count if the directive is applied to something - not just defined
                builder.directiveReferenceCount.compute(directive.getName(), incCount());
            }
            if (parentElement instanceof GraphQLArgument) {
                context = context.getParentContext();
                parentElement = context.getParentNode();
            }
            if (parentElement instanceof GraphQLFieldDefinition) {
                context = context.getParentContext();
                parentElement = context.getParentNode();
            }
            if (parentElement instanceof GraphQLInputObjectField) {
                context = context.getParentContext();
                parentElement = context.getParentNode();
            }
            recordBackReference(directive, parentElement);
            return CONTINUE;
        }

        @Override
        public TraversalControl visitGraphQLUnionType(GraphQLUnionType unionType, TraverserContext<GraphQLSchemaElement> context) {
            List<GraphQLNamedOutputType> members = unionType.getTypes();
            for (GraphQLNamedOutputType member : members) {
                builder.unionReferenceCount.compute(member.getName(), incCount());
                recordBackReference(unionType, member);
            }
            return CONTINUE;
        }

        @Override
        public TraversalControl visitGraphQLInterfaceType(GraphQLInterfaceType interfaceType, TraverserContext<GraphQLSchemaElement> context) {
            memberInterfaces(interfaceType, interfaceType.getInterfaces());
            return CONTINUE;
        }

        @Override
        public TraversalControl visitGraphQLObjectType(GraphQLObjectType objectType, TraverserContext<GraphQLSchemaElement> context) {
            memberInterfaces(objectType, objectType.getInterfaces());
            return CONTINUE;
        }
    };
    new SchemaTraverser().depthFirstFullSchema(visitor, schema);
    return builder.build();
}
Also used : GraphQLSchemaElement(graphql.schema.GraphQLSchemaElement) GraphQLNamedType(graphql.schema.GraphQLNamedType) TraversalControl(graphql.util.TraversalControl) BiFunction(java.util.function.BiFunction) GraphQLFieldDefinition(graphql.schema.GraphQLFieldDefinition) GraphQLInterfaceType(graphql.schema.GraphQLInterfaceType) GraphQLInputObjectField(graphql.schema.GraphQLInputObjectField) GraphQLUnionType(graphql.schema.GraphQLUnionType) GraphQLType(graphql.schema.GraphQLType) TraverserContext(graphql.util.TraverserContext) GraphQLNamedSchemaElement(graphql.schema.GraphQLNamedSchemaElement) HashSet(java.util.HashSet) GraphQLSchema(graphql.schema.GraphQLSchema) GraphQLTypeUtil(graphql.schema.GraphQLTypeUtil) SchemaTraverser(graphql.schema.SchemaTraverser) GraphQLObjectType(graphql.schema.GraphQLObjectType) GraphQLDirective(graphql.schema.GraphQLDirective) GraphQLNamedOutputType(graphql.schema.GraphQLNamedOutputType) CONTINUE(graphql.util.TraversalControl.CONTINUE) GraphQLArgument(graphql.schema.GraphQLArgument) GraphQLTypeVisitorStub(graphql.schema.GraphQLTypeVisitorStub) List(java.util.List) PublicApi(graphql.PublicApi) Assert.assertNotNull(graphql.Assert.assertNotNull) GraphQLTypeVisitor(graphql.schema.GraphQLTypeVisitor) GraphQLUnionType(graphql.schema.GraphQLUnionType) GraphQLType(graphql.schema.GraphQLType) GraphQLFieldDefinition(graphql.schema.GraphQLFieldDefinition) GraphQLNamedOutputType(graphql.schema.GraphQLNamedOutputType) GraphQLInterfaceType(graphql.schema.GraphQLInterfaceType) GraphQLTypeVisitorStub(graphql.schema.GraphQLTypeVisitorStub) TraverserContext(graphql.util.TraverserContext) GraphQLSchemaElement(graphql.schema.GraphQLSchemaElement) GraphQLNamedSchemaElement(graphql.schema.GraphQLNamedSchemaElement) List(java.util.List) GraphQLNamedType(graphql.schema.GraphQLNamedType) HashSet(java.util.HashSet) GraphQLArgument(graphql.schema.GraphQLArgument) GraphQLDirective(graphql.schema.GraphQLDirective) GraphQLTypeVisitor(graphql.schema.GraphQLTypeVisitor) GraphQLInputObjectField(graphql.schema.GraphQLInputObjectField) GraphQLObjectType(graphql.schema.GraphQLObjectType) SchemaTraverser(graphql.schema.SchemaTraverser)

Aggregations

SchemaTraverser (graphql.schema.SchemaTraverser)6 GraphQLNamedType (graphql.schema.GraphQLNamedType)3 GraphQLSchema (graphql.schema.GraphQLSchema)3 GraphQLSchemaElement (graphql.schema.GraphQLSchemaElement)3 GraphQLType (graphql.schema.GraphQLType)3 GraphQLTypeVisitor (graphql.schema.GraphQLTypeVisitor)3 ArrayList (java.util.ArrayList)3 GraphQLNamedOutputType (graphql.schema.GraphQLNamedOutputType)2 GraphQLObjectType (graphql.schema.GraphQLObjectType)2 GraphQLTypeResolvingVisitor (graphql.schema.GraphQLTypeResolvingVisitor)2 HashSet (java.util.HashSet)2 LinkedHashMap (java.util.LinkedHashMap)2 List (java.util.List)2 ImmutableMap (com.google.common.collect.ImmutableMap)1 Assert.assertNotNull (graphql.Assert.assertNotNull)1 Internal (graphql.Internal)1 PublicApi (graphql.PublicApi)1 GraphQLArgument (graphql.schema.GraphQLArgument)1 GraphQLCodeRegistry (graphql.schema.GraphQLCodeRegistry)1 GraphQLDirective (graphql.schema.GraphQLDirective)1