You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by bd...@apache.org on 2020/04/22 11:09:54 UTC

[sling-whiteboard] 01/02: Add SchemaProvider API

This is an automated email from the ASF dual-hosted git repository.

bdelacretaz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-whiteboard.git

commit 25bda7b7461531bf3b48ef018ddc4e5454de9166
Author: Bertrand Delacretaz <bd...@apache.org>
AuthorDate: Wed Apr 22 13:01:48 2020 +0200

    Add SchemaProvider API
---
 .../sling/scripting/gql/api/SchemaProvider.java}   | 41 ++++++++++++----------
 .../scripting/gql/engine/GraphQLResourceQuery.java |  8 ++---
 .../gql/engine/GraphQLScriptEngineFactory.java     |  6 ++--
 ...emaProvider.java => DefaultSchemaProvider.java} | 31 ++++++++--------
 .../scripting/gql/servlet/GraphQLServlet.java      |  4 +--
 .../gql/engine/GraphQLResourceQueryTest.java       |  4 +--
 .../scripting/gql/engine/MockSchemaProvider.java   |  7 ++--
 7 files changed, 52 insertions(+), 49 deletions(-)

diff --git a/graphql-scripting/src/test/java/org/apache/sling/scripting/gql/engine/MockSchemaProvider.java b/graphql-scripting/src/main/java/org/apache/sling/scripting/gql/api/SchemaProvider.java
similarity index 55%
copy from graphql-scripting/src/test/java/org/apache/sling/scripting/gql/engine/MockSchemaProvider.java
copy to graphql-scripting/src/main/java/org/apache/sling/scripting/gql/api/SchemaProvider.java
index 3d18fe2..eeef129 100644
--- a/graphql-scripting/src/test/java/org/apache/sling/scripting/gql/engine/MockSchemaProvider.java
+++ b/graphql-scripting/src/main/java/org/apache/sling/scripting/gql/api/SchemaProvider.java
@@ -16,25 +16,30 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.sling.scripting.gql.engine;
+
+package org.apache.sling.scripting.gql.api;
+
+import java.io.IOException;
 
 import org.apache.sling.api.resource.Resource;
-import org.apache.sling.scripting.gql.schema.GraphQLSchemaProvider;
-
-class MockSchemaProvider extends GraphQLSchemaProvider {
-
-    private static final String MOCK_SCHEMA = 
-        "type Query {\n"
-        + "    ## fetch:test/echo\n"
-        + "    currentResource : SlingResource\n"
-        + "    ## fetch:test/static\n"
-        + "    staticContent: Test"
-        + "}\n"
-        + "type SlingResource { path: String resourceType: String }\n"
-        + "type Test { test: Boolean }";
-
-    @Override
-    public String getSchema(Resource r) throws Exception {
-        return MOCK_SCHEMA;
+
+import aQute.bnd.annotation.ProviderType;
+
+@ProviderType
+public interface SchemaProvider {
+    
+    public static class SchemaProviderException extends IOException {
+        private static final long serialVersionUID = 1L;
+
+        public SchemaProviderException(String reason) {
+            super(reason);
+        }
+
+        public SchemaProviderException(String reason, Throwable cause) {
+            super(reason, cause);
+        }
     }
+
+    /** Get a GraphQL Schema definition for the given resource and optional selectors */
+    String getSchema(Resource r, String [] selectors) throws SchemaProviderException;
 }
diff --git a/graphql-scripting/src/main/java/org/apache/sling/scripting/gql/engine/GraphQLResourceQuery.java b/graphql-scripting/src/main/java/org/apache/sling/scripting/gql/engine/GraphQLResourceQuery.java
index 1810391..c015f15 100644
--- a/graphql-scripting/src/main/java/org/apache/sling/scripting/gql/engine/GraphQLResourceQuery.java
+++ b/graphql-scripting/src/main/java/org/apache/sling/scripting/gql/engine/GraphQLResourceQuery.java
@@ -25,9 +25,9 @@ import graphql.language.Comment;
 import graphql.language.FieldDefinition;
 import graphql.language.ObjectTypeDefinition;
 import org.apache.sling.api.resource.Resource;
+import org.apache.sling.scripting.gql.api.SchemaProvider;
 import org.apache.sling.scripting.gql.schema.DataFetcherDefinitionImpl;
 import org.apache.sling.scripting.gql.schema.DataFetcherSelector;
-import org.apache.sling.scripting.gql.schema.GraphQLSchemaProvider;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -47,7 +47,7 @@ public class GraphQLResourceQuery {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    public ExecutionResult executeQuery(GraphQLSchemaProvider schemaProvider, DataFetcherSelector fetchers,
+    public ExecutionResult executeQuery(SchemaProvider schemaProvider, DataFetcherSelector fetchers,
                                         Resource r, String query) throws ScriptException {
         if(r == null) {
             throw new ScriptException("Resource is null");
@@ -56,12 +56,12 @@ public class GraphQLResourceQuery {
             throw new ScriptException("Query is null");
         }
         if(schemaProvider == null) {
-            throw new ScriptException("GraphQLSchemaProvider is null");
+            throw new ScriptException("SchemaProvider is null");
         }
 
         String schemaDef = null;
         try {
-            schemaDef = schemaProvider.getSchema(r);
+            schemaDef = schemaProvider.getSchema(r, null);
         } catch(Exception e) {
             final ScriptException up = new ScriptException("Schema provider failed");
             up.initCause(e);
diff --git a/graphql-scripting/src/main/java/org/apache/sling/scripting/gql/engine/GraphQLScriptEngineFactory.java b/graphql-scripting/src/main/java/org/apache/sling/scripting/gql/engine/GraphQLScriptEngineFactory.java
index 6716b07..50ee0c6 100644
--- a/graphql-scripting/src/main/java/org/apache/sling/scripting/gql/engine/GraphQLScriptEngineFactory.java
+++ b/graphql-scripting/src/main/java/org/apache/sling/scripting/gql/engine/GraphQLScriptEngineFactory.java
@@ -23,8 +23,8 @@ import javax.script.ScriptEngine;
 import javax.script.ScriptEngineFactory;
 
 import org.apache.sling.scripting.api.AbstractScriptEngineFactory;
+import org.apache.sling.scripting.gql.api.SchemaProvider;
 import org.apache.sling.scripting.gql.schema.DataFetcherSelector;
-import org.apache.sling.scripting.gql.schema.GraphQLSchemaProvider;
 import org.osgi.framework.Constants;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
@@ -50,7 +50,7 @@ public class GraphQLScriptEngineFactory extends AbstractScriptEngineFactory {
     public static final String LANGUAGE_VERSION = "Sling:GraphQL:0.1";
 
     @Reference
-    private GraphQLSchemaProvider schemaProvider;
+    private SchemaProvider schemaProvider;
 
     @Reference
     private DataFetcherSelector fetcherManager;
@@ -77,7 +77,7 @@ public class GraphQLScriptEngineFactory extends AbstractScriptEngineFactory {
         return new GraphQLScriptEngine(this);
     }
 
-    GraphQLSchemaProvider getSchemaProvider() {
+    SchemaProvider getSchemaProvider() {
         return schemaProvider;
     }
 
diff --git a/graphql-scripting/src/main/java/org/apache/sling/scripting/gql/schema/GraphQLSchemaProvider.java b/graphql-scripting/src/main/java/org/apache/sling/scripting/gql/schema/DefaultSchemaProvider.java
similarity index 79%
rename from graphql-scripting/src/main/java/org/apache/sling/scripting/gql/schema/GraphQLSchemaProvider.java
rename to graphql-scripting/src/main/java/org/apache/sling/scripting/gql/schema/DefaultSchemaProvider.java
index dd3b0d2..1899b31 100644
--- a/graphql-scripting/src/main/java/org/apache/sling/scripting/gql/schema/GraphQLSchemaProvider.java
+++ b/graphql-scripting/src/main/java/org/apache/sling/scripting/gql/schema/DefaultSchemaProvider.java
@@ -22,9 +22,12 @@ package org.apache.sling.scripting.gql.schema;
 
 import java.io.IOException;
 
+import javax.servlet.ServletException;
+
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.engine.SlingRequestProcessor;
+import org.apache.sling.scripting.gql.api.SchemaProvider;
 import org.apache.sling.servlethelpers.MockSlingHttpServletRequest;
 import org.apache.sling.servlethelpers.MockSlingHttpServletResponse;
 import org.osgi.framework.Constants;
@@ -32,29 +35,18 @@ import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Reference;
 
 /** Provides a Resource-specific GraphQL Schema, as text */
-@Component(service = GraphQLSchemaProvider.class, immediate = true, property = {
+@Component(service = SchemaProvider.class, immediate = true, property = {
         Constants.SERVICE_DESCRIPTION + "=Apache Sling Scripting GraphQL SchemaProvider",
         Constants.SERVICE_VENDOR + "=The Apache Software Foundation" })
-public class GraphQLSchemaProvider {
+public class DefaultSchemaProvider implements SchemaProvider {
 
     public static final String SCHEMA_EXTENSION = ".GQLschema";
 
     @Reference
     protected SlingRequestProcessor requestProcessor;
 
-    public static class SchemaProviderException extends IOException {
-        private static final long serialVersionUID = 1L;
-
-        SchemaProviderException(String reason) {
-            super(reason);
-        }
-
-        SchemaProviderException(String reason, Throwable cause) {
-            super(reason, cause);
-        }
-    }
-
-    public String getSchema(Resource r) throws Exception {
+    @Override
+    public String getSchema(Resource r, String [] selectors) throws SchemaProviderException {
         final ResourceResolver resourceResolver = r.getResourceResolver();
         if(r == null) {
             throw new SchemaProviderException("Resource.getResourceResolver() is null");
@@ -67,7 +59,12 @@ public class GraphQLSchemaProvider {
         if(status != 200) {
             throw new SchemaProviderException("Request to " + path + " returns HTTP status " + status);
         }
-        requestProcessor.processRequest(request, response, resourceResolver);
-        return response.getOutputAsString();
+
+        try {
+            requestProcessor.processRequest(request, response, resourceResolver);
+            return response.getOutputAsString();
+        } catch(Exception e) {
+            throw new SchemaProviderException("Schema request failed", e);
+        }
     }
 }
diff --git a/graphql-scripting/src/main/java/org/apache/sling/scripting/gql/servlet/GraphQLServlet.java b/graphql-scripting/src/main/java/org/apache/sling/scripting/gql/servlet/GraphQLServlet.java
index ea4bb38..939590d 100644
--- a/graphql-scripting/src/main/java/org/apache/sling/scripting/gql/servlet/GraphQLServlet.java
+++ b/graphql-scripting/src/main/java/org/apache/sling/scripting/gql/servlet/GraphQLServlet.java
@@ -31,9 +31,9 @@ import org.apache.sling.api.SlingHttpServletRequest;
 import org.apache.sling.api.SlingHttpServletResponse;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.servlets.SlingAllMethodsServlet;
+import org.apache.sling.scripting.gql.api.SchemaProvider;
 import org.apache.sling.scripting.gql.engine.GraphQLResourceQuery;
 import org.apache.sling.scripting.gql.schema.DataFetcherSelector;
-import org.apache.sling.scripting.gql.schema.GraphQLSchemaProvider;
 import org.apache.sling.scripting.gql.engine.GraphQLScriptEngine;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.ConfigurationPolicy;
@@ -98,7 +98,7 @@ public class GraphQLServlet extends SlingAllMethodsServlet {
     }
 
     @Reference
-    private GraphQLSchemaProvider schemaProvider;
+    private SchemaProvider schemaProvider;
 
     @Reference
     private DataFetcherSelector fetchers;
diff --git a/graphql-scripting/src/test/java/org/apache/sling/scripting/gql/engine/GraphQLResourceQueryTest.java b/graphql-scripting/src/test/java/org/apache/sling/scripting/gql/engine/GraphQLResourceQueryTest.java
index 2c839ba..0d4e3fe 100644
--- a/graphql-scripting/src/test/java/org/apache/sling/scripting/gql/engine/GraphQLResourceQueryTest.java
+++ b/graphql-scripting/src/test/java/org/apache/sling/scripting/gql/engine/GraphQLResourceQueryTest.java
@@ -32,15 +32,15 @@ import com.google.gson.Gson;
 
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.scripting.gql.schema.DataFetcherSelector;
-import org.apache.sling.scripting.gql.schema.GraphQLSchemaProvider;
 import org.apache.sling.scripting.gql.schema.MockDataFetcherSelector;
+import org.apache.sling.scripting.gql.api.SchemaProvider;
 import org.junit.Test;
 import org.mockito.Mockito;
 
 import graphql.ExecutionResult;
 
 public class GraphQLResourceQueryTest {
-    private final GraphQLSchemaProvider schemaProvider = new MockSchemaProvider();
+    private final SchemaProvider schemaProvider = new MockSchemaProvider();
     private final DataFetcherSelector fetchers = new MockDataFetcherSelector();
 
     @Test
diff --git a/graphql-scripting/src/test/java/org/apache/sling/scripting/gql/engine/MockSchemaProvider.java b/graphql-scripting/src/test/java/org/apache/sling/scripting/gql/engine/MockSchemaProvider.java
index 3d18fe2..1eadc78 100644
--- a/graphql-scripting/src/test/java/org/apache/sling/scripting/gql/engine/MockSchemaProvider.java
+++ b/graphql-scripting/src/test/java/org/apache/sling/scripting/gql/engine/MockSchemaProvider.java
@@ -19,9 +19,9 @@
 package org.apache.sling.scripting.gql.engine;
 
 import org.apache.sling.api.resource.Resource;
-import org.apache.sling.scripting.gql.schema.GraphQLSchemaProvider;
+import org.apache.sling.scripting.gql.api.SchemaProvider;
 
-class MockSchemaProvider extends GraphQLSchemaProvider {
+class MockSchemaProvider implements SchemaProvider {
 
     private static final String MOCK_SCHEMA = 
         "type Query {\n"
@@ -34,7 +34,8 @@ class MockSchemaProvider extends GraphQLSchemaProvider {
         + "type Test { test: Boolean }";
 
     @Override
-    public String getSchema(Resource r) throws Exception {
+    public String getSchema(Resource r, String[] selectors) throws SchemaProviderException {
         return MOCK_SCHEMA;
     }
+
 }