Skip to content

Commit f2bb4e0

Browse files
committed
Limit use of GraphQLQueryInvoker
1 parent 497adf0 commit f2bb4e0

File tree

5 files changed

+32
-113
lines changed

5 files changed

+32
-113
lines changed

graphql-java-kickstart/src/main/java/graphql/kickstart/execution/GraphQLQueryInvoker.java

Lines changed: 7 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,16 @@
11
package graphql.kickstart.execution;
22

3-
import graphql.ExecutionInput;
4-
import graphql.ExecutionResult;
5-
import graphql.GraphQL;
63
import graphql.execution.instrumentation.ChainedInstrumentation;
74
import graphql.execution.instrumentation.Instrumentation;
85
import graphql.execution.instrumentation.SimpleInstrumentation;
9-
import graphql.execution.instrumentation.dataloader.DataLoaderDispatcherInstrumentation;
106
import graphql.execution.instrumentation.dataloader.DataLoaderDispatcherInstrumentationOptions;
117
import graphql.execution.preparsed.NoOpPreparsedDocumentProvider;
128
import graphql.execution.preparsed.PreparsedDocumentProvider;
13-
import graphql.schema.GraphQLSchema;
149
import graphql.kickstart.execution.config.DefaultExecutionStrategyProvider;
1510
import 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;
2212
import java.util.List;
23-
import java.util.concurrent.CompletableFuture;
2413
import 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 {

graphql-java-servlet/src/main/java/graphql/servlet/AbstractGraphQLHttpServlet.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
package graphql.servlet;
22

3-
import graphql.schema.GraphQLFieldDefinition;
4-
import graphql.servlet.core.GraphQLMBean;
3+
import static graphql.kickstart.execution.GraphQLRequest.createQueryOnlyRequest;
4+
5+
import graphql.ExecutionResult;
56
import graphql.kickstart.execution.GraphQLObjectMapper;
67
import graphql.kickstart.execution.GraphQLQueryInvoker;
7-
import graphql.servlet.core.GraphQLServletListener;
88
import graphql.kickstart.execution.GraphQLRequest;
9+
import graphql.kickstart.execution.input.GraphQLSingleInvocationInput;
10+
import graphql.schema.GraphQLFieldDefinition;
11+
import graphql.servlet.core.GraphQLMBean;
12+
import graphql.servlet.core.GraphQLServletListener;
913
import graphql.servlet.input.GraphQLInvocationInputFactory;
1014
import java.util.ArrayList;
11-
import java.util.HashMap;
1215
import java.util.List;
1316
import java.util.Objects;
1417
import java.util.function.Consumer;
@@ -115,8 +118,10 @@ public String[] getMutations() {
115118
@Override
116119
public String executeQuery(String query) {
117120
try {
118-
return configuration.getObjectMapper().serializeResultAsJson(configuration.getQueryInvoker()
119-
.query(configuration.getInvocationInputFactory().create(new GraphQLRequest(query, new HashMap<>(), null))));
121+
GraphQLRequest graphQLRequest = createQueryOnlyRequest(query);
122+
GraphQLSingleInvocationInput invocationInput = configuration.getInvocationInputFactory().create(graphQLRequest);
123+
ExecutionResult result = configuration.getGraphQLInvoker().query(invocationInput).getResult();
124+
return configuration.getObjectMapper().serializeResultAsJson(result);
120125
} catch (Exception e) {
121126
return e.getMessage();
122127
}

graphql-java-servlet/src/main/java/graphql/servlet/GraphQLConfiguration.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package graphql.servlet;
22

3+
import graphql.kickstart.execution.GraphQLInvoker;
34
import graphql.kickstart.execution.GraphQLObjectMapper;
45
import graphql.kickstart.execution.GraphQLQueryInvoker;
56
import graphql.kickstart.execution.context.ContextSetting;
@@ -24,19 +25,22 @@ public class GraphQLConfiguration {
2425
private final GraphQLInvocationInputFactory invocationInputFactory;
2526
private final Supplier<BatchInputPreProcessor> batchInputPreProcessor;
2627
private final GraphQLQueryInvoker queryInvoker;
28+
private final GraphQLInvoker graphQLInvoker;
2729
private final GraphQLObjectMapper objectMapper;
2830
private final List<GraphQLServletListener> listeners;
2931
private final boolean asyncServletModeEnabled;
3032
private final Executor asyncExecutor;
3133
private final long subscriptionTimeout;
3234
private final ContextSetting contextSetting;
3335

34-
private GraphQLConfiguration(GraphQLInvocationInputFactory invocationInputFactory, GraphQLQueryInvoker queryInvoker,
36+
private GraphQLConfiguration(GraphQLInvocationInputFactory invocationInputFactory,
37+
GraphQLQueryInvoker queryInvoker,
3538
GraphQLObjectMapper objectMapper, List<GraphQLServletListener> listeners, boolean asyncServletModeEnabled,
3639
Executor asyncExecutor, long subscriptionTimeout, ContextSetting contextSetting,
3740
Supplier<BatchInputPreProcessor> batchInputPreProcessor) {
3841
this.invocationInputFactory = invocationInputFactory;
3942
this.queryInvoker = queryInvoker;
43+
this.graphQLInvoker = queryInvoker.toGraphQLInvoker();
4044
this.objectMapper = objectMapper;
4145
this.listeners = listeners;
4246
this.asyncServletModeEnabled = asyncServletModeEnabled;
@@ -62,8 +66,10 @@ public GraphQLInvocationInputFactory getInvocationInputFactory() {
6266
return invocationInputFactory;
6367
}
6468

65-
public GraphQLQueryInvoker getQueryInvoker() {
66-
return queryInvoker;
69+
public GraphQLQueryInvoker getQueryInvoker() { return queryInvoker; }
70+
71+
public GraphQLInvoker getGraphQLInvoker() {
72+
return graphQLInvoker;
6773
}
6874

6975
public GraphQLObjectMapper getObjectMapper() {

graphql-java-servlet/src/main/java/graphql/servlet/HttpRequestHandlerImpl.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
import static graphql.servlet.QueryResponseWriter.createWriter;
44

55
import graphql.GraphQLException;
6+
import graphql.kickstart.execution.GraphQLInvoker;
67
import graphql.kickstart.execution.GraphQLQueryResult;
7-
import graphql.kickstart.execution.GraphQLQueryInvoker;
88
import graphql.servlet.input.BatchInputPreProcessResult;
99
import graphql.servlet.input.BatchInputPreProcessor;
1010
import graphql.kickstart.execution.input.GraphQLBatchedInvocationInput;
@@ -19,11 +19,11 @@
1919
class HttpRequestHandlerImpl implements HttpRequestHandler {
2020

2121
private final GraphQLConfiguration configuration;
22-
private final GraphQLQueryInvoker queryInvoker;
22+
private final GraphQLInvoker graphQLInvoker;
2323

2424
HttpRequestHandlerImpl(GraphQLConfiguration configuration) {
2525
this.configuration = configuration;
26-
queryInvoker = configuration.getQueryInvoker();
26+
graphQLInvoker = configuration.getGraphQLInvoker();
2727
}
2828

2929
@Override
@@ -65,7 +65,7 @@ private void execute(GraphQLInvocationInput invocationInput, HttpServletRequest
6565
private GraphQLQueryResult invoke(GraphQLInvocationInput invocationInput, HttpServletRequest request,
6666
HttpServletResponse response) {
6767
if (invocationInput instanceof GraphQLSingleInvocationInput) {
68-
return queryInvoker.query(invocationInput);
68+
return graphQLInvoker.query(invocationInput);
6969
}
7070
return invokeBatched((GraphQLBatchedInvocationInput) invocationInput, request, response);
7171
}
@@ -76,7 +76,7 @@ private GraphQLQueryResult invokeBatched(GraphQLBatchedInvocationInput batchedIn
7676
BatchInputPreProcessor preprocessor = configuration.getBatchInputPreProcessor();
7777
BatchInputPreProcessResult result = preprocessor.preProcessBatch(batchedInvocationInput, request, response);
7878
if (result.isExecutable()) {
79-
return queryInvoker.query(result.getBatchedInvocationInput());
79+
return graphQLInvoker.query(result.getBatchedInvocationInput());
8080
}
8181

8282
return GraphQLQueryResult.createError(result.getStatusCode(), result.getStatusMessage());

graphql-java-servlet/src/main/java/graphql/servlet/input/GraphQLInvocationInputFactory.java

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -108,16 +108,6 @@ private GraphQLBatchedInvocationInput create(ContextSetting contextSetting, List
108108
);
109109
}
110110

111-
public GraphQLSingleInvocationInput create(GraphQLRequest graphQLRequest, Session session) {
112-
HandshakeRequest request = (HandshakeRequest) session.getUserProperties().get(HandshakeRequest.class.getName());
113-
return new GraphQLSingleInvocationInput(
114-
graphQLRequest,
115-
schemaProviderSupplier.get().getSchema(request),
116-
contextBuilderSupplier.get().build(session, request),
117-
rootObjectBuilderSupplier.get().build(request)
118-
);
119-
}
120-
121111
@Override
122112
public GraphQLSingleInvocationInput create(GraphQLRequest graphQLRequest, SubscriptionSession session) {
123113
HandshakeRequest request = (HandshakeRequest) session.getUserProperties().get(HandshakeRequest.class.getName());

0 commit comments

Comments
 (0)