org.processbase.ui.bpm.admin.ProcessDefinitionWindow.java Source code

Java tutorial

Introduction

Here is the source code for org.processbase.ui.bpm.admin.ProcessDefinitionWindow.java

Source

/**
 * Copyright (C) 2011 PROCESSBASE Ltd.
 * 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
 * version 2.1 of the License.
 * 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.
 * You should have received a copy of the GNU Lesser General Public License along with this
 * program; if not, see <http://www.gnu.org/licenses/>.
 */
package org.processbase.ui.bpm.admin;

import com.vaadin.data.Item;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.CheckBox;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.Component;
import com.vaadin.ui.Label;
import com.vaadin.ui.TabSheet;
import com.vaadin.ui.TabSheet.SelectedTabChangeEvent;
import com.vaadin.ui.Table;
import com.vaadin.ui.Upload;
import com.vaadin.ui.Upload.FailedEvent;
import com.vaadin.ui.Upload.SucceededEvent;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.themes.Reindeer;
import com.vaadin.ui.themes.Runo;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import org.ow2.bonita.facade.IdentityAPI;
import org.ow2.bonita.facade.def.majorElement.ActivityDefinition;
import org.ow2.bonita.facade.def.majorElement.ProcessDefinition;
import org.ow2.bonita.facade.def.majorElement.ProcessDefinition.ProcessState;
import org.ow2.bonita.facade.identity.Group;
import org.ow2.bonita.facade.identity.Membership;
import org.ow2.bonita.facade.identity.Role;
import org.ow2.bonita.facade.privilege.Rule;
import org.processbase.ui.core.Constants;
import org.processbase.ui.core.ProcessbaseApplication;
import org.processbase.ui.core.template.ButtonBar;
import org.processbase.ui.core.template.ConfirmDialog;
import org.processbase.ui.core.template.PbTableFieldFactory;
import org.processbase.ui.core.template.PbWindow;
import org.processbase.ui.core.template.TableLinkButton;

/**
 *
 * @author mgubaidullin
 */
public class ProcessDefinitionWindow extends PbWindow implements ClickListener, Upload.SucceededListener,
        Upload.FailedListener, Upload.Receiver, TabSheet.SelectedTabChangeListener {

    private ProcessDefinition processDefinition = null;
    private Button addBtn;
    private ButtonBar buttons = new ButtonBar();
    private Button closeBtn;
    private Button applyBtn;
    private Button saveAccessBtn;
    private Upload upload = new Upload("", (Upload.Receiver) this);
    private Button deleteAllBtn;
    private Button deleteInstancesBtn;
    private Button downloadBtn;
    private CheckBox enableBtn;
    private Button archiveBtn;
    private Table activitiesTable = new Table();
    private File file;
    private String filename;
    private String originalFilename;
    private String fileExt;
    private Table tableMembership = new Table();
    private TabSheet tabSheet = new TabSheet();
    private VerticalLayout v1 = new VerticalLayout();
    private VerticalLayout v2 = new VerticalLayout();
    private VerticalLayout v3 = new VerticalLayout();
    private Set<String> deletedMembership = new HashSet<String>();
    private Rule rule;

    public ProcessDefinitionWindow(ProcessDefinition processDefinition) {
        super(processDefinition.getLabel());
        this.processDefinition = processDefinition;
    }

    public void initUI() {
        try {
            String caption = processDefinition.getLabel() != null ? processDefinition.getLabel()
                    : processDefinition.getName();
            setCaption(caption + " (v." + processDefinition.getVersion() + ")");
            VerticalLayout layout = (VerticalLayout) this.getContent();
            layout.setMargin(true);
            layout.setSpacing(true);
            layout.setStyleName(Reindeer.LAYOUT_WHITE);

            v1.setMargin(true, false, false, false);
            v1.setSizeFull();

            if (processDefinition.getLabel() != null) {
                Label pdLabel = new Label("<b>" + processDefinition.getLabel() + "</b>");
                pdLabel.setContentMode(Label.CONTENT_XHTML);
                v1.addComponent(pdLabel);
            }

            if (processDefinition.getDescription() != null) {
                Label pdDescription = new Label(processDefinition.getDescription());
                pdDescription.setContentMode(Label.CONTENT_XHTML);
                v1.addComponent(pdDescription);
                v1.setExpandRatio(pdDescription, 1);
            }

            tabSheet.addTab(v1, ProcessbaseApplication.getCurrent().getPbMessages().getString("tabDescription"),
                    null);

            activitiesTable.setSizeFull();

            v2.setMargin(false, false, false, false);
            v2.addComponent(activitiesTable);
            v2.setSizeFull();
            tabSheet.addTab(v2, ProcessbaseApplication.getCurrent().getPbMessages().getString("tabCustomUI"), null);

            // prepare membership
            prepareTableMembership();
            addBtn = new Button(ProcessbaseApplication.getCurrent().getPbMessages().getString("btnAdd"), this);
            addBtn.setStyleName(Runo.BUTTON_SMALL);
            v3.setMargin(false, false, false, false);
            v3.setSpacing(true);
            v3.addComponent(addBtn);
            v3.setComponentAlignment(addBtn, Alignment.MIDDLE_RIGHT);
            v3.addComponent(tableMembership);
            v3.setSizeFull();
            tabSheet.addTab(v3, ProcessbaseApplication.getCurrent().getPbMessages().getString("processAccess"),
                    null);
            refreshTableMembership();

            tabSheet.setStyleName(Reindeer.TABSHEET_MINIMAL);
            tabSheet.setSizeFull();
            tabSheet.addListener((TabSheet.SelectedTabChangeListener) this);
            layout.addComponent(tabSheet);
            layout.setExpandRatio(tabSheet, 1);

            closeBtn = new Button(ProcessbaseApplication.getCurrent().getPbMessages().getString("btnClose"), this);
            applyBtn = new Button(ProcessbaseApplication.getCurrent().getPbMessages().getString("btnSaveCustomUI"),
                    this);
            saveAccessBtn = new Button(
                    ProcessbaseApplication.getCurrent().getPbMessages().getString("btnSaveProcessAccess"), this);
            deleteAllBtn = new Button(ProcessbaseApplication.getCurrent().getPbMessages().getString("btnDeleteAll"),
                    this);
            deleteInstancesBtn = new Button(
                    ProcessbaseApplication.getCurrent().getPbMessages().getString("btnDeleteInstances"), this);
            downloadBtn = new Button(ProcessbaseApplication.getCurrent().getPbMessages().getString("btnDownload"),
                    this);
            enableBtn = new CheckBox(ProcessbaseApplication.getCurrent().getPbMessages().getString("btnEnable"),
                    this);
            archiveBtn = new Button(ProcessbaseApplication.getCurrent().getPbMessages().getString("btnArchive"),
                    this);

            deleteAllBtn.setDescription(
                    ProcessbaseApplication.getCurrent().getPbMessages().getString("deleteProcessDefinition"));
            buttons.addButton(deleteAllBtn);
            buttons.setComponentAlignment(deleteAllBtn, Alignment.MIDDLE_RIGHT);
            deleteInstancesBtn.setDescription(
                    ProcessbaseApplication.getCurrent().getPbMessages().getString("deleteProcessInstances"));
            buttons.addButton(deleteInstancesBtn);
            buttons.setComponentAlignment(deleteInstancesBtn, Alignment.MIDDLE_RIGHT);

            Label expand = new Label("");
            buttons.addComponent(expand);
            buttons.setExpandRatio(expand, 1);

            enableBtn.setValue(processDefinition.getState().equals(ProcessState.ENABLED));
            buttons.addButton(enableBtn);
            buttons.setComponentAlignment(enableBtn, Alignment.MIDDLE_RIGHT);

            buttons.addButton(archiveBtn);
            buttons.setComponentAlignment(archiveBtn, Alignment.MIDDLE_RIGHT);

            applyBtn.setVisible(false);
            buttons.addButton(applyBtn);
            buttons.setComponentAlignment(applyBtn, Alignment.MIDDLE_RIGHT);
            buttons.addButton(saveAccessBtn);
            saveAccessBtn.setVisible(false);
            buttons.setComponentAlignment(saveAccessBtn, Alignment.MIDDLE_RIGHT);
            buttons.addButton(closeBtn);
            buttons.setComponentAlignment(closeBtn, Alignment.MIDDLE_RIGHT);
            buttons.setMargin(false);
            buttons.setHeight("30px");
            buttons.setWidth("100%");
            layout.addComponent(buttons);
            layout.setWidth("800px");
            layout.setHeight("400px");
            setResizable(false);
            setModal(true);

            //        activitiesTable.addContainerProperty("activityUUID", String.class, null, "UUID", null, null);
            //        activitiesTable.setColumnWidth("activityUUID", 0);
            activitiesTable.addContainerProperty("activityLabel", String.class, null,
                    ProcessbaseApplication.getCurrent().getPbMessages().getString("tableCaptionActivityName"), null,
                    null);
            activitiesTable.addContainerProperty("url", String.class, null,
                    ProcessbaseApplication.getCurrent().getPbMessages().getString("tabCaptionTaskURL"), null, null);
            activitiesTable.setColumnWidth("url", 300);
            activitiesTable.setTableFieldFactory(new PbTableFieldFactory());
            activitiesTable.setEditable(true);
            activitiesTable.setImmediate(true);

            refreshTable();
        } catch (Exception ex) {
            ex.printStackTrace();
            showError(ex.getMessage());
        }
    }

    public void refreshTable() {
        try {
            activitiesTable.removeAllItems();
            // process level Custom UI
            Item woItem = activitiesTable.addItem(processDefinition);
            woItem.getItemProperty("activityLabel")
                    .setValue(processDefinition.getLabel() != null ? processDefinition.getLabel()
                            : processDefinition.getName());
            String url = processDefinition.getAMetaData(processDefinition.getUUID().toString());
            woItem.getItemProperty("url").setValue(url != null ? url : new String());
            // activity level Custom UI
            for (ActivityDefinition activityDefinition : processDefinition.getActivities()) {
                if (activityDefinition.isTask()) {
                    woItem = activitiesTable.addItem(activityDefinition);
                    //                    woItem.getItemProperty("activityUUID").setValue(activityDefinition.getUUID().toString());
                    woItem.getItemProperty("activityLabel").setValue(activityDefinition.getLabel());
                    url = processDefinition.getAMetaData(activityDefinition.getUUID().toString());
                    woItem.getItemProperty("url").setValue(url != null ? url : new String());
                }
            }
            activitiesTable.setSortContainerPropertyId("activityLabel");
            activitiesTable.setSortAscending(true);
            activitiesTable.sort();
        } catch (Exception ex) {
            ex.printStackTrace();
            showError(ex.getMessage());
        }
    }

    public void buttonClick(ClickEvent event) {
        try {
            if (event.getButton().equals(applyBtn)) {
                save();
                close();
            } else if (event.getButton().equals(downloadBtn)) {
                download();
            } else if (event.getButton().equals(deleteAllBtn)) {
                deleteAll();
                close();
            } else if (event.getButton().equals(deleteInstancesBtn)) {
                deleteInstances();
            } else if (event.getButton().equals(enableBtn)) {
                enableProcess();
            } else if (event.getButton().equals(archiveBtn)) {
                archiveProcess();
            } else if (event.getButton().equals(saveAccessBtn)) {
                saveProcessAccess();
                close();
            } else if (event.getButton().equals(addBtn)) {
                addTableMembershipRow(null);
            } else if (event.getButton() instanceof TableLinkButton) {
                TableLinkButton tlb = (TableLinkButton) event.getButton();
                String uuid = (String) tlb.getTableValue();
                tableMembership.removeItem(uuid);
                if (!uuid.startsWith("NEW_MEMBERSHIP_UUID")) {
                    deletedMembership.add(uuid);
                }
            } else {
                close();
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            showError(ex.getMessage());
        }
    }

    private void enableProcess() {
        final ProcessbaseApplication processbase = ProcessbaseApplication.getCurrent();
        final PbWindow mainWindow = (PbWindow) getApplication().getMainWindow();
        ConfirmDialog.show(getApplication().getMainWindow(),
                ProcessbaseApplication.getCurrent().getPbMessages().getString("windowCaptionConfirm"),
                enableBtn.booleanValue()
                        ? ProcessbaseApplication.getCurrent().getPbMessages()
                                .getString("questionEnableProcessDefinition")
                        : ProcessbaseApplication.getCurrent().getPbMessages()
                                .getString("questionDisableProcessDefinition"),
                ProcessbaseApplication.getCurrent().getPbMessages().getString("btnYes"),
                ProcessbaseApplication.getCurrent().getPbMessages().getString("btnNo"),
                new ConfirmDialog.Listener() {

                    public void onClose(ConfirmDialog dialog) {
                        if (dialog.isConfirmed()) {
                            try {
                                if (enableBtn.booleanValue()) {
                                    processbase.getBpmModule()
                                            .enableProcessDefinitions(processDefinition.getUUID());
                                } else {
                                    processbase.getBpmModule()
                                            .disableProcessDefinitions(processDefinition.getUUID());
                                }
                                mainWindow.showInformation(
                                        processbase.getPbMessages().getString("executedSuccessfully"));
                            } catch (Exception ex) {
                                ex.printStackTrace();
                                mainWindow.showError(ex.getMessage());
                            }
                        }
                    }
                });
    }

    private void archiveProcess() {
        final ProcessbaseApplication processbase = ProcessbaseApplication.getCurrent();
        final PbWindow mainWindow = (PbWindow) getApplication().getMainWindow();
        ConfirmDialog.show(getApplication().getMainWindow(),
                ProcessbaseApplication.getCurrent().getPbMessages().getString("windowCaptionConfirm"),
                ProcessbaseApplication.getCurrent().getPbMessages().getString("questionArchiveProcessDefinition"),
                ProcessbaseApplication.getCurrent().getPbMessages().getString("btnYes"),
                ProcessbaseApplication.getCurrent().getPbMessages().getString("btnNo"),
                new ConfirmDialog.Listener() {

                    public void onClose(ConfirmDialog dialog) {
                        if (dialog.isConfirmed()) {
                            try {
                                processbase.getBpmModule().archiveProcessDefinitions(processDefinition.getUUID());
                                mainWindow.showInformation(
                                        processbase.getPbMessages().getString("executedSuccessfully"));
                            } catch (Exception ex) {
                                ex.printStackTrace();
                                mainWindow.showError(ex.getMessage());
                            }
                        }
                    }
                });
    }

    private void deleteAll() {
        final ProcessbaseApplication processbase = ProcessbaseApplication.getCurrent();
        final PbWindow mainWindow = (PbWindow) getApplication().getMainWindow();
        ConfirmDialog.show(mainWindow,
                ProcessbaseApplication.getCurrent().getPbMessages().getString("windowCaptionConfirm"),
                ProcessbaseApplication.getCurrent().getPbMessages().getString("questionDeleteProcessAndInstances"),
                ProcessbaseApplication.getCurrent().getPbMessages().getString("btnYes"),
                ProcessbaseApplication.getCurrent().getPbMessages().getString("btnNo"),
                new ConfirmDialog.Listener() {

                    public void onClose(ConfirmDialog dialog) {
                        if (dialog.isConfirmed()) {
                            try {
                                processbase.getBpmModule().deleteProcess(processDefinition);
                                mainWindow.showInformation(
                                        processbase.getPbMessages().getString("executedSuccessfully"));
                            } catch (Exception ex) {
                                ex.printStackTrace();
                                mainWindow.showError(ex.getMessage());
                            }
                        }
                    }
                });
    }

    private void deleteInstances() {
        final ProcessbaseApplication processbase = ProcessbaseApplication.getCurrent();
        final PbWindow mainWindow = (PbWindow) getApplication().getMainWindow();
        ConfirmDialog.show(mainWindow,
                ProcessbaseApplication.getCurrent().getPbMessages().getString("windowCaptionConfirm"),
                ProcessbaseApplication.getCurrent().getPbMessages().getString("questionDeleteInstances"),
                ProcessbaseApplication.getCurrent().getPbMessages().getString("btnYes"),
                ProcessbaseApplication.getCurrent().getPbMessages().getString("btnNo"),
                new ConfirmDialog.Listener() {

                    public void onClose(ConfirmDialog dialog) {
                        if (dialog.isConfirmed()) {
                            try {
                                processbase.getBpmModule().deleteAllProcessInstances(processDefinition);
                                mainWindow.showInformation(
                                        processbase.getPbMessages().getString("executedSuccessfully"));
                            } catch (Exception ex) {
                                ex.printStackTrace();
                                mainWindow.showError(ex.getMessage());
                            }
                        }
                    }
                });
    }

    private void download() {
        try {
            //            ByteArraySource bas = new ByteArraySource(
            //                    XMLManager.createXML("java.util.HashMap", getCurrentTableValues()).getBytes("UTF-8"));
            //            StreamResource streamResource = new StreamResource(bas, processDefinition.getLabel() + "_" + processDefinition.getVersion() + "_ui.xml", getApplication());
            //            streamResource.setCacheTime(50000); // no cache (<=0) does not work with IE8
            //            streamResource.setMIMEType("mime/xml");
            //            getWindow().getWindow().open(streamResource, "_new");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private HashMap<String, String> getCurrentTableValues() {
        HashMap<String, String> urlMap = new HashMap<String, String>();
        for (Object object : activitiesTable.getContainerDataSource().getItemIds()) {
            ActivityDefinition activityDefinition = (ActivityDefinition) object;
            if (activitiesTable.getItem(object).getItemProperty("url") != null
                    && activitiesTable.getItem(object).getItemProperty("url").toString().length() > 0) {
                urlMap.put(activityDefinition.getUUID().toString(),
                        activitiesTable.getItem(object).getItemProperty("url").toString());
            }
        }
        return urlMap;
    }

    private void save() throws Exception {
        for (Object object : activitiesTable.getContainerDataSource().getItemIds()) {
            if (object instanceof ProcessDefinition) { // process level Custom UI
                ProcessDefinition pd = (ProcessDefinition) object;
                if (activitiesTable.getItem(object).getItemProperty("url") != null
                        && !activitiesTable.getItem(object).getItemProperty("url").toString().isEmpty()) {
                    ProcessbaseApplication.getCurrent().getBpmModule().addProcessMetaData(
                            processDefinition.getUUID(), pd.getUUID().toString(),
                            activitiesTable.getItem(object).getItemProperty("url").toString());
                } else if (activitiesTable.getItem(object).getItemProperty("url") != null
                        && activitiesTable.getItem(object).getItemProperty("url").toString().isEmpty()) {
                    ProcessbaseApplication.getCurrent().getBpmModule()
                            .deleteProcessMetaData(processDefinition.getUUID(), pd.getUUID().toString());
                }

            } else if (object instanceof ActivityDefinition) { // activity level Custom UI
                ActivityDefinition activityDefinition = (ActivityDefinition) object;
                if (activitiesTable.getItem(object).getItemProperty("url") != null
                        && !activitiesTable.getItem(object).getItemProperty("url").toString().isEmpty()) {
                    ProcessbaseApplication.getCurrent().getBpmModule().addProcessMetaData(
                            processDefinition.getUUID(), activityDefinition.getUUID().toString(),
                            activitiesTable.getItem(object).getItemProperty("url").toString());
                } else if (activitiesTable.getItem(object).getItemProperty("url") != null
                        && activitiesTable.getItem(object).getItemProperty("url").toString().isEmpty()) {
                    ProcessbaseApplication.getCurrent().getBpmModule().deleteProcessMetaData(
                            processDefinition.getUUID(), activityDefinition.getUUID().toString());
                }
            }
        }
    }

    public void uploadSucceeded(SucceededEvent event) {
        try {
            //            byte[] readData = new byte[new Long(event.getLength()).intValue()];
            //            FileInputStream fis = new FileInputStream(file);
            //            int i = fis.read(readData);
            //            HashMap<String, String> urlMap = (HashMap<String, String>) XMLManager.createObject(new String(readData, "UTF-8"));
            //            for (String key : urlMap.keySet()) {
            //                PbPortlet.getCurrent().bpmModule.addProcessMetaData(processDefinition.getUUID(), key, urlMap.get(key));
            //            }
            //            fis.close();
            //            file.delete();
            //            refreshTable();
        } catch (Exception ex) {
            ex.printStackTrace();
            getWindow().showNotification(ex.getMessage(), Notification.TYPE_ERROR_MESSAGE);
        }
    }

    public void uploadFailed(FailedEvent event) {
        event.getReason().printStackTrace();
        showError(event.getReason().getMessage());
    }

    public OutputStream receiveUpload(String filename, String MIMEType) {
        this.originalFilename = filename;
        this.filename = UUID.randomUUID().toString();
        FileOutputStream fos = null;
        try {
            file = new File(this.filename);
            fos = new FileOutputStream(file);
        } catch (final java.io.FileNotFoundException e) {
            e.printStackTrace();
            return null;
        }
        return fos;
    }

    public void selectedTabChange(SelectedTabChangeEvent event) {
        if (event.getTabSheet().getSelectedTab().equals(v1)) {
            saveAccessBtn.setVisible(false);
            applyBtn.setVisible(false);
            deleteAllBtn.setVisible(true);
            deleteInstancesBtn.setVisible(true);
            downloadBtn.setVisible(true);
            enableBtn.setVisible(true);
            archiveBtn.setVisible(true);
        } else if (event.getTabSheet().getSelectedTab().equals(v2)) {
            applyBtn.setVisible(true);
            saveAccessBtn.setVisible(false);
            deleteAllBtn.setVisible(false);
            deleteInstancesBtn.setVisible(false);
            downloadBtn.setVisible(false);
            enableBtn.setVisible(false);
            archiveBtn.setVisible(false);
        } else if (event.getTabSheet().getSelectedTab().equals(v3)) {
            saveAccessBtn.setVisible(true);
            applyBtn.setVisible(false);
            deleteAllBtn.setVisible(false);
            deleteInstancesBtn.setVisible(false);
            downloadBtn.setVisible(false);
            enableBtn.setVisible(false);
            archiveBtn.setVisible(false);
        }
    }

    private void prepareTableMembership() {
        tableMembership.addContainerProperty("group", Component.class, null,
                ProcessbaseApplication.getCurrent().getPbMessages().getString("tableCaptionGroup"), null, null);
        tableMembership.addContainerProperty("role", Component.class, null,
                ProcessbaseApplication.getCurrent().getPbMessages().getString("tableCaptionRole"), null, null);
        tableMembership.addContainerProperty("actions", TableLinkButton.class, null,
                ProcessbaseApplication.getCurrent().getPbMessages().getString("tableCaptionActions"), null, null);
        tableMembership.setColumnWidth("actions", 30);
        tableMembership.setImmediate(true);
        tableMembership.setWidth("100%");
        tableMembership.setPageLength(10);
    }

    private void refreshTableMembership() {
        try {
            rule = ProcessbaseApplication.getCurrent().getBpmModule()
                    .findRule(processDefinition.getUUID().toString());
            tableMembership.removeAllItems();
            for (String membershipUUID : rule.getMemberships()) {
                Membership membership = ProcessbaseApplication.getCurrent().getBpmModule()
                        .getMembershipByUUID(membershipUUID);
                addTableMembershipRow(membership);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    private void addTableMembershipRow(Membership membership) throws Exception {
        String uuid = membership != null ? membership.getUUID()
                : "NEW_MEMBERSHIP_UUID_" + UUID.randomUUID().toString();
        Item woItem = tableMembership.addItem(uuid);

        if (membership != null) {
            Label groups = new Label(getGroups()
                    .getItem(membership != null ? membership.getGroup().getUUID() : null).getItemProperty("path"));
            woItem.getItemProperty("group").setValue(groups);

            Label roles = new Label(getRoles().getItem(membership != null ? membership.getRole().getUUID() : null)
                    .getItemProperty("name"));
            woItem.getItemProperty("role").setValue(roles);

        } else {
            ComboBox groups = new ComboBox();
            groups.setWidth("100%");
            groups.setContainerDataSource(getGroups());
            groups.setItemCaptionPropertyId("path");
            groups.setFilteringMode(ComboBox.FILTERINGMODE_CONTAINS);
            groups.setValue(membership != null ? membership.getGroup().getUUID() : null);
            woItem.getItemProperty("group").setValue(groups);

            ComboBox roles = new ComboBox();
            roles.setWidth("100%");
            roles.setContainerDataSource(getRoles());
            roles.setItemCaptionPropertyId("name");
            roles.setFilteringMode(ComboBox.FILTERINGMODE_CONTAINS);
            roles.setValue(membership != null ? membership.getRole().getUUID() : null);
            woItem.getItemProperty("role").setValue(roles);
        }
        TableLinkButton tlb = new TableLinkButton(
                ProcessbaseApplication.getCurrent().getPbMessages().getString("btnDelete"), "icons/cancel.png",
                uuid, this, Constants.ACTION_DELETE);
        woItem.getItemProperty("actions").setValue(tlb);
    }

    public IndexedContainer getGroups() throws Exception {
        IndexedContainer container = new IndexedContainer();
        container.addContainerProperty("name", String.class, null);
        container.addContainerProperty("label", String.class, null);
        container.addContainerProperty("uuid", String.class, null);
        container.addContainerProperty("path", String.class, null);
        List<Group> groups = ProcessbaseApplication.getCurrent().getBpmModule().getAllGroups();
        for (Group groupX : groups) {
            String path = getGroupPath(groupX);
            if (!path.startsWith("/" + IdentityAPI.DEFAULT_GROUP_NAME)) {
                Item item = container.addItem(groupX.getUUID());
                item.getItemProperty("name").setValue(groupX.getName());
                item.getItemProperty("label").setValue(groupX.getLabel());
                item.getItemProperty("uuid").setValue(groupX.getUUID());
                item.getItemProperty("path").setValue(path);
            }
        }
        container.sort(new Object[] { "name" }, new boolean[] { true });
        return container;
    }

    private String getGroupPath(Group group) {
        StringBuilder result = new StringBuilder(
                IdentityAPI.GROUP_PATH_SEPARATOR + group.getName() + IdentityAPI.GROUP_PATH_SEPARATOR);
        Group parent = group.getParentGroup();
        while (parent != null) {
            result.insert(0, IdentityAPI.GROUP_PATH_SEPARATOR + parent.getName());
            parent = parent.getParentGroup();
        }
        return result.toString();
    }

    public IndexedContainer getRoles() throws Exception {
        IndexedContainer container = new IndexedContainer();
        container.addContainerProperty("name", String.class, null);
        container.addContainerProperty("label", String.class, null);
        container.addContainerProperty("uuid", String.class, null);
        List<Role> roles = ProcessbaseApplication.getCurrent().getBpmModule().getAllRoles();
        for (Role roleX : roles) {
            if (!roleX.getName().equals(IdentityAPI.ADMIN_ROLE_NAME)) {
                Item item = container.addItem(roleX.getUUID());
                item.getItemProperty("name").setValue(roleX.getName());
                item.getItemProperty("label").setValue(roleX.getLabel());
                item.getItemProperty("uuid").setValue(roleX.getUUID());
            }
        }
        container.sort(new Object[] { "name" }, new boolean[] { true });
        return container;
    }

    private void saveProcessAccess() {
        try {
            // remode deleted
            ProcessbaseApplication.getCurrent().getBpmModule().removeRuleFromEntities(rule.getUUID(), null, null,
                    null, deletedMembership, null);
            // apply added
            Set<String> membershipUUIDs = new HashSet<String>();
            for (Object itemId : tableMembership.getItemIds()) {
                Item woItem = tableMembership.getItem(itemId);
                if (woItem.getItemProperty("group").getValue() instanceof ComboBox
                        && woItem.getItemProperty("role").getValue() instanceof ComboBox) {
                    ComboBox groups = (ComboBox) woItem.getItemProperty("group").getValue();
                    ComboBox roles = (ComboBox) woItem.getItemProperty("role").getValue();
                    Membership membership = ProcessbaseApplication.getCurrent().getBpmModule()
                            .getMembershipForRoleAndGroup(roles.getValue().toString(),
                                    groups.getValue().toString());
                    membershipUUIDs.add(membership.getUUID());
                }
            }
            ProcessbaseApplication.getCurrent().getBpmModule().applyRuleToEntities(rule.getUUID(), null, null, null,
                    membershipUUIDs, null);
        } catch (Exception ex) {
            ex.printStackTrace();
            getWindow().showNotification(ex.getMessage(), Notification.TYPE_ERROR_MESSAGE);
        }
    }
}