private static void register(GraphQLFieldsContainer parentType, String fieldName, DataFetcher dataFetcher) { introspectionDataFetchers.put(coordinates(parentType.getName(), fieldName), dataFetcher); }
/** * This allows you you to build all the data fetchers for the fields of a container type. * * @param parentTypeName the parent container type * @param fieldDataFetchers the map of field names to data fetchers * * @return this builder */ public Builder dataFetchers(String parentTypeName, Map<String, DataFetcher> fieldDataFetchers) { assertNotNull(fieldDataFetchers); fieldDataFetchers.forEach((fieldName, dataFetcher) -> { dataFetcher(coordinates(parentTypeName, fieldName), dataFetcher); }); return this; }
private static DataFetcher getDataFetcherImpl(GraphQLFieldsContainer parentType, GraphQLFieldDefinition fieldDefinition, Map<FieldCoordinates, DataFetcherFactory> dataFetcherMap, Map<String, DataFetcherFactory> systemDataFetcherMap) { assertNotNull(parentType); assertNotNull(fieldDefinition); DataFetcherFactory dataFetcherFactory = systemDataFetcherMap.get(fieldDefinition.getName()); if (dataFetcherFactory == null) { dataFetcherFactory = dataFetcherMap.get(FieldCoordinates.coordinates(parentType, fieldDefinition)); if (dataFetcherFactory == null) { dataFetcherFactory = DataFetcherFactories.useDataFetcher(new PropertyDataFetcher<>(fieldDefinition.getName())); } } return dataFetcherFactory.get(newDataFetchingFactoryEnvironment() .fieldDefinition(fieldDefinition) .build()); }
@Override public TraversalControl visitGraphQLFieldDefinition(GraphQLFieldDefinition node, TraverserContext<GraphQLType> context) { GraphQLFieldsContainer parentContainerType = (GraphQLFieldsContainer) context.getParentContext().thisNode(); DataFetcher dataFetcher = node.getDataFetcher(); if (dataFetcher == null) { dataFetcher = new PropertyDataFetcher<>(node.getName()); } FieldCoordinates coordinates = coordinates(parentContainerType, node); codeRegistry.dataFetcherIfAbsent(coordinates, dataFetcher); return CONTINUE; }
@Override public GraphQLFieldDefinition onField(SchemaDirectiveWiringEnvironment<GraphQLFieldDefinition> environment) { GraphQLFieldDefinition field = environment.getElement(); String fetchName = atFetchFromSupport(field.getName(), field.getDirectives()); DataFetcher dataFetcher = new PropertyDataFetcher(fetchName); environment.getCodeRegistry().dataFetcher(coordinates(environment.getFieldsContainer(), field), dataFetcher); return field; }
private FieldDefAndDirectiveParams buildField(BuildContext buildCtx, TypeDefinition parentType, FieldDefinition fieldDef) { buildCtx.enterNode(fieldDef); GraphQLFieldDefinition.Builder builder = GraphQLFieldDefinition.newFieldDefinition(); builder.definition(fieldDef); builder.name(fieldDef.getName()); builder.description(schemaGeneratorHelper.buildDescription(fieldDef, fieldDef.getDescription())); builder.deprecate(schemaGeneratorHelper.buildDeprecationReason(fieldDef.getDirectives())); GraphQLDirective[] directives = buildDirectives(fieldDef.getDirectives(), Collections.emptyList(), DirectiveLocation.FIELD_DEFINITION, buildCtx.getDirectiveDefinitions()); builder.withDirectives( directives ); fieldDef.getInputValueDefinitions().forEach(inputValueDefinition -> builder.argument(buildArgument(buildCtx, inputValueDefinition))); GraphQLOutputType fieldType = buildOutputType(buildCtx, fieldDef.getType()); builder.type(fieldType); GraphQLFieldDefinition fieldDefinition = builder.build(); // if they have already wired in a fetcher - then leave it alone FieldCoordinates coordinates = FieldCoordinates.coordinates(parentType.getName(), fieldDefinition.getName()); if (!buildCtx.codeRegistry.hasDataFetcher(coordinates)) { DataFetcherFactory dataFetcherFactory = buildDataFetcherFactory(buildCtx, parentType, fieldDef, fieldType, Arrays.asList(directives)); buildCtx.getCodeRegistry().dataFetcher(coordinates, dataFetcherFactory); } return buildCtx.exitNode(new FieldDefAndDirectiveParams(fieldDefinition, buildCtx.mkBehaviourParams())); }
@Override public GraphQLFieldDefinition onField(SchemaDirectiveWiringEnvironment<GraphQLFieldDefinition> environment) { String targetAuthRole = (String) environment.getDirective().getArgument("role").getValue(); GraphQLFieldDefinition field = environment.getElement(); GraphQLFieldsContainer parentType = environment.getFieldsContainer(); // // build a data fetcher that first checks authorisation roles before then calling the original data fetcher // DataFetcher originalDataFetcher = environment.getCodeRegistry().getDataFetcher(parentType, field); DataFetcher authDataFetcher = new DataFetcher() { @Override public Object get(DataFetchingEnvironment dataFetchingEnvironment) throws Exception { Map<String, Object> contextMap = dataFetchingEnvironment.getContext(); AuthorisationCtx authContext = (AuthorisationCtx) contextMap.get("authContext"); if (authContext.hasRole(targetAuthRole)) { return originalDataFetcher.get(dataFetchingEnvironment); } else { return null; } } }; // // now change the field definition to have the new authorising data fetcher FieldCoordinates coordinates = FieldCoordinates.coordinates(parentType, field); environment.getCodeRegistry().dataFetcher(coordinates, authDataFetcher); return field; } }
FieldCoordinates coordinates = FieldCoordinates.coordinates(parentType, field); environment.getCodeRegistry().dataFetcher(coordinates, dataFetcher);
private static void register(GraphQLFieldsContainer parentType, String fieldName, DataFetcher dataFetcher) { introspectionDataFetchers.put(coordinates(parentType.getName(), fieldName), dataFetcher); }
/** * This allows you you to build all the data fetchers for the fields of a container type. * * @param parentTypeName the parent container type * @param fieldDataFetchers the map of field names to data fetchers * * @return this builder */ public Builder dataFetchers(String parentTypeName, Map<String, DataFetcher> fieldDataFetchers) { assertNotNull(fieldDataFetchers); fieldDataFetchers.forEach((fieldName, dataFetcher) -> { dataFetcher(coordinates(parentTypeName, fieldName), dataFetcher); }); return this; }
private static DataFetcher getDataFetcherImpl(GraphQLFieldsContainer parentType, GraphQLFieldDefinition fieldDefinition, Map<FieldCoordinates, DataFetcherFactory> dataFetcherMap, Map<String, DataFetcherFactory> systemDataFetcherMap) { assertNotNull(parentType); assertNotNull(fieldDefinition); DataFetcherFactory dataFetcherFactory = systemDataFetcherMap.get(fieldDefinition.getName()); if (dataFetcherFactory == null) { dataFetcherFactory = dataFetcherMap.get(FieldCoordinates.coordinates(parentType, fieldDefinition)); if (dataFetcherFactory == null) { dataFetcherFactory = DataFetcherFactories.useDataFetcher(new PropertyDataFetcher<>(fieldDefinition.getName())); } } return dataFetcherFactory.get(newDataFetchingFactoryEnvironment() .fieldDefinition(fieldDefinition) .build()); }
@Override public TraversalControl visitGraphQLFieldDefinition(GraphQLFieldDefinition node, TraverserContext<GraphQLType> context) { GraphQLFieldsContainer parentContainerType = (GraphQLFieldsContainer) context.getParentContext().thisNode(); DataFetcher dataFetcher = node.getDataFetcher(); if (dataFetcher == null) { dataFetcher = new PropertyDataFetcher<>(node.getName()); } FieldCoordinates coordinates = coordinates(parentContainerType, node); codeRegistry.dataFetcherIfAbsent(coordinates, dataFetcher); return CONTINUE; }
@Override public GraphQLFieldDefinition onField(SchemaDirectiveWiringEnvironment<GraphQLFieldDefinition> environment) { GraphQLFieldDefinition field = environment.getElement(); String fetchName = atFetchFromSupport(field.getName(), field.getDirectives()); DataFetcher dataFetcher = new PropertyDataFetcher(fetchName); environment.getCodeRegistry().dataFetcher(coordinates(environment.getFieldsContainer(), field), dataFetcher); return field; }
private FieldDefAndDirectiveParams buildField(BuildContext buildCtx, TypeDefinition parentType, FieldDefinition fieldDef) { buildCtx.enterNode(fieldDef); GraphQLFieldDefinition.Builder builder = GraphQLFieldDefinition.newFieldDefinition(); builder.definition(fieldDef); builder.name(fieldDef.getName()); builder.description(schemaGeneratorHelper.buildDescription(fieldDef, fieldDef.getDescription())); builder.deprecate(schemaGeneratorHelper.buildDeprecationReason(fieldDef.getDirectives())); GraphQLDirective[] directives = buildDirectives(fieldDef.getDirectives(), Collections.emptyList(), DirectiveLocation.FIELD_DEFINITION, buildCtx.getDirectiveDefinitions()); builder.withDirectives( directives ); fieldDef.getInputValueDefinitions().forEach(inputValueDefinition -> builder.argument(buildArgument(buildCtx, inputValueDefinition))); GraphQLOutputType fieldType = buildOutputType(buildCtx, fieldDef.getType()); builder.type(fieldType); GraphQLFieldDefinition fieldDefinition = builder.build(); // if they have already wired in a fetcher - then leave it alone FieldCoordinates coordinates = FieldCoordinates.coordinates(parentType.getName(), fieldDefinition.getName()); if (!buildCtx.codeRegistry.hasDataFetcher(coordinates)) { DataFetcherFactory dataFetcherFactory = buildDataFetcherFactory(buildCtx, parentType, fieldDef, fieldType, Arrays.asList(directives)); buildCtx.getCodeRegistry().dataFetcher(coordinates, dataFetcherFactory); } return buildCtx.exitNode(new FieldDefAndDirectiveParams(fieldDefinition, buildCtx.mkBehaviourParams())); }