ru.codeinside.gses.webui.components.ProcessDefinitionShowUi.java Source code

Java tutorial

Introduction

Here is the source code for ru.codeinside.gses.webui.components.ProcessDefinitionShowUi.java

Source

/*
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 * Copyright (c) 2013, MPL CodeInside http://codeinside.ru
 */

package ru.codeinside.gses.webui.components;

import com.vaadin.terminal.Sizeable;
import com.vaadin.ui.Button;
import com.vaadin.ui.Component;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.Label;
import com.vaadin.ui.Panel;
import com.vaadin.ui.Table;
import com.vaadin.ui.TreeTable;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.themes.Reindeer;
import org.activiti.engine.delegate.Expression;
import org.activiti.engine.impl.RepositoryServiceImpl;
import org.activiti.engine.impl.bpmn.behavior.UserTaskActivityBehavior;
import org.activiti.engine.impl.form.TaskFormHandler;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.activiti.engine.impl.pvm.ReadOnlyProcessDefinition;
import org.activiti.engine.impl.pvm.process.ActivityImpl;
import org.activiti.engine.impl.task.TaskDefinition;
import org.activiti.engine.repository.ProcessDefinition;
import org.apache.commons.lang.StringUtils;
import ru.codeinside.adm.AdminServiceProvider;
import ru.codeinside.gses.activiti.forms.CustomTaskFormHandler;
import ru.codeinside.gses.activiti.forms.api.definitions.BlockNode;
import ru.codeinside.gses.activiti.forms.api.definitions.PropertyCollection;
import ru.codeinside.gses.activiti.forms.api.definitions.PropertyNode;
import ru.codeinside.gses.activiti.forms.api.definitions.PropertyTree;
import ru.codeinside.gses.activiti.forms.api.definitions.VariableType;
import ru.codeinside.gses.webui.Flash;
import ru.codeinside.gses.webui.components.api.Changer;

import java.util.Set;

public class ProcessDefinitionShowUi extends CustomComponent {

    private static final long serialVersionUID = -2168823678201493358L;
    private final String processDefinitionId;
    private final Changer changer;

    public ProcessDefinitionShowUi(ProcessDefinition processDefinition, Changer changer) {
        processDefinitionId = processDefinition.getId();
        this.changer = changer;
        setCompositionRoot(buildMainLayout());
        setWidth(1100, Sizeable.UNITS_PIXELS);
        setHeight(600, Sizeable.UNITS_PIXELS);
    }

    private Component buildMainLayout() {
        VerticalLayout layout = new VerticalLayout();
        layout.setSizeFull();
        layout.setSpacing(true);
        layout.setMargin(true);

        Label label = new Label();
        String name = getProcessDefinitionById(processDefinitionId).getName();
        label.setCaption(name);
        label.setStyleName(Reindeer.LABEL_H2);

        Button showScheme = new Button("");
        showScheme.addListener(new Button.ClickListener() {
            private static final long serialVersionUID = -5911713385519847639L;

            @Override
            public void buttonClick(com.vaadin.ui.Button.ClickEvent event) {
                VerticalLayout imageLayout = new VerticalLayout();
                Button back = new Button("?");
                back.addListener(new Button.ClickListener() {
                    private static final long serialVersionUID = 4154712522487297925L;

                    @Override
                    public void buttonClick(com.vaadin.ui.Button.ClickEvent event) {
                        changer.back();
                    }
                });
                imageLayout.addComponent(back);
                imageLayout.setMargin(true);
                imageLayout.setSpacing(true);
                imageLayout.setWidth(1100, Sizeable.UNITS_PIXELS);
                imageLayout.setHeight(600, Sizeable.UNITS_PIXELS);
                final Panel panel = new Panel();
                panel.getContent().setSizeUndefined();
                TaskGraph tg = new TaskGraph(processDefinitionId, null);
                panel.addComponent(tg);
                panel.setSizeFull();
                panel.setScrollable(true);
                imageLayout.addComponent(panel);
                imageLayout.setExpandRatio(back, 0.01f);
                imageLayout.setExpandRatio(panel, 0.99f);
                changer.change(imageLayout);
            }
        });
        layout.addComponent(showScheme);

        Table table = new Table();
        table.setSizeFull();
        table.setImmediate(true);
        table.setSelectable(true);
        table.setSortDisabled(true);
        table.setPageLength(0);
        table.setSelectable(false);
        table.addContainerProperty("id", String.class, null);
        table.addContainerProperty("name", String.class, null);
        table.addContainerProperty("accessPermissions", Component.class, null);
        table.addContainerProperty("formProperties", Component.class, null);
        table.addContainerProperty("other", String.class, null);
        table.setColumnHeaders(new String[] { " ?", "?",
                /*" ?",*/ " ?", "? ",
                "? " });
        table.setColumnExpandRatio("id", 0.1f);
        table.setColumnExpandRatio("name", 0.1f);
        table.setColumnExpandRatio("accessPermissions", 0.1f);
        table.setColumnExpandRatio("formProperties", 0.4f);
        table.setColumnExpandRatio("other", 0.2f);
        fillTable(table);

        layout.addComponent(label);
        layout.setExpandRatio(label, 1);

        layout.addComponent(table);
        layout.setExpandRatio(table, 40);

        return layout;
    }

    private ReadOnlyProcessDefinition getProcessDefinitionById(String definitionId) {
        return ((RepositoryServiceImpl) Flash.flash().getProcessEngine().getRepositoryService())
                .getDeployedProcessDefinition(definitionId);
    }

    private void fillTable(Table table) {
        ReadOnlyProcessDefinition processDefinition = getProcessDefinitionById(processDefinitionId);
        int index = 1;
        for (ActivityImpl ac : ((ProcessDefinitionEntity) processDefinition).getActivities()) {
            String name = ac.getProperty("name") != null ? ac.getProperty("name").toString()
                    : " ?";
            String other = "";
            VerticalLayout formProperties = new VerticalLayout();
            Component accessSubjectsList = new VerticalLayout();
            if (ac.getActivityBehavior() instanceof UserTaskActivityBehavior) {
                UserTaskActivityBehavior utab = (UserTaskActivityBehavior) ac.getActivityBehavior();
                other = taskInfo(utab);
                TaskFormHandler taskFormHandler = utab.getTaskDefinition().getTaskFormHandler();
                PropertyTree propertyTree = ((CustomTaskFormHandler) taskFormHandler).getPropertyTree();
                formProperties.addComponent(createPropertyTable(propertyTree));
                TaskDefinition taskDefinition = utab.getTaskDefinition();
                Set<Expression> candidateUserIdExpressions = taskDefinition.getCandidateUserIdExpressions();
                Set<Expression> candidateGroupIdExpressions = taskDefinition.getCandidateGroupIdExpressions();
                accessSubjectsList = createAccessList(candidateUserIdExpressions, candidateGroupIdExpressions);
            }
            table.addItem(
                    new Object[] { ac.getId(), name, /*component,*/ accessSubjectsList, formProperties, other },
                    index++);
        }
    }

    private Component createAccessList(Set<Expression> candidateUserIdExpressions,
            Set<Expression> candidateGroupIdExpressions) {
        VerticalLayout layout = new VerticalLayout();
        layout.setSpacing(true);

        if (!candidateUserIdExpressions.isEmpty()) {
            VerticalLayout usersList = new VerticalLayout();
            usersList.setCaption(":");
            for (Expression e : candidateUserIdExpressions) {
                String fio = getUserFio(e);
                String formatted = StringUtils.isEmpty(fio) ? "" : ("(" + fio + ")");
                usersList.addComponent(new Label(e.getExpressionText() + formatted + " "));
            }
            layout.addComponent(usersList);
        }
        if (!candidateGroupIdExpressions.isEmpty()) {
            VerticalLayout groupsList = new VerticalLayout();
            groupsList.setCaption(":");
            for (Expression e : candidateGroupIdExpressions) {
                groupsList.addComponent(new Label(e.getExpressionText()));
            }
            layout.addComponent(groupsList);
        }
        return layout;
    }

    private Component createPropertyTable(PropertyTree propertyTree) {
        TreeTable table = new TreeTable();
        table.setImmediate(true);
        table.setSelectable(false);
        table.setPageLength(0);
        table.setSortDisabled(true);
        table.addContainerProperty("id", String.class, null);
        table.addContainerProperty("name", String.class, null);
        table.addContainerProperty("variable", String.class, null);
        table.addContainerProperty("expression", String.class, null);
        table.addContainerProperty("type", String.class, null);
        table.setColumnHeaders(new String[] { "id", "name", "variable", "expression", "type" });
        table.setPageLength(0);
        fillPropertyTable(table, propertyTree, -1);
        return table;
    }

    private int fillPropertyTable(TreeTable treeTable, PropertyCollection properties, int i) {
        int parentId = i;
        for (PropertyNode propertyNode : properties.getNodes()) {
            String id = "" + propertyNode.getId();
            String name = "" + propertyNode.getName();
            String variable = "" + propertyNode.getVariableName();
            String expression = "" + propertyNode.getVariableExpression();
            VariableType variableType = propertyNode.getVariableType();
            String type = (variableType == null) ? "" : variableType.getName();
            treeTable.addItem(new Object[] { id, name, variable, expression, type }, ++i);
            if (parentId >= 0) {
                treeTable.setParent(i, parentId);
            }
            if (propertyNode instanceof BlockNode) {
                i = fillPropertyTable(treeTable, (PropertyCollection) propertyNode, i);
            } else {
                treeTable.setChildrenAllowed(i, false);
            }
        }
        return i;
    }

    private String taskInfo(UserTaskActivityBehavior utab) {
        String result = "";
        if (utab.getMultiInstanceActivityBehavior() != null) {
            result += " ElementVariable:" + utab.getMultiInstanceActivityBehavior().getCollectionElementVariable();
            result += " Variable:" + utab.getMultiInstanceActivityBehavior().getCollectionVariable();
            result += " Expression:" + utab.getMultiInstanceActivityBehavior().getCollectionExpression();
            result += " ConditionExpression:"
                    + utab.getMultiInstanceActivityBehavior().getCompletionConditionExpression();
            result += " LoopCardinality:" + utab.getMultiInstanceActivityBehavior().getLoopCardinalityExpression();
        }

        TaskDefinition taskDefinition = utab.getTaskDefinition();

        if (taskDefinition.getAssigneeExpression() != null) {
            result += " Assignee:" + taskDefinition.getAssigneeExpression().toString();
        }
        if (taskDefinition.getDescriptionExpression() != null) {
            result += " Description:" + taskDefinition.getDescriptionExpression().toString();
        }
        if (taskDefinition.getDueDateExpression() != null) {
            result += " DueDate:" + taskDefinition.getDueDateExpression().toString();
        }
        if (taskDefinition.getPriorityExpression() != null) {
            result += " Priority:" + taskDefinition.getPriorityExpression().toString();
        }
        return result;
    }

    private String getUserFio(Expression e) {
        try {
            return AdminServiceProvider.get().getUserItem(e.getExpressionText()).getFio();
        } catch (Exception er) {
            return "";
        }
    }
}