From a7ae98d1beed863a5280252d2244ef38317223e1 Mon Sep 17 00:00:00 2001 From: oliemansm <oliemans@scopisto.com> Date: Sat, 22 Jan 2022 21:23:26 +0100 Subject: [PATCH 1/5] fix: support new graphql context fixes #393 --- build.gradle | 6 +-- gradle.properties | 2 +- .../execution/GraphQLInvokerSubjectProxy.java | 32 ---------------- .../execution/context/ContextSetting.java | 2 +- .../context/DefaultGraphQLContext.java | 23 ++++++------ .../context/DefaultGraphQLContextBuilder.java | 2 +- .../context/GraphQLContextBuilder.java | 2 +- ...text.java => GraphQLKickstartContext.java} | 10 ++--- .../input/GraphQLSingleInvocationInput.java | 20 ++-------- .../input/PerQueryBatchedInvocationInput.java | 4 +- .../PerRequestBatchedInvocationInput.java | 6 +-- .../context/DefaultGraphQLServletContext.java | 30 ++++++++------- .../DefaultGraphQLServletContextBuilder.java | 6 +-- .../DefaultGraphQLWebSocketContext.java | 37 +++++++++---------- .../context/GraphQLServletContext.java | 4 +- .../context/GraphQLServletContextBuilder.java | 6 +-- .../context/GraphQLWebSocketContext.java | 4 +- .../servlet/DataLoaderDispatchingSpec.groovy | 17 +++++---- .../servlet/OsgiGraphQLHttpServletSpec.groovy | 7 +--- 19 files changed, 86 insertions(+), 134 deletions(-) delete mode 100644 graphql-java-kickstart/src/main/java/graphql/kickstart/execution/GraphQLInvokerSubjectProxy.java rename graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/{GraphQLContext.java => GraphQLKickstartContext.java} (65%) diff --git a/build.gradle b/build.gradle index c73054a3..d88a0285 100644 --- a/build.gradle +++ b/build.gradle @@ -92,9 +92,9 @@ subprojects { jacocoTestReport { reports { - xml.enabled = true - html.enabled = false - csv.enabled = false + xml.required = true + html.required = false + csv.required = false } } diff --git a/gradle.properties b/gradle.properties index 0b1660ce..d65b7e84 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -version=12.0.1-SNAPSHOT +version=13.0.0-SNAPSHOT group=com.graphql-java-kickstart PROJECT_NAME=graphql-java-servlet PROJECT_DESC=GraphQL Java Kickstart diff --git a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/GraphQLInvokerSubjectProxy.java b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/GraphQLInvokerSubjectProxy.java deleted file mode 100644 index a133bcaf..00000000 --- a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/GraphQLInvokerSubjectProxy.java +++ /dev/null @@ -1,32 +0,0 @@ -package graphql.kickstart.execution; - -import graphql.ExecutionInput; -import graphql.ExecutionResult; -import graphql.GraphQL; -import graphql.kickstart.execution.context.GraphQLContext; -import java.security.AccessController; -import java.security.PrivilegedAction; -import java.util.concurrent.CompletableFuture; -import javax.security.auth.Subject; - -public class GraphQLInvokerSubjectProxy implements GraphQLInvokerProxy { - - @Override - public CompletableFuture<ExecutionResult> executeAsync( - GraphQL graphQL, ExecutionInput executionInput) { - GraphQLContext context = (GraphQLContext) executionInput.getContext(); - if (Subject.getSubject(AccessController.getContext()) == null - && context.getSubject().isPresent()) { - return context - .getSubject() - .map(it -> Subject.doAs(it, doAction(graphQL, executionInput))) - .orElseGet(() -> graphQL.executeAsync(executionInput)); - } - return graphQL.executeAsync(executionInput); - } - - private PrivilegedAction<CompletableFuture<ExecutionResult>> doAction( - GraphQL graphQL, ExecutionInput executionInput) { - return () -> graphQL.executeAsync(executionInput); - } -} diff --git a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/ContextSetting.java b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/ContextSetting.java index 2ac46c54..c9d1060f 100644 --- a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/ContextSetting.java +++ b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/ContextSetting.java @@ -47,7 +47,7 @@ public enum ContextSetting { public GraphQLBatchedInvocationInput getBatch( List<GraphQLRequest> requests, GraphQLSchema schema, - Supplier<GraphQLContext> contextSupplier, + Supplier<GraphQLKickstartContext> contextSupplier, Object root) { switch (this) { case PER_QUERY_WITH_INSTRUMENTATION: diff --git a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/DefaultGraphQLContext.java b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/DefaultGraphQLContext.java index f94b32b7..90532f9e 100644 --- a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/DefaultGraphQLContext.java +++ b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/DefaultGraphQLContext.java @@ -1,37 +1,36 @@ package graphql.kickstart.execution.context; +import java.util.HashMap; +import java.util.Map; import java.util.Objects; -import java.util.Optional; -import javax.security.auth.Subject; import org.dataloader.DataLoaderRegistry; /** * An object for the DefaultGraphQLContextBuilder to return. Can be extended to include more * context. */ -public class DefaultGraphQLContext implements GraphQLContext { - - private final Subject subject; +public class DefaultGraphQLContext implements GraphQLKickstartContext { private final DataLoaderRegistry dataLoaderRegistry; - public DefaultGraphQLContext(DataLoaderRegistry dataLoaderRegistry, Subject subject) { + public DefaultGraphQLContext(DataLoaderRegistry dataLoaderRegistry) { this.dataLoaderRegistry = Objects.requireNonNull(dataLoaderRegistry, "dataLoaderRegistry is required"); - this.subject = subject; } public DefaultGraphQLContext() { - this(new DataLoaderRegistry(), null); + this(new DataLoaderRegistry()); } @Override - public Optional<Subject> getSubject() { - return Optional.ofNullable(subject); + public DataLoaderRegistry getDataLoaderRegistry() { + return dataLoaderRegistry; } @Override - public DataLoaderRegistry getDataLoaderRegistry() { - return dataLoaderRegistry; + public Map<Object, Object> getMapOfContext() { + Map<Object, Object> map = new HashMap<>(); + map.put(DataLoaderRegistry.class, dataLoaderRegistry); + return map; } } diff --git a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/DefaultGraphQLContextBuilder.java b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/DefaultGraphQLContextBuilder.java index 653ee8ad..47d5effb 100644 --- a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/DefaultGraphQLContextBuilder.java +++ b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/DefaultGraphQLContextBuilder.java @@ -4,7 +4,7 @@ public class DefaultGraphQLContextBuilder implements GraphQLContextBuilder { @Override - public GraphQLContext build() { + public GraphQLKickstartContext build() { return new DefaultGraphQLContext(); } } diff --git a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/GraphQLContextBuilder.java b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/GraphQLContextBuilder.java index bb76930c..d0a74530 100644 --- a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/GraphQLContextBuilder.java +++ b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/GraphQLContextBuilder.java @@ -3,5 +3,5 @@ public interface GraphQLContextBuilder { /** @return the graphql context */ - GraphQLContext build(); + GraphQLKickstartContext build(); } diff --git a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/GraphQLContext.java b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/GraphQLKickstartContext.java similarity index 65% rename from graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/GraphQLContext.java rename to graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/GraphQLKickstartContext.java index 7efc3615..019ce433 100644 --- a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/GraphQLContext.java +++ b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/GraphQLKickstartContext.java @@ -1,17 +1,15 @@ package graphql.kickstart.execution.context; -import java.util.Optional; -import javax.security.auth.Subject; +import java.util.Map; import lombok.NonNull; import org.dataloader.DataLoaderRegistry; /** Represents the context required by the servlet to execute a GraphQL request. */ -public interface GraphQLContext { - - /** @return the subject to execute the query as. */ - Optional<Subject> getSubject(); +public interface GraphQLKickstartContext { /** @return the Dataloader registry to use for the execution. Must not return <code>null</code> */ @NonNull DataLoaderRegistry getDataLoaderRegistry(); + + Map<Object, Object> getMapOfContext(); } diff --git a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/input/GraphQLSingleInvocationInput.java b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/input/GraphQLSingleInvocationInput.java index f3e2fdb2..75ffd440 100644 --- a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/input/GraphQLSingleInvocationInput.java +++ b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/input/GraphQLSingleInvocationInput.java @@ -5,12 +5,9 @@ import graphql.ExecutionInput; import graphql.execution.ExecutionId; import graphql.kickstart.execution.GraphQLRequest; -import graphql.kickstart.execution.context.GraphQLContext; +import graphql.kickstart.execution.context.GraphQLKickstartContext; import graphql.schema.GraphQLSchema; -import java.util.Collections; import java.util.List; -import java.util.Optional; -import javax.security.auth.Subject; /** Represents a single GraphQL execution. */ public class GraphQLSingleInvocationInput implements GraphQLInvocationInput { @@ -19,13 +16,10 @@ public class GraphQLSingleInvocationInput implements GraphQLInvocationInput { private final ExecutionInput executionInput; - private final Subject subject; - public GraphQLSingleInvocationInput( - GraphQLRequest request, GraphQLSchema schema, GraphQLContext context, Object root) { + GraphQLRequest request, GraphQLSchema schema, GraphQLKickstartContext context, Object root) { this.schema = schema; this.executionInput = createExecutionInput(request, context, root); - subject = context.getSubject().orElse(null); } /** @return the schema to use to execute this query. */ @@ -33,18 +27,13 @@ public GraphQLSchema getSchema() { return schema; } - /** @return a subject to execute the query as. */ - public Optional<Subject> getSubject() { - return Optional.ofNullable(subject); - } - private ExecutionInput createExecutionInput( - GraphQLRequest graphQLRequest, GraphQLContext context, Object root) { + GraphQLRequest graphQLRequest, GraphQLKickstartContext context, Object root) { return ExecutionInput.newExecutionInput() .query(graphQLRequest.getQuery()) .operationName(graphQLRequest.getOperationName()) .context(context) - .graphQLContext(Collections.singletonMap(context.getClass(), context)) + .graphQLContext(context.getMapOfContext()) .root(root) .variables(graphQLRequest.getVariables()) .extensions(graphQLRequest.getExtensions()) @@ -61,5 +50,4 @@ public ExecutionInput getExecutionInput() { public List<String> getQueries() { return singletonList(executionInput.getQuery()); } - } diff --git a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/input/PerQueryBatchedInvocationInput.java b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/input/PerQueryBatchedInvocationInput.java index 99adcf5f..2ccc20d5 100644 --- a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/input/PerQueryBatchedInvocationInput.java +++ b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/input/PerQueryBatchedInvocationInput.java @@ -4,7 +4,7 @@ import graphql.kickstart.execution.GraphQLRequest; import graphql.kickstart.execution.context.ContextSetting; -import graphql.kickstart.execution.context.GraphQLContext; +import graphql.kickstart.execution.context.GraphQLKickstartContext; import graphql.schema.GraphQLSchema; import java.util.List; import java.util.function.Supplier; @@ -21,7 +21,7 @@ public class PerQueryBatchedInvocationInput implements GraphQLBatchedInvocationI public PerQueryBatchedInvocationInput( List<GraphQLRequest> requests, GraphQLSchema schema, - Supplier<GraphQLContext> contextSupplier, + Supplier<GraphQLKickstartContext> contextSupplier, Object root, ContextSetting contextSetting) { invocationInputs = diff --git a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/input/PerRequestBatchedInvocationInput.java b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/input/PerRequestBatchedInvocationInput.java index 02bdae4c..e14e933d 100644 --- a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/input/PerRequestBatchedInvocationInput.java +++ b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/input/PerRequestBatchedInvocationInput.java @@ -4,7 +4,7 @@ import graphql.kickstart.execution.GraphQLRequest; import graphql.kickstart.execution.context.ContextSetting; -import graphql.kickstart.execution.context.GraphQLContext; +import graphql.kickstart.execution.context.GraphQLKickstartContext; import graphql.schema.GraphQLSchema; import java.util.List; import java.util.function.Supplier; @@ -20,10 +20,10 @@ public class PerRequestBatchedInvocationInput implements GraphQLBatchedInvocatio public PerRequestBatchedInvocationInput( List<GraphQLRequest> requests, GraphQLSchema schema, - Supplier<GraphQLContext> contextSupplier, + Supplier<GraphQLKickstartContext> contextSupplier, Object root, ContextSetting contextSetting) { - GraphQLContext context = contextSupplier.get(); + GraphQLKickstartContext context = contextSupplier.get(); invocationInputs = requests.stream() .map(request -> new GraphQLSingleInvocationInput(request, schema, context, root)) diff --git a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContext.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContext.java index 4c2d4f66..36332142 100644 --- a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContext.java +++ b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContext.java @@ -1,6 +1,7 @@ package graphql.kickstart.servlet.context; import graphql.kickstart.execution.context.DefaultGraphQLContext; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -19,20 +20,19 @@ public class DefaultGraphQLServletContext extends DefaultGraphQLContext protected DefaultGraphQLServletContext( DataLoaderRegistry dataLoaderRegistry, - Subject subject, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) { - super(dataLoaderRegistry, subject); + super(dataLoaderRegistry); this.httpServletRequest = httpServletRequest; this.httpServletResponse = httpServletResponse; } - public static Builder createServletContext(DataLoaderRegistry registry, Subject subject) { - return new Builder(registry, subject); + public static Builder createServletContext(DataLoaderRegistry registry) { + return new Builder(registry); } public static Builder createServletContext() { - return new Builder(new DataLoaderRegistry(), null); + return new Builder(new DataLoaderRegistry()); } @Override @@ -59,21 +59,28 @@ public Map<String, List<Part>> getParts() { return httpServletRequest.getParts().stream().collect(Collectors.groupingBy(Part::getName)); } + @Override + public Map<Object, Object> getMapOfContext() { + Map<Object, Object> map = new HashMap<>(); + map.put(DataLoaderRegistry.class, getDataLoaderRegistry()); + map.put(HttpServletRequest.class, httpServletRequest); + map.put(HttpServletResponse.class, httpServletResponse); + return map; + } + public static class Builder { private HttpServletRequest httpServletRequest; private HttpServletResponse httpServletResponse; private DataLoaderRegistry dataLoaderRegistry; - private Subject subject; - private Builder(DataLoaderRegistry dataLoaderRegistry, Subject subject) { + private Builder(DataLoaderRegistry dataLoaderRegistry) { this.dataLoaderRegistry = dataLoaderRegistry; - this.subject = subject; } public DefaultGraphQLServletContext build() { return new DefaultGraphQLServletContext( - dataLoaderRegistry, subject, httpServletRequest, httpServletResponse); + dataLoaderRegistry, httpServletRequest, httpServletResponse); } public Builder with(HttpServletRequest httpServletRequest) { @@ -86,11 +93,6 @@ public Builder with(DataLoaderRegistry dataLoaderRegistry) { return this; } - public Builder with(Subject subject) { - this.subject = subject; - return this; - } - public Builder with(HttpServletResponse httpServletResponse) { this.httpServletResponse = httpServletResponse; return this; diff --git a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContextBuilder.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContextBuilder.java index 80cee6cb..126fc139 100644 --- a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContextBuilder.java +++ b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContextBuilder.java @@ -1,7 +1,7 @@ package graphql.kickstart.servlet.context; import graphql.kickstart.execution.context.DefaultGraphQLContextBuilder; -import graphql.kickstart.execution.context.GraphQLContext; +import graphql.kickstart.execution.context.GraphQLKickstartContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.websocket.Session; @@ -12,12 +12,12 @@ public class DefaultGraphQLServletContextBuilder extends DefaultGraphQLContextBu implements GraphQLServletContextBuilder { @Override - public GraphQLContext build(HttpServletRequest request, HttpServletResponse response) { + public GraphQLKickstartContext build(HttpServletRequest request, HttpServletResponse response) { return DefaultGraphQLServletContext.createServletContext().with(request).with(response).build(); } @Override - public GraphQLContext build(Session session, HandshakeRequest handshakeRequest) { + public GraphQLKickstartContext build(Session session, HandshakeRequest handshakeRequest) { return DefaultGraphQLWebSocketContext.createWebSocketContext() .with(session) .with(handshakeRequest) diff --git a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLWebSocketContext.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLWebSocketContext.java index e33fb6e8..e5b5353b 100644 --- a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLWebSocketContext.java +++ b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLWebSocketContext.java @@ -1,7 +1,8 @@ package graphql.kickstart.servlet.context; import graphql.kickstart.execution.context.DefaultGraphQLContext; -import javax.security.auth.Subject; +import java.util.HashMap; +import java.util.Map; import javax.websocket.Session; import javax.websocket.server.HandshakeRequest; import org.dataloader.DataLoaderRegistry; @@ -13,21 +14,18 @@ public class DefaultGraphQLWebSocketContext extends DefaultGraphQLContext private final HandshakeRequest handshakeRequest; private DefaultGraphQLWebSocketContext( - DataLoaderRegistry dataLoaderRegistry, - Subject subject, - Session session, - HandshakeRequest handshakeRequest) { - super(dataLoaderRegistry, subject); + DataLoaderRegistry dataLoaderRegistry, Session session, HandshakeRequest handshakeRequest) { + super(dataLoaderRegistry); this.session = session; this.handshakeRequest = handshakeRequest; } - public static Builder createWebSocketContext(DataLoaderRegistry registry, Subject subject) { - return new Builder(registry, subject); + public static Builder createWebSocketContext(DataLoaderRegistry registry) { + return new Builder(registry); } public static Builder createWebSocketContext() { - return new Builder(new DataLoaderRegistry(), null); + return new Builder(new DataLoaderRegistry()); } @Override @@ -40,21 +38,27 @@ public HandshakeRequest getHandshakeRequest() { return handshakeRequest; } + @Override + public Map<Object, Object> getMapOfContext() { + Map<Object, Object> map = new HashMap<>(); + map.put(DataLoaderRegistry.class, getDataLoaderRegistry()); + map.put(Session.class, session); + map.put(HandshakeRequest.class, handshakeRequest); + return map; + } + public static class Builder { private Session session; private HandshakeRequest handshakeRequest; private DataLoaderRegistry dataLoaderRegistry; - private Subject subject; - private Builder(DataLoaderRegistry dataLoaderRegistry, Subject subject) { + private Builder(DataLoaderRegistry dataLoaderRegistry) { this.dataLoaderRegistry = dataLoaderRegistry; - this.subject = subject; } public DefaultGraphQLWebSocketContext build() { - return new DefaultGraphQLWebSocketContext( - dataLoaderRegistry, subject, session, handshakeRequest); + return new DefaultGraphQLWebSocketContext(dataLoaderRegistry, session, handshakeRequest); } public Builder with(Session session) { @@ -71,10 +75,5 @@ public Builder with(DataLoaderRegistry dataLoaderRegistry) { this.dataLoaderRegistry = dataLoaderRegistry; return this; } - - public Builder with(Subject subject) { - this.subject = subject; - return this; - } } } diff --git a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLServletContext.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLServletContext.java index 36e744a2..2ce8ad68 100644 --- a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLServletContext.java +++ b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLServletContext.java @@ -1,13 +1,13 @@ package graphql.kickstart.servlet.context; -import graphql.kickstart.execution.context.GraphQLContext; +import graphql.kickstart.execution.context.GraphQLKickstartContext; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Part; -public interface GraphQLServletContext extends GraphQLContext { +public interface GraphQLServletContext extends GraphQLKickstartContext { List<Part> getFileParts(); diff --git a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLServletContextBuilder.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLServletContextBuilder.java index fcb10ed7..6c0ee4b2 100644 --- a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLServletContextBuilder.java +++ b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLServletContextBuilder.java @@ -1,6 +1,6 @@ package graphql.kickstart.servlet.context; -import graphql.kickstart.execution.context.GraphQLContext; +import graphql.kickstart.execution.context.GraphQLKickstartContext; import graphql.kickstart.execution.context.GraphQLContextBuilder; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -9,8 +9,8 @@ public interface GraphQLServletContextBuilder extends GraphQLContextBuilder { - GraphQLContext build( + GraphQLKickstartContext build( HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse); - GraphQLContext build(Session session, HandshakeRequest handshakeRequest); + GraphQLKickstartContext build(Session session, HandshakeRequest handshakeRequest); } diff --git a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLWebSocketContext.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLWebSocketContext.java index 3c20ba21..d718121f 100644 --- a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLWebSocketContext.java +++ b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLWebSocketContext.java @@ -1,10 +1,10 @@ package graphql.kickstart.servlet.context; -import graphql.kickstart.execution.context.GraphQLContext; +import graphql.kickstart.execution.context.GraphQLKickstartContext; import javax.websocket.Session; import javax.websocket.server.HandshakeRequest; -public interface GraphQLWebSocketContext extends GraphQLContext { +public interface GraphQLWebSocketContext extends GraphQLKickstartContext { Session getSession(); diff --git a/graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/DataLoaderDispatchingSpec.groovy b/graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/DataLoaderDispatchingSpec.groovy index 182936d7..6ab5f38c 100644 --- a/graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/DataLoaderDispatchingSpec.groovy +++ b/graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/DataLoaderDispatchingSpec.groovy @@ -8,8 +8,9 @@ import graphql.execution.instrumentation.SimpleInstrumentation import graphql.execution.instrumentation.dataloader.DataLoaderDispatcherInstrumentationOptions import graphql.kickstart.execution.context.ContextSetting import graphql.kickstart.execution.context.DefaultGraphQLContext -import graphql.kickstart.execution.context.GraphQLContext +import graphql.kickstart.execution.context.GraphQLKickstartContext import graphql.kickstart.execution.instrumentation.ConfigurableDispatchInstrumentation +import graphql.kickstart.servlet.context.GraphQLServletContextBuilder import graphql.schema.DataFetcher import graphql.schema.DataFetchingEnvironment import org.dataloader.BatchLoader @@ -83,20 +84,20 @@ class DataLoaderDispatchingSpec extends Specification { } def contextBuilder() { - return new graphql.kickstart.servlet.context.GraphQLServletContextBuilder() { + return new GraphQLServletContextBuilder() { @Override - GraphQLContext build(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) { - new DefaultGraphQLContext(registry(), null) + GraphQLKickstartContext build(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) { + new DefaultGraphQLContext(registry()) } @Override - GraphQLContext build(Session session, HandshakeRequest handshakeRequest) { - new DefaultGraphQLContext(registry(), null) + GraphQLKickstartContext build(Session session, HandshakeRequest handshakeRequest) { + new DefaultGraphQLContext(registry()) } @Override - GraphQLContext build() { - new DefaultGraphQLContext(registry(), null) + GraphQLKickstartContext build() { + new DefaultGraphQLContext(registry()) } } } diff --git a/graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/OsgiGraphQLHttpServletSpec.groovy b/graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/OsgiGraphQLHttpServletSpec.groovy index 6de50bba..3f9a233d 100644 --- a/graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/OsgiGraphQLHttpServletSpec.groovy +++ b/graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/OsgiGraphQLHttpServletSpec.groovy @@ -4,7 +4,6 @@ import graphql.AssertException import graphql.annotations.annotationTypes.GraphQLField import graphql.annotations.annotationTypes.GraphQLName import graphql.annotations.processor.GraphQLAnnotations -import graphql.execution.instrumentation.Instrumentation import graphql.execution.instrumentation.InstrumentationState import graphql.execution.instrumentation.SimpleInstrumentation import graphql.execution.instrumentation.parameters.InstrumentationCreateStateParameters @@ -12,11 +11,10 @@ import graphql.kickstart.execution.GraphQLRequest import graphql.kickstart.execution.config.ExecutionStrategyProvider import graphql.kickstart.execution.config.InstrumentationProvider import graphql.kickstart.execution.context.DefaultGraphQLContext -import graphql.kickstart.execution.context.GraphQLContext +import graphql.kickstart.execution.context.GraphQLKickstartContext import graphql.kickstart.servlet.context.GraphQLServletContextBuilder import graphql.kickstart.servlet.core.GraphQLServletListener import graphql.kickstart.servlet.core.GraphQLServletRootObjectBuilder -import graphql.kickstart.servlet.input.NoOpBatchInputPreProcessor import graphql.kickstart.servlet.osgi.* import graphql.schema.* import org.dataloader.DataLoaderRegistry @@ -286,9 +284,8 @@ class OsgiGraphQLHttpServletSpec extends Specification { def "context builder is bound and unbound"() { setup: def servlet = new OsgiGraphQLHttpServlet() - def context = Mock(GraphQLContext) + def context = Mock(GraphQLKickstartContext) context.getDataLoaderRegistry() >> new DataLoaderRegistry() - context.getSubject() >> Optional.empty() def contextBuilder = Mock(GraphQLServletContextBuilder) contextBuilder.build() >> context def request = GraphQLRequest.createIntrospectionRequest() From cc60866c87e40f4f3c1df2b90313544b5b6be54f Mon Sep 17 00:00:00 2001 From: oliemansm <oliemans@scopisto.com> Date: Sat, 22 Jan 2022 21:33:16 +0100 Subject: [PATCH 2/5] chore: mark methods as deprecated --- .../context/DefaultGraphQLServletContext.java | 25 ++++++++++++++++++- .../DefaultGraphQLWebSocketContext.java | 11 ++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContext.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContext.java index 36332142..d19fb76c 100644 --- a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContext.java +++ b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContext.java @@ -5,7 +5,6 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import javax.security.auth.Subject; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Part; @@ -35,17 +34,35 @@ public static Builder createServletContext() { return new Builder(new DataLoaderRegistry()); } + /** + * @deprecated Use + * <tt>dataFetchingEnvironment.getGraphQlContext().get(HttpServletRequest.class)</tt> instead. + * Since 13.0.0 + */ @Override + @Deprecated public HttpServletRequest getHttpServletRequest() { return httpServletRequest; } + /** + * @deprecated Use + * <tt>dataFetchingEnvironment.getGraphQlContext().get(HttpServletResponse.class)</tt> + * instead. Since 13.0.0 + */ @Override + @Deprecated public HttpServletResponse getHttpServletResponse() { return httpServletResponse; } + /** + * @deprecated Use + * <tt>dataFetchingEnvironment.getGraphQlContext().get(HttpServletRequest.class)</tt> instead + * to get the request and retrieve the file parts yourself. Since 13.0.0 + */ @Override + @Deprecated @SneakyThrows public List<Part> getFileParts() { return httpServletRequest.getParts().stream() @@ -53,7 +70,13 @@ public List<Part> getFileParts() { .collect(Collectors.toList()); } + /** + * @deprecated Use + * <tt>dataFetchingEnvironment.getGraphQlContext().get(HttpServletRequest.class)</tt> instead + * to get the request and retrieve the parts yourself. Since 13.0.0 + */ @Override + @Deprecated @SneakyThrows public Map<String, List<Part>> getParts() { return httpServletRequest.getParts().stream().collect(Collectors.groupingBy(Part::getName)); diff --git a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLWebSocketContext.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLWebSocketContext.java index e5b5353b..136720c5 100644 --- a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLWebSocketContext.java +++ b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLWebSocketContext.java @@ -28,12 +28,23 @@ public static Builder createWebSocketContext() { return new Builder(new DataLoaderRegistry()); } + /** + * @deprecated Use <tt>dataFetchingEnvironment.getGraphQlContext().get(Session.class)</tt> + * instead. Since 13.0.0 + */ @Override + @Deprecated public Session getSession() { return session; } + /** + * @deprecated Use + * <tt>dataFetchingEnvironment.getGraphQlContext().get(HandshakeRequest.class)</tt> instead. + * Since 13.0.0 + */ @Override + @Deprecated public HandshakeRequest getHandshakeRequest() { return handshakeRequest; } From 01cd8efe9eca58c2c2d30a686e7fc25984ec600b Mon Sep 17 00:00:00 2001 From: oliemansm <oliemans@scopisto.com> Date: Sat, 22 Jan 2022 21:37:52 +0100 Subject: [PATCH 3/5] fix: failing osgi unit test --- .../graphql/kickstart/servlet/OsgiGraphQLHttpServletSpec.groovy | 1 + 1 file changed, 1 insertion(+) diff --git a/graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/OsgiGraphQLHttpServletSpec.groovy b/graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/OsgiGraphQLHttpServletSpec.groovy index 3f9a233d..7556946a 100644 --- a/graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/OsgiGraphQLHttpServletSpec.groovy +++ b/graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/OsgiGraphQLHttpServletSpec.groovy @@ -286,6 +286,7 @@ class OsgiGraphQLHttpServletSpec extends Specification { def servlet = new OsgiGraphQLHttpServlet() def context = Mock(GraphQLKickstartContext) context.getDataLoaderRegistry() >> new DataLoaderRegistry() + context.getMapOfContext() >> new HashMap<Object, Object>() def contextBuilder = Mock(GraphQLServletContextBuilder) contextBuilder.build() >> context def request = GraphQLRequest.createIntrospectionRequest() From bf7130c86ef89a0e7fcd8ec4f06054f9f1a7bf54 Mon Sep 17 00:00:00 2001 From: oliemansm <oliemans@scopisto.com> Date: Sun, 23 Jan 2022 11:01:33 +0100 Subject: [PATCH 4/5] chore: refactor context builder --- .../context/DefaultGraphQLContext.java | 18 +++++-- .../context/GraphQLKickstartContext.java | 13 +++++ .../context/DefaultGraphQLServletContext.java | 51 ++++++++----------- .../DefaultGraphQLServletContextBuilder.java | 15 ++++-- .../DefaultGraphQLWebSocketContext.java | 33 ++++-------- .../context/GraphQLServletContext.java | 1 + .../context/GraphQLWebSocketContext.java | 1 + 7 files changed, 70 insertions(+), 62 deletions(-) diff --git a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/DefaultGraphQLContext.java b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/DefaultGraphQLContext.java index 90532f9e..dda335d0 100644 --- a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/DefaultGraphQLContext.java +++ b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/DefaultGraphQLContext.java @@ -12,16 +12,30 @@ public class DefaultGraphQLContext implements GraphQLKickstartContext { private final DataLoaderRegistry dataLoaderRegistry; + private final Map<Object, Object> map; - public DefaultGraphQLContext(DataLoaderRegistry dataLoaderRegistry) { + public DefaultGraphQLContext(DataLoaderRegistry dataLoaderRegistry, Map<Object, Object> map) { this.dataLoaderRegistry = Objects.requireNonNull(dataLoaderRegistry, "dataLoaderRegistry is required"); + this.map = Objects.requireNonNull(map, "map is required"); + } + + public DefaultGraphQLContext(Map<Object, Object> map) { + this(new DataLoaderRegistry(), map); + } + + public DefaultGraphQLContext(DataLoaderRegistry dataLoaderRegistry) { + this(dataLoaderRegistry, new HashMap<>()); } public DefaultGraphQLContext() { this(new DataLoaderRegistry()); } + public void put(Object key, Object value) { + map.put(key, value); + } + @Override public DataLoaderRegistry getDataLoaderRegistry() { return dataLoaderRegistry; @@ -29,8 +43,6 @@ public DataLoaderRegistry getDataLoaderRegistry() { @Override public Map<Object, Object> getMapOfContext() { - Map<Object, Object> map = new HashMap<>(); - map.put(DataLoaderRegistry.class, dataLoaderRegistry); return map; } } diff --git a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/GraphQLKickstartContext.java b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/GraphQLKickstartContext.java index 019ce433..f04e7e8f 100644 --- a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/GraphQLKickstartContext.java +++ b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/GraphQLKickstartContext.java @@ -7,6 +7,19 @@ /** Represents the context required by the servlet to execute a GraphQL request. */ public interface GraphQLKickstartContext { + static GraphQLKickstartContext of(Map<Object, Object> map) { + return new DefaultGraphQLContext(map); + } + + static GraphQLKickstartContext of(DataLoaderRegistry dataLoaderRegistry) { + return new DefaultGraphQLContext(dataLoaderRegistry); + } + + static GraphQLKickstartContext of( + DataLoaderRegistry dataLoaderRegistry, Map<Object, Object> map) { + return new DefaultGraphQLContext(dataLoaderRegistry, map); + } + /** @return the Dataloader registry to use for the execution. Must not return <code>null</code> */ @NonNull DataLoaderRegistry getDataLoaderRegistry(); diff --git a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContext.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContext.java index d19fb76c..9c366dd1 100644 --- a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContext.java +++ b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContext.java @@ -1,7 +1,6 @@ package graphql.kickstart.servlet.context; import graphql.kickstart.execution.context.DefaultGraphQLContext; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -11,19 +10,17 @@ import lombok.SneakyThrows; import org.dataloader.DataLoaderRegistry; +/** @deprecated Use {@link graphql.kickstart.execution.context.GraphQLKickstartContext} instead */ public class DefaultGraphQLServletContext extends DefaultGraphQLContext implements GraphQLServletContext { - private final HttpServletRequest httpServletRequest; - private final HttpServletResponse httpServletResponse; - protected DefaultGraphQLServletContext( DataLoaderRegistry dataLoaderRegistry, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) { super(dataLoaderRegistry); - this.httpServletRequest = httpServletRequest; - this.httpServletResponse = httpServletResponse; + put(HttpServletRequest.class, httpServletRequest); + put(HttpServletResponse.class, httpServletResponse); } public static Builder createServletContext(DataLoaderRegistry registry) { @@ -35,60 +32,52 @@ public static Builder createServletContext() { } /** - * @deprecated Use - * <tt>dataFetchingEnvironment.getGraphQlContext().get(HttpServletRequest.class)</tt> instead. - * Since 13.0.0 + * @deprecated Use {@code + * dataFetchingEnvironment.getGraphQlContext().get(HttpServletRequest.class)} instead. Since + * 13.0.0 */ @Override @Deprecated public HttpServletRequest getHttpServletRequest() { - return httpServletRequest; + return (HttpServletRequest) getMapOfContext().get(HttpServletRequest.class); } /** - * @deprecated Use - * <tt>dataFetchingEnvironment.getGraphQlContext().get(HttpServletResponse.class)</tt> - * instead. Since 13.0.0 + * @deprecated Use {@code + * dataFetchingEnvironment.getGraphQlContext().get(HttpServletResponse.class)} instead. Since + * 13.0.0 */ @Override @Deprecated public HttpServletResponse getHttpServletResponse() { - return httpServletResponse; + return (HttpServletResponse) getMapOfContext().get(HttpServletResponse.class); } /** - * @deprecated Use - * <tt>dataFetchingEnvironment.getGraphQlContext().get(HttpServletRequest.class)</tt> instead - * to get the request and retrieve the file parts yourself. Since 13.0.0 + * @deprecated Use {@code + * dataFetchingEnvironment.getGraphQlContext().get(HttpServletRequest.class)} instead to get + * the request and retrieve the file parts yourself. Since 13.0.0 */ @Override @Deprecated @SneakyThrows public List<Part> getFileParts() { - return httpServletRequest.getParts().stream() + return getHttpServletRequest().getParts().stream() .filter(part -> part.getContentType() != null) .collect(Collectors.toList()); } /** - * @deprecated Use - * <tt>dataFetchingEnvironment.getGraphQlContext().get(HttpServletRequest.class)</tt> instead - * to get the request and retrieve the parts yourself. Since 13.0.0 + * @deprecated Use {@code + * dataFetchingEnvironment.getGraphQlContext().get(HttpServletRequest.class)} instead to get + * the request and retrieve the parts yourself. Since 13.0.0 */ @Override @Deprecated @SneakyThrows public Map<String, List<Part>> getParts() { - return httpServletRequest.getParts().stream().collect(Collectors.groupingBy(Part::getName)); - } - - @Override - public Map<Object, Object> getMapOfContext() { - Map<Object, Object> map = new HashMap<>(); - map.put(DataLoaderRegistry.class, getDataLoaderRegistry()); - map.put(HttpServletRequest.class, httpServletRequest); - map.put(HttpServletResponse.class, httpServletResponse); - return map; + return getHttpServletRequest().getParts().stream() + .collect(Collectors.groupingBy(Part::getName)); } public static class Builder { diff --git a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContextBuilder.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContextBuilder.java index 126fc139..c7a1dad4 100644 --- a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContextBuilder.java +++ b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContextBuilder.java @@ -2,6 +2,8 @@ import graphql.kickstart.execution.context.DefaultGraphQLContextBuilder; import graphql.kickstart.execution.context.GraphQLKickstartContext; +import java.util.HashMap; +import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.websocket.Session; @@ -13,14 +15,17 @@ public class DefaultGraphQLServletContextBuilder extends DefaultGraphQLContextBu @Override public GraphQLKickstartContext build(HttpServletRequest request, HttpServletResponse response) { - return DefaultGraphQLServletContext.createServletContext().with(request).with(response).build(); + Map<Object, Object> map = new HashMap<>(); + map.put(HttpServletRequest.class, request); + map.put(HttpServletResponse.class, response); + return GraphQLKickstartContext.of(map); } @Override public GraphQLKickstartContext build(Session session, HandshakeRequest handshakeRequest) { - return DefaultGraphQLWebSocketContext.createWebSocketContext() - .with(session) - .with(handshakeRequest) - .build(); + Map<Object, Object> map = new HashMap<>(); + map.put(Session.class, session); + map.put(HandshakeRequest.class, handshakeRequest); + return GraphQLKickstartContext.of(map); } } diff --git a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLWebSocketContext.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLWebSocketContext.java index 136720c5..32beb4c2 100644 --- a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLWebSocketContext.java +++ b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLWebSocketContext.java @@ -1,23 +1,20 @@ package graphql.kickstart.servlet.context; import graphql.kickstart.execution.context.DefaultGraphQLContext; -import java.util.HashMap; -import java.util.Map; import javax.websocket.Session; import javax.websocket.server.HandshakeRequest; import org.dataloader.DataLoaderRegistry; +/** @deprecated Use {@link graphql.kickstart.execution.context.GraphQLKickstartContext} instead */ +@Deprecated public class DefaultGraphQLWebSocketContext extends DefaultGraphQLContext implements GraphQLWebSocketContext { - private final Session session; - private final HandshakeRequest handshakeRequest; - private DefaultGraphQLWebSocketContext( DataLoaderRegistry dataLoaderRegistry, Session session, HandshakeRequest handshakeRequest) { super(dataLoaderRegistry); - this.session = session; - this.handshakeRequest = handshakeRequest; + put(Session.class, session); + put(HandshakeRequest.class, handshakeRequest); } public static Builder createWebSocketContext(DataLoaderRegistry registry) { @@ -29,33 +26,23 @@ public static Builder createWebSocketContext() { } /** - * @deprecated Use <tt>dataFetchingEnvironment.getGraphQlContext().get(Session.class)</tt> - * instead. Since 13.0.0 + * @deprecated Use {@code dataFetchingEnvironment.getGraphQlContext().get(Session.class)} instead. + * Since 13.0.0 */ @Override @Deprecated public Session getSession() { - return session; + return (Session) getMapOfContext().get(Session.class); } /** - * @deprecated Use - * <tt>dataFetchingEnvironment.getGraphQlContext().get(HandshakeRequest.class)</tt> instead. - * Since 13.0.0 + * @deprecated Use {@code dataFetchingEnvironment.getGraphQlContext().get(HandshakeRequest.class)} + * instead. Since 13.0.0 */ @Override @Deprecated public HandshakeRequest getHandshakeRequest() { - return handshakeRequest; - } - - @Override - public Map<Object, Object> getMapOfContext() { - Map<Object, Object> map = new HashMap<>(); - map.put(DataLoaderRegistry.class, getDataLoaderRegistry()); - map.put(Session.class, session); - map.put(HandshakeRequest.class, handshakeRequest); - return map; + return (HandshakeRequest) getMapOfContext().get(HandshakeRequest.class); } public static class Builder { diff --git a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLServletContext.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLServletContext.java index 2ce8ad68..9fc42d0c 100644 --- a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLServletContext.java +++ b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLServletContext.java @@ -7,6 +7,7 @@ import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Part; +/** @deprecated Use {@link graphql.kickstart.execution.context.GraphQLKickstartContext} instead */ public interface GraphQLServletContext extends GraphQLKickstartContext { List<Part> getFileParts(); diff --git a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLWebSocketContext.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLWebSocketContext.java index d718121f..d244eb8d 100644 --- a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLWebSocketContext.java +++ b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLWebSocketContext.java @@ -4,6 +4,7 @@ import javax.websocket.Session; import javax.websocket.server.HandshakeRequest; +/** @deprecated Use {@link graphql.kickstart.execution.context.GraphQLKickstartContext} instead */ public interface GraphQLWebSocketContext extends GraphQLKickstartContext { Session getSession(); From 03c2fc01e1ff71e2cbf27db46a6cd8ddd9476c94 Mon Sep 17 00:00:00 2001 From: oliemansm <oliemans@scopisto.com> Date: Sun, 23 Jan 2022 11:23:35 +0100 Subject: [PATCH 5/5] fix: support poorly formatted graphql queries fixes #385 --- .../GraphQLPostInvocationInputParser.java | 5 +++-- .../AbstractGraphQLHttpServletSpec.groovy | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/GraphQLPostInvocationInputParser.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/GraphQLPostInvocationInputParser.java index 21ec61ea..5b114c42 100644 --- a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/GraphQLPostInvocationInputParser.java +++ b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/GraphQLPostInvocationInputParser.java @@ -10,6 +10,7 @@ import graphql.kickstart.servlet.input.GraphQLInvocationInputFactory; import java.io.IOException; import java.util.List; +import java.util.stream.Collectors; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -27,12 +28,12 @@ class GraphQLPostInvocationInputParser extends AbstractGraphQLInvocationInputPar public GraphQLInvocationInput getGraphQLInvocationInput( HttpServletRequest request, HttpServletResponse response) throws IOException { if (APPLICATION_GRAPHQL.equals(request.getContentType())) { - String query = request.getReader().lines().collect(joining()); + String query = request.getReader().lines().collect(joining(" ")); GraphQLRequest graphqlRequest = GraphQLRequest.createQueryOnlyRequest(query); return invocationInputFactory.create(graphqlRequest, request, response); } - String body = request.getReader().lines().collect(joining()); + String body = request.getReader().lines().collect(joining(" ")); if (isSingleQuery(body)) { GraphQLRequest graphqlRequest = graphQLObjectMapper.readGraphQLRequest(body); return invocationInputFactory.create(graphqlRequest, request, response); diff --git a/graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/AbstractGraphQLHttpServletSpec.groovy b/graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/AbstractGraphQLHttpServletSpec.groovy index 0eb86ef9..022621de 100644 --- a/graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/AbstractGraphQLHttpServletSpec.groovy +++ b/graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/AbstractGraphQLHttpServletSpec.groovy @@ -422,6 +422,25 @@ class AbstractGraphQLHttpServletSpec extends Specification { getResponseContent().data.echo == "test" } + def "query over HTTP POST multiline body returns data"() { + setup: + request.setContent(""" + query { object { +a +b + } }""".bytes) + request.setMethod("POST") + request.contentType = "application/graphql" + + when: + servlet.doPost(request, response) + + then: + response.getStatus() == STATUS_OK + response.getContentType() == CONTENT_TYPE_JSON_UTF8 + getResponseContent().data.object.b == null + } + def "disabling async support on request over HTTP POST does not start async request"() { setup: servlet = TestUtils.createDefaultServlet({ env -> env.arguments.arg }, { env -> env.arguments.arg }, { env ->