use of graphql.language.Directive in project graphql-java by graphql-java.
the class SchemaGenerator method buildDirectives.
private GraphQLDirective[] buildDirectives(List<Directive> directives, List<Directive> extensionDirectives, DirectiveLocation directiveLocation) {
directives = directives == null ? emptyList() : directives;
extensionDirectives = extensionDirectives == null ? emptyList() : extensionDirectives;
Set<String> names = new HashSet<>();
List<GraphQLDirective> output = new ArrayList<>();
for (Directive directive : directives) {
if (!names.contains(directive.getName())) {
names.add(directive.getName());
output.add(schemaGeneratorHelper.buildDirective(directive, directiveLocation));
}
}
for (Directive directive : extensionDirectives) {
if (!names.contains(directive.getName())) {
names.add(directive.getName());
output.add(schemaGeneratorHelper.buildDirective(directive, directiveLocation));
}
}
return output.toArray(new GraphQLDirective[0]);
}
use of graphql.language.Directive in project graphql-java by graphql-java.
the class SchemaDiff method checkDirectives.
void checkDirectives(DiffCtx ctx, TypeDefinition old, List<Directive> oldDirectives, List<Directive> newDirectives) {
if (!options.enforceDirectives) {
return;
}
Map<String, Directive> oldDirectivesMap = sortedMap(oldDirectives, Directive::getName);
Map<String, Directive> newDirectivesMap = sortedMap(newDirectives, Directive::getName);
for (String directiveName : oldDirectivesMap.keySet()) {
Directive oldDirective = oldDirectivesMap.get(directiveName);
Optional<Directive> newDirective = Optional.ofNullable(newDirectivesMap.get(directiveName));
if (!newDirective.isPresent()) {
ctx.report(DiffEvent.apiBreakage().category(DiffCategory.MISSING).typeName(old.getName()).typeKind(getTypeKind(old)).components(directiveName).reasonMsg("The new API does not have a directive named '%s' on type '%s'", directiveName, old.getName()).build());
continue;
}
Map<String, Argument> oldArgumentsByName = new TreeMap<>(oldDirective.getArgumentsByName());
Map<String, Argument> newArgumentsByName = new TreeMap<>(newDirective.get().getArgumentsByName());
if (oldArgumentsByName.size() > newArgumentsByName.size()) {
ctx.report(DiffEvent.apiBreakage().category(DiffCategory.MISSING).typeName(old.getName()).typeKind(getTypeKind(old)).components(directiveName).reasonMsg("The new API has less arguments on directive '%s' on type '%s' than the old API", directiveName, old.getName()).build());
return;
}
for (String argName : oldArgumentsByName.keySet()) {
Argument oldArgument = oldArgumentsByName.get(argName);
Optional<Argument> newArgument = Optional.ofNullable(newArgumentsByName.get(argName));
if (!newArgument.isPresent()) {
ctx.report(DiffEvent.apiBreakage().category(DiffCategory.MISSING).typeName(old.getName()).typeKind(getTypeKind(old)).components(directiveName, argName).reasonMsg("The new API does not have an argument named '%s' on directive '%s' on type '%s'", argName, directiveName, old.getName()).build());
} else {
Value oldValue = oldArgument.getValue();
Value newValue = newArgument.get().getValue();
if (oldValue != null && newValue != null) {
if (!oldValue.getClass().equals(newValue.getClass())) {
ctx.report(DiffEvent.apiBreakage().category(DiffCategory.INVALID).typeName(old.getName()).typeKind(getTypeKind(old)).components(directiveName, argName).reasonMsg("The new API has changed value types on argument named '%s' on directive '%s' on type '%s'", argName, directiveName, old.getName()).build());
}
}
}
}
}
}
use of graphql.language.Directive in project timbuctoo by HuygensING.
the class RdfWiringFactory method getDataFetcher.
@Override
public DataFetcher getDataFetcher(FieldWiringEnvironment environment) {
if (environment.getFieldDefinition().getDirective("passThrough") != null) {
return DataFetchingEnvironment::getSource;
} else if (environment.getFieldDefinition().getDirective("related") != null) {
final Directive directive = environment.getFieldDefinition().getDirective("related");
String source = ((StringValue) directive.getArgument("source").getValue()).getValue();
String predicate = ((StringValue) directive.getArgument("predicate").getValue()).getValue();
String direction = ((StringValue) directive.getArgument("direction").getValue()).getValue();
return new CollectionFetcherWrapper(argumentsHelper, new RelationsOfSubjectDataFetcher(source, predicate, Direction.valueOf(direction)));
} else if (environment.getFieldDefinition().getDirective("fromCollection") != null) {
final Directive directive = environment.getFieldDefinition().getDirective("fromCollection");
String uri = ((StringValue) directive.getArgument("uri").getValue()).getValue();
boolean listAll = ((BooleanValue) directive.getArgument("listAll").getValue()).isValue();
if (listAll) {
return new CollectionFetcherWrapper(argumentsHelper, new CollectionDataFetcher(uri));
} else {
return lookupFetcher;
}
} else if (environment.getFieldDefinition().getDirective("rdf") != null) {
final Directive directive = environment.getFieldDefinition().getDirective("rdf");
String uri = ((StringValue) directive.getArgument("predicate").getValue()).getValue();
Direction direction = valueOf(((StringValue) directive.getArgument("direction").getValue()).getValue());
boolean isList = ((BooleanValue) directive.getArgument("isList").getValue()).isValue();
boolean isObject = ((BooleanValue) directive.getArgument("isObject").getValue()).isValue();
boolean isValue = ((BooleanValue) directive.getArgument("isValue").getValue()).isValue();
if (isObject && isValue) {
return new DataFetcherWrapper(argumentsHelper, isList, new UnionDataFetcher(uri, direction));
} else {
if (isObject) {
return new DataFetcherWrapper(argumentsHelper, isList, new RelationDataFetcher(uri, direction));
} else {
return new DataFetcherWrapper(argumentsHelper, isList, new TypedLiteralDataFetcher(uri));
}
}
} else if (environment.getFieldDefinition().getDirective("uri") != null) {
return uriFetcher;
} else if (environment.getFieldDefinition().getDirective("dataSet") != null) {
final Directive directive = environment.getFieldDefinition().getDirective("dataSet");
String userId = ((StringValue) directive.getArgument("userId").getValue()).getValue();
String dataSetId = ((StringValue) directive.getArgument("dataSetId").getValue()).getValue();
final DataSet dataSet = dataSetRepository.unsafeGetDataSetWithoutCheckingPermissions(userId, dataSetId).orElse(null);
return dataFetchingEnvironment -> new DatabaseResult() {
@Override
public DataSet getDataSet() {
return dataSet;
}
};
} else if (environment.getFieldDefinition().getDirective("entityTitle") != null) {
return entityTitleFetcher;
} else if (environment.getFieldDefinition().getDirective("entityDescription") != null) {
return entityDescriptionFetcher;
} else if (environment.getFieldDefinition().getDirective("entityImage") != null) {
return entityImageFetcher;
}
return null;
}
use of graphql.language.Directive in project graphql-java by graphql-java.
the class SchemaTypeChecker method checkEnumValues.
private void checkEnumValues(List<GraphQLError> errors, EnumTypeDefinition enumType, List<EnumValueDefinition> enumValueDefinitions) {
// enum unique ness
checkNamedUniqueness(errors, enumValueDefinitions, EnumValueDefinition::getName, (name, inputValueDefinition) -> new NonUniqueNameError(enumType, inputValueDefinition));
// directive checks
enumValueDefinitions.forEach(enumValue -> {
BiFunction<String, Directive, NonUniqueDirectiveError> errorFunction = (directiveName, directive) -> new NonUniqueDirectiveError(enumType, enumValue, directiveName);
checkNamedUniqueness(errors, enumValue.getDirectives(), Directive::getName, errorFunction);
});
enumValueDefinitions.forEach(enumValue -> enumValue.getDirectives().forEach(directive -> {
checkDeprecatedDirective(errors, directive, () -> new InvalidDeprecationDirectiveError(enumType, enumValue));
BiFunction<String, Argument, NonUniqueArgumentError> errorFunction = (argumentName, argument) -> new NonUniqueArgumentError(enumType, enumValue, argumentName);
checkNamedUniqueness(errors, directive.getArguments(), Argument::getName, errorFunction);
}));
}
use of graphql.language.Directive in project graphql-java by graphql-java.
the class SchemaTypeExtensionsChecker method checkInputObjectTypeExtensions.
/*
* Input object type extensions have the potential to be invalid if incorrectly defined.
*
* The named type must already be defined and must be a Input Object type.
* All fields of an Input Object type extension must have unique names.
* All fields of an Input Object type extension must not already be a field of the original Input Object.
* Any directives provided must not already apply to the original Input Object type.
*/
private void checkInputObjectTypeExtensions(List<GraphQLError> errors, TypeDefinitionRegistry typeRegistry) {
typeRegistry.inputObjectTypeExtensions().forEach((name, extensions) -> {
checkTypeExtensionHasCorrespondingType(errors, typeRegistry, name, extensions, InputObjectTypeDefinition.class);
checkTypeExtensionDirectiveRedefinition(errors, typeRegistry, name, extensions, InputObjectTypeDefinition.class);
// field redefinitions
extensions.forEach(extension -> {
List<InputValueDefinition> inputValueDefinitions = extension.getInputValueDefinitions();
// field unique ness
checkNamedUniqueness(errors, inputValueDefinitions, InputValueDefinition::getName, (namedField, fieldDef) -> new NonUniqueNameError(extension, fieldDef));
// directive checks
inputValueDefinitions.forEach(fld -> checkNamedUniqueness(errors, fld.getDirectives(), Directive::getName, (directiveName, directive) -> new NonUniqueDirectiveError(extension, fld, directiveName)));
inputValueDefinitions.forEach(fld -> fld.getDirectives().forEach(directive -> {
checkDeprecatedDirective(errors, directive, () -> new InvalidDeprecationDirectiveError(extension, fld));
checkNamedUniqueness(errors, directive.getArguments(), Argument::getName, (argumentName, argument) -> new NonUniqueArgumentError(extension, fld, argumentName));
}));
//
// fields must be unique within a type extension
forEachBut(extension, extensions, otherTypeExt -> checkForInputValueRedefinition(errors, otherTypeExt, otherTypeExt.getInputValueDefinitions(), inputValueDefinitions));
//
// then check for field re-defs from the base type
Optional<InputObjectTypeDefinition> baseTypeOpt = typeRegistry.getType(extension.getName(), InputObjectTypeDefinition.class);
baseTypeOpt.ifPresent(baseTypeDef -> checkForInputValueRedefinition(errors, extension, inputValueDefinitions, baseTypeDef.getInputValueDefinitions()));
});
});
}
Aggregations