11package graphql .kickstart .execution ;
22
3- import graphql .ExecutionInput ;
4- import graphql .ExecutionResult ;
5- import graphql .GraphQL ;
63import graphql .execution .instrumentation .ChainedInstrumentation ;
74import graphql .execution .instrumentation .Instrumentation ;
85import graphql .execution .instrumentation .SimpleInstrumentation ;
9- import graphql .execution .instrumentation .dataloader .DataLoaderDispatcherInstrumentation ;
106import graphql .execution .instrumentation .dataloader .DataLoaderDispatcherInstrumentationOptions ;
117import graphql .execution .preparsed .NoOpPreparsedDocumentProvider ;
128import graphql .execution .preparsed .PreparsedDocumentProvider ;
13- import graphql .schema .GraphQLSchema ;
149import graphql .kickstart .execution .config .DefaultExecutionStrategyProvider ;
1510import graphql .kickstart .execution .config .ExecutionStrategyProvider ;
16- import graphql .kickstart .execution .context .ContextSetting ;
17- import graphql .kickstart .execution .input .GraphQLBatchedInvocationInput ;
18- import graphql .kickstart .execution .input .GraphQLInvocationInput ;
19- import graphql .kickstart .execution .input .GraphQLSingleInvocationInput ;
20- import java .security .AccessController ;
21- import java .security .PrivilegedAction ;
11+ import graphql .kickstart .execution .config .GraphQLBuilder ;
2212import java .util .List ;
23- import java .util .concurrent .CompletableFuture ;
2413import java .util .function .Supplier ;
25- import java .util .stream .Collectors ;
26- import javax .security .auth .Subject ;
2714
2815/**
2916 * @author Andrew Potter
@@ -49,81 +36,12 @@ public static Builder newBuilder() {
4936 return new Builder ();
5037 }
5138
52- public GraphQLQueryResult query (GraphQLInvocationInput invocationInput ) {
53- if (invocationInput instanceof GraphQLSingleInvocationInput ) {
54- return GraphQLQueryResult .create (query ((GraphQLSingleInvocationInput ) invocationInput ));
55- }
56- GraphQLBatchedInvocationInput batchedInvocationInput = (GraphQLBatchedInvocationInput ) invocationInput ;
57- return GraphQLQueryResult .create (query (batchedInvocationInput .getInvocationInputs (), batchedInvocationInput .getContextSetting ()));
58- }
59-
60- public ExecutionResult query (GraphQLSingleInvocationInput singleInvocationInput ) {
61- return queryAsync (singleInvocationInput , getInstrumentation ).join ();
62- }
63-
64- private CompletableFuture <ExecutionResult > queryAsync (GraphQLSingleInvocationInput singleInvocationInput ,
65- Supplier <Instrumentation > configuredInstrumentation ) {
66- return query (singleInvocationInput , configuredInstrumentation , singleInvocationInput .getExecutionInput ());
67- }
68-
69- public List <ExecutionResult > query (List <GraphQLSingleInvocationInput > batchedInvocationInput ,
70- ContextSetting contextSetting ) {
71- List <ExecutionInput > executionIds = batchedInvocationInput .stream ()
72- .map (GraphQLSingleInvocationInput ::getExecutionInput )
73- .collect (Collectors .toList ());
74- Supplier <Instrumentation > configuredInstrumentation = contextSetting
75- .configureInstrumentationForContext (getInstrumentation , executionIds , optionsSupplier .get ());
76- return batchedInvocationInput .stream ()
77- .map (input -> this .queryAsync (input , configuredInstrumentation ))
78- //We want eager eval
79- .collect (Collectors .toList ())
80- .stream ()
81- .map (CompletableFuture ::join )
82- .collect (Collectors .toList ());
83- }
84-
85- private GraphQL newGraphQL (GraphQLSchema schema , Supplier <Instrumentation > configuredInstrumentation ) {
86- ExecutionStrategyProvider executionStrategyProvider = getExecutionStrategyProvider .get ();
87- GraphQL .Builder builder = GraphQL .newGraphQL (schema )
88- .queryExecutionStrategy (executionStrategyProvider .getQueryExecutionStrategy ())
89- .mutationExecutionStrategy (executionStrategyProvider .getMutationExecutionStrategy ())
90- .subscriptionExecutionStrategy (executionStrategyProvider .getSubscriptionExecutionStrategy ())
91- .preparsedDocumentProvider (getPreparsedDocumentProvider .get ());
92- Instrumentation instrumentation = configuredInstrumentation .get ();
93- builder .instrumentation (instrumentation );
94- if (containsDispatchInstrumentation (instrumentation )) {
95- builder .doNotAddDefaultInstrumentations ();
96- }
97- return builder .build ();
98- }
99-
100- private boolean containsDispatchInstrumentation (Instrumentation instrumentation ) {
101- if (instrumentation instanceof ChainedInstrumentation ) {
102- return ((ChainedInstrumentation ) instrumentation ).getInstrumentations ().stream ()
103- .anyMatch (this ::containsDispatchInstrumentation );
104- }
105- return instrumentation instanceof DataLoaderDispatcherInstrumentation ;
106- }
107-
108- private CompletableFuture <ExecutionResult > query (GraphQLSingleInvocationInput invocationInput ,
109- Supplier <Instrumentation > configuredInstrumentation , ExecutionInput executionInput ) {
110- if (Subject .getSubject (AccessController .getContext ()) == null && invocationInput .getSubject ().isPresent ()) {
111- return Subject
112- .doAs (invocationInput .getSubject ().get (), (PrivilegedAction <CompletableFuture <ExecutionResult >>) () -> {
113- try {
114- return query (invocationInput .getSchema (), executionInput , configuredInstrumentation );
115- } catch (Exception e ) {
116- throw new RuntimeException (e );
117- }
118- });
119- }
120-
121- return query (invocationInput .getSchema (), executionInput , configuredInstrumentation );
122- }
123-
124- private CompletableFuture <ExecutionResult > query (GraphQLSchema schema , ExecutionInput executionInput ,
125- Supplier <Instrumentation > configuredInstrumentation ) {
126- return newGraphQL (schema , configuredInstrumentation ).executeAsync (executionInput );
39+ public GraphQLInvoker toGraphQLInvoker () {
40+ GraphQLBuilder graphQLBuilder = new GraphQLBuilder ()
41+ .executionStrategyProvider (getExecutionStrategyProvider )
42+ .instrumentation (getInstrumentation )
43+ .preparsedDocumentProvider (getPreparsedDocumentProvider );
44+ return new GraphQLInvoker (graphQLBuilder , new BatchedDataLoaderGraphQLBuilder (optionsSupplier ));
12745 }
12846
12947 public static class Builder {
0 commit comments