org.roda.wui.client.ingest.process.PluginParameterPanel.java Source code

Java tutorial

Introduction

Here is the source code for org.roda.wui.client.ingest.process.PluginParameterPanel.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.ingest.process;

import java.util.Arrays;
import java.util.List;
import java.util.Set;

import org.roda.core.data.common.RodaConstants;
import org.roda.core.data.v2.common.Pair;
import org.roda.core.data.v2.ip.IndexedAIP;
import org.roda.core.data.v2.jobs.PluginInfo;
import org.roda.core.data.v2.jobs.PluginParameter;
import org.roda.core.data.v2.jobs.PluginParameter.PluginParameterType;
import org.roda.core.data.v2.jobs.PluginType;
import org.roda.core.data.v2.risks.IndexedRisk;
import org.roda.core.data.v2.risks.Risk.SEVERITY_LEVEL;
import org.roda.wui.client.browse.BrowserService;
import org.roda.wui.client.common.IncrementalAssociativeList;
import org.roda.wui.client.common.dialogs.SelectAipDialog;
import org.roda.wui.client.common.utils.PluginUtils;
import org.roda.wui.common.client.ClientLogger;
import org.roda.wui.common.client.tools.DescriptionLevelUtils;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
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.SafeHtmlUtils;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Anchor;
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.HTMLPanel;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.IntegerBox;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.TextBox;

import config.i18n.client.ClientMessages;

public class PluginParameterPanel extends Composite {
    private static final ClientMessages messages = GWT.create(ClientMessages.class);
    private ClientLogger logger = new ClientLogger(getClass().getName());

    private final PluginParameter parameter;
    private final FlowPanel layout;

    private String value;

    public PluginParameterPanel(PluginParameter parameter) {
        super();
        this.parameter = parameter;

        layout = new FlowPanel();
        initWidget(layout);

        updateLayout();

        layout.addStyleName("plugin-options-parameter");
    }

    private void updateLayout() {
        if (PluginParameterType.BOOLEAN.equals(parameter.getType())) {
            createBooleanLayout();
        } else if (PluginParameterType.STRING.equals(parameter.getType())) {
            createStringLayout();
        } else if (PluginParameterType.PLUGIN_SIP_TO_AIP.equals(parameter.getType())) {
            createPluginSipToAipLayout();
        } else if (PluginParameterType.AIP_ID.equals(parameter.getType())) {
            createSelectAipLayout();
        } else if (PluginParameterType.RISK_ID.equals(parameter.getType())) {
            createSelectRiskLayout();
        } else if (PluginParameterType.SEVERITY.equals(parameter.getType())) {
            createSelectSeverityLayout();
        } else if (PluginParameterType.RODA_OBJECT.equals(parameter.getType())) {
            createSelectRodaObjectLayout();
        } else if (PluginParameterType.INTEGER.equals(parameter.getType())) {
            createIntegerLayout();
        } else {
            logger.warn("Unsupported plugin parameter type: " + parameter.getType()
                    + ". Reverting to default parameter editor.");
            createStringLayout();
        }
    }

    private void createSelectSeverityLayout() {
        Label parameterName = new Label(parameter.getName());
        final ListBox severityBox = new ListBox();
        severityBox.addStyleName("form-selectbox");
        severityBox.addStyleName("form-textbox-small");

        for (SEVERITY_LEVEL severity : SEVERITY_LEVEL.values()) {
            severityBox.addItem(messages.severityLevel(severity), severity.toString());
        }

        value = severityBox.getSelectedValue();

        severityBox.addChangeHandler(new ChangeHandler() {
            @Override
            public void onChange(ChangeEvent event) {
                value = severityBox.getSelectedValue();
            }
        });

        severityBox.setTitle("severity box");
        layout.add(parameterName);
        layout.add(severityBox);
        addHelp();
    }

    private void createSelectRiskLayout() {
        Label parameterName = new Label(parameter.getName());
        IncrementalAssociativeList list = new IncrementalAssociativeList(IndexedRisk.class, RodaConstants.RISK_ID,
                RodaConstants.RISK_SEARCH, messages.getRisksDialogName());

        list.addChangeHandler(new ChangeHandler() {

            @Override
            public void onChange(ChangeEvent event) {
                IncrementalAssociativeList sourceList = (IncrementalAssociativeList) event.getSource();
                List<String> values = sourceList.getTextBoxesValue();
                if (!values.isEmpty()) {
                    value = getValuesString(values);
                }
            }

            private String getValuesString(List<String> values) {
                StringBuilder builder = new StringBuilder();

                for (String stringValue : values) {
                    builder.append(stringValue).append(",");
                }

                return builder.substring(0, builder.length() - 1);
            }

        });

        layout.add(parameterName);
        layout.add(list);
        addHelp();
    }

    private void createSelectAipLayout() {
        Label parameterName = new Label(parameter.getName());
        final HorizontalPanel editPanel = new HorizontalPanel();
        final FlowPanel aipPanel = new FlowPanel();
        final Button button = new Button(messages.pluginAipIdButton());
        final FlowPanel buttonsPanel = new FlowPanel();
        final Anchor editButton = new Anchor(SafeHtmlUtils.fromSafeConstant("<i class=\"fa fa-edit\"></i>"));
        final Anchor removeButton = new Anchor(SafeHtmlUtils.fromSafeConstant("<i class=\"fa fa-remove\"></i>"));

        buttonsPanel.add(editButton);
        buttonsPanel.add(removeButton);

        ClickHandler editClickHandler = new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {
                SelectAipDialog selectAipDialog = new SelectAipDialog(parameter.getName(), false);
                selectAipDialog.setSingleSelectionMode();
                selectAipDialog.showAndCenter();
                selectAipDialog.addValueChangeHandler(new ValueChangeHandler<IndexedAIP>() {

                    @Override
                    public void onValueChange(ValueChangeEvent<IndexedAIP> event) {
                        IndexedAIP aip = event.getValue();

                        Label itemTitle = new Label();
                        HTMLPanel itemIconHtmlPanel = DescriptionLevelUtils
                                .getElementLevelIconHTMLPanel(aip.getLevel());
                        itemIconHtmlPanel.addStyleName("itemIcon");
                        itemTitle.setText(aip.getTitle() != null ? aip.getTitle() : aip.getId());
                        itemTitle.addStyleName("itemText");

                        aipPanel.clear();
                        aipPanel.add(itemIconHtmlPanel);
                        aipPanel.add(itemTitle);

                        editPanel.add(aipPanel);
                        editPanel.add(buttonsPanel);

                        editPanel.setCellWidth(aipPanel, "100%");

                        editPanel.setVisible(true);
                        button.setVisible(false);

                        value = aip.getId();
                    }
                });
            }
        };

        ClickHandler removeClickHandler = new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {
                editPanel.setVisible(false);
                button.setVisible(true);

                value = null;
            }
        };

        button.addClickHandler(editClickHandler);
        editButton.addClickHandler(editClickHandler);
        removeButton.addClickHandler(removeClickHandler);

        layout.add(parameterName);
        layout.add(button);
        layout.add(editPanel);

        parameterName.addStyleName("form-label");
        aipPanel.addStyleName("itemPanel");
        button.addStyleName("form-button btn btn-play");
        buttonsPanel.addStyleName("itemButtonsPanel");
        editButton.addStyleName("toolbarLink toolbarLinkSmall");
        removeButton.addStyleName("toolbarLink toolbarLinkSmall");
    }

    private void createSelectRodaObjectLayout() {
        Label parameterName = new Label(parameter.getName());
        final ListBox objectBox = new ListBox();
        objectBox.addStyleName("form-selectbox");
        objectBox.addStyleName("form-textbox-small");

        BrowserService.Util.getInstance()
                .retrieveReindexPluginObjectClasses(new AsyncCallback<Set<Pair<String, String>>>() {

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

                    @Override
                    public void onSuccess(Set<Pair<String, String>> result) {
                        for (Pair<String, String> classNames : result) {
                            objectBox.addItem(classNames.getFirst(), classNames.getSecond());
                        }

                        objectBox.addItem(RodaConstants.PLUGIN_SELECT_ALL_RODA_OBJECTS,
                                RodaConstants.PLUGIN_SELECT_ALL_RODA_OBJECTS);
                        objectBox.setSelectedIndex(objectBox.getItemCount() - 1);
                        value = objectBox.getSelectedValue();
                    }
                });

        objectBox.addChangeHandler(new ChangeHandler() {
            @Override
            public void onChange(ChangeEvent event) {
                value = objectBox.getSelectedValue();
            }
        });

        objectBox.setTitle("object box");
        layout.add(parameterName);
        layout.add(objectBox);
        addHelp();
    }

    private void createPluginSipToAipLayout() {

        List<PluginType> plugins = Arrays.asList(PluginType.SIP_TO_AIP);
        BrowserService.Util.getInstance().retrievePluginsInfo(plugins, new AsyncCallback<List<PluginInfo>>() {

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

            @Override
            public void onSuccess(List<PluginInfo> pluginsInfo) {
                Label parameterName = new Label(parameter.getName());

                layout.add(parameterName);
                addHelp();

                FlowPanel radioGroup = new FlowPanel();

                PluginUtils.sortByName(pluginsInfo);

                for (final PluginInfo pluginInfo : pluginsInfo) {
                    if (pluginInfo != null) {
                        RadioButton pRadio = new RadioButton(parameter.getName(),
                                messages.pluginLabelWithVersion(pluginInfo.getName(), pluginInfo.getVersion()));

                        if (pluginInfo.getId().equals(parameter.getDefaultValue())) {
                            pRadio.setValue(true);
                            value = pluginInfo.getId();
                        }

                        Label pHelp = new Label(pluginInfo.getDescription());
                        pRadio.setTitle("radio button");

                        radioGroup.add(pRadio);
                        radioGroup.add(pHelp);

                        pRadio.addStyleName("form-radiobutton");
                        pHelp.addStyleName("form-help");

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

                            @Override
                            public void onValueChange(ValueChangeEvent<Boolean> event) {
                                if (event.getValue()) {
                                    value = pluginInfo.getId();
                                }
                            }
                        });
                    }
                }

                layout.add(radioGroup);

                radioGroup.addStyleName("form-radiogroup");
                parameterName.addStyleName("form-label");
            }
        });
    }

    private void createIntegerLayout() {
        Label parameterName = new Label(parameter.getName());
        IntegerBox parameterBox = new IntegerBox();
        if (parameter.getDefaultValue() != null) {
            parameterBox.setText(parameter.getDefaultValue());
            value = parameter.getDefaultValue();
        }

        parameterBox.setTitle("parameter box");
        layout.add(parameterName);
        layout.add(parameterBox);
        addHelp();

        parameterName.addStyleName("form-label");
        parameterBox.addStyleName("form-textbox");

        // binding change
        parameterBox.addChangeHandler(new ChangeHandler() {

            @Override
            public void onChange(ChangeEvent event) {
                value = ((IntegerBox) event.getSource()).getValue().toString();
            }
        });
    }

    private void createStringLayout() {
        Label parameterName = new Label(parameter.getName());
        TextBox parameterBox = new TextBox();
        if (parameter.getDefaultValue() != null) {
            parameterBox.setText(parameter.getDefaultValue());
            value = parameter.getDefaultValue();
        }

        parameterBox.setTitle("parameter box");
        layout.add(parameterName);
        layout.add(parameterBox);
        addHelp();

        parameterName.addStyleName("form-label");
        parameterBox.addStyleName("form-textbox");

        // binding change
        parameterBox.addValueChangeHandler(new ValueChangeHandler<String>() {

            @Override
            public void onValueChange(ValueChangeEvent<String> event) {
                value = event.getValue();
            }
        });
    }

    private void createBooleanLayout() {
        CheckBox checkBox = new CheckBox(parameter.getName());
        checkBox.setValue("true".equals(parameter.getDefaultValue()));
        value = "true".equals(parameter.getDefaultValue()) ? "true" : "false";
        checkBox.setEnabled(!parameter.isReadonly());
        checkBox.getElement().setTitle("checkbox");

        layout.add(checkBox);
        addHelp();

        checkBox.addStyleName("form-checkbox");

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

            @Override
            public void onValueChange(ValueChangeEvent<Boolean> event) {
                value = event.getValue() ? "true" : "false";
            }
        });
    }

    private void addHelp() {
        String pDescription = parameter.getDescription();
        if (pDescription != null && pDescription.length() > 0) {
            Label pHelp = new Label(pDescription);

            layout.add(pHelp);

            pHelp.addStyleName("form-help");
        }
    }

    public String getValue() {
        return value;
    }

    public PluginParameter getParameter() {
        return parameter;
    }

}