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