CQPayloadInfoBuilder.java 11.1 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.adobe.granite.security.user.util.AuthorizableUtil
 *  com.adobe.granite.taskmanagement.Task
 *  com.adobe.granite.workflow.exec.InboxItem
 *  com.adobe.granite.workflow.exec.WorkItem
 *  com.adobe.granite.workflow.payload.PayloadInfo
 *  com.adobe.granite.workflow.payload.PayloadInfo$PAYLOAD_TYPE
 *  com.adobe.granite.workflow.payload.PayloadInfoBuilder
 *  com.adobe.granite.workflow.payload.PayloadInfoBuilderContext
 *  com.day.cq.dam.api.Asset
 *  com.day.cq.dam.api.Rendition
 *  com.day.cq.wcm.api.Page
 *  com.day.cq.wcm.api.WCMException
 *  com.day.cq.wcm.core.stats.PageViewStatistics
 *  com.day.cq.workflow.exec.WorkItem
 *  com.day.cq.workflow.exec.Workflow
 *  com.day.cq.workflow.exec.WorkflowData
 *  com.day.cq.workflow.metadata.MetaDataMap
 *  com.day.cq.workflow.model.WorkflowNode
 *  com.day.cq.workflow.ui.JcrPathBuilderManager
 *  javax.jcr.Node
 *  javax.jcr.RepositoryException
 *  javax.jcr.Session
 *  javax.jcr.Workspace
 *  javax.jcr.lock.Lock
 *  javax.jcr.lock.LockManager
 *  org.apache.felix.scr.annotations.Component
 *  org.apache.felix.scr.annotations.Property
 *  org.apache.felix.scr.annotations.Reference
 *  org.apache.felix.scr.annotations.Service
 *  org.apache.sling.api.resource.Resource
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.apache.sling.api.resource.ValueMap
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.day.cq.workflow.impl;

import com.adobe.granite.security.user.util.AuthorizableUtil;
import com.adobe.granite.taskmanagement.Task;
import com.adobe.granite.workflow.exec.InboxItem;
import com.adobe.granite.workflow.exec.WorkItem;
import com.adobe.granite.workflow.payload.PayloadInfo;
import com.adobe.granite.workflow.payload.PayloadInfoBuilder;
import com.adobe.granite.workflow.payload.PayloadInfoBuilderContext;
import com.day.cq.dam.api.Asset;
import com.day.cq.dam.api.Rendition;
import com.day.cq.wcm.api.Page;
import com.day.cq.wcm.api.WCMException;
import com.day.cq.wcm.core.stats.PageViewStatistics;
import com.day.cq.workflow.exec.Workflow;
import com.day.cq.workflow.exec.WorkflowData;
import com.day.cq.workflow.impl.exec.CQWorkItemWrapper;
import com.day.cq.workflow.metadata.MetaDataMap;
import com.day.cq.workflow.model.WorkflowNode;
import com.day.cq.workflow.ui.JcrPathBuilderManager;
import java.util.Calendar;
import java.util.Date;
import java.util.Dictionary;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.Workspace;
import javax.jcr.lock.Lock;
import javax.jcr.lock.LockManager;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ValueMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component
@Service(value={PayloadInfoBuilder.class})
@Property(name="service.ranking", intValue={Integer.MIN_VALUE}, propertyPrivate=1)
public class CQPayloadInfoBuilder
implements PayloadInfoBuilder {
    protected Logger log = LoggerFactory.getLogger(CQPayloadInfoBuilder.class);
    @Reference
    private JcrPathBuilderManager pathBuilder;
    @Reference
    private PageViewStatistics statistics;

    public PayloadInfo getPayloadInfo(PayloadInfoBuilderContext context) {
        InboxItem item = context.getInboxItem();
        Object wi = null;
        if (item != null) {
            if (item instanceof Task) {
                wi = new InlineWorkItem((Task)item);
            } else if (item instanceof WorkItem) {
                wi = new CQWorkItemWrapper((WorkItem)item);
            }
            if (wi != null) {
                this.log.debug("Checking for CQ PathBuilder to handle {}", (Object)item.getContentPath());
                String path = this.pathBuilder.getPath((com.day.cq.workflow.exec.WorkItem)wi);
                if (path != null) {
                    return this.createPayloadInfo(context, item.getContentPath(), path);
                }
            }
        }
        this.log.debug("Unable to find a PathBuilder to handle inbox item id: {} and path: ", (Object)item.getId(), (Object)item.getContentPath());
        return null;
    }

    private PayloadInfo createPayloadInfo(PayloadInfoBuilderContext context, String contentPath, String path) {
        PayloadInfo info = context.createPayloadInfo().setBrowserPath(path);
        Resource res = context.getResourceResolver().getResource(contentPath);
        if (res != null) {
            String payloadType;
            Calendar lastModified;
            Calendar onTime;
            String createdBy;
            String lockedBy;
            String description;
            long monthlyHits;
            long timeUntilValid;
            String title;
            Calendar offTime;
            String lastModifiedBy;
            Calendar created;
            String thumbnailPath;
            title = null;
            description = null;
            payloadType = null;
            created = null;
            createdBy = null;
            lastModified = null;
            lastModifiedBy = null;
            lockedBy = null;
            thumbnailPath = null;
            onTime = null;
            offTime = null;
            timeUntilValid = -1;
            monthlyHits = -1;
            Page page = (Page)res.adaptTo(Page.class);
            Asset asset = (Asset)res.adaptTo(Asset.class);
            ValueMap vm = res.getValueMap();
            created = (Calendar)vm.get("jcr:created", Calendar.class);
            createdBy = (String)vm.get("jcr:createdBy", String.class);
            createdBy = AuthorizableUtil.getFormattedName((ResourceResolver)context.getResourceResolver(), (String)createdBy);
            Node n = (Node)res.adaptTo(Node.class);
            if (n != null) {
                try {
                    boolean isLocked = n.isLocked();
                    Session session = (Session)context.getResourceResolver().adaptTo(Session.class);
                    if (session != null && isLocked) {
                        LockManager lockManager = session.getWorkspace().getLockManager();
                        lockedBy = lockManager.getLock(n.getPath()).getLockOwner();
                        lockedBy = AuthorizableUtil.getFormattedName((ResourceResolver)context.getResourceResolver(), (String)lockedBy);
                    }
                }
                catch (RepositoryException e) {
                    this.log.error("Unable to look up lock information for resource at {}.", (Object)res.getPath(), (Object)e);
                }
            }
            if (page != null) {
                title = page.getTitle();
                description = page.getDescription();
                payloadType = PayloadInfo.PAYLOAD_TYPE.PAGE.name();
                lastModified = page.getLastModified();
                lastModifiedBy = page.getLastModifiedBy();
                lastModifiedBy = AuthorizableUtil.getFormattedName((ResourceResolver)context.getResourceResolver(), (String)lastModifiedBy);
                timeUntilValid = page.timeUntilValid();
                onTime = page.getOnTime();
                offTime = page.getOffTime();
                monthlyHits = 0;
                try {
                    Object[] stats = this.statistics.report(page);
                    if (stats != null && stats.length > 2) {
                        monthlyHits = (Long)stats[2];
                    }
                }
                catch (WCMException e) {
                    this.log.error("Unable to look up stats for page {}.  Setting monthly hits to 0.", (Object)page.getPath());
                }
            } else if (asset != null) {
                title = asset.getMetadataValue("dc:title");
                description = asset.getMetadataValue("dc:description");
                payloadType = PayloadInfo.PAYLOAD_TYPE.ASSET.name();
                lastModified = Calendar.getInstance();
                lastModified.setTimeInMillis(asset.getLastModified());
                lastModifiedBy = asset.getModifier();
                thumbnailPath = asset.getRendition("cq5dam.thumbnail.48.48.png").getPath();
            } else {
                title = (String)vm.get("jcr:title", String.class);
                description = (String)vm.get("jcr:description", String.class);
                lastModified = (Calendar)vm.get("cq:lastModified", Calendar.class);
                lastModifiedBy = (String)vm.get("cq:lastModifiedBy", String.class);
            }
            info.setTitle(title).setDescription(description).setPayloadType(payloadType).setCreated(created).setCreatedBy(createdBy).setLastModified(lastModified).setLastModifiedBy(lastModifiedBy).setLockedBy(lockedBy).setThumbnailPath(thumbnailPath).setOnTime(onTime).setOffTime(offTime).setTimeUntilValid(timeUntilValid).setMonthlyHits(monthlyHits);
        }
        return info;
    }

    protected void bindPathBuilder(JcrPathBuilderManager jcrPathBuilderManager) {
        this.pathBuilder = jcrPathBuilderManager;
    }

    protected void unbindPathBuilder(JcrPathBuilderManager jcrPathBuilderManager) {
        if (this.pathBuilder == jcrPathBuilderManager) {
            this.pathBuilder = null;
        }
    }

    protected void bindStatistics(PageViewStatistics pageViewStatistics) {
        this.statistics = pageViewStatistics;
    }

    protected void unbindStatistics(PageViewStatistics pageViewStatistics) {
        if (this.statistics == pageViewStatistics) {
            this.statistics = null;
        }
    }

    public class InlineWorkflowData
    implements WorkflowData {
        private Task task;

        private InlineWorkflowData(Task task) {
            this.task = task;
        }

        public Object getPayload() {
            return this.task.getContentPath();
        }

        public String getPayloadType() {
            return PayloadInfo.PAYLOAD_TYPE.JCR_PATH.name();
        }

        public Dictionary<String, String> getMetaData() {
            return null;
        }

        public MetaDataMap getMetaDataMap() {
            return null;
        }
    }

    public class InlineWorkItem
    implements com.day.cq.workflow.exec.WorkItem {
        private Task task;

        private InlineWorkItem(Task task) {
            this.task = task;
        }

        public Date getTimeStarted() {
            return this.task.getTimeStarted();
        }

        public Date getTimeEnded() {
            return this.task.getTimeEnded();
        }

        public Workflow getWorkflow() {
            return null;
        }

        public WorkflowNode getNode() {
            return null;
        }

        public String getId() {
            return this.task.getId();
        }

        public WorkflowData getWorkflowData() {
            return new InlineWorkflowData(this.task);
        }

        public String getCurrentAssignee() {
            return this.task.getCurrentAssignee();
        }

        public Dictionary<String, String> getMetaData() {
            return null;
        }

        public MetaDataMap getMetaDataMap() {
            return null;
        }
    }

}