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 2021/06/10 09:03:33 UTC
[sling-whiteboard] branch master updated: UnstructuredContent,
first shot
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
The following commit(s) were added to refs/heads/master by this push:
new 02770ff UnstructuredContent, first shot
02770ff is described below
commit 02770ff2649d41d8411462349d3e82c4daaf3d78
Author: Bertrand Delacretaz <bd...@apache.org>
AuthorDate: Thu Jun 10 11:03:18 2021 +0200
UnstructuredContent, first shot
---
.../remotecontent/contentmodel/Backstage.java | 34 ++++++++++++-------
.../{Etc.java => ContentGenerator.java} | 8 ++---
.../remotecontent/contentmodel/ContentItem.java | 8 +++--
.../sling/remotecontent/contentmodel/Document.java | 14 +++++---
.../sling/remotecontent/contentmodel/Folder.java | 6 ++--
.../{Backstage.java => UnstructuredContent.java} | 39 +++++++++++++++-------
.../samples/graphql/DocumentDataFetcher.java | 2 +-
.../samples/graphql/DocumentsDataFetcher.java | 2 +-
...her.java => DummyContentGeneratorSupplier.java} | 27 +++++++++------
.../samples/graphql/FolderDataFetcher.java | 2 +-
.../samples/graphql/FoldersDataFetcher.java | 2 +-
.../main/resources/schemas/default/N.GQLschema.jsp | 29 ++++++++--------
12 files changed, 107 insertions(+), 66 deletions(-)
diff --git a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/contentmodel/Backstage.java b/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/contentmodel/Backstage.java
index 84fccd7..54bf2ea 100644
--- a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/contentmodel/Backstage.java
+++ b/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/contentmodel/Backstage.java
@@ -19,24 +19,34 @@
package org.apache.sling.remotecontent.contentmodel;
-import java.util.HashMap;
+import java.util.function.Supplier;
+
+import org.apache.sling.api.resource.Resource;
/** Backstage information is meant to provide hints and rules
* to authoring user interfaces and publishing services.
*/
-public class Backstage extends HashMap<String, Object> {
- private Etc etc;
-
- public Backstage() {
- put("authoring", "authoring/editor information can come here, free-form");
- put("publishing", "publishing hints can come here, free-form");
+public class Backstage {
+ private final UnstructuredContent authoring;
+ private final UnstructuredContent publishing;
+ private final UnstructuredContent etc;
+
+ public Backstage(Resource resource, Supplier<ContentGenerator> contentGeneratorSupplier) {
+ final String source = "TODO indicate source";
+ authoring = new UnstructuredContent(resource, "authoring", source, contentGeneratorSupplier);
+ publishing = new UnstructuredContent(resource, "publishing", source, contentGeneratorSupplier);
+ etc = new UnstructuredContent(resource, "etc", source, contentGeneratorSupplier);
+ }
+
+ public UnstructuredContent getAuthoring() {
+ return authoring;
+ }
+
+ public UnstructuredContent getPublishing() {
+ return publishing;
}
- public Object getEtc() {
- if(etc == null) {
- etc = new Etc();
- etc.put("info", "...additional information for this Document");
- }
+ public UnstructuredContent getEtc() {
return etc;
}
}
\ No newline at end of file
diff --git a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/contentmodel/Etc.java b/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/contentmodel/ContentGenerator.java
similarity index 81%
rename from remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/contentmodel/Etc.java
rename to remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/contentmodel/ContentGenerator.java
index 61b818b..b09d729 100644
--- a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/contentmodel/Etc.java
+++ b/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/contentmodel/ContentGenerator.java
@@ -19,10 +19,8 @@
package org.apache.sling.remotecontent.contentmodel;
-import java.util.HashMap;
+import org.apache.sling.api.resource.Resource;
-/** Backstage information is meant to provide hints and rules
- * to authoring user interfaces and publishing services.
- */
-public class Etc extends HashMap<String, Object> {
+public interface ContentGenerator {
+ Object getContent(Resource r, String name);
}
\ No newline at end of file
diff --git a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/contentmodel/ContentItem.java b/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/contentmodel/ContentItem.java
index 723cb85..ce93dbb 100644
--- a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/contentmodel/ContentItem.java
+++ b/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/contentmodel/ContentItem.java
@@ -19,15 +19,19 @@
package org.apache.sling.remotecontent.contentmodel;
+import java.util.function.Supplier;
+
import org.apache.sling.api.resource.Resource;
/** Base class for folders and documents */
public class ContentItem {
protected final Resource resource;
protected ContentItemHeader header;
+ protected final Supplier<ContentGenerator> contentGeneratorSupplier;
- ContentItem(Resource r) {
- resource = r;
+ ContentItem(Resource r, Supplier<ContentGenerator> contentGeneratorSupplier) {
+ this.resource = r;
+ this.contentGeneratorSupplier = contentGeneratorSupplier;
}
public String getPath() {
diff --git a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/contentmodel/Document.java b/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/contentmodel/Document.java
index 4e17508..c91e7e8 100644
--- a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/contentmodel/Document.java
+++ b/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/contentmodel/Document.java
@@ -19,17 +19,21 @@
package org.apache.sling.remotecontent.contentmodel;
+import java.util.function.Supplier;
+
import org.apache.sling.api.resource.Resource;
/** Base class for folders and documents */
public class Document extends ContentItem {
private Backstage backstage;
+ private final UnstructuredContent body;
- public Document(Resource r) {
- super(r);
+ public Document(Resource r, Supplier<ContentGenerator> contentGeneratorSupplier) {
+ super(r, contentGeneratorSupplier);
+ body = new UnstructuredContent(resource, "body", "No source yet", contentGeneratorSupplier);
}
- public Object getBody() {
+ public UnstructuredContent getBody() {
/*
@Reference(target="(" + DocumentTree.TARGET_TYPE + "=map)")
private DocumentTree mappingTarget;
@@ -46,12 +50,12 @@ public class Document extends ContentItem {
data.put("body", body.adaptTo(Map.class));
}
*/
- return "This will be the document body, created using the document aggregator or document-speficic services";
+ return body;
}
public Backstage getBackstage() {
if(backstage == null) {
- backstage = new Backstage();
+ backstage = new Backstage(resource, contentGeneratorSupplier);
}
return backstage;
}
diff --git a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/contentmodel/Folder.java b/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/contentmodel/Folder.java
index c910f63..47687d7 100644
--- a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/contentmodel/Folder.java
+++ b/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/contentmodel/Folder.java
@@ -19,11 +19,13 @@
package org.apache.sling.remotecontent.contentmodel;
+import java.util.function.Supplier;
+
import org.apache.sling.api.resource.Resource;
/** Base class for folders and documents */
public class Folder extends ContentItem {
- public Folder(Resource r) {
- super(r);
+ public Folder(Resource r, Supplier<ContentGenerator> contentGeneratorSupplier) {
+ super(r, contentGeneratorSupplier);
}
}
\ No newline at end of file
diff --git a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/contentmodel/Backstage.java b/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/contentmodel/UnstructuredContent.java
similarity index 52%
copy from remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/contentmodel/Backstage.java
copy to remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/contentmodel/UnstructuredContent.java
index 84fccd7..28086df 100644
--- a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/contentmodel/Backstage.java
+++ b/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/contentmodel/UnstructuredContent.java
@@ -19,24 +19,39 @@
package org.apache.sling.remotecontent.contentmodel;
-import java.util.HashMap;
+import java.util.function.Supplier;
+
+import org.apache.sling.api.resource.Resource;
/** Backstage information is meant to provide hints and rules
* to authoring user interfaces and publishing services.
*/
-public class Backstage extends HashMap<String, Object> {
- private Etc etc;
-
- public Backstage() {
- put("authoring", "authoring/editor information can come here, free-form");
- put("publishing", "publishing hints can come here, free-form");
+public class UnstructuredContent {
+ private final Resource resource;
+ private final String name;
+ private final String source;
+ private Object content;
+ private final Supplier<ContentGenerator> contentGeneratorSupplier;
+
+ public UnstructuredContent(Resource resource, String name, String source, Supplier<ContentGenerator> contentGeneratorSupplier) {
+ this.resource = resource;
+ this.name = name;
+ this.source = source;
+ this.contentGeneratorSupplier = contentGeneratorSupplier;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getSource() {
+ return source;
}
- public Object getEtc() {
- if(etc == null) {
- etc = new Etc();
- etc.put("info", "...additional information for this Document");
+ public Object getContent() {
+ if(content == null) {
+ content = contentGeneratorSupplier.get().getContent(resource, name);
}
- return etc;
+ return content;
}
}
\ No newline at end of file
diff --git a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/samples/graphql/DocumentDataFetcher.java b/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/samples/graphql/DocumentDataFetcher.java
index 0673793..18c3cca 100644
--- a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/samples/graphql/DocumentDataFetcher.java
+++ b/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/samples/graphql/DocumentDataFetcher.java
@@ -31,6 +31,6 @@ public class DocumentDataFetcher implements SlingDataFetcher<Document> {
@Override
public @Nullable Document get(@NotNull SlingDataFetcherEnvironment e) throws Exception {
- return new Document(new FetcherContext(e, false).currentResource);
+ return new Document(new FetcherContext(e, false).currentResource, new DummyContentGeneratorSupplier());
}
}
\ No newline at end of file
diff --git a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/samples/graphql/DocumentsDataFetcher.java b/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/samples/graphql/DocumentsDataFetcher.java
index 58579a2..fb3069c 100644
--- a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/samples/graphql/DocumentsDataFetcher.java
+++ b/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/samples/graphql/DocumentsDataFetcher.java
@@ -49,7 +49,7 @@ public class DocumentsDataFetcher implements SlingDataFetcher<Connection<Documen
final String query = e.getArgument("query");
final Iterator<Resource> resultIterator = ctx.currentResource.getResourceResolver().findResources(query, lang);
- final Iterator<Document> it = new ConvertingIterator<>(resultIterator, Document::new);
+ final Iterator<Document> it = new ConvertingIterator<>(resultIterator, r -> new Document(r, new DummyContentGeneratorSupplier()));
return new GenericConnection.Builder<>(it, Document::getPath)
.withStartAfter(ctx.afterCursor)
.withLimit(ctx.limit)
diff --git a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/samples/graphql/FolderDataFetcher.java b/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/samples/graphql/DummyContentGeneratorSupplier.java
similarity index 57%
copy from remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/samples/graphql/FolderDataFetcher.java
copy to remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/samples/graphql/DummyContentGeneratorSupplier.java
index 23b0bf5..3f911a2 100644
--- a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/samples/graphql/FolderDataFetcher.java
+++ b/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/samples/graphql/DummyContentGeneratorSupplier.java
@@ -19,18 +19,23 @@
package org.apache.sling.remotecontent.samples.graphql;
-import org.apache.sling.graphql.api.SlingDataFetcher;
-import org.apache.sling.graphql.api.SlingDataFetcherEnvironment;
-import org.apache.sling.remotecontent.contentmodel.Folder;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import org.osgi.service.component.annotations.Component;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.function.Supplier;
-@Component(service = SlingDataFetcher.class, property = {"name=samples/folder"})
-public class FolderDataFetcher implements SlingDataFetcher<Object> {
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.remotecontent.contentmodel.ContentGenerator;
+
+public class DummyContentGeneratorSupplier implements Supplier<ContentGenerator> {
@Override
- public @Nullable Object get(@NotNull SlingDataFetcherEnvironment e) throws Exception {
- return new Folder(new FetcherContext(e, false).currentResource);
- }
+ public ContentGenerator get() {
+ return (Resource r, String name) -> {
+ final Map<String, Object> result = new HashMap<>();
+ result.put(
+ "dummy-content",
+ String.format("This is the %s dummy content for resource %s", name, r.getPath()));
+ return result;
+ };
+ }
}
\ No newline at end of file
diff --git a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/samples/graphql/FolderDataFetcher.java b/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/samples/graphql/FolderDataFetcher.java
index 23b0bf5..35967aa 100644
--- a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/samples/graphql/FolderDataFetcher.java
+++ b/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/samples/graphql/FolderDataFetcher.java
@@ -31,6 +31,6 @@ public class FolderDataFetcher implements SlingDataFetcher<Object> {
@Override
public @Nullable Object get(@NotNull SlingDataFetcherEnvironment e) throws Exception {
- return new Folder(new FetcherContext(e, false).currentResource);
+ return new Folder(new FetcherContext(e, false).currentResource, new DummyContentGeneratorSupplier());
}
}
\ No newline at end of file
diff --git a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/samples/graphql/FoldersDataFetcher.java b/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/samples/graphql/FoldersDataFetcher.java
index e4c7fb6..74bafb9 100644
--- a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/samples/graphql/FoldersDataFetcher.java
+++ b/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/samples/graphql/FoldersDataFetcher.java
@@ -43,7 +43,7 @@ public class FoldersDataFetcher implements SlingDataFetcher<Connection<Folder>>
ctx.currentResource.getPath());
final Iterator<Resource> resultIterator = ctx.currentResource.getResourceResolver().findResources(xpathQuery, "xpath");
- final Iterator<Folder> it = new ConvertingIterator<>(resultIterator, Folder::new);
+ final Iterator<Folder> it = new ConvertingIterator<>(resultIterator, r -> new Folder(r, new DummyContentGeneratorSupplier()));
return new GenericConnection.Builder<>(it, Folder::getPath)
.withStartAfter(ctx.afterCursor)
.withLimit(ctx.limit)
diff --git a/remote-content-api/sample-graphql-api/src/main/resources/schemas/default/N.GQLschema.jsp b/remote-content-api/sample-graphql-api/src/main/resources/schemas/default/N.GQLschema.jsp
index db56f61..cfe2fcc 100644
--- a/remote-content-api/sample-graphql-api/src/main/resources/schemas/default/N.GQLschema.jsp
+++ b/remote-content-api/sample-graphql-api/src/main/resources/schemas/default/N.GQLschema.jsp
@@ -82,11 +82,6 @@ type ContentItemHeader {
""" The summary of this document, if supplied """
summary : String
links : [Link]
-
- """
- etc can contain any additional information, as an unstructured Object scalar
- """
- etc : Object
}
"""
@@ -101,7 +96,19 @@ type Document {
The document's body is unstructured, usually generated by a document aggregator service.
Fields like 'resourceType' in that content can help rendering or applying UI logic to it.
"""
- body : Object
+ body : UnstructuredContent
+}
+
+"""
+UnstructuredContent allows for representing content structures which do not have
+a fixed structures. In content management those are often built out of semi-structured
+components which are assembled in a more or less free-form way. Content type information
+such as Resource Type values help make such structures self-descriptive.
+"""
+type UnstructuredContent {
+ name : String!
+ source : String!
+ content : Object
}
"""
@@ -110,13 +117,9 @@ authoring rules, publishing hints etc.
"""
type Backstage {
- authoring : Object
- publishing : Object
-
- """
- etc can contain any additional information, as an unstructured Object scalar
- """
- etc : Object
+ authoring : UnstructuredContent
+ publishing : UnstructuredContent
+ etc : UnstructuredContent
}
"""