private GraphQLInputObjectType buildInputObjectType(BuildContext buildCtx, InputObjectTypeDefinition typeDefinition) { buildCtx.enterNode(typeDefinition); GraphQLInputObjectType.Builder builder = GraphQLInputObjectType.newInputObject(); builder.definition(typeDefinition); builder.name(typeDefinition.getName()); builder.description(schemaGeneratorHelper.buildDescription(typeDefinition, typeDefinition.getDescription())); List<InputObjectTypeExtensionDefinition> extensions = inputObjectTypeExtensions(typeDefinition, buildCtx); builder.withDirectives( buildDirectives(typeDefinition.getDirectives(), directivesOf(extensions), INPUT_OBJECT, buildCtx.getDirectiveDefinitions()) ); typeDefinition.getInputValueDefinitions().forEach(inputValue -> builder.field(buildInputField(buildCtx, inputValue))); extensions.forEach(extension -> extension.getInputValueDefinitions().forEach(inputValueDefinition -> { GraphQLInputObjectField inputField = buildInputField(buildCtx, inputValueDefinition); if (!builder.hasField(inputField.getName())) { builder.field(inputField); } })); GraphQLInputObjectType inputObjectType = builder.build(); inputObjectType = directiveBehaviour.onInputObjectType(inputObjectType, buildCtx.mkBehaviourParams()); return buildCtx.exitNode(inputObjectType); }
.name(type) .description("Criteria expression specification of "+namingStrategy.singularize(attribute.getName())+" attribute in entity " + attribute.getDeclaringType().getJavaType()) .field(GraphQLInputObjectField.newInputObjectField() .name("OR") .description("Logical OR criteria expression") .field(GraphQLInputObjectField.newInputObjectField() .name("AND") .description("Logical AND criteria expression") .field(GraphQLInputObjectField.newInputObjectField() .name(Criteria.EQ.name()) .description("Equals criteria") .field(GraphQLInputObjectField.newInputObjectField() .name(Criteria.NE.name()) .description("Not Equals criteria") builder.field(GraphQLInputObjectField.newInputObjectField() .name(Criteria.LE.name()) .description("Less then or Equals criteria") .field(GraphQLInputObjectField.newInputObjectField() .name(Criteria.GE.name()) .description("Greater or Equals criteria") .field(GraphQLInputObjectField.newInputObjectField() .name(Criteria.GT.name()) .description("Greater Then criteria")
if (isInput) { type = new InputObjectBuilder(graphQLObjectInfoRetriever, fieldSearchAlgorithm, methodSearchAlgorithm, graphQLFieldRetriever).getInputObjectBuilder(object, container).build(); } else { type = new OutputObjectBuilder(graphQLObjectInfoRetriever, fieldSearchAlgorithm, methodSearchAlgorithm,
@Override public GraphQLInputType createInputType() { return GraphQLInputObjectType.newInputObject() .name(STANDARD_BUILD_FILTER) .field( newInputObjectField() .name("count") .field(formField("sincePromotionLevel", "Builds since the last one which was promoted to this level")) .field(formField("withPromotionLevel", "Builds with this promotion level")) .field(formField("afterDate", "Build created after or on this date")) .field(formField("beforeDate", "Build created before or on this date")) .field(formField("sinceValidationStamp", "Builds since the last one which had this validation stamp")) .field(formField("sinceValidationStampStatus", "... with status")) .field(formField("withValidationStamp", "Builds with this validation stamp")) .field(formField("withValidationStampStatus", "... with status")) .field(formField("withProperty", "With property")) .field(formField("withPropertyValue", "...with value")) .field(formField("sinceProperty", "Since property")) .field(formField("sincePropertyValue", "...with value")) .field(formField( "linkedFrom", "The build must be linked FROM the builds selected by the pattern.\n" + "with * as placeholder" )) .field(formField( "linkedFromPromotion", "The build must be linked FROM a build having this promotion (requires \"linkedFrom\")" ))
.collect(Collectors.toList()); GraphQLInputObjectType inputObjectType = newInputObject() .name(mutation.getName() + "Input") .field(newInputObjectField() .name(CLIENT_MUTATION_ID) .type(new GraphQLNonNull(GraphQLString))) .fields(inputFields) .build(); GraphQLObjectType outputType = newObject() .name(mutation.getName() + "Payload")
.name(type) .description("Where logical AND specification of the provided list of criteria expressions") .field(GraphQLInputObjectField.newInputObjectField() .name("OR") .description("Logical operation for expressions") .build() .field(GraphQLInputObjectField.newInputObjectField() .name("AND") .description("Logical operation for expressions") .build() .fields(managedType.getAttributes().stream() .filter(this::isValidInput) .filter(this::isNotIgnored) .collect(Collectors.toList()) .build();
builder.name(container.getInputPrefix() + graphQLObjectInfoRetriever.getTypeName(object) + container.getInputSuffix()); GraphQLDescription description = object.getAnnotation(GraphQLDescription.class); if (description != null) { builder.description(description.value()); GraphQLInputObjectField gqlField = graphQLFieldRetriever.getInputField(method,container); definedFields.add(gqlField.getName()); builder.field(gqlField); GraphQLInputObjectField gqlField = graphQLFieldRetriever.getInputField(field,container); definedFields.add(gqlField.getName()); builder.field(gqlField);
/** * Creates a GraphQL Map Input type. GraphQL doesn't support this natively. We mimic * maps by creating a list of key/value pairs. * @param keyClazz The map key class * @param valueClazz The map value class * @return The created type. */ public GraphQLList classToInputMap(Class<?> keyClazz, Class<?> valueClazz) { String mapName = toValidNameName("__input__" + keyClazz.getName() + valueClazz.getCanonicalName() + MAP); if (mapConversions.containsKey(mapName)) { return mapConversions.get(mapName); } GraphQLInputType keyType = fetchScalarOrObjectInput(keyClazz); GraphQLInputType valueType = fetchScalarOrObjectInput(valueClazz); GraphQLList inputMap = new GraphQLList( newInputObject() .name(mapName) .field(newInputObjectField() .name(KEY) .type(keyType)) .field(newInputObjectField() .name(VALUE) .type(valueType)) .build() ); mapConversions.put(mapName, inputMap); return inputMap; }
/** * Creates a GraphQL Map Input type. GraphQL doesn't support this natively. We mimic * maps by creating a list of key/value pairs. * @param keyClazz The map key class * @param valueClazz The map value class * @return The created type. */ public GraphQLList classToInputMap(Class<?> keyClazz, Class<?> valueClazz) { String mapName = toValidNameName("__input__" + keyClazz.getName() + valueClazz.getCanonicalName() + MAP); if (mapConversions.containsKey(mapName)) { return mapConversions.get(mapName); } GraphQLInputType keyType = fetchScalarOrObjectInput(keyClazz); GraphQLInputType valueType = fetchScalarOrObjectInput(valueClazz); GraphQLList inputMap = new GraphQLList( newInputObject() .name(mapName) .field(newInputObjectField() .name(KEY) .type(keyType)) .field(newInputObjectField() .name(VALUE) .type(valueType)) .build() ); mapConversions.put(mapName, inputMap); return inputMap; }
private GraphQLInputType getInputType(GraphQLOutputType outputType) { if (GraphQLInputType.class.isAssignableFrom(outputType.getClass())) { return (GraphQLInputType) outputType; } else if (outputType instanceof GraphQLObjectType) { GraphQLObjectType objectType = (GraphQLObjectType) outputType; final String inputTypeName; inputTypeName = String.format("%s%s%s", objectType.getName(), this.getTypeNamingStrategy().getDelimiter(), this.getTypeNamingStrategy().getInputTypePostfix()); GraphQLInputObjectType.Builder rv = GraphQLInputObjectType.newInputObject().name(inputTypeName); rv.description(((GraphQLObjectType) outputType).getDescription()); for (GraphQLFieldDefinition field : objectType.getFieldDefinitions()) { rv.field(GraphQLInputObjectField.newInputObjectField() .name(field.getName()) .type(getInputType(field.getType())) .description(field.getDescription()) .build()); } GraphQLInputType type = rv.build(); inputTypes.add(type); return type; } else { throw new RuntimeException(String.format("Unknown output type %s", outputType.toString())); } }
private void createTypes() { userType = newObject().name("user").description("A user") .field(newFieldDefinition().name("id").description("The id").type(GraphQLInt).build()) .field(newFieldDefinition().name("name").description("The name").type(GraphQLString).build()) .field(newFieldDefinition().name("roles").description("The roles").type(new GraphQLList(roleFields.getRoleType())) .dataFetcher(environment -> userDataFetcher.getRoles((User) environment.getSource())) .build()) .build(); addUserInputType = newInputObject().name("addUserInput") .field(newInputObjectField().name("id").type(new GraphQLNonNull(GraphQLInt)).build()) .field(newInputObjectField().name("name").type(new GraphQLNonNull(Scalars.GraphQLString)).build()) .build(); updateUserInputType = newInputObject().name("updateUserInput") .field(newInputObjectField().name("id").type(new GraphQLNonNull(GraphQLInt)).build()) .field(newInputObjectField().name("name").type(GraphQLString).build()) .build(); deleteUserInputType = newInputObject().name("deleteUserInput") .field(newInputObjectField().name("id").type(new GraphQLNonNull(GraphQLInt)).build()) .build(); filterUserInputType = newInputObject().name("filterUserInput") .field(newInputObjectField().name("id").type(GraphQLInt).build()) .build(); }
public static GraphQLInputType asInputType(Class<?> type) { GraphQLInputObjectType.Builder builder = newInputObject() .name(type.getSimpleName()); // Gets the properties for the type for (PropertyDescriptor descriptor : BeanUtils.getPropertyDescriptors(type)) { if (descriptor.getReadMethod() != null) { String name = descriptor.getName(); String description = descriptor.getShortDescription(); GraphQLInputType scalarType = getScalarType(descriptor.getPropertyType()); if (scalarType != null) { builder = builder.field(field -> field .name(name) .description(description) .type(scalarType) ); } } } // OK return builder.build(); }
public GraphQLFieldDefinition mutation(String name, String fieldName, List<GraphQLInputObjectField> inputFields, List<GraphQLFieldDefinition> outputFields, DataFetcher dataFetcher) { GraphQLInputObjectType inputObjectType = newInputObject() .name(name + "Input") .fields(inputFields) .build(); GraphQLObjectType outputType = newObject() .name(name + "Payload") .fields(outputFields) .build(); return newFieldDefinition() .name(fieldName) .type(outputType) .argument(newArgument() .name("input") .type(nonNull(inputObjectType))) .dataFetcher(dataFetcher) .build(); }
private void createTypes() { roleType = newObject().name("role").description("A role") .field(newFieldDefinition().name("id").description("The id").type(GraphQLInt).build()) .field(newFieldDefinition().name("name").description("The name").type(GraphQLString).build()) .build(); addRoleInputType = newInputObject().name("addRoleInput") .field(newInputObjectField().name("id").type(new GraphQLNonNull(GraphQLInt)).build()) .field(newInputObjectField().name("name").type(new GraphQLNonNull(Scalars.GraphQLString)).build()) .build(); updateRoleInputType = newInputObject().name("updateRoleInput") .field(newInputObjectField().name("id").type(new GraphQLNonNull(GraphQLInt)).build()) .field(newInputObjectField().name("name").type(GraphQLString).build()) .build(); deleteRoleInputType = newInputObject().name("deleteRoleInput") .field(newInputObjectField().name("id").type(new GraphQLNonNull(GraphQLInt)).build()) .build(); filterRoleInputType = newInputObject().name("filterRoleInput") .field(newInputObjectField().name("id").type(GraphQLInt).build()) .build(); }
private GraphQLInputObjectType buildInputObjectType(BuildContext buildCtx, InputObjectTypeDefinition typeDefinition) { buildCtx.enterNode(typeDefinition); GraphQLInputObjectType.Builder builder = GraphQLInputObjectType.newInputObject(); builder.definition(typeDefinition); builder.name(typeDefinition.getName()); builder.description(schemaGeneratorHelper.buildDescription(typeDefinition, typeDefinition.getDescription())); List<InputObjectTypeExtensionDefinition> extensions = inputObjectTypeExtensions(typeDefinition, buildCtx); builder.withDirectives( buildDirectives(typeDefinition.getDirectives(), directivesOf(extensions), INPUT_OBJECT, buildCtx.getDirectiveDefinitions()) ); typeDefinition.getInputValueDefinitions().forEach(inputValue -> builder.field(buildInputField(buildCtx, inputValue))); extensions.forEach(extension -> extension.getInputValueDefinitions().forEach(inputValueDefinition -> { GraphQLInputObjectField inputField = buildInputField(buildCtx, inputValueDefinition); if (!builder.hasField(inputField.getName())) { builder.field(inputField); } })); GraphQLInputObjectType inputObjectType = builder.build(); inputObjectType = directiveBehaviour.onInputObjectType(inputObjectType, buildCtx.mkBehaviourParams()); return buildCtx.exitNode(inputObjectType); }
public GraphQLInputType buildGraphQLInputTypeFromMethodParam(DfsContext dfsContext, ResolvableTypeAccessor resolvableTypeAccessor) { Class<?> cls = resolvableTypeAccessor.resolve(); GraphQLInputType graphQLInputObjectType = (GraphQLInputType) objectTypeResolverMap.get(cls); if (graphQLInputObjectType == null) graphQLInputObjectType = (GraphQLInputType) createGraphQLFieldType(dfsContext, resolvableTypeAccessor, false); if (graphQLInputObjectType == null) { // -- class as input parameter final List<GraphQLInputObjectField> graphQLInputFieldDefinitions = new ArrayList<GraphQLInputObjectField>(); ReflectionUtils.getAllFields(cls).forEach(field -> { GraphQLInputObjectField definition = buildGraphQLInputObjectField(dfsContext, field, cls); if (definition != null) graphQLInputFieldDefinitions.add(definition); }); graphQLInputObjectType = newInputObject() .name(cls.getSimpleName()) .description(resolvableTypeAccessor.getDescription()) .fields(graphQLInputFieldDefinitions) .build(); } return graphQLInputObjectType; }
@Test public void optionalInput() { GraphQLObjectType object = GraphQLAnnotations.object(OptionalTest.class); GraphQLObjectInfoRetriever graphQLObjectInfoRetriever = new GraphQLObjectInfoRetriever(); GraphQLInputObjectType inputObject = new InputObjectBuilder(graphQLObjectInfoRetriever, new ParentalSearch(graphQLObjectInfoRetriever), new BreadthFirstSearch(graphQLObjectInfoRetriever), new GraphQLFieldRetriever()). getInputObjectBuilder(OptionalTest.class, GraphQLAnnotations.getInstance().getContainer()).build(); GraphQLObjectType mutation = GraphQLObjectType.newObject().name("mut").field(newFieldDefinition().name("test").type(object). argument(GraphQLArgument.newArgument().type(inputObject).name("input").build()).dataFetcher(environment -> { Map<String, String> input = environment.getArgument("input"); return new OptionalTest(Optional.ofNullable(input.get("empty")), Optional.ofNullable(input.get("nonempty"))); }).build()).build(); GraphQLSchema schema = newSchema().query(object).mutation(mutation).build(); GraphQL graphQL = GraphQL.newGraphQL(schema).build(); ExecutionResult result = graphQL.execute("mutation {test(input: {empty: \"test\"}) { empty nonempty } }", new OptionalTest()); assertTrue(result.getErrors().isEmpty()); Map<String, Object> v = (Map<String, Object>) ((Map<String, Object>) result.getData()).get("test"); assertEquals(v.get("empty"), "test"); assertNull(v.get("nonempty")); }