columnpreview.jsp 12.9 KB
<%--
  ADOBE CONFIDENTIAL

  Copyright 2015 Adobe Systems Incorporated
  All Rights Reserved.

  NOTICE:  All information contained herein is, and remains
  the property of Adobe Systems Incorporated and its suppliers,
  if any.  The intellectual and technical concepts contained
  herein are proprietary to Adobe Systems Incorporated and its
  suppliers and may be covered by U.S. and Foreign Patents,
  patents in process, and are protected by trade secret or copyright law.
  Dissemination of this information or reproduction of this material
  is strictly forbidden unless prior written permission is obtained
  from Adobe Systems Incorporated.
--%><%
%><%@include file="/libs/granite/ui/global.jsp"%><%
%><%@page session="false"%><%
%><%@page import="java.text.SimpleDateFormat,
                  java.text.DateFormat,
                  java.util.ArrayList,
                  java.util.Calendar,
                  java.util.Collection,
                  java.util.List,
                  java.util.Locale,
                  java.util.Map,
                  javax.jcr.RepositoryException,
                  javax.jcr.Session,
                  javax.jcr.security.AccessControlManager,
                  javax.jcr.security.Privilege,
                  org.apache.commons.lang.StringUtils,
                  org.apache.jackrabbit.util.Text,
                  org.apache.sling.api.resource.ResourceResolver,
                  com.adobe.granite.security.user.util.AuthorizableUtil,
                  com.adobe.granite.ui.components.AttrBuilder,
                  com.adobe.granite.ui.components.Config,
                  com.adobe.granite.ui.components.Tag,
                  com.adobe.granite.workflow.exec.Workflow,
                  com.adobe.granite.workflow.status.WorkflowStatus,
                  com.adobe.cq.screens.binding.ScreensConstants,
                  com.adobe.cq.ui.commons.admin.views.PublicationStatusUtils,
                  com.day.cq.commons.date.RelativeTimeFormat,
                  com.day.cq.replication.AgentManager,
                  com.day.cq.replication.ReplicationQueue,
                  com.day.cq.replication.ReplicationStatus,
                  com.day.cq.wcm.api.Page,
                  com.day.cq.wcm.api.Template,
                  com.day.cq.wcm.api.PageManager" %><%

Config cfg = cmp.getConfig();
String path = StringUtils.trimToNull(cmp.getExpressionHelper().getString(cfg.get("path", String.class)));

Resource contentResource = resourceResolver.getResource(path);

if (contentResource == null) {
    return;
}

Page cqPage = contentResource.adaptTo(Page.class);
String title;
String name;
String thumbnailUrl;
boolean isFolder = false;
Locale locale = request.getLocale();
RelativeTimeFormat rtf = new RelativeTimeFormat("r", slingRequest.getResourceBundle(locale));

if (cqPage != null) {
    title = cqPage.getTitle() == null ? cqPage.getName() : cqPage.getTitle();
    name = cqPage.getName();
    thumbnailUrl = getThumbnailUrl(cqPage, 480, 300);
} else {
    title = getFolderTitle(contentResource);
    name = contentResource.getName();
    thumbnailUrl = Text.escapePath(contentResource.getPath()) + ".folderthumbnail.jpg";
    isFolder = true;
}

AgentManager agentManager = sling.getService(AgentManager.class);
WorkflowStatus workflowStatus = contentResource.adaptTo(WorkflowStatus.class);
ReplicationStatus replicationStatus = contentResource.adaptTo(ReplicationStatus.class);
Map<String, ReplicationQueue.Entry> replicationEntries = (Map<String, ReplicationQueue.Entry>)request.getAttribute("libs.cq.gui.components.coral.admin.page.row.replicationMap");
if (replicationEntries == null) {
    replicationEntries = PublicationStatusUtils.buildPendingReplicationMap(agentManager);
}
List<String> publicationPendingStatus = PublicationStatusUtils.getPendingStatus(replicationEntries, contentResource.getPath() , i18n);
Calendar publishedDate = null;
String publishedBy = null;
Boolean isDeactivated = false;
if (replicationStatus != null) {
    publishedDate = replicationStatus.getLastPublished();
    publishedBy = AuthorizableUtil.getFormattedName(resourceResolver, replicationStatus.getLastPublishedBy());
    isDeactivated = replicationStatus.isDeactivated();
}

AccessControlManager acm = null;
try {
    acm = resourceResolver.adaptTo(Session.class).getAccessControlManager();
} catch (RepositoryException e) {
    log.error("Unable to get access manager", e);
}

String actionRels = StringUtils.join(getActionRels(contentResource, cqPage, acm), " ");

Tag tag = cmp.consumeTag();

%><coral-columnview-preview><coral-columnview-preview-content>
    <coral-columnview-preview-asset>
        <img src="<%= xssAPI.getValidHref(request.getContextPath() + thumbnailUrl) %>" alt="">
    </coral-columnview-preview-asset>
    <coral-columnview-preview-label><%= i18n.get("Title") %></coral-columnview-preview-label>
    <coral-columnview-preview-value><%= xssAPI.encodeForHTML(title) %></coral-columnview-preview-value><%

    if (name != null && !name.equals(title)) {
      %><coral-columnview-preview-label><%= i18n.get("Name") %></coral-columnview-preview-label>
        <coral-columnview-preview-value><%= xssAPI.encodeForHTML(name) %></coral-columnview-preview-value><%
    }

    if (cqPage != null) {

        Template template = cqPage.getTemplate();
        if (template != null) {
            String templateTitle = template.getTitle();
            if ("".equals(templateTitle) || templateTitle == null) {
                templateTitle = template.getName();
            }
            %><coral-columnview-preview-label><%= i18n.get("Template") %></coral-columnview-preview-label>
            <coral-columnview-preview-value><%= xssAPI.encodeForHTML(templateTitle) %></coral-columnview-preview-value><%
        }

        if (cqPage.getLastModified() != null) {
            %><coral-columnview-preview-label><%= i18n.get("Modified") %></coral-columnview-preview-label>
            <coral-columnview-preview-value>
                <foundation-time type="datetime" value="<%= xssAPI.encodeForHTMLAttr(cqPage.getLastModified().toInstant().toString()) %>"/>
            </coral-columnview-preview-value>

            <coral-columnview-preview-label><%= i18n.get("Modified By") %></coral-columnview-preview-label>
            <coral-columnview-preview-value><%= xssAPI.encodeForHTML(AuthorizableUtil.getFormattedName(resourceResolver, cqPage.getLastModifiedBy())) %></coral-columnview-preview-value><%
        }

        if (cqPage.getPageTitle() != null) {
            %><coral-columnview-preview-label><%= i18n.get("Page Title") %></coral-columnview-preview-label>
            <coral-columnview-preview-value><%= xssAPI.encodeForHTML(cqPage.getPageTitle()) %></coral-columnview-preview-value><%
        }

        if (cqPage.getNavigationTitle() != null) {
            %><coral-columnview-preview-label><%= i18n.get("Navigation Title") %></coral-columnview-preview-label>
            <coral-columnview-preview-value><%= xssAPI.encodeForHTML(cqPage.getNavigationTitle()) %></coral-columnview-preview-value><%
        }

        if (cqPage.getDescription() != null) {
            %><coral-columnview-preview-label><%= i18n.get("Description") %></coral-columnview-preview-label>
            <coral-columnview-preview-value><%= xssAPI.encodeForHTML(cqPage.getDescription()) %></coral-columnview-preview-value><%
        }

        %><coral-columnview-preview-label><%= i18n.get("Language") %></coral-columnview-preview-label>
        <coral-columnview-preview-value><%= xssAPI.encodeForHTML(cqPage.getLanguage(false).getDisplayLanguage(locale)) %></coral-columnview-preview-value><%

        if (cqPage.getOnTime() != null) {
            %><coral-columnview-preview-label><%= i18n.get("On Time") %></coral-columnview-preview-label>
            <coral-columnview-preview-value><%= xssAPI.encodeForHTML(formatAbsoluteDate(cqPage.getOnTime().getTimeInMillis(), locale)) %></coral-columnview-preview-value><%
        }

        if (cqPage.getOffTime() != null) {
            %><coral-columnview-preview-label><%= i18n.get("Off Time") %></coral-columnview-preview-label>
            <coral-columnview-preview-value><%= xssAPI.encodeForHTML(formatAbsoluteDate(cqPage.getOffTime().getTimeInMillis(), locale)) %></coral-columnview-preview-value><%
        }


        // published status
        %><coral-columnview-preview-label><%= xssAPI.encodeForHTMLAttr(i18n.get("Published")) %></coral-columnview-preview-label><%
        %><coral-columnview-preview-value><%
            if (!isDeactivated && publishedDate != null) {
                %><foundation-time type="datetime" value="<%= xssAPI.encodeForHTMLAttr(publishedDate.toInstant().toString()) %>"/><%
            } else {
                %><%= xssAPI.encodeForHTML(i18n.get("Not published")) %><%
            }
        %></coral-columnview-preview-value><%

        // published by
        if (!isDeactivated && publishedBy != null) {
            %><coral-columnview-preview-label><%= xssAPI.encodeForHTMLAttr(i18n.get("Published By")) %></coral-columnview-preview-label><%
            %><coral-columnview-preview-value><%= xssAPI.encodeForHTML(publishedBy) %></coral-columnview-preview-value><%
         }

        // publication pending status
        if (publicationPendingStatus.size() > 0) {
            %><coral-columnview-preview-label>&nbsp;</coral-columnview-preview-label><%
            %><coral-columnview-preview-value><br><%
                for (String s : publicationPendingStatus) {
                    %><%= xssAPI.encodeForHTML(s) %><br><%
                }
        %></coral-columnview-preview-value><%
        }

        // publication/un-publication scheduled indicator
        List<Workflow> scheduledWorkflows = PublicationStatusUtils.getScheduledWorkflows(workflowStatus);
        if (scheduledWorkflows.size() > 0) {
            List<String> scheduledStatus = PublicationStatusUtils.getScheduledStatus(scheduledWorkflows, i18n, request.getLocale(), resourceResolver);
            if (scheduledStatus.size() > 0) {
                %><coral-columnview-preview-label>&nbsp;</coral-columnview-preview-label><%
                %><coral-columnview-preview-value><br><%
                    for (String s : scheduledStatus) {
                        %><%= xssAPI.encodeForHTML(s) %><br><%
                    }
                %></coral-columnview-preview-value><%
            }
        }
    }

    AttrBuilder metaAttrs = tag.getAttrs();
    metaAttrs.addBoolean("hidden", true);
    metaAttrs.addClass("foundation-collection-meta");
    metaAttrs.add("data-foundation-collection-meta-title", title);
    metaAttrs.add("data-foundation-collection-meta-folder", isFolder);
    metaAttrs.add("data-foundation-collection-meta-rel", actionRels);

    AttrBuilder imgAttrs = new AttrBuilder(request, xssAPI);
    imgAttrs.addClass("foundation-collection-meta-thumbnail");
    imgAttrs.addHref("src", thumbnailUrl);

    %><div <%= metaAttrs %>>
        <img <%= imgAttrs %>>
    </div>
</coral-columnview-preview-content></coral-columnview-preview><%!

    private String getThumbnailUrl(Page page, int width, int height) {
        String ck = "";

        ValueMap metadata = page.getProperties("image/file/jcr:content");
        if (metadata != null) {
            Calendar cal = metadata.get("jcr:lastModified", Calendar.class);
            if (cal != null) {
                ck = "" + (cal.getTimeInMillis() / 1000);
            }
        }

        return Text.escapePath(page.getPath()) + ".thumb." + width + "." + height + ".png?ck=" + ck;
    }

    private String getFolderTitle(Resource folder) {
        ValueMap vm = folder.getValueMap();
        return vm.get("jcr:content/jcr:title", vm.get("jcr:title", folder.getName()));
    }

    private String formatDate(Calendar cal, RelativeTimeFormat rtf) {
        try {
            return rtf.format(cal.getTimeInMillis(), true);
        } catch (IllegalArgumentException e) {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            return sdf.format(cal.getTime());
        }
    }

    private List<String> getActionRels(Resource resource, Page page, AccessControlManager acm) {
        List<String> actionRels = new ArrayList<String>();

        if (hasPermission(acm, resource, Privilege.JCR_ADD_CHILD_NODES)) {
            actionRels.add(ScreensConstants.ACT_CREATE);
            actionRels.add(ScreensConstants.ACT_CREATE_LIVECOPY);
        }

        return actionRels;
    }

    private boolean hasPermission(AccessControlManager acm, String path, String privilege) {
        if (acm != null) {
            try {
                Privilege p = acm.privilegeFromName(privilege);
                return acm.hasPrivileges(path, new Privilege[]{p});
            } catch (RepositoryException ignore) {
            }
        }
        return false;
    }

    private boolean hasPermission(AccessControlManager acm, Resource resource, String privilege) {
        return hasPermission(acm, resource.getPath(), privilege);
    }

    private String formatAbsoluteDate(Long time, Locale locale) {
        return DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, locale).format(time);
    }

%>