Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Code review changes.
  • Loading branch information
donbeave committed May 24, 2020
commit 4b4edfe3b05792d0112a79d53544e8aae7736dee
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,6 @@

import graphql.ExecutionResult;
import graphql.kickstart.execution.GraphQLObjectMapper;
import graphql.kickstart.execution.input.GraphQLInvocationInput;
import graphql.kickstart.servlet.cache.CachedResponse;
import graphql.kickstart.servlet.cache.GraphQLResponseCache;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

Expand All @@ -21,10 +18,9 @@ class BatchedQueryResponseWriter implements QueryResponseWriter {

private final List<ExecutionResult> results;
private final GraphQLObjectMapper graphQLObjectMapper;
private final GraphQLInvocationInput invocationInput;

@Override
public void write(HttpServletRequest request, HttpServletResponse response, GraphQLResponseCache responseCache) throws IOException {
public void write(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType(HttpRequestHandler.APPLICATION_JSON_UTF8);
response.setStatus(HttpRequestHandler.STATUS_OK);

Expand All @@ -42,15 +38,6 @@ public void write(HttpServletRequest request, HttpServletResponse response, Grap
String responseContent = responseBuilder.toString();
byte[] contentBytes = responseContent.getBytes(StandardCharsets.UTF_8);

if (responseCache != null && responseCache.isCacheable(request, invocationInput)) {
try {
responseCache.put(request, invocationInput, CachedResponse.ofContent(contentBytes));
} catch (Throwable t) {
log.warn(t.getMessage(), t);
log.warn("Ignore read from cache, unexpected error happened");
}
}

response.setContentLength(contentBytes.length);
response.getOutputStream().write(contentBytes);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,31 +3,16 @@
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import graphql.kickstart.execution.input.GraphQLInvocationInput;
import graphql.kickstart.servlet.cache.CachedResponse;
import graphql.kickstart.servlet.cache.GraphQLResponseCache;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@RequiredArgsConstructor
class ErrorQueryResponseWriter implements QueryResponseWriter {

private final int statusCode;
private final String message;
private final GraphQLInvocationInput invocationInput;

@Override
public void write(HttpServletRequest request, HttpServletResponse response, GraphQLResponseCache responseCache) throws IOException {
if (responseCache != null && responseCache.isCacheable(request, invocationInput)) {
try {
responseCache.put(request, invocationInput, CachedResponse.ofError(statusCode, message));
} catch (Throwable t) {
log.warn(t.getMessage(), t);
log.warn("Ignore read from cache, unexpected error happened");
}
}
public void write(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.sendError(statusCode, message);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import graphql.kickstart.execution.GraphQLObjectMapper;
import graphql.kickstart.execution.GraphQLQueryInvoker;
import graphql.kickstart.execution.context.ContextSetting;
import graphql.kickstart.servlet.cache.GraphQLResponseCache;
import graphql.kickstart.servlet.cache.GraphQLResponseCacheManager;
import graphql.kickstart.servlet.config.DefaultGraphQLSchemaServletProvider;
import graphql.kickstart.servlet.config.GraphQLSchemaServletProvider;
import graphql.kickstart.servlet.context.GraphQLServletContextBuilder;
Expand Down Expand Up @@ -37,13 +37,13 @@ public class GraphQLConfiguration {
@Getter
private final long asyncTimeout;
private final ContextSetting contextSetting;
private final GraphQLResponseCache responseCache;
private final GraphQLResponseCacheManager responseCacheManager;

private GraphQLConfiguration(GraphQLInvocationInputFactory invocationInputFactory,
GraphQLQueryInvoker queryInvoker,
GraphQLObjectMapper objectMapper, List<GraphQLServletListener> listeners, boolean asyncServletModeEnabled,
Executor asyncExecutor, long subscriptionTimeout, long asyncTimeout, ContextSetting contextSetting,
Supplier<BatchInputPreProcessor> batchInputPreProcessor, GraphQLResponseCache responseCache) {
Supplier<BatchInputPreProcessor> batchInputPreProcessor, GraphQLResponseCacheManager responseCacheManager) {
this.invocationInputFactory = invocationInputFactory;
this.queryInvoker = queryInvoker;
this.graphQLInvoker = queryInvoker.toGraphQLInvoker();
Expand All @@ -55,7 +55,7 @@ private GraphQLConfiguration(GraphQLInvocationInputFactory invocationInputFactor
this.asyncTimeout = asyncTimeout;
this.contextSetting = contextSetting;
this.batchInputPreProcessor = batchInputPreProcessor;
this.responseCache = responseCache;
this.responseCacheManager = responseCacheManager;
}

public static GraphQLConfiguration.Builder with(GraphQLSchema schema) {
Expand Down Expand Up @@ -116,8 +116,8 @@ public BatchInputPreProcessor getBatchInputPreProcessor() {
return batchInputPreProcessor.get();
}

public GraphQLResponseCache getResponseCache() {
return responseCache;
public GraphQLResponseCacheManager getResponseCacheManager() {
return responseCacheManager;
}

public static class Builder {
Expand All @@ -133,7 +133,7 @@ public static class Builder {
private long asyncTimeout = 30;
private ContextSetting contextSetting = ContextSetting.PER_QUERY_WITH_INSTRUMENTATION;
private Supplier<BatchInputPreProcessor> batchInputPreProcessorSupplier = NoOpBatchInputPreProcessor::new;
private GraphQLResponseCache responseCache;
private GraphQLResponseCacheManager responseCacheManager;

private Builder(GraphQLInvocationInputFactory.Builder invocationInputFactoryBuilder) {
this.invocationInputFactoryBuilder = invocationInputFactoryBuilder;
Expand Down Expand Up @@ -217,8 +217,8 @@ public Builder with(Supplier<BatchInputPreProcessor> batchInputPreProcessor) {
return this;
}

public Builder with(GraphQLResponseCache responseCache) {
this.responseCache = responseCache;
public Builder with(GraphQLResponseCacheManager responseCache) {
this.responseCacheManager = responseCache;
return this;
}

Expand All @@ -234,7 +234,7 @@ public GraphQLConfiguration build() {
asyncTimeout,
contextSetting,
batchInputPreProcessorSupplier,
responseCache
responseCacheManager
);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,7 @@
import graphql.kickstart.execution.input.GraphQLBatchedInvocationInput;
import graphql.kickstart.execution.input.GraphQLInvocationInput;
import graphql.kickstart.execution.input.GraphQLSingleInvocationInput;
import graphql.kickstart.servlet.cache.CacheResponseWriter;
import graphql.kickstart.servlet.cache.CachedResponse;
import graphql.kickstart.servlet.cache.CacheReader;
import graphql.kickstart.servlet.input.BatchInputPreProcessResult;
import graphql.kickstart.servlet.input.BatchInputPreProcessor;
import lombok.extern.slf4j.Slf4j;
Expand Down Expand Up @@ -52,31 +51,20 @@ public void handle(HttpServletRequest request, HttpServletResponse response) thr
private void execute(GraphQLInvocationInput invocationInput, HttpServletRequest request,
HttpServletResponse response) {
try {
if (configuration.getResponseCache() != null) {
CachedResponse cachedResponse = null;
try {
cachedResponse = configuration.getResponseCache().get(request, invocationInput);
} catch (Throwable t) {
log.warn(t.getMessage(), t);
log.warn("Ignore read from cache, unexpected error happened");
}
// try to return value from cache if cache manager was set, otherwise processed the query
if (configuration.getResponseCacheManager() != null &&
!CacheReader.responseFromCache(invocationInput, request, response, configuration.getResponseCacheManager())) {
GraphQLQueryResult queryResult = invoke(invocationInput, request, response);

if (cachedResponse != null) {
CacheResponseWriter cacheResponseWriter = new CacheResponseWriter();
cacheResponseWriter.write(request, response, cachedResponse);
return;
}
QueryResponseWriter queryResponseWriter = QueryResponseWriter.createWriter(
queryResult,
configuration.getObjectMapper(),
configuration.getSubscriptionTimeout(),
invocationInput,
configuration.getResponseCacheManager()
);
queryResponseWriter.write(request, response);
}

GraphQLQueryResult queryResult = invoke(invocationInput, request, response);

QueryResponseWriter queryResponseWriter = QueryResponseWriter.createWriter(
queryResult,
configuration.getObjectMapper(),
configuration.getSubscriptionTimeout(),
invocationInput
);
queryResponseWriter.write(request, response, configuration.getResponseCache());
} catch (Throwable t) {
response.setStatus(STATUS_BAD_REQUEST);
log.info("Bad GET request: path was not \"/schema.json\" or no query variable named \"query\" given");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,33 +3,43 @@
import graphql.kickstart.execution.GraphQLQueryResult;
import graphql.kickstart.execution.GraphQLObjectMapper;
import graphql.kickstart.execution.input.GraphQLInvocationInput;
import graphql.kickstart.servlet.cache.GraphQLResponseCache;
import graphql.kickstart.servlet.cache.CachingQueryResponseWriter;
import graphql.kickstart.servlet.cache.GraphQLResponseCacheManager;

import java.io.IOException;
import java.util.Objects;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

interface QueryResponseWriter {
public interface QueryResponseWriter {

static QueryResponseWriter createWriter(
GraphQLQueryResult result,
GraphQLObjectMapper graphQLObjectMapper,
long subscriptionTimeout,
GraphQLInvocationInput invocationInput
GraphQLInvocationInput invocationInput,
GraphQLResponseCacheManager responseCache
) {
Objects.requireNonNull(result, "GraphQL query result cannot be null");

QueryResponseWriter writer;

if (result.isBatched()) {
return new BatchedQueryResponseWriter(result.getResults(), graphQLObjectMapper, invocationInput);
writer = new BatchedQueryResponseWriter(result.getResults(), graphQLObjectMapper);
} else if (result.isAsynchronous()) {
return new SingleAsynchronousQueryResponseWriter(result.getResult(), graphQLObjectMapper, subscriptionTimeout, invocationInput);
writer = new SingleAsynchronousQueryResponseWriter(result.getResult(), graphQLObjectMapper, subscriptionTimeout);
} else if (result.isError()) {
return new ErrorQueryResponseWriter(result.getStatusCode(), result.getMessage(), invocationInput);
writer = new ErrorQueryResponseWriter(result.getStatusCode(), result.getMessage());
} else {
writer = new SingleQueryResponseWriter(result.getResult(), graphQLObjectMapper);
}

if (responseCache != null) {
writer = new CachingQueryResponseWriter(writer, responseCache, invocationInput, result.isError());
}
return new SingleQueryResponseWriter(result.getResult(), graphQLObjectMapper, invocationInput);
return writer;
}

void write(HttpServletRequest request, HttpServletResponse response, GraphQLResponseCache responseCache) throws IOException;
void write(HttpServletRequest request, HttpServletResponse response) throws IOException;

}
Original file line number Diff line number Diff line change
Expand Up @@ -10,31 +10,21 @@
import javax.servlet.AsyncContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import graphql.kickstart.execution.input.GraphQLInvocationInput;
import graphql.kickstart.servlet.cache.GraphQLResponseCache;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.reactivestreams.Publisher;
import org.reactivestreams.Subscription;

@Slf4j
@RequiredArgsConstructor
class SingleAsynchronousQueryResponseWriter implements QueryResponseWriter {

@Getter
private final ExecutionResult result;
private final GraphQLObjectMapper graphQLObjectMapper;
private final long subscriptionTimeout;
private final GraphQLInvocationInput invocationInput;

@Override
public void write(HttpServletRequest request, HttpServletResponse response, GraphQLResponseCache responseCache) {
if (responseCache != null) {
log.warn("Response cache for asynchronous query are not implemented yet");
}

public void write(HttpServletRequest request, HttpServletResponse response) {
Objects.requireNonNull(request, "Http servlet request cannot be null");
response.setContentType(HttpRequestHandler.APPLICATION_EVENT_STREAM_UTF8);
response.setStatus(HttpRequestHandler.STATUS_OK);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,42 +2,26 @@

import graphql.ExecutionResult;
import graphql.kickstart.execution.GraphQLObjectMapper;
import graphql.kickstart.execution.input.GraphQLInvocationInput;
import graphql.kickstart.servlet.cache.CachedResponse;
import graphql.kickstart.servlet.cache.GraphQLResponseCache;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

@Slf4j
@RequiredArgsConstructor
class SingleQueryResponseWriter implements QueryResponseWriter {

private final ExecutionResult result;
private final GraphQLObjectMapper graphQLObjectMapper;
private final GraphQLInvocationInput invocationInput;

@Override
public void write(HttpServletRequest request, HttpServletResponse response, GraphQLResponseCache responseCache) throws IOException {
public void write(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType(HttpRequestHandler.APPLICATION_JSON_UTF8);
response.setStatus(HttpRequestHandler.STATUS_OK);
response.setCharacterEncoding(StandardCharsets.UTF_8.name());
String responseContent = graphQLObjectMapper.serializeResultAsJson(result);
byte[] contentBytes = responseContent.getBytes(StandardCharsets.UTF_8);

if (responseCache != null && responseCache.isCacheable(request, invocationInput)) {
try {
responseCache.put(request, invocationInput, CachedResponse.ofContent(contentBytes));
} catch (Throwable t) {
log.warn(t.getMessage(), t);
log.warn("Ignore read from cache, unexpected error happened");
}
}

response.setContentLength(contentBytes.length);
response.getOutputStream().write(contentBytes);
}
Expand Down
Loading