diff --git a/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/DataLoaderModule.java b/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/DataLoaderModule.java index c5c8060..9ad7819 100644 --- a/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/DataLoaderModule.java +++ b/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/DataLoaderModule.java @@ -22,7 +22,6 @@ import com.google.example.library.book.v1.ListBooksRequest; import com.google.inject.AbstractModule; import com.google.inject.Provides; -import com.google.inject.servlet.RequestScoped; import net.javacrumbs.futureconverter.java8guava.FutureConverter; import org.dataloader.BatchLoader; import org.dataloader.DataLoader; @@ -33,7 +32,6 @@ final class DataLoaderModule extends AbstractModule { @Provides - @RequestScoped DataLoaderRegistry dataLoaderRegistry(BookServiceGrpc.BookServiceFutureStub bookService) { // TODO: Use multibinder to modularize this, or automate this somehow @@ -48,14 +46,11 @@ DataLoaderRegistry dataLoaderRegistry(BookServiceGrpc.BookServiceFutureStub book .build()), resp -> resp.getBooksList(), MoreExecutors.directExecutor()); - // ServletScopes.transferRequest(() -> ... ); ?? return FutureConverter.toCompletableFuture(listenableFuture); }; DataLoaderRegistry registry = new DataLoaderRegistry(); - registry.register("books", new DataLoader<>(bookBatchLoader)); - return registry; } } diff --git a/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/GraphQlServer.java b/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/GraphQlServer.java index 633b886..99dd102 100644 --- a/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/GraphQlServer.java +++ b/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/GraphQlServer.java @@ -14,6 +14,8 @@ package com.google.api.graphql.examples.library.graphqlserver; +import com.google.api.graphql.examples.library.graphqlserver.client.ClientModule; +import com.google.api.graphql.examples.library.graphqlserver.schema.SchemaModule; import com.google.api.graphql.rejoiner.SchemaProviderModule; import com.google.inject.Guice; import com.google.inject.Injector; @@ -41,8 +43,7 @@ public class GraphQlServer { public static void main(String[] args) throws Exception { Server server = new Server(HTTP_PORT); - ServletContextHandler context = - new ServletContextHandler(server, "/", SESSIONS); + ServletContextHandler context = new ServletContextHandler(server, "/", SESSIONS); context.addEventListener( new GuiceServletContextListener() { @@ -58,12 +59,8 @@ protected void configureServlets() { new DataLoaderModule(), new SchemaProviderModule(), // Part of Rejoiner framework (Provides `@Schema // GraphQLSchema`) - new BookClientModule(), // Configures the Book gRPC client - new ShelfClientModule(), // Configures the Shelf gRPC client - new BookSchemaModule(), // Creates queries and mutations for the Book service - new ShelfSchemaModule(), // Creates queries and mutations for the Shelf service - new LibrarySchemaModule(), // Joins together Shelf and Book services - new SeedLibrarySchemaModule() // Fills the Shelf and Book services with data + new ClientModule(), // Installs all of the client modules + new SchemaModule() // Installs all of the schema modules ); } }); diff --git a/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/GraphQlServlet.java b/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/GraphQlServlet.java index d734b52..baf97b5 100644 --- a/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/GraphQlServlet.java +++ b/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/GraphQlServlet.java @@ -59,11 +59,12 @@ final class GraphQlServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { + DataLoaderRegistry dataLoaderRegistry = registryProvider.get(); Instrumentation instrumentation = new ChainedInstrumentation( Arrays.asList( GuavaListenableFutureSupport.listenableFutureInstrumentation(), - new DataLoaderDispatcherInstrumentation(registryProvider.get()), + new DataLoaderDispatcherInstrumentation(dataLoaderRegistry), new TracingInstrumentation())); GraphQL graphql = GraphQL.newGraphQL(schema).instrumentation(instrumentation).build(); @@ -81,13 +82,13 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws I .query(query) .operationName(operationName) .variables(variables) - .context(new Object()) + .context(dataLoaderRegistry) .build(); ExecutionResult executionResult = graphql.execute(executionInput); resp.setContentType("application/json"); resp.setStatus(HttpServletResponse.SC_OK); GSON.toJson(executionResult.toSpecification(), resp.getWriter()); - logger.info("stats: " + registryProvider.get().getStatistics()); + logger.info("stats: " + dataLoaderRegistry.getStatistics()); } private static Map getVariables(Object variables) { diff --git a/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/BookClientModule.java b/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/client/BookClientModule.java similarity index 94% rename from examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/BookClientModule.java rename to examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/client/BookClientModule.java index 4a27a4b..baa8465 100644 --- a/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/BookClientModule.java +++ b/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/client/BookClientModule.java @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package com.google.api.graphql.examples.library.graphqlserver; +package com.google.api.graphql.examples.library.graphqlserver.client; import com.google.example.library.book.v1.BookServiceGrpc; import com.google.inject.AbstractModule; diff --git a/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/client/ClientModule.java b/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/client/ClientModule.java new file mode 100644 index 0000000..7e0ec15 --- /dev/null +++ b/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/client/ClientModule.java @@ -0,0 +1,12 @@ +package com.google.api.graphql.examples.library.graphqlserver.client; + +import com.google.inject.AbstractModule; + +/** Installs all of the client modules. */ +public final class ClientModule extends AbstractModule { + @Override + protected void configure() { + install(new BookClientModule()); + install(new ShelfClientModule()); + } +} diff --git a/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/ShelfClientModule.java b/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/client/ShelfClientModule.java similarity index 94% rename from examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/ShelfClientModule.java rename to examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/client/ShelfClientModule.java index ab42993..faa49ad 100644 --- a/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/ShelfClientModule.java +++ b/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/client/ShelfClientModule.java @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package com.google.api.graphql.examples.library.graphqlserver; +package com.google.api.graphql.examples.library.graphqlserver.client; import com.google.example.library.shelf.v1.ShelfServiceGrpc; import com.google.inject.AbstractModule; diff --git a/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/BookSchemaModule.java b/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/schema/BookSchemaModule.java similarity index 79% rename from examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/BookSchemaModule.java rename to examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/schema/BookSchemaModule.java index c1bb135..ca63188 100644 --- a/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/BookSchemaModule.java +++ b/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/schema/BookSchemaModule.java @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package com.google.api.graphql.examples.library.graphqlserver; +package com.google.api.graphql.examples.library.graphqlserver.schema; import com.google.api.graphql.rejoiner.Mutation; import com.google.api.graphql.rejoiner.Query; @@ -20,6 +20,7 @@ import com.google.api.graphql.rejoiner.SchemaModule; import com.google.common.util.concurrent.ListenableFuture; import com.google.example.library.book.v1.*; +import graphql.schema.DataFetchingEnvironment; import net.javacrumbs.futureconverter.java8guava.FutureConverter; import org.dataloader.DataLoaderRegistry; @@ -28,9 +29,13 @@ final class BookSchemaModule extends SchemaModule { @Query("getBook") @RelayNode - ListenableFuture getBook(GetBookRequest request, DataLoaderRegistry dataLoaderRegistry) { + ListenableFuture getBook( + GetBookRequest request, DataFetchingEnvironment dataFetchingEnvironment) { return FutureConverter.toListenableFuture( - dataLoaderRegistry.getDataLoader("books").load(request.getId())); + dataFetchingEnvironment + .getContext() + .getDataLoader("books") + .load(request.getId())); } @Query("listBooks") diff --git a/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/LibrarySchemaModule.java b/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/schema/LibrarySchemaModule.java similarity index 84% rename from examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/LibrarySchemaModule.java rename to examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/schema/LibrarySchemaModule.java index 73beaad..212e843 100644 --- a/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/LibrarySchemaModule.java +++ b/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/schema/LibrarySchemaModule.java @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package com.google.api.graphql.examples.library.graphqlserver; +package com.google.api.graphql.examples.library.graphqlserver.schema; import com.google.api.graphql.rejoiner.Arg; import com.google.api.graphql.rejoiner.Mutation; @@ -25,6 +25,7 @@ import com.google.example.library.shelf.v1.GetShelfRequest; import com.google.example.library.shelf.v1.Shelf; import com.google.example.library.shelf.v1.ShelfServiceGrpc; +import graphql.schema.DataFetchingEnvironment; import net.javacrumbs.futureconverter.java8guava.FutureConverter; import org.dataloader.DataLoaderRegistry; @@ -47,8 +48,11 @@ Book createBookAndAddToShelf( } @SchemaModification(addField = "books", onType = Shelf.class) - ListenableFuture> shelfToBooks(Shelf shelf, DataLoaderRegistry dataLoaderRegistry) { + ListenableFuture> shelfToBooks(Shelf shelf, DataFetchingEnvironment environment) { return FutureConverter.toListenableFuture( - dataLoaderRegistry.getDataLoader("books").loadMany(shelf.getBookIdsList())); + environment + .getContext() + .getDataLoader("books") + .loadMany(shelf.getBookIdsList())); } } diff --git a/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/schema/SchemaModule.java b/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/schema/SchemaModule.java new file mode 100644 index 0000000..df8ff24 --- /dev/null +++ b/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/schema/SchemaModule.java @@ -0,0 +1,14 @@ +package com.google.api.graphql.examples.library.graphqlserver.schema; + +import com.google.inject.AbstractModule; + +/** Install all of the schema modules. */ +public final class SchemaModule extends AbstractModule { + @Override + protected void configure() { + install(new BookSchemaModule()); // Creates queries and mutations for the Book service + install(new ShelfSchemaModule()); // Creates queries and mutations for the Shelf service + install(new LibrarySchemaModule()); // Joins together Shelf and Book services + install(new SeedLibrarySchemaModule()); // Fills the Shelf and Book services with data + } +} diff --git a/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/SeedLibrarySchemaModule.java b/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/schema/SeedLibrarySchemaModule.java similarity index 98% rename from examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/SeedLibrarySchemaModule.java rename to examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/schema/SeedLibrarySchemaModule.java index f75c2ba..f256e66 100644 --- a/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/SeedLibrarySchemaModule.java +++ b/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/schema/SeedLibrarySchemaModule.java @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package com.google.api.graphql.examples.library.graphqlserver; +package com.google.api.graphql.examples.library.graphqlserver.schema; import com.google.api.graphql.rejoiner.Mutation; import com.google.api.graphql.rejoiner.SchemaModule; diff --git a/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/ShelfSchemaModule.java b/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/schema/ShelfSchemaModule.java similarity index 78% rename from examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/ShelfSchemaModule.java rename to examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/schema/ShelfSchemaModule.java index 05a55eb..1ee7f3f 100644 --- a/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/ShelfSchemaModule.java +++ b/examples/src/main/java/com/google/api/graphql/examples/library/graphqlserver/schema/ShelfSchemaModule.java @@ -12,20 +12,14 @@ // See the License for the specific language governing permissions and // limitations under the License. -package com.google.api.graphql.examples.library.graphqlserver; +package com.google.api.graphql.examples.library.graphqlserver.schema; import com.google.api.graphql.rejoiner.Mutation; import com.google.api.graphql.rejoiner.Query; import com.google.api.graphql.rejoiner.RelayNode; import com.google.api.graphql.rejoiner.SchemaModule; import com.google.common.util.concurrent.ListenableFuture; -import com.google.example.library.shelf.v1.CreateShelfRequest; -import com.google.example.library.shelf.v1.GetShelfRequest; -import com.google.example.library.shelf.v1.ListShelvesRequest; -import com.google.example.library.shelf.v1.ListShelvesResponse; -import com.google.example.library.shelf.v1.MergeShelvesRequest; -import com.google.example.library.shelf.v1.Shelf; -import com.google.example.library.shelf.v1.ShelfServiceGrpc; +import com.google.example.library.shelf.v1.*; /** A GraphQL {@link SchemaModule} backed by a gRPC service. */ final class ShelfSchemaModule extends SchemaModule {