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);
     }
 

Reply via email to