You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by dk...@apache.org on 2023/08/26 17:34:28 UTC

[sling-org-apache-sling-app-cms] branch master updated: SLING-12012 - Add Recent Drafts List

This is an automated email from the ASF dual-hosted git repository.

dklco pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-app-cms.git


The following commit(s) were added to refs/heads/master by this push:
     new 3cf0bd30 SLING-12012 - Add Recent Drafts List
3cf0bd30 is described below

commit 3cf0bd3088bd936321f6cbeeff61fe9bd03012d1
Author: Dan Klco <kl...@adobe.com>
AuthorDate: Sat Aug 26 13:34:17 2023 -0400

    SLING-12012 - Add Recent Drafts List
---
 .../apache/sling/cms/core/models/StartContent.java | 93 ++++++++--------------
 .../apache/sling/cms/core/models/package-info.java |  2 +-
 .../components/cms/startcontent/startcontent.jsp   | 29 +++++++
 3 files changed, 64 insertions(+), 60 deletions(-)

diff --git a/core/src/main/java/org/apache/sling/cms/core/models/StartContent.java b/core/src/main/java/org/apache/sling/cms/core/models/StartContent.java
index e1f4cdcc..b8ced570 100644
--- a/core/src/main/java/org/apache/sling/cms/core/models/StartContent.java
+++ b/core/src/main/java/org/apache/sling/cms/core/models/StartContent.java
@@ -22,22 +22,16 @@
  */
 package org.apache.sling.cms.core.models;
 
-import java.util.ArrayList;
-import java.util.Date;
+import java.util.Calendar;
 import java.util.Iterator;
 import java.util.List;
-import java.util.Objects;
 import java.util.Spliterator;
 import java.util.Spliterators;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import java.util.stream.StreamSupport;
 
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
 import javax.jcr.query.Query;
-import javax.jcr.query.QueryResult;
-import javax.jcr.query.Row;
 
 import org.apache.sling.api.SlingHttpServletRequest;
 import org.apache.sling.api.resource.Resource;
@@ -56,8 +50,8 @@ public class StartContent {
 
     private static final Logger log = LoggerFactory.getLogger(StartContent.class);
 
-    private ResourceResolver resolver;
-    private String term;
+    private final ResourceResolver resolver;
+    private final String term;
 
     public StartContent(SlingHttpServletRequest request) {
         this.resolver = request.getResourceResolver();
@@ -65,63 +59,44 @@ public class StartContent {
     }
 
     public List<Resource> getRelatedContent() {
-        return get10Related(resolver, term).sorted((o1, o2) -> {
-            try {
-                return (int) ((o1.getScore() - o2.getScore()) * 100);
-            } catch (RepositoryException e) {
-                log.warn("Exception getting score", e);
-                return 0;
-            }
-        }).limit(9).map(row -> {
-            try {
-                return resolver.getResource(row.getPath());
-            } catch (RepositoryException e) {
-                log.warn("Failed to get resource", e);
-                return null;
-            }
-        }).filter(Objects::nonNull).collect(Collectors.toList());
+        return getTenResults(
+                "SELECT * FROM [nt:hierarchyNode] AS s WHERE ISDESCENDANTNODE([/content]) AND CONTAINS(s.*,'"
+                        + escape(term.replaceAll("[\\Q+-&|!(){}[]^\"~*?:\\/\\E]", "")) + "')");
 
     }
 
+    public List<Resource> getRecentDrafts() {
+        return Stream.concat(getTenResults("SELECT * FROM [sling:Page] WHERE [jcr:content/jcr:lastModifiedBy] = '"
+                + escape(resolver.getUserID())
+                + "' AND ISDESCENDANTNODE([/content]) AND [jcr:content/sling:published] = false ORDER BY [jcr:content/jcr:lastModified] DESC")
+                .stream(),
+                getTenResults("SELECT * FROM [sling:Page] WHERE [jcr:content/jcr:lastModifiedBy] = '"
+                        + escape(resolver.getUserID())
+                        + "' AND ISDESCENDANTNODE([/content]) AND [jcr:content/sling:published] IS NULL ORDER BY [jcr:content/jcr:lastModified] DESC")
+                        .stream())
+                .sorted((r1, r2) -> r2.getValueMap().get("jcr:content/jcr:lastModified", Calendar.class)
+                        .compareTo(r1.getValueMap().get("jcr:content/jcr:lastModified", Calendar.class))
+
+                ).limit(10).collect(Collectors.toList());
+    }
+
     public List<Resource> getRecentContent() {
-        return get10Recent(resolver).sorted((o1, o2) -> o1.getValueMap().get("jcr:content/jcr:lastModified", new Date())
-                .compareTo(o2.getValueMap().get("jcr:content/jcr:lastModified", new Date())) * -1)
-                .limit(10).collect(Collectors.toList());
+        return getTenResults(
+                "SELECT * FROM [nt:hierarchyNode] WHERE [jcr:content/jcr:lastModifiedBy] = '"
+                        + escape(resolver.getUserID())
+                        + "' AND ISDESCENDANTNODE([/content]) ORDER BY [jcr:content/jcr:lastModified] DESC");
     }
 
-    private Stream<Resource> get10Recent(ResourceResolver resolver) {
-        Iterator<Resource> it = resolver.findResources(
-                "SELECT * FROM [nt:hierarchyNode] WHERE [jcr:content/jcr:lastModifiedBy] = '" + resolver.getUserID()
-                        + "' AND ISDESCENDANTNODE([/content]) ORDER BY [jcr:content/jcr:lastModified] DESC",
-                Query.JCR_SQL2);
-        return StreamSupport.stream(Spliterators.spliteratorUnknownSize(it, Spliterator.NONNULL), false).limit(10);
+    private String escape(String str) {
+        return str.replace("'", "''");
     }
 
-    private Stream<Row> get10Related(ResourceResolver resolver, String term) {
-        Session session = resolver.adaptTo(Session.class);
-        if (session != null) {
-            try {
-                Query query = session.getWorkspace().getQueryManager()
-                        .createQuery(
-                                "SELECT * FROM [nt:hierarchyNode] AS s WHERE ISDESCENDANTNODE([/content]) AND CONTAINS(s.*,'"
-                                        + term.replace("'", "''") + "')",
-                                Query.JCR_SQL2);
-                query.setLimit(10);
-                QueryResult result = query.execute();
-                @SuppressWarnings("unchecked")
-                Iterable<Row> iterable = () -> {
-                    try {
-                        return result.getRows();
-                    } catch (RepositoryException e) {
-                        log.warn("Failed to get iterator", e);
-                    }
-                    return null;
-                };
-                return StreamSupport.stream(iterable.spliterator(), false).limit(10);
-            } catch (RepositoryException e) {
-                log.warn("Exception searching for related content", e);
-            }
-        }
-        return new ArrayList<Row>().stream();
+    private List<Resource> getTenResults(String query) {
+        log.debug("Executing query: {}", query);
+        Iterator<Resource> it = resolver.findResources(query,
+                Query.JCR_SQL2);
+        return StreamSupport.stream(Spliterators.spliteratorUnknownSize(it, Spliterator.NONNULL), false).limit(10)
+                .collect(Collectors.toList());
     }
+
 }
diff --git a/core/src/main/java/org/apache/sling/cms/core/models/package-info.java b/core/src/main/java/org/apache/sling/cms/core/models/package-info.java
index b12001cd..8ef992ee 100644
--- a/core/src/main/java/org/apache/sling/cms/core/models/package-info.java
+++ b/core/src/main/java/org/apache/sling/cms/core/models/package-info.java
@@ -20,7 +20,7 @@
 /**
  * Package with all of the core models used to support the Sling reference CMS
  */
-@Version("5.0.0")
+@Version("5.1.0")
 package org.apache.sling.cms.core.models;
 
 import org.osgi.annotation.versioning.Version;
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/startcontent/startcontent.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/startcontent/startcontent.jsp
index 65a71d48..79a74d49 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/startcontent/startcontent.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/startcontent/startcontent.jsp
@@ -50,6 +50,35 @@
                 </a>
             </c:forEach>
         </nav>
+        <fmt:message key="Recent Drafts" var="recentDraftsMessage" />
+        <nav class="panel has-background-white" aria-label="${recentDraftsMessage}">
+            <p class="panel-heading">
+                ${recentDraftsMessage}
+            </p>
+            <c:forEach var="item" items="${startContent.recentDrafts}">
+                <a class="panel-block" title="${sling:encode(item.path,'HTML_ATTR')}" href="/cms/site/content.html${sling:encode(item.parent.path,'HTML_ATTR')}?resource=${sling:encode(item.path,'HTML_ATTR')}">
+                    <span class="panel-icon">
+                        <c:choose>
+                            <c:when test="${item.resourceType == 'sling:Page'}">
+                                <i class="jam jam-document" aria-hidden="true"></i>
+                            </c:when>
+                            <c:otherwise>
+                                <i class="jam jam-file" aria-hidden="true"></i>
+                            </c:otherwise>
+                        </c:choose>
+                    </span>
+                    <c:choose>
+                        <c:when test="${item.resourceType == 'sling:Page'}">
+                            <sling:encode value="${item.valueMap['jcr:content/jcr:title']}" default="${item.name}" mode="HTML" />
+                        </c:when>
+                        <c:otherwise>
+                            <sling:encode value="${item.name}" mode="HTML" />
+                        </c:otherwise>
+                    </c:choose>&nbsp;&mdash;&nbsp;
+                    <small><fmt:formatDate value="${item.valueMap['jcr:content/jcr:lastModified'].time}" type="both" dateStyle="short" timeStyle="short" /></small>
+                </a>
+            </c:forEach>
+        </nav>
     </div>
     <div class="column">
         <nav class="panel has-background-white">