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 <[email protected]> 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; } + }
