Search in sources :

Example 1 with OperationTypeDefinition

use of graphql.language.OperationTypeDefinition in project graphql-java by graphql-java.

the class IntrospectionResultToSchema method createSchemaDefinition.

/**
 * Returns a IDL Document that reprSesents the schema as defined by the introspection result map
 *
 * @param introspectionResult the result of an introspection query on a schema
 *
 * @return a IDL Document of the schema
 */
@SuppressWarnings("unchecked")
public Document createSchemaDefinition(Map<String, Object> introspectionResult) {
    assertTrue(introspectionResult.get("__schema") != null, "__schema expected");
    Map<String, Object> schema = (Map<String, Object>) introspectionResult.get("__schema");
    Map<String, Object> queryType = (Map<String, Object>) schema.get("queryType");
    assertNotNull(queryType, "queryType expected");
    TypeName query = new TypeName((String) queryType.get("name"));
    boolean nonDefaultQueryName = !"Query".equals(query.getName());
    SchemaDefinition schemaDefinition = new SchemaDefinition();
    schemaDefinition.getOperationTypeDefinitions().add(new OperationTypeDefinition("query", query));
    Map<String, Object> mutationType = (Map<String, Object>) schema.get("mutationType");
    boolean nonDefaultMutationName = false;
    if (mutationType != null) {
        TypeName mutation = new TypeName((String) mutationType.get("name"));
        nonDefaultMutationName = !"Mutation".equals(mutation.getName());
        schemaDefinition.getOperationTypeDefinitions().add(new OperationTypeDefinition("mutation", mutation));
    }
    Map<String, Object> subscriptionType = (Map<String, Object>) schema.get("subscriptionType");
    boolean nonDefaultSubscriptionName = false;
    if (subscriptionType != null) {
        TypeName subscription = new TypeName((String) subscriptionType.get("name"));
        nonDefaultSubscriptionName = !"Subscription".equals(subscription.getName());
        schemaDefinition.getOperationTypeDefinitions().add(new OperationTypeDefinition("subscription", subscription));
    }
    Document document = new Document();
    if (nonDefaultQueryName || nonDefaultMutationName || nonDefaultSubscriptionName) {
        document.getDefinitions().add(schemaDefinition);
    }
    List<Map<String, Object>> types = (List<Map<String, Object>>) schema.get("types");
    for (Map<String, Object> type : types) {
        TypeDefinition typeDefinition = createTypeDefinition(type);
        if (typeDefinition == null)
            continue;
        document.getDefinitions().add(typeDefinition);
    }
    return document;
}
Also used : TypeName(graphql.language.TypeName) SchemaDefinition(graphql.language.SchemaDefinition) ArrayList(java.util.ArrayList) List(java.util.List) OperationTypeDefinition(graphql.language.OperationTypeDefinition) Document(graphql.language.Document) Map(java.util.Map) InputObjectTypeDefinition(graphql.language.InputObjectTypeDefinition) EnumTypeDefinition(graphql.language.EnumTypeDefinition) UnionTypeDefinition(graphql.language.UnionTypeDefinition) OperationTypeDefinition(graphql.language.OperationTypeDefinition) ScalarTypeDefinition(graphql.language.ScalarTypeDefinition) ObjectTypeDefinition(graphql.language.ObjectTypeDefinition) TypeDefinition(graphql.language.TypeDefinition) InterfaceTypeDefinition(graphql.language.InterfaceTypeDefinition)

Example 2 with OperationTypeDefinition

use of graphql.language.OperationTypeDefinition in project graphql-java by graphql-java.

the class SchemaTypeChecker method checkSchemaInvariants.

private void checkSchemaInvariants(List<GraphQLError> errors, TypeDefinitionRegistry typeRegistry) {
    // schema
    if (!typeRegistry.schemaDefinition().isPresent()) {
        if (!typeRegistry.getType("Query").isPresent()) {
            errors.add(new SchemaMissingError());
        }
    } else {
        SchemaDefinition schemaDefinition = typeRegistry.schemaDefinition().get();
        List<OperationTypeDefinition> operationTypeDefinitions = schemaDefinition.getOperationTypeDefinitions();
        operationTypeDefinitions.forEach(checkOperationTypesExist(typeRegistry, errors));
        operationTypeDefinitions.forEach(checkOperationTypesAreObjects(typeRegistry, errors));
        // ensure we have a "query" one
        Optional<OperationTypeDefinition> query = operationTypeDefinitions.stream().filter(op -> "query".equals(op.getName())).findFirst();
        if (!query.isPresent()) {
            errors.add(new QueryOperationMissingError());
        }
    }
}
Also used : MissingInterfaceTypeError(graphql.schema.idl.errors.MissingInterfaceTypeError) BiFunction(java.util.function.BiFunction) InputValueDefinition(graphql.language.InputValueDefinition) SchemaDefinition(graphql.language.SchemaDefinition) MissingInterfaceFieldError(graphql.schema.idl.errors.MissingInterfaceFieldError) EnumTypeDefinition(graphql.language.EnumTypeDefinition) Type(graphql.language.Type) MissingScalarImplementationError(graphql.schema.idl.errors.MissingScalarImplementationError) EnumValueDefinition(graphql.language.EnumValueDefinition) ObjectTypeExtensionDefinition(graphql.language.ObjectTypeExtensionDefinition) GraphQLError(graphql.GraphQLError) Map(java.util.Map) TypeName(graphql.language.TypeName) QueryOperationMissingError(graphql.schema.idl.errors.QueryOperationMissingError) OperationTypeDefinition(graphql.language.OperationTypeDefinition) ObjectTypeDefinition(graphql.language.ObjectTypeDefinition) InterfaceFieldRedefinitionError(graphql.schema.idl.errors.InterfaceFieldRedefinitionError) Predicate(java.util.function.Predicate) Collection(java.util.Collection) FieldDefinition(graphql.language.FieldDefinition) Set(java.util.Set) TypeDefinition(graphql.language.TypeDefinition) Collectors(java.util.stream.Collectors) BinaryOperator(java.util.function.BinaryOperator) AstPrinter(graphql.language.AstPrinter) MissingTypeError(graphql.schema.idl.errors.MissingTypeError) List(java.util.List) InterfaceTypeDefinition(graphql.language.InterfaceTypeDefinition) Optional(java.util.Optional) NonUniqueArgumentError(graphql.schema.idl.errors.NonUniqueArgumentError) InterfaceFieldArgumentRedefinitionError(graphql.schema.idl.errors.InterfaceFieldArgumentRedefinitionError) SchemaMissingError(graphql.schema.idl.errors.SchemaMissingError) NonUniqueDirectiveError(graphql.schema.idl.errors.NonUniqueDirectiveError) Internal(graphql.Internal) InputObjectTypeDefinition(graphql.language.InputObjectTypeDefinition) SchemaProblem(graphql.schema.idl.errors.SchemaProblem) MissingTypeResolverError(graphql.schema.idl.errors.MissingTypeResolverError) Function(java.util.function.Function) Supplier(java.util.function.Supplier) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) UnionTypeDefinition(graphql.language.UnionTypeDefinition) NonUniqueNameError(graphql.schema.idl.errors.NonUniqueNameError) OperationTypesMustBeObjects(graphql.schema.idl.errors.OperationTypesMustBeObjects) InvalidDeprecationDirectiveError(graphql.schema.idl.errors.InvalidDeprecationDirectiveError) MissingInterfaceFieldArgumentsError(graphql.schema.idl.errors.MissingInterfaceFieldArgumentsError) Directive(graphql.language.Directive) Consumer(java.util.function.Consumer) Argument(graphql.language.Argument) StringValue(graphql.language.StringValue) Collections(java.util.Collections) QueryOperationMissingError(graphql.schema.idl.errors.QueryOperationMissingError) SchemaDefinition(graphql.language.SchemaDefinition) SchemaMissingError(graphql.schema.idl.errors.SchemaMissingError) OperationTypeDefinition(graphql.language.OperationTypeDefinition)

Example 3 with OperationTypeDefinition

use of graphql.language.OperationTypeDefinition in project graphql-java by graphql-java.

the class SchemaGenerator method makeExecutableSchemaImpl.

private GraphQLSchema makeExecutableSchemaImpl(BuildContext buildCtx) {
    GraphQLObjectType query;
    GraphQLObjectType mutation;
    GraphQLObjectType subscription;
    GraphQLSchema.Builder schemaBuilder = GraphQLSchema.newSchema();
    // 
    // Schema can be missing if the type is called 'Query'.  Pre flight checks have checked that!
    // 
    TypeDefinitionRegistry typeRegistry = buildCtx.getTypeRegistry();
    if (!typeRegistry.schemaDefinition().isPresent()) {
        @SuppressWarnings({ "OptionalGetWithoutIsPresent", "ConstantConditions" }) TypeDefinition queryTypeDef = typeRegistry.getType("Query").get();
        query = buildOutputType(buildCtx, new TypeName(queryTypeDef.getName()));
        schemaBuilder.query(query);
        Optional<TypeDefinition> mutationTypeDef = typeRegistry.getType("Mutation");
        if (mutationTypeDef.isPresent()) {
            mutation = buildOutputType(buildCtx, new TypeName(mutationTypeDef.get().getName()));
            schemaBuilder.mutation(mutation);
        }
        Optional<TypeDefinition> subscriptionTypeDef = typeRegistry.getType("Subscription");
        if (subscriptionTypeDef.isPresent()) {
            subscription = buildOutputType(buildCtx, new TypeName(subscriptionTypeDef.get().getName()));
            schemaBuilder.subscription(subscription);
        }
    } else {
        SchemaDefinition schemaDefinition = typeRegistry.schemaDefinition().get();
        List<OperationTypeDefinition> operationTypes = schemaDefinition.getOperationTypeDefinitions();
        // pre-flight checked via checker
        @SuppressWarnings({ "OptionalGetWithoutIsPresent", "ConstantConditions" }) OperationTypeDefinition queryOp = operationTypes.stream().filter(op -> "query".equals(op.getName())).findFirst().get();
        Optional<OperationTypeDefinition> mutationOp = operationTypes.stream().filter(op -> "mutation".equals(op.getName())).findFirst();
        Optional<OperationTypeDefinition> subscriptionOp = operationTypes.stream().filter(op -> "subscription".equals(op.getName())).findFirst();
        query = buildOperation(buildCtx, queryOp);
        schemaBuilder.query(query);
        if (mutationOp.isPresent()) {
            mutation = buildOperation(buildCtx, mutationOp.get());
            schemaBuilder.mutation(mutation);
        }
        if (subscriptionOp.isPresent()) {
            subscription = buildOperation(buildCtx, subscriptionOp.get());
            schemaBuilder.subscription(subscription);
        }
    }
    Set<GraphQLType> additionalTypes = buildAdditionalTypes(buildCtx);
    schemaBuilder.fieldVisibility(buildCtx.getWiring().getFieldVisibility());
    return schemaBuilder.build(additionalTypes);
}
Also used : Arrays(java.util.Arrays) Value(graphql.language.Value) INPUT_FIELD_DEFINITION(graphql.introspection.Introspection.DirectiveLocation.INPUT_FIELD_DEFINITION) GraphQLInputObjectType(graphql.schema.GraphQLInputObjectType) GraphQLFieldDefinition(graphql.schema.GraphQLFieldDefinition) GraphQLInterfaceType(graphql.schema.GraphQLInterfaceType) InputValueDefinition(graphql.language.InputValueDefinition) GraphQLInputObjectField(graphql.schema.GraphQLInputObjectField) GraphQLUnionType(graphql.schema.GraphQLUnionType) SchemaDefinition(graphql.language.SchemaDefinition) GraphQLEnumValueDefinition(graphql.schema.GraphQLEnumValueDefinition) UNION(graphql.introspection.Introspection.DirectiveLocation.UNION) EnumTypeDefinition(graphql.language.EnumTypeDefinition) Type(graphql.language.Type) INPUT_OBJECT(graphql.introspection.Introspection.DirectiveLocation.INPUT_OBJECT) TypeResolverProxy(graphql.schema.TypeResolverProxy) GraphQLEnumValueDefinition.newEnumValueDefinition(graphql.schema.GraphQLEnumValueDefinition.newEnumValueDefinition) DataFetcherFactory(graphql.schema.DataFetcherFactory) EnumValueDefinition(graphql.language.EnumValueDefinition) ObjectTypeExtensionDefinition(graphql.language.ObjectTypeExtensionDefinition) OBJECT(graphql.introspection.Introspection.DirectiveLocation.OBJECT) GraphQLError(graphql.GraphQLError) Map(java.util.Map) TypeName(graphql.language.TypeName) TypeResolver(graphql.schema.TypeResolver) OperationTypeDefinition(graphql.language.OperationTypeDefinition) GraphQLObjectType(graphql.schema.GraphQLObjectType) GraphQLDirective(graphql.schema.GraphQLDirective) NotAnInputTypeError(graphql.schema.idl.errors.NotAnInputTypeError) ObjectTypeDefinition(graphql.language.ObjectTypeDefinition) UnionTypeExtensionDefinition(graphql.language.UnionTypeExtensionDefinition) Collections.emptyList(java.util.Collections.emptyList) FieldDefinition(graphql.language.FieldDefinition) GraphQLInputType(graphql.schema.GraphQLInputType) Set(java.util.Set) TypeDefinition(graphql.language.TypeDefinition) GraphQLArgument(graphql.schema.GraphQLArgument) Collectors(java.util.stream.Collectors) Objects(java.util.Objects) NotAnOutputTypeError(graphql.schema.idl.errors.NotAnOutputTypeError) List(java.util.List) Stream(java.util.stream.Stream) ENUM_VALUE(graphql.introspection.Introspection.DirectiveLocation.ENUM_VALUE) InterfaceTypeDefinition(graphql.language.InterfaceTypeDefinition) Optional(java.util.Optional) GraphQLEnumType(graphql.schema.GraphQLEnumType) InterfaceTypeExtensionDefinition(graphql.language.InterfaceTypeExtensionDefinition) DirectiveLocation(graphql.introspection.Introspection.DirectiveLocation) GraphQLScalarType(graphql.schema.GraphQLScalarType) InputObjectTypeDefinition(graphql.language.InputObjectTypeDefinition) SchemaProblem(graphql.schema.idl.errors.SchemaProblem) HashMap(java.util.HashMap) GraphQLType(graphql.schema.GraphQLType) Stack(java.util.Stack) ArrayList(java.util.ArrayList) ENUM(graphql.introspection.Introspection.DirectiveLocation.ENUM) Introspection(graphql.introspection.Introspection) HashSet(java.util.HashSet) LinkedHashMap(java.util.LinkedHashMap) UnionTypeDefinition(graphql.language.UnionTypeDefinition) DataFetcherFactories(graphql.schema.DataFetcherFactories) InputObjectTypeExtensionDefinition(graphql.language.InputObjectTypeExtensionDefinition) ScalarTypeExtensionDefinition(graphql.language.ScalarTypeExtensionDefinition) DataFetcher(graphql.schema.DataFetcher) GraphQLSchema(graphql.schema.GraphQLSchema) ScalarTypeDefinition(graphql.language.ScalarTypeDefinition) EnumTypeExtensionDefinition(graphql.language.EnumTypeExtensionDefinition) GraphQLOutputType(graphql.schema.GraphQLOutputType) Directive(graphql.language.Directive) GraphQLTypeReference(graphql.schema.GraphQLTypeReference) PublicApi(graphql.PublicApi) Assert.assertNotNull(graphql.Assert.assertNotNull) GraphQLTypeReference.typeRef(graphql.schema.GraphQLTypeReference.typeRef) Collections(java.util.Collections) TypeName(graphql.language.TypeName) SchemaDefinition(graphql.language.SchemaDefinition) GraphQLType(graphql.schema.GraphQLType) OperationTypeDefinition(graphql.language.OperationTypeDefinition) GraphQLSchema(graphql.schema.GraphQLSchema) EnumTypeDefinition(graphql.language.EnumTypeDefinition) OperationTypeDefinition(graphql.language.OperationTypeDefinition) ObjectTypeDefinition(graphql.language.ObjectTypeDefinition) TypeDefinition(graphql.language.TypeDefinition) InterfaceTypeDefinition(graphql.language.InterfaceTypeDefinition) InputObjectTypeDefinition(graphql.language.InputObjectTypeDefinition) UnionTypeDefinition(graphql.language.UnionTypeDefinition) ScalarTypeDefinition(graphql.language.ScalarTypeDefinition) GraphQLObjectType(graphql.schema.GraphQLObjectType)

Example 4 with OperationTypeDefinition

use of graphql.language.OperationTypeDefinition in project graphql-java by graphql-java.

the class SchemaDiff method checkOperation.

private void checkOperation(DiffCtx ctx, String opName, Optional<SchemaDefinition> oldSchemaDef, Optional<SchemaDefinition> newSchemaDef) {
    // if schema declaration is missing then it is assumed to contain Query / Mutation / Subscription
    Optional<OperationTypeDefinition> oldOpTypeDef;
    oldOpTypeDef = oldSchemaDef.map(schemaDefinition -> getOpDef(opName, schemaDefinition)).orElseGet(() -> synthOperationTypeDefinition(type -> ctx.getOldTypeDef(type, ObjectTypeDefinition.class), opName));
    Optional<OperationTypeDefinition> newOpTypeDef;
    newOpTypeDef = newSchemaDef.map(schemaDefinition -> getOpDef(opName, schemaDefinition)).orElseGet(() -> synthOperationTypeDefinition(type -> ctx.getNewTypeDef(type, ObjectTypeDefinition.class), opName));
    // must be new
    if (!oldOpTypeDef.isPresent()) {
        return;
    }
    ctx.report(DiffEvent.apiInfo().typeName(capitalize(opName)).typeKind(TypeKind.Operation).components(opName).reasonMsg("Examining operation '%s' ...", capitalize(opName)).build());
    if (oldOpTypeDef.isPresent() && !newOpTypeDef.isPresent()) {
        ctx.report(DiffEvent.apiBreakage().category(DiffCategory.MISSING).typeName(capitalize(opName)).typeKind(TypeKind.Operation).components(opName).reasonMsg("The new API no longer has the operation '%s'", opName).build());
        return;
    }
    OperationTypeDefinition oldOpTypeDefinition = oldOpTypeDef.get();
    OperationTypeDefinition newOpTypeDefinition = newOpTypeDef.get();
    Type oldType = oldOpTypeDefinition.getType();
    // 
    // if we have no old op, then it must have been added (which is ok)
    Optional<TypeDefinition> oldTD = ctx.getOldTypeDef(oldType, TypeDefinition.class);
    if (!oldTD.isPresent()) {
        return;
    }
    checkType(ctx, oldType, newOpTypeDefinition.getType());
}
Also used : InputObjectTypeDefinition(graphql.language.InputObjectTypeDefinition) ObjectTypeDefinition(graphql.language.ObjectTypeDefinition) Type(graphql.language.Type) OperationTypeDefinition(graphql.language.OperationTypeDefinition) InputObjectTypeDefinition(graphql.language.InputObjectTypeDefinition) EnumTypeDefinition(graphql.language.EnumTypeDefinition) UnionTypeDefinition(graphql.language.UnionTypeDefinition) OperationTypeDefinition(graphql.language.OperationTypeDefinition) ScalarTypeDefinition(graphql.language.ScalarTypeDefinition) ObjectTypeDefinition(graphql.language.ObjectTypeDefinition) TypeDefinition(graphql.language.TypeDefinition) InterfaceTypeDefinition(graphql.language.InterfaceTypeDefinition)

Example 5 with OperationTypeDefinition

use of graphql.language.OperationTypeDefinition in project graphql-java by graphql-java.

the class GraphqlAntlrToLanguage method visitTypeName.

// MARKER END: Here GraphqlOperation.g4 specific methods end
@Override
public Void visitTypeName(GraphqlParser.TypeNameContext ctx) {
    TypeName typeName = new TypeName(ctx.name().getText());
    newNode(typeName, ctx);
    for (ContextEntry contextEntry : contextStack) {
        if (contextEntry.value instanceof ListType) {
            ((ListType) contextEntry.value).setType(typeName);
            break;
        }
        if (contextEntry.value instanceof NonNullType) {
            ((NonNullType) contextEntry.value).setType(typeName);
            break;
        }
        if (contextEntry.value instanceof VariableDefinition) {
            ((VariableDefinition) contextEntry.value).setType(typeName);
            break;
        }
        if (contextEntry.value instanceof FieldDefinition) {
            ((FieldDefinition) contextEntry.value).setType(typeName);
            break;
        }
        if (contextEntry.value instanceof InputValueDefinition) {
            ((InputValueDefinition) contextEntry.value).setType(typeName);
            break;
        }
        if (contextEntry.contextProperty == ContextProperty.ObjectTypeDefinition) {
            ((ObjectTypeDefinition) contextEntry.value).getImplements().add(typeName);
            break;
        }
        if (contextEntry.contextProperty == ContextProperty.UnionTypeDefinition) {
            ((UnionTypeDefinition) contextEntry.value).getMemberTypes().add(typeName);
            break;
        }
        if (contextEntry.contextProperty == ContextProperty.OperationTypeDefinition) {
            ((OperationTypeDefinition) contextEntry.value).setType(typeName);
            break;
        }
    }
    return super.visitTypeName(ctx);
}
Also used : TypeName(graphql.language.TypeName) VariableDefinition(graphql.language.VariableDefinition) NonNullType(graphql.language.NonNullType) ListType(graphql.language.ListType) FieldDefinition(graphql.language.FieldDefinition) InputValueDefinition(graphql.language.InputValueDefinition) OperationTypeDefinition(graphql.language.OperationTypeDefinition)

Aggregations

OperationTypeDefinition (graphql.language.OperationTypeDefinition)7 InputObjectTypeDefinition (graphql.language.InputObjectTypeDefinition)5 ObjectTypeDefinition (graphql.language.ObjectTypeDefinition)5 TypeName (graphql.language.TypeName)5 EnumTypeDefinition (graphql.language.EnumTypeDefinition)4 InterfaceTypeDefinition (graphql.language.InterfaceTypeDefinition)4 TypeDefinition (graphql.language.TypeDefinition)4 UnionTypeDefinition (graphql.language.UnionTypeDefinition)4 FieldDefinition (graphql.language.FieldDefinition)3 InputValueDefinition (graphql.language.InputValueDefinition)3 ScalarTypeDefinition (graphql.language.ScalarTypeDefinition)3 SchemaDefinition (graphql.language.SchemaDefinition)3 Type (graphql.language.Type)3 ArrayList (java.util.ArrayList)3 List (java.util.List)3 Map (java.util.Map)3 GraphQLError (graphql.GraphQLError)2 Directive (graphql.language.Directive)2 EnumValueDefinition (graphql.language.EnumValueDefinition)2 ObjectTypeExtensionDefinition (graphql.language.ObjectTypeExtensionDefinition)2