Skip to content

Commit 5f99d52

Browse files
committed
Allow root object builder to be set
1 parent 7f61872 commit 5f99d52

File tree

5 files changed

+77
-19
lines changed

5 files changed

+77
-19
lines changed

src/main/java/graphql/servlet/DefaultGraphQLRootObjectBuilder.java

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,8 @@
1414
*/
1515
package graphql.servlet;
1616

17-
import javax.servlet.http.HttpServletRequest;
18-
import javax.servlet.http.HttpServletResponse;
19-
import java.util.Optional;
20-
21-
public class DefaultGraphQLRootObjectBuilder implements GraphQLRootObjectBuilder {
22-
@Override
23-
public Object build(Optional<HttpServletRequest> req, Optional<HttpServletResponse> resp) {
24-
return new Object();
17+
public class DefaultGraphQLRootObjectBuilder extends StaticGraphQLRootObjectBuilder {
18+
public DefaultGraphQLRootObjectBuilder() {
19+
super(new Object());
2520
}
2621
}

src/main/java/graphql/servlet/GraphQLServlet.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import com.fasterxml.jackson.databind.ObjectMapper;
2222
import com.fasterxml.jackson.databind.SerializationFeature;
2323
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
24+
import graphql.ExecutionInput;
2425
import graphql.ExecutionResult;
2526
import graphql.GraphQL;
2627
import graphql.GraphQLError;
@@ -72,6 +73,7 @@ public abstract class GraphQLServlet extends HttpServlet implements Servlet, Gra
7273

7374
protected abstract GraphQLSchemaProvider getSchemaProvider();
7475
protected abstract GraphQLContext createContext(Optional<HttpServletRequest> request, Optional<HttpServletResponse> response);
76+
protected abstract Object createRootObject(Optional<HttpServletRequest> request, Optional<HttpServletResponse> response);
7577
protected abstract ExecutionStrategyProvider getExecutionStrategyProvider();
7678
protected abstract Instrumentation getInstrumentation();
7779
protected abstract Map<String, Object> transformVariables(GraphQLSchema schema, String query, Map<String, Object> variables);
@@ -93,12 +95,13 @@ public GraphQLServlet(List<GraphQLServletListener> listeners, FileItemFactory fi
9395

9496
this.getHandler = (request, response) -> {
9597
final GraphQLContext context = createContext(Optional.of(request), Optional.of(response));
98+
final Object rootObject = createRootObject(Optional.of(request), Optional.of(response));
9699
String path = request.getPathInfo();
97100
if (path == null) {
98101
path = request.getServletPath();
99102
}
100103
if (path.contentEquals("/schema.json")) {
101-
query(IntrospectionQuery.INTROSPECTION_QUERY, null, new HashMap<>(), getSchemaProvider().getSchema(request), request, response, context);
104+
query(IntrospectionQuery.INTROSPECTION_QUERY, null, new HashMap<>(), getSchemaProvider().getSchema(request), request, response, context, rootObject);
102105
} else {
103106
if (request.getParameter("query") != null) {
104107
final Map<String, Object> variables = new HashMap<>();
@@ -109,7 +112,7 @@ public GraphQLServlet(List<GraphQLServletListener> listeners, FileItemFactory fi
109112
if (request.getParameter("operationName") != null) {
110113
operationName = request.getParameter("operationName");
111114
}
112-
query(request.getParameter("query"), operationName, variables, getSchemaProvider().getReadOnlySchema(request), request, response, context);
115+
query(request.getParameter("query"), operationName, variables, getSchemaProvider().getReadOnlySchema(request), request, response, context, rootObject);
113116
} else {
114117
response.setStatus(STATUS_BAD_REQUEST);
115118
log.info("Bad GET request: path was not \"/schema.json\" or no query variable named \"query\" given");
@@ -119,6 +122,7 @@ public GraphQLServlet(List<GraphQLServletListener> listeners, FileItemFactory fi
119122

120123
this.postHandler = (request, response) -> {
121124
final GraphQLContext context = createContext(Optional.of(request), Optional.of(response));
125+
final Object rootObject = createRootObject(Optional.of(request), Optional.of(response));
122126
GraphQLRequest graphQLRequest = null;
123127

124128
try {
@@ -182,7 +186,7 @@ public GraphQLServlet(List<GraphQLServletListener> listeners, FileItemFactory fi
182186
variables = new HashMap<>();
183187
}
184188

185-
query(graphQLRequest.getQuery(), graphQLRequest.getOperationName(), variables, getSchemaProvider().getSchema(request), request, response, context);
189+
query(graphQLRequest.getQuery(), graphQLRequest.getOperationName(), variables, getSchemaProvider().getSchema(request), request, response, context, rootObject);
186190
};
187191
}
188192

@@ -259,13 +263,13 @@ private GraphQL newGraphQL(GraphQLSchema schema) {
259263
.build();
260264
}
261265

262-
private void query(String query, String operationName, Map<String, Object> variables, GraphQLSchema schema, HttpServletRequest req, HttpServletResponse resp, GraphQLContext context) throws IOException {
266+
private void query(String query, String operationName, Map<String, Object> variables, GraphQLSchema schema, HttpServletRequest req, HttpServletResponse resp, GraphQLContext context, Object rootObject) throws IOException {
263267
if (operationName != null && operationName.isEmpty()) {
264-
query(query, null, variables, schema, req, resp, context);
268+
query(query, null, variables, schema, req, resp, context, rootObject);
265269
} else if (Subject.getSubject(AccessController.getContext()) == null && context.getSubject().isPresent()) {
266270
Subject.doAs(context.getSubject().get(), (PrivilegedAction<Void>) () -> {
267271
try {
268-
query(query, operationName, variables, schema, req, resp, context);
272+
query(query, operationName, variables, schema, req, resp, context, rootObject);
269273
} catch (IOException e) {
270274
throw new RuntimeException(e);
271275
}
@@ -274,7 +278,7 @@ private void query(String query, String operationName, Map<String, Object> varia
274278
} else {
275279
List<GraphQLServletListener.OperationCallback> operationCallbacks = runListeners(l -> l.onOperation(context, operationName, query, variables));
276280

277-
final ExecutionResult executionResult = newGraphQL(schema).execute(query, operationName, context, transformVariables(schema, query, variables));
281+
final ExecutionResult executionResult = newGraphQL(schema).execute(new ExecutionInput(query, operationName, context, rootObject, transformVariables(schema, query, variables)));
278282
final List<GraphQLError> errors = executionResult.getErrors();
279283
final Object data = executionResult.getData();
280284

src/main/java/graphql/servlet/OsgiGraphQLServlet.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ public class OsgiGraphQLServlet extends GraphQLServlet {
4646
private final List<GraphQLTypesProvider> typesProviders = new ArrayList<>();
4747

4848
private GraphQLContextBuilder contextBuilder = new DefaultGraphQLContextBuilder();
49+
private GraphQLRootObjectBuilder rootObjectBuilder = new DefaultGraphQLRootObjectBuilder();
4950
private ExecutionStrategyProvider executionStrategyProvider = new DefaultExecutionStrategyProvider();
5051
private InstrumentationProvider instrumentationProvider = new NoOpInstrumentationProvider();
5152
private GraphQLErrorHandler errorHandler = new DefaultGraphQLErrorHandler();
@@ -159,6 +160,14 @@ public void unsetContextProvider(GraphQLContextBuilder contextBuilder) {
159160
this.contextBuilder = new DefaultGraphQLContextBuilder();
160161
}
161162

163+
@Reference(cardinality = ReferenceCardinality.OPTIONAL, policyOption = ReferencePolicyOption.GREEDY)
164+
public void setRootObjectBuilder(GraphQLRootObjectBuilder rootObjectBuilder) {
165+
this.rootObjectBuilder = rootObjectBuilder;
166+
}
167+
public void unsetRootObjectBuilder(GraphQLRootObjectBuilder rootObjectBuilder) {
168+
this.rootObjectBuilder = new DefaultGraphQLRootObjectBuilder();
169+
}
170+
162171
@Reference(cardinality = ReferenceCardinality.OPTIONAL)
163172
public void setExecutionStrategyProvider(ExecutionStrategyProvider provider) {
164173
executionStrategyProvider = provider;
@@ -192,6 +201,11 @@ protected GraphQLContext createContext(Optional<HttpServletRequest> req, Optiona
192201
return contextBuilder.build(req, resp);
193202
}
194203

204+
@Override
205+
protected Object createRootObject(Optional<HttpServletRequest> request, Optional<HttpServletResponse> response) {
206+
return rootObjectBuilder.build(request, response);
207+
}
208+
195209
@Override
196210
protected ExecutionStrategyProvider getExecutionStrategyProvider() {
197211
return executionStrategyProvider;

src/main/java/graphql/servlet/SimpleGraphQLServlet.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,14 @@ public SimpleGraphQLServlet(GraphQLSchema schema, ExecutionStrategy executionStr
3939
}
4040

4141
public SimpleGraphQLServlet(GraphQLSchema schema, ExecutionStrategyProvider executionStrategyProvider) {
42-
this(schema, executionStrategyProvider, null, null, null, null);
42+
this(schema, executionStrategyProvider, null, null, null, null, null);
4343
}
4444

45-
public SimpleGraphQLServlet(final GraphQLSchema schema, ExecutionStrategyProvider executionStrategyProvider, List<GraphQLServletListener> listeners, Instrumentation instrumentation, GraphQLErrorHandler errorHandler, GraphQLContextBuilder contextBuilder) {
46-
this(new DefaultGraphQLSchemaProvider(schema), executionStrategyProvider, listeners, instrumentation, errorHandler, contextBuilder);
45+
public SimpleGraphQLServlet(final GraphQLSchema schema, ExecutionStrategyProvider executionStrategyProvider, List<GraphQLServletListener> listeners, Instrumentation instrumentation, GraphQLErrorHandler errorHandler, GraphQLContextBuilder contextBuilder, GraphQLRootObjectBuilder rootObjectBuilder) {
46+
this(new DefaultGraphQLSchemaProvider(schema), executionStrategyProvider, listeners, instrumentation, errorHandler, contextBuilder, rootObjectBuilder);
4747
}
4848

49-
public SimpleGraphQLServlet(GraphQLSchemaProvider schemaProvider, ExecutionStrategyProvider executionStrategyProvider, List<GraphQLServletListener> listeners, Instrumentation instrumentation, GraphQLErrorHandler errorHandler, GraphQLContextBuilder contextBuilder) {
49+
public SimpleGraphQLServlet(GraphQLSchemaProvider schemaProvider, ExecutionStrategyProvider executionStrategyProvider, List<GraphQLServletListener> listeners, Instrumentation instrumentation, GraphQLErrorHandler errorHandler, GraphQLContextBuilder contextBuilder, GraphQLRootObjectBuilder rootObjectBuilder) {
5050
super(listeners, null);
5151

5252
this.schemaProvider = schemaProvider;
@@ -69,13 +69,20 @@ public SimpleGraphQLServlet(GraphQLSchemaProvider schemaProvider, ExecutionStrat
6969
} else {
7070
this.contextBuilder = contextBuilder;
7171
}
72+
73+
if(rootObjectBuilder == null) {
74+
this.rootObjectBuilder = new DefaultGraphQLRootObjectBuilder();
75+
} else {
76+
this.rootObjectBuilder = rootObjectBuilder;
77+
}
7278
}
7379

7480
private final GraphQLSchemaProvider schemaProvider;
7581
private final ExecutionStrategyProvider executionStrategyProvider;
7682
private final Instrumentation instrumentation;
7783
private final GraphQLErrorHandler errorHandler;
7884
private final GraphQLContextBuilder contextBuilder;
85+
private final GraphQLRootObjectBuilder rootObjectBuilder;
7986

8087
@Override
8188
protected GraphQLSchemaProvider getSchemaProvider() {
@@ -87,6 +94,11 @@ protected GraphQLContext createContext(Optional<HttpServletRequest> request, Opt
8794
return this.contextBuilder.build(request, response);
8895
}
8996

97+
@Override
98+
protected Object createRootObject(Optional<HttpServletRequest> request, Optional<HttpServletResponse> response) {
99+
return this.rootObjectBuilder.build(request, response);
100+
}
101+
90102
@Override
91103
protected ExecutionStrategyProvider getExecutionStrategyProvider() {
92104
return executionStrategyProvider;
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/**
2+
* Copyright 2016 Yurii Rashkovskii
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
*/
15+
package graphql.servlet;
16+
17+
import javax.servlet.http.HttpServletRequest;
18+
import javax.servlet.http.HttpServletResponse;
19+
import java.util.Optional;
20+
21+
public class StaticGraphQLRootObjectBuilder implements GraphQLRootObjectBuilder {
22+
23+
private final Object rootObject;
24+
25+
public StaticGraphQLRootObjectBuilder(Object rootObject) {
26+
this.rootObject = rootObject;
27+
}
28+
29+
@Override
30+
public Object build(Optional<HttpServletRequest> req, Optional<HttpServletResponse> resp) {
31+
return rootObject;
32+
}
33+
}

0 commit comments

Comments
 (0)