WorkflowListItem.java 10.2 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.adobe.granite.security.user.UserPropertiesManager
 *  com.adobe.granite.taskmanagement.Task
 *  com.adobe.granite.workflow.exec.InboxItem
 *  com.adobe.granite.workflow.exec.Status
 *  com.adobe.granite.workflow.exec.Workflow
 *  com.adobe.granite.workflow.exec.WorkflowData
 *  com.adobe.granite.workflow.metadata.MetaDataMap
 *  com.adobe.granite.workflow.model.WorkflowModel
 *  com.day.cq.commons.TidyJSONWriter
 *  com.day.cq.wcm.api.Page
 *  javax.servlet.ServletException
 *  javax.servlet.http.HttpServletResponse
 *  org.apache.jackrabbit.api.security.user.UserManager
 *  org.apache.jackrabbit.util.Text
 *  org.apache.sling.api.SlingHttpServletRequest
 *  org.apache.sling.api.resource.Resource
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.apache.sling.api.resource.ValueMap
 *  org.apache.sling.commons.json.JSONException
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.adobe.cq.projects.impl.servlet;

import com.adobe.cq.projects.impl.servlet.ListItem;
import com.adobe.granite.security.user.UserPropertiesManager;
import com.adobe.granite.taskmanagement.Task;
import com.adobe.granite.workflow.exec.InboxItem;
import com.adobe.granite.workflow.exec.Status;
import com.adobe.granite.workflow.exec.Workflow;
import com.adobe.granite.workflow.exec.WorkflowData;
import com.adobe.granite.workflow.metadata.MetaDataMap;
import com.adobe.granite.workflow.model.WorkflowModel;
import com.day.cq.commons.TidyJSONWriter;
import com.day.cq.wcm.api.Page;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import org.apache.jackrabbit.api.security.user.UserManager;
import org.apache.jackrabbit.util.Text;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ValueMap;
import org.apache.sling.commons.json.JSONException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class WorkflowListItem
extends ListItem {
    private static final Logger LOGGER = LoggerFactory.getLogger(WorkflowListItem.class);
    private Workflow workflow;
    private List<Task> tasks = new ArrayList<Task>();

    public WorkflowListItem(String itemId) {
        super(itemId);
    }

    public WorkflowListItem(Workflow workflow) {
        this(workflow.getId());
        this.workflow = workflow;
    }

    public Workflow getWorkflow() {
        return this.workflow;
    }

    public void addTask(Task task) {
        this.tasks.add(task);
    }

    @Override
    public void write(TidyJSONWriter writer, UserManager usrMgr, UserPropertiesManager userPropertiesManager, ResourceResolver resourceResolver, SlingHttpServletRequest request, HttpServletResponse response, Map<String, String> config) throws JSONException, ServletException, IOException {
        if (this.workflow != null) {
            writer.object();
            this.writeWorkflowInstance(writer, usrMgr, userPropertiesManager, resourceResolver, request, response, this.workflow);
            writer.endObject();
        }
        boolean taskGroupMember = this.workflow != null;
        Iterator<Task> subtaskIterator = this.tasks.iterator();
        while (subtaskIterator.hasNext()) {
            Task nextTask = subtaskIterator.next();
            writer.object();
            this.writeTask(resourceResolver, usrMgr, userPropertiesManager, writer, nextTask, request, response, taskGroupMember, false, this.workflow == null ? false : !subtaskIterator.hasNext(), config);
            writer.endObject();
        }
    }

    private void writeWorkflowInstance(TidyJSONWriter writer, UserManager usrMgr, UserPropertiesManager userPropertiesManager, ResourceResolver resourceResolver, SlingHttpServletRequest slingRequest, HttpServletResponse response, Workflow workflow) throws JSONException, ServletException, IOException {
        List workItems;
        String instanceTitle = (String)workflow.getMetaDataMap().get("workflowTitle", (Object)"");
        String instanceStartComment = (String)workflow.getMetaDataMap().get("startComment", (Object)"");
        WorkflowModel workflowModel = workflow.getWorkflowModel();
        writer.key("item").value((Object)workflow.getId());
        writer.key("status").value((Object)workflow.getState());
        writer.key("isGroupRoot").value(true);
        writer.key("inboxItemType").value((Object)"WorkflowInformationEntry");
        writer.key("computedItemType").value((Object)"WorkflowInformationEntry");
        writer.key("workflowModelImageUrl").value((Object)this.getWorkflowModelImageUrl(resourceResolver, this.workflow.getWorkflowModel()));
        writer.key("inboxItemType").value((Object)"WorkflowInformationEntry");
        if (workflow.getTimeStarted() != null) {
            writer.key("startTime").value(workflow.getTimeStarted().getTime());
        }
        if (workflow.getTimeEnded() != null) {
            writer.key("endTime").value(workflow.getTimeEnded().getTime());
        }
        this.writeCurrentAssignee(usrMgr, userPropertiesManager, writer, workflow.getInitiator());
        String payloadType = workflow.getWorkflowData().getPayloadType();
        Object payloadObject = workflow.getWorkflowData().getPayload();
        if (payloadObject != null && (workItems = workflow.getWorkItems()) != null && workItems.size() > 0) {
            this.writePayloadObject(resourceResolver, writer, (InboxItem)workItems.get(0), payloadType);
        }
        if (workflowModel != null) {
            writer.key("workflowModel").object();
            writer.key("id").value((Object)workflowModel.getId());
            writer.key("title").value((Object)workflowModel.getTitle());
            writer.key("description").value((Object)workflowModel.getDescription());
            writer.endObject();
        }
        writer.key("properties");
        writer.object();
        Date dueDate = this.getDueDate();
        SimpleDateFormat formatterWithSeconds = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
        writer.key("taskDueDate").value((Object)(dueDate != null ? formatterWithSeconds.format(dueDate) : ""));
        writer.endObject();
        writer.key("instanceTitle").value((Object)instanceTitle);
        writer.key("instanceDescription").value((Object)instanceStartComment);
    }

    @Override
    public void sortTasks() {
        Collections.sort(this.tasks, new Comparator<Task>(){

            @Override
            public int compare(Task lhsTask, Task rhsTask) {
                int statusResult = this.compareStatus(lhsTask, rhsTask);
                if (statusResult != 0) {
                    return statusResult;
                }
                Date leftDueDate = WorkflowListItem.this.getTaskDueDate(lhsTask);
                Date rightDueDate = WorkflowListItem.this.getTaskDueDate(rhsTask);
                if (leftDueDate != null) {
                    if (rightDueDate != null) {
                        return leftDueDate.compareTo(rightDueDate);
                    }
                    return -1;
                }
                if (rightDueDate != null) {
                    return 1;
                }
                return - lhsTask.getTimeStarted().compareTo(rhsTask.getTimeStarted());
            }

            private int compareStatus(Task lhsTask, Task rhsTask) {
                if (lhsTask.getStatus() != rhsTask.getStatus()) {
                    if (lhsTask.getStatus() == Status.ACTIVE) {
                        return -1;
                    }
                    return 1;
                }
                return 0;
            }
        });
    }

    @Override
    public Date getDueDate() {
        if (this.tasks != null && this.tasks.size() > 0) {
            return this.getTaskDueDate(this.tasks.get(0));
        }
        return null;
    }

    @Override
    public boolean isActive() {
        if (this.workflow != null) {
            return this.workflow.isActive();
        }
        return false;
    }

    @Override
    public int countSubItems() {
        return this.tasks != null ? this.tasks.size() : 0;
    }

    public int compareStartDates(WorkflowListItem listItem) {
        Date rightStartDate;
        int statusComparison = this.compareStatusWith(listItem);
        if (statusComparison != 0) {
            return statusComparison;
        }
        Date leftStartDate = this.getWorkflow() != null ? this.getWorkflow().getTimeStarted() : null;
        Date date = rightStartDate = listItem.getWorkflow() != null ? listItem.getWorkflow().getTimeStarted() : null;
        if (leftStartDate != null) {
            if (rightStartDate != null) {
                return leftStartDate.compareTo(rightStartDate);
            }
            return -1;
        }
        if (rightStartDate != null) {
            return 1;
        }
        return 0;
    }

    private String getWorkflowModelImageUrl(ResourceResolver resourceResolver, WorkflowModel model) {
        String thumbnail = "/libs/cq/core/content/projects/templates/default/thumbnail.png";
        if (model != null) {
            Page workflowPage;
            Resource modelPageResource;
            String pagePath = "";
            if (model.getId().endsWith("jcr:content/model")) {
                pagePath = Text.getRelativeParent((String)model.getId(), (int)2);
            }
            if ((modelPageResource = resourceResolver.getResource(pagePath)) != null && (workflowPage = (Page)modelPageResource.adaptTo(Page.class)) != null && workflowPage.getContentResource().getChild("image") != null) {
                thumbnail = workflowPage.getPath() + ".thumb.319.319.png" + this.pageCK(workflowPage);
            }
        }
        return thumbnail;
    }

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

}