de.hofuniversity.iisys.liferay.workflows.LoggingTaskManager.java Source code

Java tutorial

Introduction

Here is the source code for de.hofuniversity.iisys.liferay.workflows.LoggingTaskManager.java

Source

/**
 * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 */

package de.hofuniversity.iisys.liferay.workflows;

import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.model.Role;
import com.liferay.portal.kernel.model.User;
import com.liferay.portal.kernel.service.ServiceContext;
import com.liferay.portal.kernel.transaction.Isolation;
import com.liferay.portal.kernel.transaction.Propagation;
import com.liferay.portal.kernel.transaction.Transactional;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.workflow.WorkflowConstants;
import com.liferay.portal.kernel.workflow.WorkflowException;
import com.liferay.portal.kernel.workflow.WorkflowTask;
import com.liferay.portal.kernel.workflow.WorkflowTaskAssignee;
import com.liferay.portal.spring.extender.service.ServiceReference;
import com.liferay.portal.workflow.kaleo.KaleoWorkflowModelConverter;
import com.liferay.portal.workflow.kaleo.definition.ExecutionType;
import com.liferay.portal.workflow.kaleo.model.KaleoInstance;
import com.liferay.portal.workflow.kaleo.model.KaleoNode;
import com.liferay.portal.workflow.kaleo.model.KaleoTask;
import com.liferay.portal.workflow.kaleo.model.KaleoTaskAssignmentInstance;
import com.liferay.portal.workflow.kaleo.model.KaleoTaskInstanceToken;
import com.liferay.portal.workflow.kaleo.runtime.ExecutionContext;
import com.liferay.portal.workflow.kaleo.runtime.TaskManager;
import com.liferay.portal.workflow.kaleo.runtime.action.KaleoActionExecutor;
import com.liferay.portal.workflow.kaleo.runtime.internal.BaseKaleoBean;
import com.liferay.portal.workflow.kaleo.runtime.notification.NotificationHelper;
import com.liferay.portal.workflow.kaleo.runtime.util.WorkflowContextUtil;

import java.io.File;
import java.io.PrintWriter;
import java.io.Serializable;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

/**
 * @author Michael C. Han
 */
@Transactional(isolation = Isolation.PORTAL, propagation = Propagation.REQUIRED, rollbackFor = { Exception.class })
public class LoggingTaskManager extends BaseKaleoBean implements TaskManager {

    private final PrintWriter fLogger;

    public LoggingTaskManager() throws Exception {
        File logFile = new File("/home/liferay/workflow-task-manager.log");

        if (!logFile.exists()) {
            logFile.createNewFile();
        }

        fLogger = new PrintWriter(logFile);

        fLogger.println("logging task manager initialized\n");
        fLogger.flush();
    }

    private void logMap(Map<String, Serializable> map, String indent) {
        if (map != null) {
            for (Entry<String, Serializable> entry : map.entrySet()) {
                fLogger.println(indent + entry.getKey() + ": " + entry.getValue());
            }
        }
    }

    private void logServiceContext(ServiceContext serviceContext, String indent) {
        if (serviceContext != null) {
            fLogger.println(indent + "command: " + serviceContext.getCommand());
            try {
                fLogger.println(indent + "guestOrUserId: " + serviceContext.getGuestOrUserId());
            } catch (PortalException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            fLogger.println(indent + "workflowAction: " + serviceContext.getWorkflowAction());
            fLogger.println(indent + "attributes:");
            logMap(serviceContext.getAttributes(), indent + "\t");
        }
    }

    private void logTask(WorkflowTask task, String indent) {
        if (task == null) {
            return;
        }

        fLogger.println(indent + "AssigneeUserId: " + task.getAssigneeUserId());
        fLogger.println(indent + "name: " + task.getName());
        fLogger.println(indent + "workflowDefinitionName: " + task.getWorkflowDefinitionName());
        fLogger.println(indent + "workflowInstanceId: " + task.getWorkflowInstanceId());
        fLogger.println(indent + "workflowTaskId: " + task.getWorkflowTaskId());

        fLogger.println(indent + "optionalAttributes:");
        logMap(task.getOptionalAttributes(), indent + "\t");

        fLogger.println(indent + "workflowTaskAssignees:");
        for (WorkflowTaskAssignee wta : task.getWorkflowTaskAssignees()) {
            fLogger.println(indent + "\t" + "assignee:");

            fLogger.println(indent + "\t\t" + "className: " + wta.getAssigneeClassName());
            fLogger.println(indent + "\t\t" + "classPK: " + wta.getAssigneeClassPK());
        }
    }

    @Override
    public WorkflowTask assignWorkflowTaskToRole(long workflowTaskInstanceId, long roleId, String comment,
            Date dueDate, Map<String, Serializable> workflowContext, ServiceContext serviceContext)
            throws WorkflowException {

        try {
            fLogger.println("TaskManager.assignWorkflowTaskToRole");
            fLogger.println("\tworkflowTaskInstanceId: " + workflowTaskInstanceId);
            fLogger.println("\troleId: " + roleId);
            fLogger.println("\tcomment: " + comment);
            fLogger.println("\tdueDate: " + dueDate);
            fLogger.println("\tworkflowContext:");
            logMap(workflowContext, "\t\t");
            fLogger.println("\tserviceContext:");
            logServiceContext(serviceContext, "\t\t");

            WorkflowTask task = assignWorkflowTask(workflowTaskInstanceId, Role.class.getName(), roleId, comment,
                    dueDate, workflowContext, serviceContext);

            fLogger.println("RETURN task:");
            logTask(task, "\t\t");
            fLogger.flush();

            return task;
        } catch (Exception e) {
            throw new WorkflowException(e);
        }
    }

    @Override
    public WorkflowTask assignWorkflowTaskToUser(long workflowTaskInstanceId, long assigneeUserId, String comment,
            Date dueDate, Map<String, Serializable> workflowContext, ServiceContext serviceContext)
            throws WorkflowException {

        try {
            fLogger.println("TaskManager.assignWorkflowTaskToUser");
            fLogger.println("\tworkflowTaskInstanceId: " + workflowTaskInstanceId);
            fLogger.println("\tassigneeUserId: " + assigneeUserId);
            fLogger.println("\tcomment: " + comment);
            fLogger.println("\tdueDate: " + dueDate);
            fLogger.println("\tworkflowContext:");
            logMap(workflowContext, "\t\t");
            fLogger.println("\tserviceContext:");
            logServiceContext(serviceContext, "\t\t");

            WorkflowTask task = assignWorkflowTask(workflowTaskInstanceId, User.class.getName(), assigneeUserId,
                    comment, dueDate, workflowContext, serviceContext);

            fLogger.println("RETURN task:");
            logTask(task, "\t\t");
            fLogger.flush();

            return task;
        } catch (Exception e) {
            throw new WorkflowException(e);
        }
    }

    @Override
    public WorkflowTask completeWorkflowTask(long workflowTaskInstanceId, String transitionName, String comment,
            Map<String, Serializable> workflowContext, ServiceContext serviceContext) throws WorkflowException {

        try {
            fLogger.println("TaskManager.completeWorkflowTask");
            fLogger.println("\tworkflowTaskInstanceId: " + workflowTaskInstanceId);
            fLogger.println("\ttransitionName: " + transitionName);
            fLogger.println("\tcomment: " + comment);
            fLogger.println("\tworkflowContext:");
            logMap(workflowContext, "\t\t");
            fLogger.println("\tserviceContext:");
            logServiceContext(serviceContext, "\t\t");

            WorkflowTask task = doCompleteWorkflowTask(workflowTaskInstanceId, transitionName, comment,
                    workflowContext, serviceContext);

            fLogger.println("RETURN task:");
            logTask(task, "\t\t");
            fLogger.flush();

            return task;
        } catch (Exception e) {
            throw new WorkflowException(e);
        }
    }

    @Override
    public WorkflowTask updateDueDate(long workflowTaskInstanceId, String comment, Date dueDate,
            ServiceContext serviceContext) throws WorkflowException {

        try {
            fLogger.println("TaskManager.updateDueDate");
            fLogger.println("\tworkflowTaskInstanceId: " + workflowTaskInstanceId);
            fLogger.println("\tcomment: " + comment);
            fLogger.println("\tdueDate: " + dueDate);
            fLogger.println("\tserviceContext:");
            logServiceContext(serviceContext, "\t\t");
            fLogger.flush();

            KaleoTaskInstanceToken kaleoTaskInstanceToken = kaleoTaskInstanceTokenLocalService
                    .getKaleoTaskInstanceToken(workflowTaskInstanceId);

            if (kaleoTaskInstanceToken.isCompleted()) {
                throw new WorkflowException("Cannot update due date for completed task " + workflowTaskInstanceId);
            }

            if (dueDate != null) {
                kaleoTaskInstanceTokenLocalService.updateDueDate(workflowTaskInstanceId, dueDate, serviceContext);
            }

            Map<String, Serializable> workflowContext = WorkflowContextUtil
                    .convert(kaleoTaskInstanceToken.getWorkflowContext());

            kaleoLogLocalService.addTaskUpdateKaleoLog(kaleoTaskInstanceToken, comment, workflowContext,
                    serviceContext);

            return _kaleoWorkflowModelConverter.toWorkflowTask(kaleoTaskInstanceToken, workflowContext);
        } catch (Exception e) {
            throw new WorkflowException(e);
        }
    }

    protected WorkflowTask assignWorkflowTask(long workflowTaskInstanceId, String assigneeClassName,
            long assigneeClassPK, String comment, Date dueDate, Map<String, Serializable> workflowContext,
            ServiceContext serviceContext) throws Exception {

        KaleoTaskInstanceToken kaleoTaskInstanceToken = kaleoTaskInstanceTokenLocalService
                .getKaleoTaskInstanceToken(workflowTaskInstanceId);

        List<KaleoTaskAssignmentInstance> previousTaskAssignmentInstances = kaleoTaskInstanceToken
                .getKaleoTaskAssignmentInstances();

        workflowContext = updateWorkflowContext(workflowContext, kaleoTaskInstanceToken);

        if (kaleoTaskInstanceToken.isCompleted()) {
            throw new WorkflowException("Cannot reassign a completed task " + workflowTaskInstanceId);
        }

        if (dueDate != null) {
            kaleoTaskInstanceTokenLocalService.updateDueDate(workflowTaskInstanceId, dueDate, serviceContext);
        }

        kaleoTaskInstanceToken = kaleoTaskInstanceTokenLocalService.assignKaleoTaskInstanceToken(
                kaleoTaskInstanceToken.getKaleoTaskInstanceTokenId(), assigneeClassName, assigneeClassPK,
                workflowContext, serviceContext);

        workflowContext.put(WorkflowConstants.CONTEXT_TASK_COMMENTS, comment);

        ExecutionContext executionContext = new ExecutionContext(kaleoTaskInstanceToken.getKaleoInstanceToken(),
                kaleoTaskInstanceToken, workflowContext, serviceContext);

        KaleoTask kaleoTask = kaleoTaskInstanceToken.getKaleoTask();

        _kaleoActionExecutor.executeKaleoActions(KaleoNode.class.getName(), kaleoTask.getKaleoNodeId(),
                ExecutionType.ON_ASSIGNMENT, executionContext);

        boolean selfAssignment = false;

        if (assigneeClassName.equals(User.class.getName()) && (assigneeClassPK == serviceContext.getUserId())) {

            selfAssignment = true;
        }

        if (!selfAssignment) {
            _notificationHelper.sendKaleoNotifications(KaleoNode.class.getName(), kaleoTask.getKaleoNodeId(),
                    ExecutionType.ON_ASSIGNMENT, executionContext);
        }

        kaleoLogLocalService.addTaskAssignmentKaleoLog(previousTaskAssignmentInstances, kaleoTaskInstanceToken,
                comment, workflowContext, serviceContext);

        return _kaleoWorkflowModelConverter.toWorkflowTask(kaleoTaskInstanceToken, workflowContext);
    }

    protected WorkflowTask doCompleteWorkflowTask(long workflowTaskInstanceId, String transitionName,
            String comment, Map<String, Serializable> workflowContext, ServiceContext serviceContext)
            throws Exception {

        KaleoTaskInstanceToken kaleoTaskInstanceToken = kaleoTaskInstanceTokenLocalService
                .getKaleoTaskInstanceToken(workflowTaskInstanceId);

        if (Validator.isNotNull(transitionName)) {

            // Validate that the transition actually exists before moving
            // forward

            KaleoTask kaleoTask = kaleoTaskInstanceToken.getKaleoTask();

            KaleoNode currentKaleoNode = kaleoTask.getKaleoNode();

            currentKaleoNode.getKaleoTransition(transitionName);
        }

        workflowContext = updateWorkflowContext(workflowContext, kaleoTaskInstanceToken);

        if (kaleoTaskInstanceToken.isCompleted()) {
            throw new WorkflowException("Cannot complete an already completed task " + workflowTaskInstanceId
                    + " for user " + serviceContext.getUserId());
        }

        serviceContext.setScopeGroupId(kaleoTaskInstanceToken.getGroupId());

        kaleoTaskInstanceToken = kaleoTaskInstanceTokenLocalService.completeKaleoTaskInstanceToken(
                kaleoTaskInstanceToken.getKaleoTaskInstanceTokenId(), serviceContext);

        kaleoLogLocalService.addTaskCompletionKaleoLog(kaleoTaskInstanceToken, comment, workflowContext,
                serviceContext);

        return _kaleoWorkflowModelConverter.toWorkflowTask(kaleoTaskInstanceToken, workflowContext);
    }

    protected Map<String, Serializable> updateWorkflowContext(Map<String, Serializable> workflowContext,
            KaleoTaskInstanceToken kaleoTaskInstanceToken) throws PortalException {

        KaleoInstance kaleoInstance = kaleoInstanceLocalService
                .getKaleoInstance(kaleoTaskInstanceToken.getKaleoInstanceId());

        if (workflowContext == null) {
            workflowContext = WorkflowContextUtil.convert(kaleoInstance.getWorkflowContext());
        } else {
            Map<String, Serializable> storedWorkflowContext = WorkflowContextUtil
                    .convert(kaleoInstance.getWorkflowContext());

            for (Map.Entry<String, Serializable> entry : storedWorkflowContext.entrySet()) {

                String key = entry.getKey();

                if (!workflowContext.containsKey(key)) {
                    workflowContext.put(key, entry.getValue());
                }
            }
        }

        return workflowContext;
    }

    @ServiceReference(type = KaleoActionExecutor.class)
    private KaleoActionExecutor _kaleoActionExecutor;

    @ServiceReference(type = KaleoWorkflowModelConverter.class)
    private KaleoWorkflowModelConverter _kaleoWorkflowModelConverter;

    @ServiceReference(type = NotificationHelper.class)
    private NotificationHelper _notificationHelper;

}