This is an automated email from the ASF dual-hosted git repository.
radu pushed a commit to branch master
in repository
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-graphql-core.git
The following commit(s) were added to refs/heads/master by this push:
new 0e0d29d SLING-9800 - Extract a service to be able to execute GraphQL
queries directly
0e0d29d is described below
commit 0e0d29da4efda5eec0545fcf76853ab5bef4e2dd
Author: Radu Cotescu <[email protected]>
AuthorDate: Mon Oct 12 13:36:22 2020 +0200
SLING-9800 - Extract a service to be able to execute GraphQL queries
directly
* improved QueryExecutor API to return a ValidationResult for #validate
and a Map<String, Object> for #execute
---
.../sling/graphql/api/engine/QueryExecutor.java | 10 ++-
.../sling/graphql/api/engine/ValidationResult.java | 49 +++++++++++++++
.../graphql/core/engine/DefaultQueryExecutor.java | 40 ++++++++----
.../core/engine/DefaultValidationResult.java | 73 ++++++++++++++++++++++
.../core/scripting/GraphQLScriptEngine.java | 6 +-
.../sling/graphql/core/servlet/GraphQLServlet.java | 22 ++++---
.../core/engine/DefaultQueryExecutorTest.java | 16 ++++-
.../graphql/core/engine/ResourceQueryTestBase.java | 6 +-
.../core/schema/SchemaDescriptionsTest.java | 7 ++-
.../graphql/core/servlet/GraphQLServletTest.java | 5 +-
10 files changed, 199 insertions(+), 35 deletions(-)
diff --git
a/src/main/java/org/apache/sling/graphql/api/engine/QueryExecutor.java
b/src/main/java/org/apache/sling/graphql/api/engine/QueryExecutor.java
index 29e49ea..916f412 100644
--- a/src/main/java/org/apache/sling/graphql/api/engine/QueryExecutor.java
+++ b/src/main/java/org/apache/sling/graphql/api/engine/QueryExecutor.java
@@ -20,8 +20,6 @@ package org.apache.sling.graphql.api.engine;
import java.util.Map;
-import javax.json.JsonObject;
-
import org.apache.sling.api.resource.Resource;
import org.apache.sling.graphql.api.SlingGraphQLException;
import org.jetbrains.annotations.NotNull;
@@ -42,8 +40,8 @@ public interface QueryExecutor {
* @param selectors potential selectors used to select the schema
applicable to the passed {@code query}
* @return {code true} if the {@code query} is valid, {@code false}
otherwise
*/
- boolean isValid(@NotNull String query, @NotNull Map<String, Object>
variables, @NotNull Resource queryResource,
- @NotNull String[] selectors);
+ ValidationResult validate(@NotNull String query, @NotNull Map<String,
Object> variables, @NotNull Resource queryResource,
+ @NotNull String[] selectors);
/**
* Executes the passed {@code query}.
@@ -52,10 +50,10 @@ public interface QueryExecutor {
* @param variables the query's variables; can be an empty {@link Map}
if the query doesn't accept variables
* @param queryResource the current resource, used as the root for the
query
* @param selectors potential selectors used to select the schema
applicable to the passed {@code query}
- * @return a {@link JsonObject} representing the query's result
+ * @return a {@link Map} representing the query's result
* @throws SlingGraphQLException if the execution of the query leads to
any issues
*/
@NotNull
- JsonObject execute(@NotNull String query, @NotNull Map<String, Object>
variables, @NotNull Resource queryResource,
+ Map<String, Object> execute(@NotNull String query, @NotNull Map<String,
Object> variables, @NotNull Resource queryResource,
@NotNull String[] selectors);
}
diff --git
a/src/main/java/org/apache/sling/graphql/api/engine/ValidationResult.java
b/src/main/java/org/apache/sling/graphql/api/engine/ValidationResult.java
new file mode 100644
index 0000000..d6be3a3
--- /dev/null
+++ b/src/main/java/org/apache/sling/graphql/api/engine/ValidationResult.java
@@ -0,0 +1,49 @@
+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ~ Licensed to the Apache Software Foundation (ASF) under one
+ ~ or more contributor license agreements. See the NOTICE file
+ ~ distributed with this work for additional information
+ ~ regarding copyright ownership. The ASF licenses this file
+ ~ to you under the Apache License, Version 2.0 (the
+ ~ "License"); you may not use this file except in compliance
+ ~ with the License. You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing,
+ ~ software distributed under the License is distributed on an
+ ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ~ KIND, either express or implied. See the License for the
+ ~ specific language governing permissions and limitations
+ ~ under the License.
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
+package org.apache.sling.graphql.api.engine;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.sling.api.resource.Resource;
+import org.jetbrains.annotations.NotNull;
+import org.osgi.annotation.versioning.ProviderType;
+
+/**
+ * The {@code ValidationResult} interface defines the result returned by
{@link QueryExecutor#validate(String, Map, Resource, String[])} and
+ * helps additional services to pre-validate a GraphQL query without executing
it.
+ */
+@ProviderType
+public interface ValidationResult {
+
+ /**
+ * Provides a simple way check if a query is valid or not.
+ *
+ * @return {@code true} if the query is valid, {@code false} otherwise
+ */
+ boolean isValid();
+
+ /**
+ * Returns a list of errors encountered while validating the query.
+ *
+ * @return a list of errors encountered while validating the query; an
empty list means that no issues were encountered.
+ */
+ @NotNull
+ List<String> getErrors();
+}
diff --git
a/src/main/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutor.java
b/src/main/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutor.java
index 2b87dab..b6ecfea 100644
---
a/src/main/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutor.java
+++
b/src/main/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutor.java
@@ -21,8 +21,6 @@ package org.apache.sling.graphql.core.engine;
import java.util.List;
import java.util.Map;
-import javax.json.Json;
-import javax.json.JsonObject;
import javax.script.ScriptException;
import org.apache.sling.api.resource.Resource;
@@ -30,6 +28,7 @@ import org.apache.sling.graphql.api.SchemaProvider;
import org.apache.sling.graphql.api.SlingDataFetcher;
import org.apache.sling.graphql.api.SlingGraphQLException;
import org.apache.sling.graphql.api.engine.QueryExecutor;
+import org.apache.sling.graphql.api.engine.ValidationResult;
import org.apache.sling.graphql.core.scalars.SlingScalarsProvider;
import org.apache.sling.graphql.core.schema.RankedSchemaProviders;
import org.jetbrains.annotations.NotNull;
@@ -44,10 +43,12 @@ import graphql.ExecutionResult;
import graphql.GraphQL;
import graphql.GraphQLError;
import graphql.ParseAndValidate;
+import graphql.ParseAndValidateResult;
import graphql.language.Argument;
import graphql.language.Directive;
import graphql.language.FieldDefinition;
import graphql.language.ObjectTypeDefinition;
+import graphql.language.SourceLocation;
import graphql.language.StringValue;
import graphql.schema.DataFetcher;
import graphql.schema.GraphQLScalarType;
@@ -79,8 +80,8 @@ public class DefaultQueryExecutor implements QueryExecutor {
private SlingScalarsProvider scalarsProvider;
@Override
- public boolean isValid(@NotNull String query, @NotNull Map<String, Object>
variables, @NotNull Resource queryResource,
- @NotNull String[] selectors) {
+ public ValidationResult validate(@NotNull String query, @NotNull
Map<String, Object> variables, @NotNull Resource queryResource,
+ @NotNull String[] selectors) {
try {
String schemaDef = prepareSchemaDefinition(schemaProvider,
queryResource, selectors);
LOGGER.debug("Resource {} maps to GQL schema {}",
queryResource.getPath(), schemaDef);
@@ -90,16 +91,29 @@ public class DefaultQueryExecutor implements QueryExecutor {
.query(query)
.variables(variables)
.build();
- return !ParseAndValidate.parseAndValidate(schema,
executionInput).isFailure();
+ ParseAndValidateResult parseAndValidateResult =
ParseAndValidate.parseAndValidate(schema, executionInput);
+ if (!parseAndValidateResult.isFailure()) {
+ return
DefaultValidationResult.Builder.newBuilder().withValidFlag(true).build();
+ }
+ DefaultValidationResult.Builder validationResultBuilder =
DefaultValidationResult.Builder.newBuilder().withValidFlag(false);
+ for (GraphQLError error : parseAndValidateResult.getErrors()) {
+ StringBuilder sb = new StringBuilder();
+ sb.append("Error:
type=").append(error.getErrorType().toString()).append("; ");
+ sb.append("message=").append(error.getMessage()).append("; ");
+ for (SourceLocation location : error.getLocations()) {
+
sb.append("location=").append(location.getLine()).append(",").append(location.getColumn()).append(";");
+ }
+ validationResultBuilder.withErrorMessage(sb.toString());
+ }
+ return validationResultBuilder.build();
} catch (Exception e) {
- LOGGER.error(String.format("Invalid query: %s.", query), e);
- return false;
+ return
DefaultValidationResult.Builder.newBuilder().withValidFlag(false).withErrorMessage(e.getMessage()).build();
}
}
@Override
- public @NotNull JsonObject execute(@NotNull String query, @NotNull
Map<String, Object> variables, @NotNull Resource queryResource,
- @NotNull String[] selectors) {
+ public @NotNull Map<String, Object> execute(@NotNull String query,
@NotNull Map<String, Object> variables,
+ @NotNull Resource
queryResource, @NotNull String[] selectors) {
String schemaDef = null;
try {
schemaDef = prepareSchemaDefinition(schemaProvider, queryResource,
selectors);
@@ -115,14 +129,16 @@ public class DefaultQueryExecutor implements
QueryExecutor {
if (!result.getErrors().isEmpty()) {
StringBuilder errors = new StringBuilder();
for (GraphQLError error : result.getErrors()) {
- errors.append("Error type:
").append(error.getErrorType().toString()).append("; error message:
").append(error.getMessage()).append(System.lineSeparator());
+ errors.append("Error:
type=").append(error.getErrorType().toString()).append(";
message=").append(error.getMessage()).append(System.lineSeparator());
+ for (SourceLocation location : error.getLocations()) {
+
errors.append("location=").append(location.getLine()).append(",").append(location.getColumn()).append(";");
+ }
}
throw new SlingGraphQLException(String.format("Query failed
for Resource %s: schema=%s, query=%s%nErrors:%n%s",
queryResource.getPath(), schemaDef, query,
errors.toString()));
}
LOGGER.debug("ExecutionResult.isDataPresent={}",
result.isDataPresent());
- Map<String, Object> resultAsMap = result.toSpecification();
- return
Json.createObjectBuilder(resultAsMap).build().asJsonObject();
+ return result.toSpecification();
} catch (SlingGraphQLException e) {
throw e;
} catch (Exception e) {
diff --git
a/src/main/java/org/apache/sling/graphql/core/engine/DefaultValidationResult.java
b/src/main/java/org/apache/sling/graphql/core/engine/DefaultValidationResult.java
new file mode 100644
index 0000000..851cace
--- /dev/null
+++
b/src/main/java/org/apache/sling/graphql/core/engine/DefaultValidationResult.java
@@ -0,0 +1,73 @@
+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ~ Licensed to the Apache Software Foundation (ASF) under one
+ ~ or more contributor license agreements. See the NOTICE file
+ ~ distributed with this work for additional information
+ ~ regarding copyright ownership. The ASF licenses this file
+ ~ to you under the Apache License, Version 2.0 (the
+ ~ "License"); you may not use this file except in compliance
+ ~ with the License. You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing,
+ ~ software distributed under the License is distributed on an
+ ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ~ KIND, either express or implied. See the License for the
+ ~ specific language governing permissions and limitations
+ ~ under the License.
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
+package org.apache.sling.graphql.core.engine;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.sling.graphql.api.engine.ValidationResult;
+import org.jetbrains.annotations.NotNull;
+
+public class DefaultValidationResult implements ValidationResult {
+
+ private final boolean isValid;
+ private final List<String> errors;
+
+ private DefaultValidationResult(boolean isValid, List<String> errors) {
+ this.isValid = isValid;
+ this.errors = errors;
+ }
+
+ @Override
+ public boolean isValid() {
+ return isValid;
+ }
+
+ @Override
+ public @NotNull List<String> getErrors() {
+ return Collections.unmodifiableList(errors);
+ }
+
+ static class Builder {
+
+ private boolean isValid;
+ private List<String> errors = new ArrayList<>();
+
+ private Builder() {};
+
+ Builder withValidFlag(boolean isValid) {
+ this.isValid = isValid;
+ return this;
+ }
+
+ Builder withErrorMessage(@NotNull String message) {
+ errors.add(message);
+ return this;
+ }
+
+ ValidationResult build() {
+ return new DefaultValidationResult(isValid, errors);
+ }
+
+ static Builder newBuilder() {
+ return new Builder();
+ }
+ }
+}
diff --git
a/src/main/java/org/apache/sling/graphql/core/scripting/GraphQLScriptEngine.java
b/src/main/java/org/apache/sling/graphql/core/scripting/GraphQLScriptEngine.java
index 5f4ac7f..5570e9c 100644
---
a/src/main/java/org/apache/sling/graphql/core/scripting/GraphQLScriptEngine.java
+++
b/src/main/java/org/apache/sling/graphql/core/scripting/GraphQLScriptEngine.java
@@ -26,6 +26,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+import java.util.Map;
import javax.json.Json;
import javax.json.JsonObject;
@@ -60,8 +61,9 @@ public class GraphQLScriptEngine extends AbstractScriptEngine
{
final Resource resource = (Resource)
context.getBindings(ScriptContext.ENGINE_SCOPE)
.get(SlingBindings.RESOURCE);
final String [] selectors = getRequestSelectors(resource);
- JsonObject json =
factory.getQueryExecutor().execute(IOUtils.toString(reader),
Collections.emptyMap(), resource, selectors);
- writer.writeObject(json);
+ Map<String, Object> executionResult =
factory.getQueryExecutor().execute(IOUtils.toString(reader),
Collections.emptyMap(),
+ resource, selectors);
+
writer.write(Json.createObjectBuilder(executionResult).build().asJsonObject());
} catch(Exception e) {
throw new ScriptException(e);
}
diff --git
a/src/main/java/org/apache/sling/graphql/core/servlet/GraphQLServlet.java
b/src/main/java/org/apache/sling/graphql/core/servlet/GraphQLServlet.java
index 49bd8b4..49e795b 100644
--- a/src/main/java/org/apache/sling/graphql/core/servlet/GraphQLServlet.java
+++ b/src/main/java/org/apache/sling/graphql/core/servlet/GraphQLServlet.java
@@ -22,11 +22,11 @@ package org.apache.sling.graphql.core.servlet;
import java.io.IOException;
import java.util.Arrays;
+import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.json.Json;
-import javax.json.JsonObject;
import javax.json.JsonWriter;
import javax.servlet.Servlet;
import javax.servlet.http.HttpServletResponse;
@@ -42,6 +42,7 @@ import org.apache.sling.commons.metrics.MetricsService;
import org.apache.sling.commons.metrics.Timer;
import org.apache.sling.graphql.api.cache.GraphQLCacheProvider;
import org.apache.sling.graphql.api.engine.QueryExecutor;
+import org.apache.sling.graphql.api.engine.ValidationResult;
import org.jetbrains.annotations.NotNull;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
@@ -52,6 +53,8 @@ import
org.osgi.service.metatype.annotations.AttributeDefinition;
import org.osgi.service.metatype.annotations.AttributeType;
import org.osgi.service.metatype.annotations.Designate;
import org.osgi.service.metatype.annotations.ObjectClassDefinition;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import com.codahale.metrics.Gauge;
import com.codahale.metrics.MetricRegistry;
@@ -78,6 +81,7 @@ import com.codahale.metrics.MetricRegistry;
@Designate(ocd = GraphQLServlet.Config.class, factory=true)
public class GraphQLServlet extends SlingAllMethodsServlet {
private static final long serialVersionUID = 1L;
+ private static final Logger LOGGER =
LoggerFactory.getLogger(GraphQLServlet.class);
public static final String P_QUERY = "query";
@@ -277,8 +281,9 @@ public class GraphQLServlet extends SlingAllMethodsServlet {
throws IOException {
String rawQuery = IOUtils.toString(request.getReader());
QueryParser.Result query = QueryParser.fromJSON(rawQuery);
- if (queryExecutor
- .isValid(query.getQuery(), query.getVariables(),
request.getResource(), request.getRequestPathInfo().getSelectors())) {
+ ValidationResult validationResult = queryExecutor
+ .validate(query.getQuery(), query.getVariables(),
request.getResource(), request.getRequestPathInfo().getSelectors());
+ if (validationResult.isValid()) {
String hash = cacheProvider.cacheQuery(rawQuery,
request.getResource().getResourceType(),
request.getRequestPathInfo().getSelectorString());
if (hash != null) {
@@ -288,6 +293,7 @@ public class GraphQLServlet extends SlingAllMethodsServlet {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Cannot store
persisted query.");
}
} else {
+ LOGGER.error("Invalid GraphQL query: " +
String.join(System.lineSeparator(), validationResult.getErrors()));
response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Invalid
GraphQL query.");
}
}
@@ -307,9 +313,9 @@ public class GraphQLServlet extends SlingAllMethodsServlet {
}
try (JsonWriter writer = Json.createWriter(response.getWriter())) {
- final JsonObject json = queryExecutor.execute(query,
result.getVariables(), resource,
+ Map<String, Object> executionResult = queryExecutor.execute(query,
result.getVariables(), resource,
request.getRequestPathInfo().getSelectors());
- writer.writeObject(json);
+
writer.write(Json.createObjectBuilder(executionResult).build().asJsonObject());
} catch(Exception ex) {
throw new IOException(ex);
}
@@ -320,9 +326,9 @@ public class GraphQLServlet extends SlingAllMethodsServlet {
response.setCharacterEncoding("UTF-8");
try (JsonWriter writer = Json.createWriter(response.getWriter())) {
final QueryParser.Result result =
QueryParser.fromJSON(persistedQuery);
- final JsonObject json = queryExecutor
- .execute(result.getQuery(), result.getVariables(),
request.getResource(), request.getRequestPathInfo().getSelectors());
- writer.writeObject(json);
+ Map<String, Object> executionResult =
queryExecutor.execute(result.getQuery(), result.getVariables(),
request.getResource(),
+ request.getRequestPathInfo().getSelectors());
+
writer.write(Json.createObjectBuilder(executionResult).build().asJsonObject());
} catch (Exception ex) {
throw new IOException(ex);
}
diff --git
a/src/test/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutorTest.java
b/src/test/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutorTest.java
index d137cc6..903f738 100644
---
a/src/test/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutorTest.java
+++
b/src/test/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutorTest.java
@@ -25,6 +25,7 @@ import java.util.Hashtable;
import org.apache.sling.graphql.api.SchemaProvider;
import org.apache.sling.graphql.api.SlingGraphQLException;
import org.apache.sling.graphql.api.engine.QueryExecutor;
+import org.apache.sling.graphql.api.engine.ValidationResult;
import org.apache.sling.graphql.core.mocks.DigestDataFetcher;
import org.apache.sling.graphql.core.mocks.EchoDataFetcher;
import org.apache.sling.graphql.core.mocks.FailingDataFetcher;
@@ -39,8 +40,10 @@ import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.nullValue;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
public class DefaultQueryExecutorTest extends ResourceQueryTestBase {
@@ -100,11 +103,22 @@ public class DefaultQueryExecutorTest extends
ResourceQueryTestBase {
assertNotNull(queryExecutor);
queryExecutor.execute(stmt, Collections.emptyMap(), resource, new
String[] {});
} catch(RuntimeException rex) {
- assertThat(rex.getMessage(),
containsString("DataFetchingException; error message: Exception while fetching
data (/currentResource/failure) : FailingDataFetcher"));
+ assertThat(rex.getMessage(), containsString("Error:
type=DataFetchingException; message=Exception while fetching data
(/currentResource/failure) : FailingDataFetcher"));
}
}
@Test
+ public void invalidQueryTest() {
+ final String stmt = "{ currentRsrc { failure } }";
+ QueryExecutor queryExecutor = context.getService(QueryExecutor.class);
+ assertNotNull(queryExecutor);
+ ValidationResult result = queryExecutor.validate(stmt,
Collections.emptyMap(), resource, new String[] {});
+ assertFalse(result.isValid());
+ String errors = String.join("\n", result.getErrors());
+ assertTrue(errors.contains("Error: type=ValidationError;
message=Validation error of type FieldUndefined: Field 'currentRsrc' in type
'Query' is undefined @ 'currentRsrc'; location=1,3;"));
+ }
+
+ @Test
public void schemaSelectorsTest() throws Exception {
final String [] selectors = { "selected", "foryou" };
final String json = queryJSON("{ currentResource { path fortyTwo } }",
selectors);
diff --git
a/src/test/java/org/apache/sling/graphql/core/engine/ResourceQueryTestBase.java
b/src/test/java/org/apache/sling/graphql/core/engine/ResourceQueryTestBase.java
index 790c14b..eb9090d 100644
---
a/src/test/java/org/apache/sling/graphql/core/engine/ResourceQueryTestBase.java
+++
b/src/test/java/org/apache/sling/graphql/core/engine/ResourceQueryTestBase.java
@@ -19,8 +19,10 @@
package org.apache.sling.graphql.core.engine;
import java.util.Collections;
+import java.util.Map;
import java.util.UUID;
+import javax.json.Json;
import javax.json.JsonObject;
import org.apache.sling.api.resource.Resource;
@@ -77,8 +79,8 @@ public abstract class ResourceQueryTestBase {
protected String queryJSON(String stmt, String [] selectors) {
final QueryExecutor queryExecutor =
context.getService(QueryExecutor.class);
assertNotNull(queryExecutor);
- JsonObject json = queryExecutor.execute(stmt, Collections.emptyMap(),
resource, selectors);
- return json.toString();
+ Map<String, Object> executionResult = queryExecutor.execute(stmt,
Collections.emptyMap(), resource, selectors);
+ return
Json.createObjectBuilder(executionResult).build().asJsonObject().toString();
}
protected void setupAdditionalServices() {
diff --git
a/src/test/java/org/apache/sling/graphql/core/schema/SchemaDescriptionsTest.java
b/src/test/java/org/apache/sling/graphql/core/schema/SchemaDescriptionsTest.java
index 6b53117..a4147dd 100644
---
a/src/test/java/org/apache/sling/graphql/core/schema/SchemaDescriptionsTest.java
+++
b/src/test/java/org/apache/sling/graphql/core/schema/SchemaDescriptionsTest.java
@@ -19,9 +19,10 @@
package org.apache.sling.graphql.core.schema;
import java.util.Collections;
+import java.util.Map;
import java.util.UUID;
-import javax.json.JsonObject;
+import javax.json.Json;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.servlets.ServletResolver;
@@ -112,8 +113,8 @@ public class SchemaDescriptionsTest {
private String queryJSON(String stmt) throws Exception {
QueryExecutor queryExecutor = context.getService(QueryExecutor.class);
assertNotNull(queryExecutor);
- JsonObject json = queryExecutor.execute(stmt, Collections.emptyMap(),
resource, new String[] {});
- return json.toString();
+ Map<String, Object> executionResult = queryExecutor.execute(stmt,
Collections.emptyMap(), resource, new String[]{});
+ return
Json.createObjectBuilder(executionResult).build().asJsonObject().toString();
}
private void assertTypeDescription(String typeName, String expected) {
diff --git
a/src/test/java/org/apache/sling/graphql/core/servlet/GraphQLServletTest.java
b/src/test/java/org/apache/sling/graphql/core/servlet/GraphQLServletTest.java
index 0c1ab0c..43a901b 100644
---
a/src/test/java/org/apache/sling/graphql/core/servlet/GraphQLServletTest.java
+++
b/src/test/java/org/apache/sling/graphql/core/servlet/GraphQLServletTest.java
@@ -31,6 +31,7 @@ import org.apache.sling.commons.metrics.Counter;
import org.apache.sling.commons.metrics.MetricsService;
import org.apache.sling.commons.metrics.Timer;
import org.apache.sling.graphql.api.engine.QueryExecutor;
+import org.apache.sling.graphql.api.engine.ValidationResult;
import org.apache.sling.graphql.core.cache.SimpleGraphQLCacheProvider;
import org.apache.sling.testing.mock.sling.junit.SlingContext;
import org.apache.sling.testing.mock.sling.servlet.MockRequestPathInfo;
@@ -70,7 +71,9 @@ public class GraphQLServletTest {
context.registerService(MetricRegistry.class, metricRegistry, "name",
"sling");
QueryExecutor queryExecutor = mock(QueryExecutor.class);
- when(queryExecutor.isValid(any(String.class), any(Map.class),
any(Resource.class), any(String[].class))).thenReturn(true);
+ ValidationResult validationResult = mock(ValidationResult.class);
+ when(validationResult.isValid()).thenReturn(true);
+ when(queryExecutor.validate(any(String.class), any(Map.class),
any(Resource.class), any(String[].class))).thenReturn(validationResult);
context.registerService(QueryExecutor.class, queryExecutor);
}