ru.codeinside.gses.manager.processdefeniton.ProcessDefenitionQuery.java Source code

Java tutorial

Introduction

Here is the source code for ru.codeinside.gses.manager.processdefeniton.ProcessDefenitionQuery.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.manager.processdefeniton;

import java.io.InputStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.ProcessDefinition;

import ru.codeinside.adm.database.DefinitionStatus;
import ru.codeinside.adm.database.Employee;
import ru.codeinside.adm.database.ProcedureProcessDefinition;
import ru.codeinside.adm.ui.LazyLoadingContainer2;
import ru.codeinside.gses.manager.ManagerService;
import ru.codeinside.gses.service.Functions;
import ru.codeinside.gses.service.PF;
import ru.codeinside.gses.webui.Flash;
import ru.codeinside.gses.webui.actions.deployment.DeploymentStartListener;
import ru.codeinside.gses.webui.actions.deployment.DeploymentSucceededListener;
import ru.codeinside.gses.webui.actions.deployment.DeploymentUploadReceiver;
import ru.codeinside.gses.webui.components.ContentWindowChanger;
import ru.codeinside.gses.webui.components.DeploymentAddUi;
import ru.codeinside.gses.webui.components.ProcessDefinitionShowUi;
import ru.codeinside.gses.webui.containers.LazyLoadingContainer;
import ru.codeinside.gses.webui.containers.LazyLoadingQuery;
import ru.codeinside.gses.webui.utils.Components;

import com.google.common.base.Function;
import com.vaadin.Application;
import com.vaadin.data.Item;
import com.vaadin.data.util.ObjectProperty;
import com.vaadin.data.util.PropertysetItem;
import com.vaadin.terminal.DownloadStream;
import com.vaadin.terminal.StreamResource;
import com.vaadin.terminal.StreamResource.StreamSource;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.Component;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.Window;

public class ProcessDefenitionQuery implements LazyLoadingQuery {

    private static final long serialVersionUID = 1L;

    final SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy HH:mm");
    DecimalFormat df = new DecimalFormat("##.00");

    String[] sortProps = {};
    boolean[] sortAsc = {};

    private final String procedureId;
    private final LazyLoadingContainer2 proceduresContainer;

    public ProcessDefenitionQuery(String procedureId, LazyLoadingContainer2 proceduresContainer) {
        this.procedureId = procedureId;
        this.proceduresContainer = proceduresContainer;
    }

    @Override
    public int size() {
        return ManagerService.get().getProcessDefenitionCountByProcedureId(procedureId);
    }

    @Override
    public List<Item> loadItems(int start, int count) {
        ArrayList<Item> items = new ArrayList<Item>();
        for (ProcedureProcessDefinition procedure : ManagerService.get()
                .getProcessDefenitionsByProcedureId(procedureId, start, count, sortProps, sortAsc)) {
            items.add(createItem(procedure));
        }
        return items;
    }

    @Override
    public Item loadSingleResult(String id) {
        final ProcedureProcessDefinition procedure = ManagerService.get().getProcessDefenition(id);
        return createItem(procedure);
    }

    PropertysetItem createItem(final ProcedureProcessDefinition p) {
        PropertysetItem item = new PropertysetItem();

        ClickListener listener = new ClickListener() {

            private static final long serialVersionUID = -8900212370037948964L;

            @Override
            public void buttonClick(ClickEvent event) {
                Window mainWin = event.getButton().getApplication().getMainWindow();

                ProcessDefinition processDefinition = Functions.withRepository(Flash.login(),
                        new Function<RepositoryService, ProcessDefinition>() {
                            public ProcessDefinition apply(RepositoryService srv) {
                                return srv.createProcessDefinitionQuery()
                                        .processDefinitionId(p.getProcessDefinitionId()).singleResult();
                            }
                        });

                String caption = "?? " + df.format(p.getVersion());
                Window win = Components.createWindow(mainWin, caption);
                win.center();
                ContentWindowChanger changer = new ContentWindowChanger(win);
                ProcessDefinitionShowUi putComponent = new ProcessDefinitionShowUi(processDefinition, changer);
                changer.set(putComponent, caption);
            }

        };
        ObjectProperty<Component> versionProperty = Components.buttonProperty(df.format(p.getVersion()), listener);
        item.addItemProperty("version", versionProperty);

        HorizontalLayout ll = new HorizontalLayout();
        ll.setSpacing(true);
        DefinitionStatus status = p.getStatus();
        final Label label = new Label(status.getLabelName());
        label.setWidth("100px");
        ll.addComponent(label);

        final ComboBox comboBox = new ComboBox();
        comboBox.setWidth("100px");
        comboBox.setNullSelectionAllowed(false);
        for (DefinitionStatus s : status.getAvailableStatus()) {
            comboBox.addItem(s.getLabelName());
            comboBox.setValue(s.getLabelName());
        }
        if (!status.equals(DefinitionStatus.PathToArchive) && !status.getAvailableStatus().isEmpty()) {
            ll.addComponent(comboBox);
            Button c = new Button("ok");
            c.addListener(new ClickListener() {

                private static final long serialVersionUID = 2966059295049064338L;

                @Override
                public void buttonClick(ClickEvent event) {
                    Object value = comboBox.getValue();
                    final String newValue = value.toString();
                    final DefinitionStatus newStatus = DefinitionStatus.getStatusByLabelName(newValue);

                    if (DefinitionStatus.Work.equals(newStatus)) {
                        final List<ProcedureProcessDefinition> works = ManagerService.get()
                                .getProcessDefenitionWithStatus(p, DefinitionStatus.Work);
                        if (!works.isEmpty()) {
                            final Window thisWindow = event.getButton().getWindow();
                            comfirmAction(thisWindow, p, label, newValue, newStatus, works);
                            return;

                        }
                    }

                    ManagerService.get().updateProcessDefinationStatus(p.getProcessDefinitionId(), newStatus);

                    label.setValue(null);
                    label.setCaption(newValue);
                    paramLazyLoadingContainer.fireItemSetChange();
                    proceduresContainer.fireItemSetChange();
                }

                private void comfirmAction(final Window thisWindow, final ProcedureProcessDefinition p,
                        final Label label, final String newValue, final DefinitionStatus newStatus,
                        final List<ProcedureProcessDefinition> works) {

                    final Window window = new Window();
                    window.setModal(true);
                    window.setContent(new HorizontalLayout());
                    window.setCaption(" ? " + df.format(works.get(0).getVersion())
                            + "       ?   ??  ");
                    Button save = new Button("");
                    save.addListener(new ClickListener() {

                        private static final long serialVersionUID = 3229924940535642819L;

                        @Override
                        public void buttonClick(ClickEvent event) {
                            ManagerService.get().updateProcessDefinationStatus(p.getProcessDefinitionId(),
                                    newStatus);
                            label.setValue(null);
                            label.setCaption(newValue);
                            paramLazyLoadingContainer.fireItemSetChange();
                            proceduresContainer.fireItemSetChange();
                            closeWindow(thisWindow, window);
                        }

                    });

                    window.addComponent(save);
                    Button c2 = new Button("?");
                    c2.addListener(new ClickListener() {

                        private static final long serialVersionUID = 4502614143261892063L;

                        @Override
                        public void buttonClick(ClickEvent event) {
                            closeWindow(thisWindow, window);
                        }
                    });
                    window.addComponent(c2);
                    thisWindow.addWindow(window);
                }
            });
            ll.addComponent(c);
        }
        item.addItemProperty("status", new ObjectProperty<Component>(ll));
        item.addItemProperty("date", Components.stringProperty(formatter.format(p.getDateCreated())));
        Employee creator = p.getCreator();
        item.addItemProperty("user", Components.stringProperty(creator == null ? null : creator.getLogin()));

        Button b = new Button("");

        b.addListener(new ClickListener() {

            private static final long serialVersionUID = 1362078893385574138L;

            @Override
            public void buttonClick(ClickEvent event) {
                StreamSource streamSource = new StreamSource() {

                    private static final long serialVersionUID = 456334952891567271L;

                    public InputStream getStream() {
                        return Functions.withEngine(new PF<InputStream>() {
                            private static final long serialVersionUID = 1L;

                            public InputStream apply(ProcessEngine s) {
                                return s.getRepositoryService().getProcessModel(p.getProcessDefinitionId());
                            }
                        });
                    }
                };
                final Application application = event.getButton().getApplication();
                StreamResource resource = new StreamResource(streamSource, "test" + ".xml", application) {
                    private static final long serialVersionUID = -3869546661105572851L;

                    public DownloadStream getStream() {
                        final StreamSource ss = getStreamSource();
                        if (ss == null) {
                            return null;
                        }
                        final DownloadStream ds = new DownloadStream(ss.getStream(), getMIMEType(), getFilename());
                        ds.setBufferSize(getBufferSize());
                        ds.setCacheTime(getCacheTime());
                        ds.setParameter("Content-Disposition", "attachment; filename=" + getFilename());
                        return ds;
                    }
                };
                Window window = event.getButton().getWindow();
                window.open(resource);
            }
        });
        item.addItemProperty("getRoute", new ObjectProperty<Component>(b));

        ObjectProperty<Component> buttonProperty = null;

        if (status.equals(DefinitionStatus.Debugging)) {
            DeploymentUploadReceiver receiver = new DeploymentUploadReceiver();

            DeploymentSucceededListener succeededListener = new DeploymentSucceededListener(receiver, procedureId,
                    p.getProcessDefinitionId());
            succeededListener.addLoadingContainer(paramLazyLoadingContainer);
            succeededListener.addLoadingContainer(proceduresContainer);
            DeploymentAddUi addUi = new DeploymentAddUi(new DeploymentStartListener(), receiver, succeededListener);

            addUi.setSizeFull();
            buttonProperty = new ObjectProperty<Component>(addUi);
        } else {
            ClickListener l = new ClickListener() {

                private static final long serialVersionUID = 1362078893385574138L;

                @Override
                public void buttonClick(ClickEvent event) {

                }
            };
            buttonProperty = Components.buttonProperty("", l);
        }

        item.addItemProperty("download", buttonProperty);
        return item;
    }

    private static void closeWindow(final Window thisWindow, final Window window) {
        thisWindow.removeWindow(window);
        if (thisWindow.getParent() != null) {
            thisWindow.getParent().removeWindow(window);
        }
    }

    private LazyLoadingContainer2 paramLazyLoadingContainer;

    @Override
    public void setLazyLoadingContainer(LazyLoadingContainer paramLazyLoadingContainer) {
        this.paramLazyLoadingContainer = (LazyLoadingContainer2) paramLazyLoadingContainer;
    }

    @Override
    public void setSorting(Object[] propertyIds, boolean[] ascending) {
        String[] props = new String[propertyIds.length];
        for (int i = 0; i < propertyIds.length; i++) {
            props[i] = propertyIds[i].toString();
        }
        sortProps = props;
        sortAsc = ascending;
    }

}