Skip to content

Commit 80236b4

Browse files
committed
Introduced GraphQLInvoker to allow invocation from webflux version
1 parent f17ad46 commit 80236b4

File tree

45 files changed

+611
-404
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+611
-404
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ buildscript {
3434

3535
plugins {
3636
id 'net.researchgate.release' version '2.7.0'
37-
id 'io.franzbecker.gradle-lombok' version '3.1.0' apply false
37+
id 'io.franzbecker.gradle-lombok' version '3.2.0' apply false
3838
id "com.jfrog.artifactory" version "4.8.1" apply false
3939
}
4040

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package graphql.kickstart.execution;
2+
3+
public class DefaultGraphQLRootObjectBuilder extends StaticGraphQLRootObjectBuilder {
4+
5+
public DefaultGraphQLRootObjectBuilder() {
6+
super(new Object());
7+
}
8+
9+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package graphql.kickstart.execution;
2+
3+
import graphql.ExecutionInput;
4+
import graphql.ExecutionResult;
5+
import graphql.GraphQL;
6+
import graphql.kickstart.execution.context.ContextSetting;
7+
import graphql.kickstart.execution.input.GraphQLBatchedInvocationInput;
8+
import graphql.kickstart.execution.input.GraphQLInvocationInput;
9+
import graphql.kickstart.execution.input.GraphQLSingleInvocationInput;
10+
import java.security.AccessController;
11+
import java.security.PrivilegedAction;
12+
import java.util.List;
13+
import java.util.concurrent.CompletableFuture;
14+
import java.util.stream.Collectors;
15+
import javax.security.auth.Subject;
16+
import lombok.RequiredArgsConstructor;
17+
18+
@RequiredArgsConstructor
19+
public class GraphQLInvoker {
20+
21+
private final GraphQL graphQL;
22+
23+
public GraphQLQueryResult query(GraphQLInvocationInput invocationInput) {
24+
if (invocationInput instanceof GraphQLSingleInvocationInput) {
25+
return GraphQLQueryResult.create(query((GraphQLSingleInvocationInput) invocationInput));
26+
}
27+
GraphQLBatchedInvocationInput batchedInvocationInput = (GraphQLBatchedInvocationInput) invocationInput;
28+
return GraphQLQueryResult.create(query(batchedInvocationInput.getExecutionInputs(), batchedInvocationInput.getContextSetting()));
29+
}
30+
31+
private ExecutionResult query(GraphQLSingleInvocationInput singleInvocationInput) {
32+
return executeAsync(singleInvocationInput).join();
33+
}
34+
35+
public CompletableFuture<ExecutionResult> executeAsync(GraphQLSingleInvocationInput invocationInput) {
36+
if (Subject.getSubject(AccessController.getContext()) == null && invocationInput.getSubject().isPresent()) {
37+
return Subject
38+
.doAs(invocationInput.getSubject().get(), (PrivilegedAction<CompletableFuture<ExecutionResult>>) () -> {
39+
try {
40+
return query(invocationInput.getExecutionInput());
41+
} catch (Exception e) {
42+
throw new RuntimeException(e);
43+
}
44+
});
45+
}
46+
47+
return query(invocationInput.getExecutionInput());
48+
}
49+
50+
private CompletableFuture<ExecutionResult> query(ExecutionInput executionInput) {
51+
return graphQL.executeAsync(executionInput);
52+
}
53+
54+
private List<ExecutionResult> query(List<GraphQLSingleInvocationInput> batchedInvocationInput,
55+
ContextSetting contextSetting) {
56+
// List<ExecutionInput> executionIds = batchedInvocationInput.stream()
57+
// .map(GraphQLSingleInvocationInput::getExecutionInput)
58+
// .collect(Collectors.toList());
59+
// Supplier<Instrumentation> configuredInstrumentation = contextSetting
60+
// .configureInstrumentationForContext(getInstrumentation, executionIds, optionsSupplier.get());
61+
return batchedInvocationInput.stream()
62+
.map(this::executeAsync)
63+
//We want eager eval
64+
.collect(Collectors.toList())
65+
.stream()
66+
.map(CompletableFuture::join)
67+
.collect(Collectors.toList());
68+
}
69+
}

graphql-java-servlet/src/main/java/graphql/servlet/core/GraphQLObjectMapper.java renamed to graphql-java-kickstart/src/main/java/graphql/kickstart/execution/GraphQLObjectMapper.java

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package graphql.servlet.core;
1+
package graphql.kickstart.execution;
22

33
import static java.util.stream.Collectors.toList;
44

@@ -13,13 +13,11 @@
1313
import graphql.ExecutionResultImpl;
1414
import graphql.GraphQLError;
1515
import graphql.execution.ExecutionPath;
16-
import graphql.kickstart.execution.error.DefaultGraphQLErrorHandler;
17-
import graphql.kickstart.execution.error.GraphQLErrorHandler;
1816
import graphql.kickstart.execution.config.ConfiguringObjectMapperProvider;
1917
import graphql.kickstart.execution.config.ObjectMapperConfigurer;
2018
import graphql.kickstart.execution.config.ObjectMapperProvider;
21-
import graphql.kickstart.execution.GraphQLRequest;
22-
import graphql.kickstart.execution.VariablesDeserializer;
19+
import graphql.kickstart.execution.error.DefaultGraphQLErrorHandler;
20+
import graphql.kickstart.execution.error.GraphQLErrorHandler;
2321
import java.io.IOException;
2422
import java.io.InputStream;
2523
import java.io.Writer;
@@ -28,7 +26,6 @@
2826
import java.util.List;
2927
import java.util.Map;
3028
import java.util.function.Supplier;
31-
import javax.servlet.http.Part;
3229

3330
/**
3431
* @author Andrew Potter
@@ -182,9 +179,9 @@ public Map<String, Object> deserializeVariables(String variables) {
182179
}
183180
}
184181

185-
public Map<String, List<String>> deserializeMultipartMap(Part part) {
182+
public Map<String, List<String>> deserializeMultipartMap(InputStream inputStream) {
186183
try {
187-
return getJacksonMapper().readValue(part.getInputStream(), MULTIPART_MAP_TYPE_REFERENCE);
184+
return getJacksonMapper().readValue(inputStream, MULTIPART_MAP_TYPE_REFERENCE);
188185
} catch (IOException e) {
189186
throw new RuntimeException(e);
190187
}

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,7 @@ public List<ExecutionResult> query(List<GraphQLSingleInvocationInput> batchedInv
7272
.map(GraphQLSingleInvocationInput::getExecutionInput)
7373
.collect(Collectors.toList());
7474
Supplier<Instrumentation> configuredInstrumentation = contextSetting
75-
.configureInstrumentationForContext(getInstrumentation, executionIds,
76-
optionsSupplier.get());
75+
.configureInstrumentationForContext(getInstrumentation, executionIds, optionsSupplier.get());
7776
return batchedInvocationInput.stream()
7877
.map(input -> this.queryAsync(input, configuredInstrumentation))
7978
//We want eager eval
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package graphql.kickstart.execution;
2+
3+
public interface GraphQLRootObjectBuilder {
4+
5+
/**
6+
* @return the graphql root object
7+
*/
8+
Object build();
9+
10+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package graphql.kickstart.execution;
2+
3+
public class StaticGraphQLRootObjectBuilder implements GraphQLRootObjectBuilder {
4+
5+
private final Object rootObject;
6+
7+
public StaticGraphQLRootObjectBuilder(Object rootObject) {
8+
this.rootObject = rootObject;
9+
}
10+
11+
@Override
12+
public Object build() {
13+
return rootObject;
14+
}
15+
16+
protected Object getRootObject() {
17+
return rootObject;
18+
}
19+
20+
}
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
package graphql.servlet.config;
1+
package graphql.kickstart.execution.config;
22

33
import graphql.schema.GraphQLSchema;
4-
import javax.servlet.http.HttpServletRequest;
5-
import javax.websocket.server.HandshakeRequest;
64

75
/**
86
* @author Andrew Potter
@@ -21,24 +19,14 @@ public DefaultGraphQLSchemaProvider(GraphQLSchema schema, GraphQLSchema readOnly
2119
this.readOnlySchema = readOnlySchema;
2220
}
2321

24-
25-
@Override
26-
public GraphQLSchema getSchema(HttpServletRequest request) {
27-
return getSchema();
28-
}
29-
30-
@Override
31-
public GraphQLSchema getSchema(HandshakeRequest request) {
32-
return getSchema();
33-
}
34-
3522
@Override
3623
public GraphQLSchema getSchema() {
3724
return schema;
3825
}
3926

4027
@Override
41-
public GraphQLSchema getReadOnlySchema(HttpServletRequest request) {
28+
public GraphQLSchema getReadOnlySchema() {
4229
return readOnlySchema;
4330
}
31+
4432
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package graphql.kickstart.execution.config;
2+
3+
import graphql.GraphQL;
4+
import graphql.execution.instrumentation.ChainedInstrumentation;
5+
import graphql.execution.instrumentation.Instrumentation;
6+
import graphql.execution.instrumentation.SimpleInstrumentation;
7+
import graphql.execution.instrumentation.dataloader.DataLoaderDispatcherInstrumentation;
8+
import graphql.execution.preparsed.NoOpPreparsedDocumentProvider;
9+
import graphql.execution.preparsed.PreparsedDocumentProvider;
10+
import graphql.schema.GraphQLSchema;
11+
import java.util.function.Supplier;
12+
13+
public class GraphQLBuilder {
14+
15+
private Supplier<ExecutionStrategyProvider> executionStrategyProviderSupplier = DefaultExecutionStrategyProvider::new;
16+
private Supplier<PreparsedDocumentProvider> preparsedDocumentProviderSupplier = () -> NoOpPreparsedDocumentProvider.INSTANCE;
17+
private Supplier<Instrumentation> instrumentationSupplier = () -> SimpleInstrumentation.INSTANCE;
18+
19+
public GraphQLBuilder executionStrategyProvider(Supplier<ExecutionStrategyProvider> supplier) {
20+
executionStrategyProviderSupplier = supplier;
21+
return this;
22+
}
23+
24+
public GraphQLBuilder preparsedDocumentProvider(Supplier<PreparsedDocumentProvider> supplier) {
25+
preparsedDocumentProviderSupplier = supplier;
26+
return this;
27+
}
28+
29+
public GraphQLBuilder instrumentation(Supplier<Instrumentation> supplier) {
30+
instrumentationSupplier = supplier;
31+
return this;
32+
}
33+
34+
public GraphQL build(GraphQLSchemaProvider schemaProvider) {
35+
return build(schemaProvider.getSchema());
36+
}
37+
38+
public GraphQL build(GraphQLSchema schema) {
39+
ExecutionStrategyProvider executionStrategyProvider = executionStrategyProviderSupplier.get();
40+
GraphQL.Builder builder = GraphQL.newGraphQL(schema)
41+
.queryExecutionStrategy(executionStrategyProvider.getQueryExecutionStrategy())
42+
.mutationExecutionStrategy(executionStrategyProvider.getMutationExecutionStrategy())
43+
.subscriptionExecutionStrategy(executionStrategyProvider.getSubscriptionExecutionStrategy())
44+
.preparsedDocumentProvider(preparsedDocumentProviderSupplier.get());
45+
Instrumentation instrumentation = instrumentationSupplier.get();
46+
builder.instrumentation(instrumentation);
47+
if (containsDispatchInstrumentation(instrumentation)) {
48+
builder.doNotAddDefaultInstrumentations();
49+
}
50+
return builder.build();
51+
}
52+
53+
private boolean containsDispatchInstrumentation(Instrumentation instrumentation) {
54+
if (instrumentation instanceof ChainedInstrumentation) {
55+
return ((ChainedInstrumentation) instrumentation).getInstrumentations().stream()
56+
.anyMatch(this::containsDispatchInstrumentation);
57+
}
58+
return instrumentation instanceof DataLoaderDispatcherInstrumentation;
59+
}
60+
61+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package graphql.kickstart.execution.config;
2+
3+
import graphql.schema.GraphQLObjectType;
4+
import graphql.schema.GraphQLSchema;
5+
6+
public interface GraphQLSchemaProvider {
7+
8+
static GraphQLSchema copyReadOnly(GraphQLSchema schema) {
9+
return GraphQLSchema.newSchema(schema)
10+
.mutation((GraphQLObjectType) null)
11+
.build();
12+
}
13+
14+
/**
15+
* @return a schema for handling mbean calls.
16+
*/
17+
GraphQLSchema getSchema();
18+
19+
GraphQLSchema getReadOnlySchema();
20+
21+
}

0 commit comments

Comments
 (0)