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 <bdelacre...@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 } """