org.roda.wui.client.process.CreateSelectedJob.java Source code

Java tutorial

Introduction

Here is the source code for org.roda.wui.client.process.CreateSelectedJob.java

Source

/**
 * The contents of this file are subject to the license and copyright
 * detailed in the LICENSE file at the root of the source
 * tree and available online at
 *
 * https://github.com/keeps/roda
 */
/**
 * 
 */
package org.roda.wui.client.process;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.roda.core.data.common.RodaConstants;
import org.roda.core.data.v2.index.IsIndexed;
import org.roda.core.data.v2.index.select.SelectedItems;
import org.roda.core.data.v2.index.select.SelectedItemsList;
import org.roda.core.data.v2.index.select.SelectedItemsNone;
import org.roda.core.data.v2.ip.TransferredResource;
import org.roda.core.data.v2.jobs.PluginInfo;
import org.roda.core.data.v2.jobs.PluginType;
import org.roda.wui.client.browse.BrowserService;
import org.roda.wui.client.common.LastSelectedItemsSingleton;
import org.roda.wui.client.common.UserLogin;
import org.roda.wui.client.common.utils.JavascriptUtils;
import org.roda.wui.client.common.utils.PluginUtils;
import org.roda.wui.client.ingest.process.PluginOptionsPanel;
import org.roda.wui.common.client.HistoryResolver;
import org.roda.wui.common.client.tools.HistoryUtils;
import org.roda.wui.common.client.tools.ListUtils;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;

import config.i18n.client.ClientMessages;

/**
 * @author Luis Faria
 * 
 */
public abstract class CreateSelectedJob<T extends IsIndexed> extends Composite {

    public static final HistoryResolver RESOLVER = new HistoryResolver() {

        @Override
        public void resolve(List<String> historyTokens, final AsyncCallback<Widget> callback) {
            if (historyTokens.size() == 1) {
                if (RodaConstants.JOB_PROCESS_INGEST.equals(historyTokens.get(0))) {
                    CreateIngestJob createIngestJob = new CreateIngestJob();
                    callback.onSuccess(createIngestJob);
                } else if (RodaConstants.JOB_PROCESS_ACTION.equals(historyTokens.get(0))) {
                    CreateActionJob createActionJob = new CreateActionJob();
                    callback.onSuccess(createActionJob);
                } else {
                    HistoryUtils.newHistory(CreateSelectedJob.RESOLVER);
                    callback.onSuccess(null);
                }
            } else {
                HistoryUtils.newHistory(CreateSelectedJob.RESOLVER);
                callback.onSuccess(null);
            }
        }

        @Override
        public void isCurrentUserPermitted(AsyncCallback<Boolean> callback) {
            UserLogin.getInstance().checkRoles(new HistoryResolver[] { Process.RESOLVER }, false, callback);
        }

        @Override
        public List<String> getHistoryPath() {
            return ListUtils.concat(Process.RESOLVER.getHistoryPath(), getHistoryToken());
        }

        @Override
        public String getHistoryToken() {
            return "create";
        }
    };

    @SuppressWarnings("rawtypes")
    public interface MyUiBinder extends UiBinder<Widget, CreateSelectedJob> {
    }

    private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);
    private static final ClientMessages messages = GWT.create(ClientMessages.class);

    private SelectedItems<?> selected = new SelectedItemsNone<>();
    private List<PluginInfo> plugins = null;
    private PluginInfo selectedPlugin = null;
    private String listSelectedClass = TransferredResource.class.getName();

    @UiField
    TextBox name;

    @UiField
    FlowPanel targetPanel;

    @UiField
    Label selectedObject;

    @UiField
    Label workflowCategoryLabel;

    @UiField
    FlowPanel workflowCategoryList;

    @UiField
    FlowPanel workflowList;

    @UiField
    FlowPanel workflowListDescription;

    @UiField
    Label workflowListTitle;

    @UiField
    HTML workflowListDescriptionCategories;

    @UiField
    FlowPanel workflowPanel;

    @UiField
    PluginOptionsPanel workflowOptions;

    @UiField
    Button buttonCreate;

    @UiField
    Button buttonObtainCommand;

    @UiField
    Button buttonCancel;

    public CreateSelectedJob(final List<PluginType> pluginType) {
        this.selected = LastSelectedItemsSingleton.getInstance().getSelectedItems();

        initWidget(uiBinder.createAndBindUi(this));

        boolean isEmpty = updateObjectList();
        if (isEmpty) {
            List<String> lastHistory = LastSelectedItemsSingleton.getInstance().getLastHistory();
            HistoryUtils.newHistory(lastHistory);
        }

        BrowserService.Util.getInstance().retrievePluginsInfo(pluginType, new AsyncCallback<List<PluginInfo>>() {

            @Override
            public void onFailure(Throwable caught) {
                // do nothing
            }

            @Override
            public void onSuccess(List<PluginInfo> pluginsInfo) {
                init(pluginsInfo);
            }
        });
    }

    @Override
    protected void onLoad() {
        super.onLoad();
        JavascriptUtils.stickSidebar();
    }

    public void init(List<PluginInfo> plugins) {
        this.plugins = plugins;
        name.setText(messages.processNewDefaultName(new Date()));
        workflowOptions.setPlugins(plugins);
        configurePlugins(selected.getSelectedClass());
        workflowCategoryList.addStyleName("form-listbox-job");
    }

    public abstract boolean updateObjectList();

    public void configurePlugins(final String selectedClass) {
        List<String> categoriesOnListBox = new ArrayList<>();

        if (plugins != null) {
            PluginUtils.sortByName(plugins);

            int pluginAdded = 0;
            for (PluginInfo pluginInfo : plugins) {

                if (pluginInfo != null) {
                    List<String> pluginCategories = pluginInfo.getCategories();

                    if (pluginCategories != null) {
                        for (String category : pluginCategories) {
                            if (!categoriesOnListBox.contains(category)
                                    && !category.equals(RodaConstants.PLUGIN_CATEGORY_NOT_LISTABLE)
                                    && ((!isSelectedEmpty() && pluginInfo.hasObjectClass(selectedClass))
                                            || (isSelectedEmpty()
                                                    && pluginInfo.hasObjectClass(listSelectedClass)))) {

                                CheckBox box = new CheckBox();
                                box.setText(messages.showPluginCategories(category));
                                box.setName(category);
                                box.addStyleName("form-checkbox-job");

                                box.addValueChangeHandler(new ValueChangeHandler<Boolean>() {

                                    @Override
                                    public void onValueChange(ValueChangeEvent<Boolean> event) {
                                        workflowList.clear();
                                        boolean noChecks = true;

                                        if (plugins != null) {
                                            PluginUtils.sortByName(plugins);
                                            List<String> pluginsAdded = new ArrayList<>();

                                            for (PluginInfo pluginInfo : plugins) {
                                                if (pluginInfo != null) {
                                                    List<String> categories = pluginInfo.getCategories();

                                                    if (categories != null) {
                                                        for (int i = 0; i < workflowCategoryList
                                                                .getWidgetCount(); i++) {
                                                            CheckBox checkbox = (CheckBox) workflowCategoryList
                                                                    .getWidget(i);

                                                            if (checkbox.getValue()) {
                                                                noChecks = false;

                                                                if (categories.contains(checkbox.getName())
                                                                        && !categories.contains(
                                                                                RodaConstants.PLUGIN_CATEGORY_NOT_LISTABLE)
                                                                        && ((!isSelectedEmpty() && pluginInfo
                                                                                .hasObjectClass(selectedClass))
                                                                                || (isSelectedEmpty() && pluginInfo
                                                                                        .hasObjectClass(
                                                                                                listSelectedClass)))
                                                                        && !pluginsAdded
                                                                                .contains(pluginInfo.getId())) {
                                                                    Widget pluginItem = addPluginItemWidgetToWorkflowList(
                                                                            pluginInfo);

                                                                    if (pluginsAdded.isEmpty()) {
                                                                        CreateSelectedJob.this.selectedPlugin = lookupPlugin(
                                                                                pluginInfo.getId());
                                                                        pluginItem.addStyleName(
                                                                                "plugin-list-item-selected");
                                                                    }

                                                                    pluginsAdded.add(pluginInfo.getId());
                                                                }

                                                            }
                                                        }

                                                        if (noChecks) {
                                                            if (!pluginInfo.getCategories().contains(
                                                                    RodaConstants.PLUGIN_CATEGORY_NOT_LISTABLE)
                                                                    && ((!isSelectedEmpty() && pluginInfo
                                                                            .hasObjectClass(selectedClass))
                                                                            || (isSelectedEmpty()
                                                                                    && pluginInfo.hasObjectClass(
                                                                                            listSelectedClass)))) {
                                                                Widget pluginItem = addPluginItemWidgetToWorkflowList(
                                                                        pluginInfo);
                                                                if (pluginsAdded.isEmpty()) {
                                                                    CreateSelectedJob.this.selectedPlugin = lookupPlugin(
                                                                            pluginInfo.getId());
                                                                    pluginItem.addStyleName(
                                                                            "plugin-list-item-selected");
                                                                }

                                                                pluginsAdded.add(pluginInfo.getId());
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }

                                        updateWorkflowOptions();
                                    }

                                });

                                workflowCategoryList.add(box);
                                categoriesOnListBox.add(category);
                            }
                        }

                        if (!pluginCategories.contains(RodaConstants.PLUGIN_CATEGORY_NOT_LISTABLE)
                                && ((!isSelectedEmpty() && pluginInfo.hasObjectClass(selectedClass))
                                        || (isSelectedEmpty() && pluginInfo.hasObjectClass(listSelectedClass)))) {
                            Widget pluginItem = addPluginItemWidgetToWorkflowList(pluginInfo);
                            if (pluginAdded == 0) {
                                CreateSelectedJob.this.selectedPlugin = lookupPlugin(pluginInfo.getId());
                                pluginItem.addStyleName("plugin-list-item-selected");
                                pluginAdded++;
                            }
                        }
                    }

                }
            }

            updateWorkflowOptions();
        }
    }

    private Widget addPluginItemWidgetToWorkflowList(PluginInfo pluginInfo) {
        FlowPanel panel = new FlowPanel();
        panel.addStyleName("plugin-list-item");
        panel.getElement().setAttribute("data-id", pluginInfo.getId());

        panel.addDomHandler(new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {
                FlowPanel panel = (FlowPanel) event.getSource();
                String selectedPluginId = panel.getElement().getAttribute("data-id");

                for (int i = 0; i < workflowList.getWidgetCount(); i++) {
                    Widget panelWidget = workflowList.getWidget(i);
                    panelWidget.removeStyleName("plugin-list-item-selected");
                }

                if (selectedPluginId != null) {
                    CreateSelectedJob.this.selectedPlugin = lookupPlugin(selectedPluginId);
                    panel.addStyleName("plugin-list-item-selected");
                }

                updateWorkflowOptions();
            }

        }, ClickEvent.getType());

        FlowPanel itemImage = new FlowPanel();
        itemImage.addStyleName("fa");
        itemImage.addStyleName("plugin-list-item-icon");
        if (pluginInfo.getCategories().isEmpty()) {
            itemImage.addStyleName("plugin-list-item-icon-default");
        } else {
            itemImage.addStyleName("plugin-list-item-icon-" + pluginInfo.getCategories().get(0));
            itemImage.setTitle(pluginInfo.getCategories().get(0));
        }

        Label label = new Label();
        String labelContent = messages.pluginLabelWithVersion(pluginInfo.getName(), pluginInfo.getVersion());
        label.setText(labelContent);
        label.setTitle(labelContent);
        label.addStyleName("plugin-list-item-label");

        panel.add(itemImage);
        panel.add(label);

        workflowList.add(panel);
        return panel;
    }

    protected void updateWorkflowOptions() {
        if (selectedPlugin == null) {
            workflowListDescription.clear();
            workflowListDescriptionCategories.setText("");
            workflowListDescription.setVisible(false);
            workflowListDescriptionCategories.setVisible(false);
            workflowOptions.setPluginInfo(null);
        } else {
            String pluginName = messages.pluginLabelWithVersion(selectedPlugin.getName(),
                    selectedPlugin.getVersion());
            name.setText(pluginName);
            workflowListTitle.setText(pluginName);

            String description = selectedPlugin.getDescription();
            if (description != null && description.length() > 0) {
                String[] split = description.split("\\r?\\n");
                workflowListDescription.clear();

                for (String s : split) {
                    Label descriptionLine = new Label(s);
                    descriptionLine.addStyleName("p");
                    descriptionLine.addStyleName("plugin-description");
                    workflowListDescription.add(descriptionLine);
                }

                List<String> categoryTranslations = new ArrayList<>();
                for (String category : selectedPlugin.getCategories()) {
                    categoryTranslations.add(messages.showPluginCategories(category));
                }

                SafeHtml categories = messages.createJobCategoryWorkflow(categoryTranslations);

                workflowListDescriptionCategories.setHTML(categories);
                workflowListDescription.setVisible(true);
                workflowListDescriptionCategories.setVisible(true);
            } else {
                workflowListDescription.setVisible(false);
                workflowListDescriptionCategories.setVisible(false);
            }

            if (selectedPlugin.getParameters().isEmpty()) {
                workflowPanel.setVisible(false);
                workflowOptions.setPluginInfo(null);
            } else {
                workflowPanel.setVisible(true);
                workflowOptions.setPluginInfo(selectedPlugin);
            }

        }
    }

    private PluginInfo lookupPlugin(String selectedPluginId) {
        PluginInfo p = null;
        if (plugins != null && selectedPluginId != null) {
            for (PluginInfo pluginInfo : plugins) {
                if (pluginInfo != null && pluginInfo.getId().equals(selectedPluginId)) {
                    p = pluginInfo;
                    break;
                }
            }
        }
        return p;
    }

    @UiHandler("buttonCreate")
    public abstract void buttonCreateHandler(ClickEvent e);

    @UiHandler("buttonObtainCommand")
    public abstract void buttonObtainCommandHandler(ClickEvent e);

    @UiHandler("buttonCancel")
    void buttonCancelHandler(ClickEvent e) {
        cancel();
    }

    public abstract void cancel();

    public SelectedItems<?> getSelected() {
        return selected;
    }

    public void setSelected(SelectedItems<?> selected) {
        this.selected = selected;
    }

    public PluginInfo getSelectedPlugin() {
        return selectedPlugin;
    }

    public void setSelectedPlugin(PluginInfo selectedPlugin) {
        this.selectedPlugin = selectedPlugin;
    }

    public FlowPanel getTargetPanel() {
        return this.targetPanel;
    }

    public Button getButtonCreate() {
        return this.buttonCreate;
    }

    public TextBox getName() {
        return this.name;
    }

    public FlowPanel getWorkflowList() {
        return workflowList;
    }

    public PluginOptionsPanel getWorkflowOptions() {
        return this.workflowOptions;
    }

    public void setJobSelectedDescription(String text) {
        selectedObject.setText(text);
    }

    public void setCategoryListBoxVisible(boolean visible) {
        workflowCategoryLabel.setVisible(visible);
        workflowCategoryList.setVisible(visible);
    }

    public String getSelectedClass() {
        return listSelectedClass;
    }

    public void setSelectedClass(String selectedClass) {
        this.listSelectedClass = selectedClass;
    }

    public FlowPanel getCategoryList() {
        return workflowCategoryList;
    }

    public boolean isSelectedEmpty() {
        if (selected instanceof SelectedItemsList) {
            return ((SelectedItemsList<?>) selected).getIds().isEmpty();
        }
        return false;
    }

}