WorkflowTimelineEventProvider.java 5.28 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.adobe.granite.workflow.WorkflowException
 *  com.adobe.granite.workflow.WorkflowSession
 *  com.adobe.granite.workflow.exec.HistoryItem
 *  com.adobe.granite.workflow.exec.WorkItem
 *  com.adobe.granite.workflow.exec.Workflow
 *  com.adobe.granite.workflow.model.WorkflowNode
 *  org.apache.felix.scr.annotations.Component
 *  org.apache.felix.scr.annotations.Service
 *  org.apache.jackrabbit.util.Text
 *  org.apache.sling.api.resource.Resource
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.adobe.granite.timeline.internal.providers;

import com.adobe.granite.timeline.TimelineEvent;
import com.adobe.granite.timeline.TimelineEventProvider;
import com.adobe.granite.timeline.TimelineEventType;
import com.adobe.granite.timeline.types.WorkflowTimelineEventType;
import com.adobe.granite.workflow.WorkflowException;
import com.adobe.granite.workflow.WorkflowSession;
import com.adobe.granite.workflow.exec.HistoryItem;
import com.adobe.granite.workflow.exec.WorkItem;
import com.adobe.granite.workflow.exec.Workflow;
import com.adobe.granite.workflow.model.WorkflowNode;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Service;
import org.apache.jackrabbit.util.Text;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/*
 * This class specifies class file version 49.0 but uses Java 6 signatures.  Assumed Java 6.
 */
@Component
@Service
public class WorkflowTimelineEventProvider
implements TimelineEventProvider {
    private static final Logger log = LoggerFactory.getLogger(WorkflowTimelineEventProvider.class);
    public static final TimelineEventType EVENT_TYPE = new WorkflowTimelineEventType();

    @Override
    public boolean accepts(Resource resource) {
        return true;
    }

    @Override
    public Collection<TimelineEvent> getEvents(Resource resource) {
        ArrayList<TimelineEvent> events = new ArrayList<TimelineEvent>();
        ResourceResolver resolver = resource.getResourceResolver();
        WorkflowSession workflowSession = (WorkflowSession)resolver.adaptTo(WorkflowSession.class);
        if (null != workflowSession) {
            log.debug(">>> querying workflow instances for resource [{}]", (Object)resource.getPath());
            String query = "/jcr:root/etc/workflow//element(*,cq:Payload)[path='" + Text.escapeIllegalXpathSearchChars((String)resource.getPath()).replaceAll("'", "''") + "']";
            long startQuery = System.currentTimeMillis();
            Iterator resources = resolver.findResources(query, "xpath");
            log.debug(">>> queried workflow instances for resource [{}] in [{}ms]", (Object)resource.getPath(), (Object)(System.currentTimeMillis() - startQuery));
            long startTimelineEntries = System.currentTimeMillis();
            while (resources.hasNext()) {
                Resource instance = ((Resource)resources.next()).getParent().getParent();
                try {
                    Workflow workflow = workflowSession.getWorkflow(instance.getPath());
                    List history = workflowSession.getHistory(workflow);
                    for (HistoryItem historyItem : history) {
                        events.add(new WorkflowTimelineEvent(historyItem, instance));
                    }
                    continue;
                }
                catch (WorkflowException e) {
                    log.error("error retrieving workflow history for instance [{}]: ", (Object)instance.getPath(), (Object)e);
                    continue;
                }
            }
            log.debug(">>> transformation of workflow history to timeline events for resource [{}] took [{}ms]", (Object)resource.getPath(), (Object)(System.currentTimeMillis() - startTimelineEntries));
        } else {
            log.error("cannot get workflow timeline events: workflow session unavailable!");
        }
        return events;
    }

    @Override
    public TimelineEventType getType() {
        return EVENT_TYPE;
    }

    private static class WorkflowTimelineEvent
    implements TimelineEvent {
        private final HistoryItem historyItem;
        private final Resource instance;

        private WorkflowTimelineEvent(HistoryItem historyItem, Resource instance) {
            this.historyItem = historyItem;
            this.instance = instance;
        }

        public String getAction() {
            return null != this.historyItem.getWorkItem() ? this.historyItem.getWorkItem().getNode().getTitle() : this.historyItem.getAction();
        }

        public String getDescription() {
            return this.historyItem.getComment();
        }

        public String getOrigin() {
            return this.instance.getPath();
        }

        public long getTime() {
            return this.historyItem.getDate().getTime();
        }

        public TimelineEventType getType() {
            return WorkflowTimelineEventProvider.EVENT_TYPE;
        }

        public String getUserID() {
            return this.historyItem.getUserId();
        }
    }

}