edu.illinois.ncsa.datawolf.executor.commandline.wizard.CommandLineWizardPage.java Source code

Java tutorial

Introduction

Here is the source code for edu.illinois.ncsa.datawolf.executor.commandline.wizard.CommandLineWizardPage.java

Source

/*******************************************************************************
 * University of Illinois/NCSA 
 * Open Source License
 * 
 * Copyright (c) 2006, 2008 NCSA/UIUC.  All rights reserved.
 * 
 *  Developed by:
 *   Image Spatial Data Analysis Group (ISDA Group)
 *   http://isda.ncsa.uiuc.edu/
 *
 *   Cyber-Environments and Technologies
 *   http://cet.ncsa.uiuc.edu/
 *
 *   National Center for Supercomputing Applications (NCSA)
 *   http://www.ncsa.uiuc.edu/
 *
 * Permission is hereby granted, free of charge, to any person obtaining
 * a copy of this software and associated documentation files (the 
 * "Software"), to deal with the Software without restriction, including 
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sublicense, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to
 * the following conditions:
 * 
 * - Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimers.
 * - Redistributions in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimers in the
 *   documentation and/or other materials provided with the distribution.
 * - Neither the names of University of Illinois, NCSA, nor the names
 *   of its contributors may be used to endorse or promote products
 *   derived from this Software without specific prior written permission.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 * IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR
 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF 
 * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE SOFTWARE.
 *******************************************************************************/
package edu.illinois.ncsa.datawolf.executor.commandline.wizard;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.ListViewer;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import edu.illinois.ncsa.datawolf.domain.WorkflowTool;
import edu.illinois.ncsa.datawolf.domain.WorkflowToolData;
import edu.illinois.ncsa.datawolf.domain.WorkflowToolParameter;
import edu.illinois.ncsa.datawolf.executor.commandline.CommandLineImplementation;
import edu.illinois.ncsa.datawolf.executor.commandline.CommandLineOption;
import edu.illinois.ncsa.springdata.SpringData;
import edu.illinois.ncsa.springdata.Transaction;

public class CommandLineWizardPage extends WizardPage {
    private static Logger logger = LoggerFactory.getLogger(CommandLineWizardPage.class);

    private final List<CommandLineOption> options;
    private final Map<CommandLineOption, WorkflowToolParameter> parameters;
    private final Map<CommandLineOption, WorkflowToolData> data;
    private Button del;
    private Button up;
    private Button down;
    private Text exec;
    private Button stdoutCheck;
    private Text stdout;
    private Button joinStdoutStderrCheck;
    private Button stderrCheck;
    private Text stderr;
    private Text commandline;
    private ListViewer viewer;
    private final WorkflowTool oldtool;
    private Button addData;
    private Button edit;

    private Button addValue;

    private Button addParam;

    protected CommandLineWizardPage(String pageName, WorkflowTool oldtool) {
        super(pageName);
        setTitle(pageName);
        setPageComplete(true);
        setMessage("External tool command line with options.");

        options = new ArrayList<CommandLineOption>();
        parameters = new HashMap<CommandLineOption, WorkflowToolParameter>();
        data = new HashMap<CommandLineOption, WorkflowToolData>();
        this.oldtool = oldtool;
    }

    public void createControl(Composite parent) {
        final Composite top = new Composite(parent, SWT.NONE);
        top.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true));
        top.setLayout(new GridLayout(3, false));

        Label lbl = new Label(top, SWT.NONE);
        lbl.setLayoutData(new GridData(GridData.BEGINNING, GridData.BEGINNING, false, false));
        lbl.setText("Executable:");

        exec = new Text(top, SWT.SINGLE | SWT.BORDER);
        exec.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false));
        exec.addKeyListener(new KeyAdapter() {
            @Override
            public void keyReleased(KeyEvent e) {
                validate();
            }
        });

        Button btn = new Button(top, SWT.NONE);
        btn.setText("...");
        btn.setLayoutData(new GridData(GridData.FILL, GridData.FILL, false, false));
        btn.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                FileDialog fd = new FileDialog(getShell(), SWT.OPEN);
                fd.setFileName(exec.getText());
                String filename = fd.open();
                if (filename != null) {
                    exec.setText(filename);
                    validate();
                }
            }
        });

        stdoutCheck = new Button(top, SWT.CHECK);
        stdoutCheck.setText("Capture stdout?");
        stdoutCheck.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                validate();
            }
        });

        stdout = new Text(top, SWT.SINGLE | SWT.BORDER);
        stdout.setText("stdout");
        stdout.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false, 1, 1));
        stdout.setEnabled(stdoutCheck.getSelection());
        stdout.addKeyListener(new KeyAdapter() {
            @Override
            public void keyReleased(KeyEvent e) {
                validate();
            }
        });

        joinStdoutStderrCheck = new Button(top, SWT.CHECK);
        joinStdoutStderrCheck.setText("also stderr?");
        joinStdoutStderrCheck.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                validate();
            }
        });

        stderrCheck = new Button(top, SWT.CHECK);
        stderrCheck.setText("Capture stderr?");
        stderrCheck.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                validate();
            }
        });

        stderr = new Text(top, SWT.SINGLE | SWT.BORDER);
        stderr.setText("stderr");
        stderr.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false, 2, 1));
        stderr.setEnabled(stdoutCheck.getSelection());
        stderr.addKeyListener(new KeyAdapter() {
            @Override
            public void keyReleased(KeyEvent e) {
                validate();
            }
        });

        lbl = new Label(top, SWT.NONE);
        lbl.setLayoutData(new GridData(GridData.BEGINNING, GridData.BEGINNING, false, false));
        lbl.setText("Options:");

        viewer = new ListViewer(top, SWT.SINGLE | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL | SWT.FULL_SELECTION);
        viewer.setUseHashlookup(true);
        viewer.getList().setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true));
        viewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                validate();
            }
        });

        viewer.addDoubleClickListener(new IDoubleClickListener() {
            public void doubleClick(DoubleClickEvent event) {
                CommandLineOption option = (CommandLineOption) ((IStructuredSelection) viewer.getSelection())
                        .getFirstElement();
                switch (option.getType()) {
                case VALUE:
                    if (new CommandLineValueDialog(top.getShell(), option).open() == Dialog.OK) {
                        viewer.refresh();
                        validate();
                    }
                    break;
                case PARAMETER:
                    if (new CommandLineParameterDialog(top.getShell(), option, parameters.get(option))
                            .open() == Dialog.OK) {
                        viewer.refresh();
                        validate();
                    }
                    break;
                case DATA:
                    if (new CommandLineDataDialog(top.getShell(), option, data.get(option)).open() == Dialog.OK) {
                        viewer.refresh();
                        validate();
                    }
                    break;
                }
            }
        });

        // content
        viewer.setContentProvider(new IStructuredContentProvider() {
            public Object[] getElements(Object inputElement) {
                return options.toArray();
            }

            public void dispose() {
            }

            public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
            }
        });
        viewer.setLabelProvider(new LabelProvider() {
            @Override
            public String getText(Object element) {
                if (element instanceof CommandLineOption) {
                    return getOptionString((CommandLineOption) element);
                }
                return element.toString();
            }
        });

        Composite buttons = new Composite(top, SWT.NULL);
        buttons.setLayout(new GridLayout());

        addValue = new Button(buttons, SWT.PUSH);
        addValue.setLayoutData(new GridData(GridData.FILL, GridData.FILL, false, false));
        addValue.setText("Add Value");
        addValue.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                CommandLineOption option = new CommandLineOption();
                CommandLineValueDialog dlg = new CommandLineValueDialog(top.getShell(), option);
                if (dlg.open() == Dialog.OK) {
                    options.add(option);
                    viewer.refresh();
                    validate();
                }
            }
        });

        addParam = new Button(buttons, SWT.PUSH);
        addParam.setLayoutData(new GridData(GridData.FILL, GridData.FILL, false, false));
        addParam.setText("Add Parameter");
        addParam.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                CommandLineOption option = new CommandLineOption();
                WorkflowToolParameter param = new WorkflowToolParameter();
                CommandLineParameterDialog dlg = new CommandLineParameterDialog(top.getShell(), option, param);
                if (dlg.open() == Dialog.OK) {
                    options.add(option);
                    parameters.put(option, param);
                    viewer.refresh();
                    validate();
                }
            }
        });

        addData = new Button(buttons, SWT.PUSH);
        addData.setLayoutData(new GridData(GridData.FILL, GridData.FILL, false, false));
        addData.setText("Add Data");
        addData.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                CommandLineOption option = new CommandLineOption();
                WorkflowToolData data = new WorkflowToolData();
                CommandLineDataDialog dlg = new CommandLineDataDialog(top.getShell(), option, data);
                if (dlg.open() == Dialog.OK) {
                    options.add(option);
                    CommandLineWizardPage.this.data.put(option, data);
                    viewer.refresh();
                    validate();
                }
            }
        });

        edit = new Button(buttons, SWT.PUSH);
        edit.setLayoutData(new GridData(GridData.FILL, GridData.FILL, false, false));
        edit.setText("Edit");
        edit.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                CommandLineOption option = (CommandLineOption) ((IStructuredSelection) viewer.getSelection())
                        .getFirstElement();
                switch (option.getType()) {
                case VALUE:
                    if (new CommandLineValueDialog(top.getShell(), option).open() == Dialog.OK) {
                        viewer.refresh();
                        validate();
                    }
                    break;
                case PARAMETER:
                    if (new CommandLineParameterDialog(top.getShell(), option, parameters.get(option))
                            .open() == Dialog.OK) {
                        viewer.refresh();
                        validate();
                    }
                    break;
                case DATA:
                    if (new CommandLineDataDialog(top.getShell(), option, data.get(option)).open() == Dialog.OK) {
                        viewer.refresh();
                        validate();
                    }
                    break;
                }
            }
        });

        del = new Button(buttons, SWT.PUSH);
        del.setLayoutData(new GridData(GridData.FILL, GridData.FILL, false, false));
        del.setText("Delete");
        del.setEnabled(false);
        del.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                Object obj = ((IStructuredSelection) viewer.getSelection()).getFirstElement();
                options.remove(obj);
                viewer.remove(obj);
                validate();
            }
        });

        up = new Button(buttons, SWT.PUSH);
        up.setLayoutData(new GridData(GridData.FILL, GridData.FILL, false, false));
        up.setText("Up");
        up.setEnabled(false);
        up.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                int idx = viewer.getList().getSelectionIndex();
                CommandLineOption o = options.get(idx);
                options.set(idx, options.get(idx - 1));
                options.set(idx - 1, o);
                viewer.refresh();
                validate();
            }
        });

        down = new Button(buttons, SWT.PUSH);
        down.setLayoutData(new GridData(GridData.FILL, GridData.FILL, false, false));
        down.setText("Down");
        down.setEnabled(false);
        down.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                int idx = viewer.getList().getSelectionIndex();
                CommandLineOption o = options.get(idx);
                options.set(idx, options.get(idx + 1));
                options.set(idx + 1, o);
                viewer.refresh();
                validate();
            }
        });

        commandline = new Text(top, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL | SWT.WRAP);
        commandline.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true, 3, 1));
        commandline.setEditable(false);

        // set values from old tool
        if (oldtool != null) {
            Transaction transaction = null;
            try {
                transaction = SpringData.getTransaction();
                transaction.start();

                CommandLineImplementation impl = SpringData.JSONToObject(oldtool.getImplementation(),
                        CommandLineImplementation.class);
                exec.setText(impl.getExecutable());
                //          waitGUICheck.setSelection(impl.isGuiwait());
                if (impl.getCaptureStdOut() != null) {
                    stdoutCheck.setSelection(true);
                    //          oldtool.get
                    //          WorkflowToolDataBean wtdb = oldtool.getOutput(oldexternal.getCaptureStdout().getRefid());
                    //          stdout.setText(wtdb.getTitle());
                }

                joinStdoutStderrCheck.setSelection(impl.isJoinStdOutStdErr());

                if (impl.getCaptureStdErr() != null) {
                    stderrCheck.setSelection(true);
                }

                //          ArrayList<OptionOrder> options = new ArrayList<OptionOrder>();
                //          for (Cmdoption cmdopt : oldexternal.getOption()) {
                //              for (Optionvalue opt : cmdopt.getValue()) {
                //                  ToolOption to = new ToolOption();
                //                  to.setType(ToolOptionType.VALUE);
                //                  if (opt.getFlag() != null) {
                //                      to.setFlag(opt.getFlag());
                //                  }
                //                  if (opt.getValue() != null) {
                //                      to.setValue(opt.getValue());
                //                  }
                //                  options.add(new OptionOrder(opt.getOrder(), to));
                //              }
                //              for (Optionparameter opt : cmdopt.getParameter()) {
                //                  ToolOption to = new ToolOption();
                //                  to.setType(ToolOptionType.PARAMETER);
                //                  if (opt.getFlag() != null) {
                //                      to.setFlag(opt.getFlag());
                //                  }
                //                  to.setParameter(oldtool.getParameter(opt.getRefid()));
                //                  options.add(new OptionOrder(opt.getOrder(), to));
                //              }
                //              for (Optiondata opt : cmdopt.getData()) {
                //                  if (opt.getInput() != null) {
                //                      ToolOption to = new ToolOption();
                //                      to.setType(ToolOptionType.INPUT);
                //                      if (opt.getFlag() != null) {
                //                          to.setFlag(opt.getFlag());
                //                      }
                //                      ToolInput input = new ToolInput();
                //                      input.setCommandLine(opt.isCommandline());
                //                      input.setInput(oldtool.getInput(opt.getInput()));
                //                      to.setInput(input);
                //                      if (opt.getOutput() != null) {
                //                          input.setAlsoOutput(true);
                //                          input.setOutput(oldtool.getOutput(opt.getOutput()));
                //                      }
                //                      options.add(new OptionOrder(opt.getOrder(), to));
                //                  } else {
                //                      ToolOption to = new ToolOption();
                //                      to.setType(ToolOptionType.OUTPUT);
                //                      if (opt.getFlag() != null) {
                //                          to.setFlag(opt.getFlag());
                //                      }
                //                      ToolOutput out = new ToolOutput();
                //                      out.setCommandLine(opt.isCommandline());
                //                      out.setOutput(oldtool.getOutput(opt.getOutput()));
                //                      to.setOutput(out);
                //                      options.add(new OptionOrder(opt.getOrder(), to));
                //                  }
                //              }

                transaction.commit();
            } catch (Exception exc) {
                logger.warn("Could nto get information from old tool.", exc);
            }
        }

        viewer.setInput(options);
        validate();
        setControl(top);
    }

    private String getOptionString(CommandLineOption option) {
        StringBuilder result = new StringBuilder();

        if ((option.getFlag() != null) && (option.getFlag().trim().length() > 0)) {
            result.append(option.getFlag());
            result.append(" ");
        }

        switch (option.getType()) {
        case VALUE:
            if ((option.getValue() != null) && (option.getValue().trim().length() > 0)) {
                result.append(option.getValue());
            }
            break;

        case PARAMETER:
            WorkflowToolParameter param = parameters.get(option);
            result.append(param.getTitle());
            result.append("[");
            result.append(param.getType().toString());
            result.append("] = ");
            result.append(param.getValue());
            break;

        case DATA:
            result.append("file(");
            switch (option.getInputOutput()) {
            case INPUT:
                result.append("in:");
                break;
            case OUTPUT:
                result.append("out:");
                break;
            case BOTH:
                result.append("in/out:");
                break;
            }
            if ((option.getFilename() != null) && (option.getFilename().trim().length() > 0)) {
                result.append(option.getFilename());
            } else {
                result.append("AUTO");
            }
            if (option.isCommandline()) {
                result.append("[not passed]");
            }
            result.append(")");
            break;
        }

        return result.toString();
    }

    private void validate() {
        int index = viewer.getList().getSelectionIndex();
        int size = viewer.getList().getItemCount();

        StringBuffer sb = new StringBuffer();
        sb.append(exec.getText());
        sb.append(" "); //$NON-NLS-1$
        for (CommandLineOption option : options) {
            sb.append(getOptionString(option));
        }

        if (joinStdoutStderrCheck.getSelection()) {
            sb.append(" 2>&1"); //$NON-NLS-1$
        } else if (stderrCheck.getSelection()) {
            sb.append(" 2>"); //$NON-NLS-1$
            sb.append(stderr.getText());
        }

        if (stdoutCheck.getSelection()) {
            sb.append(" >"); //$NON-NLS-1$
            sb.append(stdout.getText());
        }

        commandline.setText(sb.toString());

        del.setEnabled(index >= 0);
        up.setEnabled(size > 1 && index > 0);
        down.setEnabled(size > 1 && index >= 0 && index < size - 1);

        stdout.setEnabled(stdoutCheck.getSelection());
        stderrCheck.setEnabled(!joinStdoutStderrCheck.getSelection());
        stderr.setEnabled(!joinStdoutStderrCheck.getSelection() && stderrCheck.getSelection());

        if (exec.getText().trim().length() == 0) {
            setErrorMessage("Tool needs an executable.");
            setPageComplete(false);
            return;
        }

        if (stdoutCheck.getSelection() && (stdout.getText().trim().length() == 0)) {
            setErrorMessage("If capturing stdout, an output is required.");
            setPageComplete(false);
            return;
        }

        if (stderrCheck.getSelection() && (stderr.getText().trim().length() == 0)) {
            setErrorMessage("If capturing stderr, an output is required.");
            setPageComplete(false);
            return;
        }

        setErrorMessage(null);
        setPageComplete(true);
    }

    public void updateTool(WorkflowTool tool) throws IOException {
        CommandLineImplementation impl = new CommandLineImplementation();

        impl.setExecutable(exec.getText());

        if (stdoutCheck.getSelection()) {
            WorkflowToolData data = new WorkflowToolData();
            data.setTitle(stdout.getText());
            data.setDescription("stdout of external tool.");
            data.setMimeType("text/plain"); //$NON-NLS-1$
            data.setDataId("stdout");
            tool.addOutput(data);

            impl.setCaptureStdOut(data.getDataId());
            if (joinStdoutStderrCheck.getSelection()) {
                impl.setJoinStdOutStdErr(true);
            }
        }

        if (!joinStdoutStderrCheck.getSelection() && stderrCheck.getSelection()) {
            WorkflowToolData data = new WorkflowToolData();
            data.setTitle(stderr.getText());
            data.setDescription("stderr of external tool.");
            data.setMimeType("text/plain"); //$NON-NLS-1$
            data.setDataId("stderr");
            tool.addOutput(data);

            impl.setCaptureStdErr(data.getDataId());
        }

        for (CommandLineOption option : options) {
            impl.getCommandLineOptions().add(option);
            switch (option.getType()) {
            case VALUE:
                break;

            case PARAMETER:
                tool.addParameter(parameters.get(option));
                break;

            case DATA:
                switch (option.getInputOutput()) {
                case INPUT:
                    tool.addInput(data.get(option));
                    break;
                case OUTPUT:
                    tool.addOutput(data.get(option));
                    break;
                case BOTH:
                    tool.addInput(data.get(option));
                    tool.addOutput(data.get(option));
                    break;
                }
                break;
            }
        }

        tool.setImplementation(SpringData.objectToJSON(impl));
    }
}