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 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> 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 requests, GraphQLSchema schema, - Supplier contextSupplier, + Supplier 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..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 @@ -1,37 +1,48 @@ 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; + private final Map map; - public DefaultGraphQLContext(DataLoaderRegistry dataLoaderRegistry, Subject subject) { + public DefaultGraphQLContext(DataLoaderRegistry dataLoaderRegistry, Map map) { this.dataLoaderRegistry = Objects.requireNonNull(dataLoaderRegistry, "dataLoaderRegistry is required"); - this.subject = subject; + this.map = Objects.requireNonNull(map, "map is required"); + } + + public DefaultGraphQLContext(Map map) { + this(new DataLoaderRegistry(), map); + } + + public DefaultGraphQLContext(DataLoaderRegistry dataLoaderRegistry) { + this(dataLoaderRegistry, new HashMap<>()); } public DefaultGraphQLContext() { - this(new DataLoaderRegistry(), null); + this(new DataLoaderRegistry()); } - @Override - public Optional getSubject() { - return Optional.ofNullable(subject); + public void put(Object key, Object value) { + map.put(key, value); } @Override public DataLoaderRegistry getDataLoaderRegistry() { return dataLoaderRegistry; } + + @Override + public Map getMapOfContext() { + 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/GraphQLContext.java b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/GraphQLContext.java deleted file mode 100644 index 7efc3615..00000000 --- a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/GraphQLContext.java +++ /dev/null @@ -1,17 +0,0 @@ -package graphql.kickstart.execution.context; - -import java.util.Optional; -import javax.security.auth.Subject; -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 getSubject(); - - /** @return the Dataloader registry to use for the execution. Must not return null */ - @NonNull - DataLoaderRegistry getDataLoaderRegistry(); -} 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/GraphQLKickstartContext.java b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/GraphQLKickstartContext.java new file mode 100644 index 00000000..f04e7e8f --- /dev/null +++ b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/GraphQLKickstartContext.java @@ -0,0 +1,28 @@ +package graphql.kickstart.execution.context; + +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 GraphQLKickstartContext { + + static GraphQLKickstartContext of(Map map) { + return new DefaultGraphQLContext(map); + } + + static GraphQLKickstartContext of(DataLoaderRegistry dataLoaderRegistry) { + return new DefaultGraphQLContext(dataLoaderRegistry); + } + + static GraphQLKickstartContext of( + DataLoaderRegistry dataLoaderRegistry, Map map) { + return new DefaultGraphQLContext(dataLoaderRegistry, map); + } + + /** @return the Dataloader registry to use for the execution. Must not return null */ + @NonNull + DataLoaderRegistry getDataLoaderRegistry(); + + Map 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 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 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 requests, GraphQLSchema schema, - Supplier contextSupplier, + Supplier 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 requests, GraphQLSchema schema, - Supplier contextSupplier, + Supplier 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/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/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContext.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContext.java index 4c2d4f66..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 @@ -4,59 +4,80 @@ 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; 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, - Subject subject, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) { - super(dataLoaderRegistry, subject); - this.httpServletRequest = httpServletRequest; - this.httpServletResponse = httpServletResponse; + super(dataLoaderRegistry); + put(HttpServletRequest.class, httpServletRequest); + put(HttpServletResponse.class, 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()); } + /** + * @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 {@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 {@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 getFileParts() { - return httpServletRequest.getParts().stream() + return getHttpServletRequest().getParts().stream() .filter(part -> part.getContentType() != null) .collect(Collectors.toList()); } + /** + * @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> getParts() { - return httpServletRequest.getParts().stream().collect(Collectors.groupingBy(Part::getName)); + return getHttpServletRequest().getParts().stream() + .collect(Collectors.groupingBy(Part::getName)); } public static class Builder { @@ -64,16 +85,14 @@ 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 +105,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..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 @@ -1,7 +1,9 @@ package graphql.kickstart.servlet.context; import graphql.kickstart.execution.context.DefaultGraphQLContextBuilder; -import graphql.kickstart.execution.context.GraphQLContext; +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; @@ -12,15 +14,18 @@ public class DefaultGraphQLServletContextBuilder extends DefaultGraphQLContextBu implements GraphQLServletContextBuilder { @Override - public GraphQLContext build(HttpServletRequest request, HttpServletResponse response) { - return DefaultGraphQLServletContext.createServletContext().with(request).with(response).build(); + public GraphQLKickstartContext build(HttpServletRequest request, HttpServletResponse response) { + Map map = new HashMap<>(); + map.put(HttpServletRequest.class, request); + map.put(HttpServletResponse.class, response); + return GraphQLKickstartContext.of(map); } @Override - public GraphQLContext build(Session session, HandshakeRequest handshakeRequest) { - return DefaultGraphQLWebSocketContext.createWebSocketContext() - .with(session) - .with(handshakeRequest) - .build(); + public GraphQLKickstartContext build(Session session, HandshakeRequest handshakeRequest) { + Map 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 e33fb6e8..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,43 +1,48 @@ package graphql.kickstart.servlet.context; import graphql.kickstart.execution.context.DefaultGraphQLContext; -import javax.security.auth.Subject; 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, - Subject subject, - Session session, - HandshakeRequest handshakeRequest) { - super(dataLoaderRegistry, subject); - this.session = session; - this.handshakeRequest = handshakeRequest; + DataLoaderRegistry dataLoaderRegistry, Session session, HandshakeRequest handshakeRequest) { + super(dataLoaderRegistry); + put(Session.class, session); + put(HandshakeRequest.class, 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()); } + /** + * @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 {@code dataFetchingEnvironment.getGraphQlContext().get(HandshakeRequest.class)} + * instead. Since 13.0.0 + */ @Override + @Deprecated public HandshakeRequest getHandshakeRequest() { - return handshakeRequest; + return (HandshakeRequest) getMapOfContext().get(HandshakeRequest.class); } public static class Builder { @@ -45,16 +50,13 @@ 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 +73,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..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 @@ -1,13 +1,14 @@ 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 { +/** @deprecated Use {@link graphql.kickstart.execution.context.GraphQLKickstartContext} instead */ +public interface GraphQLServletContext extends GraphQLKickstartContext { List 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..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 @@ -1,10 +1,11 @@ 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 { +/** @deprecated Use {@link graphql.kickstart.execution.context.GraphQLKickstartContext} instead */ +public interface GraphQLWebSocketContext extends GraphQLKickstartContext { Session getSession(); 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 -> 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..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 @@ -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,9 @@ 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() + context.getMapOfContext() >> new HashMap() def contextBuilder = Mock(GraphQLServletContextBuilder) contextBuilder.build() >> context def request = GraphQLRequest.createIntrospectionRequest()