package graphql; import graphql.schema.*; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import static graphql.Scalars.GraphQLBoolean; import static graphql.Scalars.GraphQLString; import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition; import static graphql.schema.GraphQLInterfaceType.newInterface; import static graphql.schema.GraphQLObjectType.newObject; import static graphql.schema.GraphQLUnionType.newUnionType; public class GarfieldSchema { public interface Named { String getName(); } public static class Dog implements Named { private final String name; private final boolean barks; public Dog(String name, boolean barks) { this.name = name; this.barks = barks; } public boolean isBarks() { return barks; } @Override public String getName() { return name; } } public static class Cat implements Named { private final String name; private final boolean meows; public Cat(String name, boolean meows) { this.name = name; this.meows = meows; } public boolean isMeows() { return meows; } @Override public String getName() { return name; } } public static class Person implements Named { private final String name; private List<Dog> dogs; private List<Cat> cats; private List<Named> friends; public Person(String name) { this(name, Collections.emptyList(), Collections.emptyList(), Collections.emptyList()); } public Person(String name, List<Cat> cats, List<Dog> dogs, List<Named> friends) { this.name = name; this.dogs = dogs; this.cats = cats; this.friends = friends; } public List<Object> getPets() { List<Object> pets = new ArrayList<>(); pets.addAll(cats); pets.addAll(dogs); return pets; } @Override public String getName() { return name; } public List<Named> getFriends() { return friends; } } public static Cat garfield = new Cat("Garfield", false); public static Dog odie = new Dog("Odie", true); public static Person liz = new Person("Liz"); public static Person john = new Person("John", Arrays.asList(garfield), Arrays.asList(odie), Arrays.asList(liz, odie)); public static GraphQLInterfaceType NamedType = newInterface() .name("Named") .field(newFieldDefinition() .name("name") .type(GraphQLString)) .typeResolver(new TypeResolver() { @Override public GraphQLObjectType getType(TypeResolutionEnvironment env) { if (env.getObject() instanceof Dog) { return DogType; } if (env.getObject() instanceof Person) { return PersonType; } if (env.getObject() instanceof Cat) { return CatType; } return null; } }) .build(); public static GraphQLObjectType DogType = newObject() .name("Dog") .field(newFieldDefinition() .name("name") .type(GraphQLString)) .field(newFieldDefinition() .name("barks") .type(GraphQLBoolean)) .withInterface(NamedType) .build(); public static GraphQLObjectType CatType = newObject() .name("Cat") .field(newFieldDefinition() .name("name") .type(GraphQLString)) .field(newFieldDefinition() .name("meows") .type(GraphQLBoolean)) .withInterface(NamedType) .build(); public static GraphQLUnionType PetType = newUnionType() .name("Pet") .possibleType(CatType) .possibleType(DogType) .typeResolver(env -> { if (env.getObject() instanceof Cat) { return CatType; } if (env.getObject() instanceof Dog) { return DogType; } return null; }) .build(); public static GraphQLObjectType PersonType = newObject() .name("Person") .field(newFieldDefinition() .name("name") .type(GraphQLString)) .field(newFieldDefinition() .name("pets") .type(new GraphQLList(PetType))) .field(newFieldDefinition() .name("friends") .type(new GraphQLList(NamedType))) .withInterface(NamedType) .build(); public static GraphQLSchema GarfieldSchema = GraphQLSchema.newSchema() .query(PersonType) .build(); }