package graphql; import graphql.schema.GraphQLObjectType; import graphql.schema.GraphQLSchema; import java.util.ArrayList; import java.util.List; import static graphql.Scalars.GraphQLInt; import static graphql.schema.GraphQLArgument.newArgument; import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition; import static graphql.schema.GraphQLSchema.newSchema; public class MutationSchema { public static class NumberHolder { int theNumber; public NumberHolder(int theNumber) { this.theNumber = theNumber; } public int getTheNumber() { return theNumber; } public void setTheNumber(int theNumber) { this.theNumber = theNumber; } } public static class SubscriptionRoot { List<String> result = new ArrayList<String>(); List<Integer> subscribers = new ArrayList<Integer>(); NumberHolder numberHolder; public SubscriptionRoot(int initalNumber) { this.numberHolder = new NumberHolder(initalNumber); } public void subscribeToNumberChanges(int clientId) { subscribers.add(clientId); } public void informSubscribers(int newNumber) { for (Integer subscriber : subscribers) { result.add("Alert client [" + subscriber + "] that number is now [" + newNumber + "]"); } } public NumberHolder changeNumber(int newNumber) { this.numberHolder.theNumber = newNumber; informSubscribers(newNumber); return this.numberHolder; } public NumberHolder failToChangeTheNumber(int newNumber) { throw new RuntimeException("Cannot change the number"); } public NumberHolder getNumberHolder() { return numberHolder; } public List<String> getResult() { return result; } } public static GraphQLObjectType numberHolderType = GraphQLObjectType.newObject() .name("NumberHolder") .field(newFieldDefinition() .name("theNumber") .type(GraphQLInt)) .build(); public static GraphQLObjectType queryType = GraphQLObjectType.newObject() .name("queryType") .field(newFieldDefinition() .name("numberHolder") .type(numberHolderType)) .build(); public static GraphQLObjectType mutationType = GraphQLObjectType.newObject() .name("mutationType") .field(newFieldDefinition() .name("changeTheNumber") .type(numberHolderType) .argument(newArgument() .name("newNumber") .type(GraphQLInt)) .dataFetcher(environment -> { Integer newNumber = environment.getArgument("newNumber"); SubscriptionRoot root = environment.getSource(); return root.changeNumber(newNumber); })) .field(newFieldDefinition() .name("failToChangeTheNumber") .type(numberHolderType) .argument(newArgument() .name("newNumber") .type(GraphQLInt)) .dataFetcher(environment -> { Integer newNumber = environment.getArgument("newNumber"); SubscriptionRoot root = environment.getSource(); return root.failToChangeTheNumber(newNumber); })) .build(); public static GraphQLObjectType subscriptionType = GraphQLObjectType.newObject() .name("subscriptionType") .field(newFieldDefinition() .name("changeNumberSubscribe") .type(numberHolderType) .argument(newArgument() .name("clientId") .type(GraphQLInt)) .dataFetcher(environment -> { Integer clientId = environment.getArgument("clientId"); SubscriptionRoot subscriptionRoot = environment.getSource(); subscriptionRoot.subscribeToNumberChanges(clientId); return subscriptionRoot.getNumberHolder(); })) .build(); public static GraphQLSchema schema = newSchema() .query(queryType) .mutation(mutationType) .subscription(subscriptionType) .build(); }