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
 }
 
 """