org.eclipse.gyrex.admin.ui.jobs.internal.externalprocess.ExternalProcessWizardPage.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.gyrex.admin.ui.jobs.internal.externalprocess.ExternalProcessWizardPage.java

Source

/*******************************************************************************
 * Copyright (c) 2013 AGETO Service GmbH and others.
 * All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html.
 *
 * Contributors:
 *     Gunnar Wagenknecht - initial API and implementation
 *******************************************************************************/
package org.eclipse.gyrex.admin.ui.jobs.internal.externalprocess;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.eclipse.gyrex.admin.ui.internal.wizards.dialogfields.DialogField;
import org.eclipse.gyrex.admin.ui.internal.wizards.dialogfields.IDialogFieldListener;
import org.eclipse.gyrex.admin.ui.internal.wizards.dialogfields.IListAdapter;
import org.eclipse.gyrex.admin.ui.internal.wizards.dialogfields.LayoutUtil;
import org.eclipse.gyrex.admin.ui.internal.wizards.dialogfields.ListDialogField;
import org.eclipse.gyrex.admin.ui.internal.wizards.dialogfields.ListDialogField.ColumnsDescription;
import org.eclipse.gyrex.admin.ui.internal.wizards.dialogfields.SelectionButtonDialogField;
import org.eclipse.gyrex.admin.ui.internal.wizards.dialogfields.Separator;
import org.eclipse.gyrex.admin.ui.internal.wizards.dialogfields.StringDialogField;
import org.eclipse.gyrex.admin.ui.jobs.configuration.wizard.JobConfigurationWizardSession;
import org.eclipse.gyrex.jobs.internal.externalprocess.ExternalProcessJobParameter;

import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.rap.rwt.widgets.DialogCallback;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;

public class ExternalProcessWizardPage extends WizardPage {

    private static final long serialVersionUID = 1L;

    final StringDialogField commandField = new StringDialogField();
    final ListDialogField argumentsList = new ListDialogField(new IListAdapter() {

        @Override
        public void customButtonPressed(final ListDialogField field, final int index) {
            switch (index) {
            case 0:
                openAddArgumentDialog();
                break;
            case 1:
                openEditArgumentDialog();
                break;
            default:
                // nothing
                break;
            }
        }

        @Override
        public void doubleClicked(final ListDialogField field) {
            openEditArgumentDialog();
        }

        @Override
        public void selectionChanged(final ListDialogField field) {
            field.enableButton(1, field.getSelectedElements().size() == 1);
        }
    }, new String[] { "New...", "Edit...", "Remove", null, "Up", "Down", }, new LabelProvider());
    {
        argumentsList.setRemoveButtonIndex(2);
        argumentsList.setUpButtonIndex(4);
        argumentsList.setDownButtonIndex(5);
    }

    final StringDialogField workingDirectoryField = new StringDialogField();

    final SelectionButtonDialogField clearEnvironmentCheckBox = new SelectionButtonDialogField(SWT.CHECK);
    final ListDialogField environmentTable = new ListDialogField(new IListAdapter() {

        @Override
        public void customButtonPressed(final ListDialogField field, final int index) {
            switch (index) {
            case 0:
                openAddVariableDialog();
                break;
            case 1:
                openSelectVariableDialog();
                break;
            case 2:
                openEditVariableDialog();
                break;
            default:
                // nothing
                break;
            }
        }

        @Override
        public void doubleClicked(final ListDialogField field) {
            openEditVariableDialog();
        }

        @Override
        public void selectionChanged(final ListDialogField field) {
            field.enableButton(2, field.getSelectedElements().size() == 1);
        }
    }, new String[] { "New...", "Select...", "Edit...", "Remove" }, new ColumnLabelProvider() {
        private static final long serialVersionUID = 1L;

        @Override
        public void update(final ViewerCell cell) {
            final Variable element = (Variable) cell.getElement();
            switch (cell.getColumnIndex()) {
            case 0:
                cell.setText(element.getName());
                break;

            case 1:
                if (StringUtils.equals(element.getValue(), ExternalProcessJobParameter.ENV_VALUE_INHERIT)) {
                    cell.setText(System.getenv(element.getName()) + " (inherited)");
                    cell.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY));
                } else {
                    cell.setText(element.getValue());
                    cell.setForeground(null);
                }
                break;
            default:
                break;
            }
        }
    });
    {
        environmentTable.setRemoveButtonIndex(3);
        environmentTable.setTableColumns(new ColumnsDescription(new String[] { "Variable", "Value" }, true));
    }

    final StringDialogField expectedReturnCodeField = new StringDialogField();

    private final JobConfigurationWizardSession session;

    public ExternalProcessWizardPage(final JobConfigurationWizardSession session) {
        super(ExternalProcessWizardPage.class.getSimpleName());
        this.session = session;
        setTitle("External Process");
        setDescription("Provide details for the external process to launch.");
        setPageComplete(false);
    }

    @Override
    public void createControl(final Composite parent) {
        final Composite composite = new Composite(parent, SWT.NONE);
        composite.setLayout(GridLayoutFactory.fillDefaults().create());
        composite.setLayoutData(GridDataFactory.fillDefaults()
                .minSize(convertVerticalDLUsToPixels(200), convertHorizontalDLUsToPixels(400)).create());
        setControl(composite);

        commandField.setLabelText("Program:");
        argumentsList.setLabelText("Arguments:");

        clearEnvironmentCheckBox.setLabelText("Clear native environment before launching.");
        environmentTable.setLabelText("Environment variable to set:");

        workingDirectoryField.setLabelText("Working Directory:");
        expectedReturnCodeField.setLabelText("Return Code:");

        final IDialogFieldListener validateListener = new IDialogFieldListener() {
            @Override
            public void dialogFieldChanged(final DialogField field) {
                validate();
            }
        };

        commandField.setDialogFieldListener(validateListener);
        argumentsList.setDialogFieldListener(validateListener);
        clearEnvironmentCheckBox.setDialogFieldListener(validateListener);
        environmentTable.setDialogFieldListener(validateListener);
        workingDirectoryField.setDialogFieldListener(validateListener);
        expectedReturnCodeField.setDialogFieldListener(validateListener);

        LayoutUtil
                .doDefaultLayout(composite,
                        new DialogField[] { commandField, argumentsList, new Separator(), clearEnvironmentCheckBox,
                                environmentTable, new Separator(), workingDirectoryField, expectedReturnCodeField },
                        false);
        LayoutUtil.setHorizontalGrabbing(commandField.getTextControl(null));
        LayoutUtil.setHorizontalGrabbing(argumentsList.getListControl(null));
        LayoutUtil.setHorizontalGrabbing(environmentTable.getListControl(null));
        LayoutUtil.setHorizontalGrabbing(workingDirectoryField.getTextControl(null));
        LayoutUtil.setHorizontalGrabbing(expectedReturnCodeField.getTextControl(null));

        // initialize from existing parameter
        readParameterFromSession();
    }

    public String getCommand() {
        return StringUtils.trimToNull(commandField.getText());
    }

    private String getWorkingDir() {
        return workingDirectoryField.getText();
    }

    void openAddArgumentDialog() {
        final AddEditArgumentDialog dialog = new AddEditArgumentDialog(getShell());
        dialog.openNonBlocking(new DialogCallback() {
            private static final long serialVersionUID = 1L;

            @Override
            public void dialogClosed(final int returnCode) {
                if ((returnCode == Window.OK) && StringUtils.isNotBlank(dialog.getValue())) {
                    argumentsList.addElement(new Argument(dialog.getValue()));
                }
            }
        });
    }

    void openAddVariableDialog() {
        final AddEditEnvironmentVariableDialog dialog = new AddEditEnvironmentVariableDialog(getShell());
        dialog.openNonBlocking(new DialogCallback() {
            private static final long serialVersionUID = 1L;

            @Override
            public void dialogClosed(final int returnCode) {
                if ((returnCode == Window.OK) && StringUtils.isNotBlank(dialog.getName())) {
                    environmentTable.addElement(new Variable(dialog.getName(), dialog.getValue()));
                }
            }
        });
    }

    void openEditArgumentDialog() {
        final Argument a = (Argument) argumentsList.getSelectedElements().iterator().next();
        final AddEditArgumentDialog dialog = new AddEditArgumentDialog(getShell(), a.getValue());
        dialog.openNonBlocking(new DialogCallback() {
            private static final long serialVersionUID = 1L;

            @Override
            public void dialogClosed(final int returnCode) {
                if ((returnCode == Window.OK) && StringUtils.isNotBlank(dialog.getValue())) {
                    a.setValue(dialog.getValue());
                    argumentsList.refresh();
                }
            }
        });
    }

    void openEditVariableDialog() {
        final Variable v = (Variable) environmentTable.getSelectedElements().iterator().next();
        final AddEditEnvironmentVariableDialog dialog = new AddEditEnvironmentVariableDialog(getShell(),
                v.getName(), v.getValue());
        dialog.openNonBlocking(new DialogCallback() {
            private static final long serialVersionUID = 1L;

            @Override
            public void dialogClosed(final int returnCode) {
                if ((returnCode == Window.OK) && StringUtils.isNotBlank(dialog.getName())) {
                    v.setName(dialog.getName());
                    v.setValue(dialog.getValue());
                    environmentTable.refresh();
                }
            }
        });
    }

    void openSelectVariableDialog() {
        final SelectEnvironmentVariableDialog dialog = new SelectEnvironmentVariableDialog(getShell());
        dialog.openNonBlocking(new DialogCallback() {
            private static final long serialVersionUID = 1L;

            @Override
            public void dialogClosed(final int returnCode) {
                if (returnCode == Window.OK) {
                    for (final String name : dialog.getVariables()) {
                        environmentTable
                                .addElement(new Variable(name, ExternalProcessJobParameter.ENV_VALUE_INHERIT));
                    }
                    environmentTable.refresh();
                }
            }
        });
    }

    private void readParameterFromSession() {
        final ExternalProcessJobParameter p = ExternalProcessJobParameter.fromParameter(session.getParameter(),
                false);
        if (StringUtils.isNotBlank(p.getCommand())) {
            commandField.setText(StringUtils.trimToEmpty(p.getCommand()));
        }

        if (p.getArguments() != null) {
            argumentsList.removeAllElements();
            for (final String value : p.getArguments()) {
                argumentsList.addElement(new Argument(value));
            }
            argumentsList.selectElements(null);
        }

        if (p.getExpectedReturnCode() != null) {
            expectedReturnCodeField.setText(String.valueOf(p.getExpectedReturnCode().intValue()));
        }

        if (p.getClearEnvironment() != null) {
            clearEnvironmentCheckBox.setSelection(p.getClearEnvironment().booleanValue());
        }

        if (p.getEnvironment() != null) {
            environmentTable.removeAllElements();
            for (final Entry<String, String> e : p.getEnvironment().entrySet()) {
                environmentTable.addElement(new Variable(e.getKey(), e.getValue()));
            }
            environmentTable.selectElements(null);
        }

        if (StringUtils.isNotBlank(p.getWorkingDir())) {
            workingDirectoryField.setText(StringUtils.trimToEmpty(p.getWorkingDir()));
        }
    }

    private void saveParameterToSession() {
        final ExternalProcessJobParameter p = new ExternalProcessJobParameter();

        p.setCommand(StringUtils.trimToNull(getCommand()));
        p.setWorkingDir(StringUtils.trimToNull(getWorkingDir()));
        p.setClearEnvironment(clearEnvironmentCheckBox.isSelected());

        if (StringUtils.isBlank(expectedReturnCodeField.getText())) {
            p.setExpectedReturnCode(null);
        } else {
            p.setExpectedReturnCode(NumberUtils.toInt(expectedReturnCodeField.getText()));
        }

        final List<Object> arguments = argumentsList.getElements();
        if (!arguments.isEmpty()) {
            final List<String> result = new ArrayList<>(arguments.size());
            for (final Object object : arguments) {
                result.add(((Argument) object).getValue());
            }
            p.setArguments(result);
        } else {
            p.setArguments(null);
        }

        final List<Object> variables = environmentTable.getElements();
        if (!variables.isEmpty()) {
            final Map<String, String> result = new LinkedHashMap<>();
            for (final Object variable : variables) {
                final Variable v = (Variable) variable;
                result.put(v.getName(), v.getValue());
            }
            p.setEnvironment(result);
        } else {
            p.setEnvironment(null);
        }

        session.setParameter(p.toParameter());
    }

    void validate() {
        final String command = getCommand();
        if (StringUtils.isBlank(command)) {
            setMessage("Please enter a program to launch.");
            setPageComplete(false);
            return;
        }

        final String returnCode = expectedReturnCodeField.getText();
        if (StringUtils.isNotBlank(returnCode)) {
            try {
                Integer.parseInt(returnCode);
            } catch (final NumberFormatException e) {
                setMessage("The entered return code must be an integer number.", IMessageProvider.ERROR);
                setPageComplete(false);
                return;
            }
        }

        saveParameterToSession();

        setMessage(null);
        setPageComplete(true);
    }
}