Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 8 additions & 3 deletions src/main/java/graphql/ParseAndValidate.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public class ParseAndValidate {

/**
* This {@link GraphQLContext} hint can be used to supply a Predicate to the Validator so that certain rules can be skipped.
*
* <p>
* This is an internal capability that you should use at your own risk. While we intend for this to be present for some time, the validation
* rule class names may change, as may this mechanism.
*/
Expand Down Expand Up @@ -123,6 +123,10 @@ public static List<ValidationError> validate(@NonNull GraphQLSchema graphQLSchem
return validate(graphQLSchema, parsedDocument, rulePredicate, locale, null);
}

public static List<ValidationError> validate(GraphQLSchema graphQLSchema, Document parsedDocument, Predicate<OperationValidationRule> rulePredicate, Locale locale, @Nullable QueryComplexityLimits limits) {
return validate(graphQLSchema, parsedDocument, rulePredicate, locale, limits, null);
}

/**
* This can be called to validate a parsed graphql query.
*
Expand All @@ -131,12 +135,13 @@ public static List<ValidationError> validate(@NonNull GraphQLSchema graphQLSchem
* @param rulePredicate this predicate is used to decide what validation rules will be applied
* @param locale the current locale
* @param limits optional query complexity limits to enforce
* @param graphQLContext the graphql context to use
*
* @return a result object that indicates how this operation went
*/
public static List<ValidationError> validate(GraphQLSchema graphQLSchema, Document parsedDocument, Predicate<OperationValidationRule> rulePredicate, Locale locale, @Nullable QueryComplexityLimits limits) {
public static List<ValidationError> validate(GraphQLSchema graphQLSchema, Document parsedDocument, Predicate<OperationValidationRule> rulePredicate, Locale locale, @Nullable QueryComplexityLimits limits, @Nullable GraphQLContext graphQLContext) {
Validator validator = new Validator();
return validator.validateDocument(graphQLSchema, parsedDocument, rulePredicate, locale, limits);
return validator.validateDocument(graphQLSchema, parsedDocument, rulePredicate, locale, limits, graphQLContext);
}

/**
Expand Down
8 changes: 6 additions & 2 deletions src/main/java/graphql/validation/ValidationContext.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,18 @@ public class ValidationContext {
private final QueryComplexityLimits queryComplexityLimits;

public ValidationContext(GraphQLSchema schema, Document document, I18n i18n) {
this(schema, document, i18n, null);
this(schema, document, i18n, null, null);
}

public ValidationContext(GraphQLSchema schema, Document document, I18n i18n, @Nullable QueryComplexityLimits limits) {
this(schema, document, i18n, limits, null);
}

public ValidationContext(GraphQLSchema schema, Document document, I18n i18n, @Nullable QueryComplexityLimits limits, @Nullable GraphQLContext graphQLContext) {
this.schema = schema;
this.document = document;
this.i18n = i18n;
this.graphQLContext = GraphQLContext.newContext().of(Locale.class, i18n.getLocale()).build();
this.graphQLContext = graphQLContext != null ? graphQLContext : GraphQLContext.newContext().of(Locale.class, i18n.getLocale()).build();
this.queryComplexityLimits = limits != null ? limits : QueryComplexityLimits.getDefaultLimits();
buildFragmentMap();
}
Expand Down
10 changes: 8 additions & 2 deletions src/main/java/graphql/validation/Validator.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package graphql.validation;


import graphql.GraphQLContext;
import graphql.Internal;
import graphql.i18n.I18n;
import graphql.language.Document;
import graphql.schema.GraphQLSchema;
import org.jspecify.annotations.Nullable;

import java.util.List;
import java.util.Locale;
Expand Down Expand Up @@ -37,12 +39,16 @@ public List<ValidationError> validateDocument(GraphQLSchema schema, Document doc
}

public List<ValidationError> validateDocument(GraphQLSchema schema, Document document, Predicate<OperationValidationRule> rulePredicate, Locale locale) {
return validateDocument(schema, document, rulePredicate, locale, null);
return validateDocument(schema, document, rulePredicate, locale, null, null);
}

public List<ValidationError> validateDocument(GraphQLSchema schema, Document document, Predicate<OperationValidationRule> rulePredicate, Locale locale, QueryComplexityLimits limits) {
return validateDocument(schema, document, rulePredicate, locale, limits, null);
}

public List<ValidationError> validateDocument(GraphQLSchema schema, Document document, Predicate<OperationValidationRule> rulePredicate, Locale locale, QueryComplexityLimits limits, @Nullable GraphQLContext graphQLContext) {
I18n i18n = I18n.i18n(I18n.BundleType.Validation, locale);
ValidationContext validationContext = new ValidationContext(schema, document, i18n, limits);
ValidationContext validationContext = new ValidationContext(schema, document, i18n, limits, graphQLContext);

ValidationErrorCollector validationErrorCollector = new ValidationErrorCollector(MAX_VALIDATION_ERRORS);
OperationValidator operationValidator = new OperationValidator(validationContext, validationErrorCollector, rulePredicate);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,10 @@
package graphql.validation

import graphql.ExperimentalApi
import graphql.GraphQLContext
import graphql.i18n.I18n
import graphql.language.Document
import graphql.parser.Parser
import graphql.validation.LanguageTraversal
import graphql.validation.OperationValidationRule
import graphql.validation.OperationValidator
import graphql.validation.SpecValidationSchema
import graphql.validation.ValidationContext
import graphql.validation.ValidationErrorCollector
import graphql.validation.ValidationErrorType
import spock.lang.Specification

class DeferDirectiveOnRootLevelTest extends Specification {
Expand All @@ -19,11 +13,13 @@ class DeferDirectiveOnRootLevelTest extends Specification {

def traverse(String query) {
Document document = new Parser().parseDocument(query)
GraphQLContext graphQLContext = GraphQLContext.newContext().build().put(ExperimentalApi.ENABLE_INCREMENTAL_SUPPORT, true)
ValidationContext validationContext = new ValidationContext(
SpecValidationSchema.specValidationSchema,
document,
I18n.i18n(I18n.BundleType.Validation, Locale.ENGLISH))
validationContext.getGraphQLContext().put(ExperimentalApi.ENABLE_INCREMENTAL_SUPPORT, true)
I18n.i18n(I18n.BundleType.Validation, Locale.ENGLISH),
QueryComplexityLimits.getDefaultLimits(),
graphQLContext)

LanguageTraversal languageTraversal = new LanguageTraversal()
languageTraversal.traverse(document, new OperationValidator(validationContext, errorCollector,
Expand Down
Loading