eu.geclipse.jsdl.ui.wizards.ExecutableNewJobWizardPage.java Source code

Java tutorial

Introduction

Here is the source code for eu.geclipse.jsdl.ui.wizards.ExecutableNewJobWizardPage.java

Source

/******************************************************************************
 * Copyright (c) 2006-2008 g-Eclipse consortium
 * 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
 *
 * Initial development of the original code was made for
 * project g-Eclipse founded by European Union
 * project number: FP6-IST-034327  http://www.geclipse.eu/
 *
 * Contributor(s):
 *     PSNC:
 *      - Katarzyna Bylec (katis@man.poznan.pl)
 *
 *****************************************************************************/
package eu.geclipse.jsdl.ui.wizards;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.xml.parsers.ParserConfigurationException;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.IWizardNode;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.jface.wizard.WizardSelectionPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
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.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.PlatformUI;
import org.xml.sax.SAXException;

import eu.geclipse.core.model.GridModel;
import eu.geclipse.core.model.IGridConnectionElement;
import eu.geclipse.core.model.IGridElement;
import eu.geclipse.core.model.IVirtualOrganization;
import eu.geclipse.core.reporting.ProblemException;
import eu.geclipse.jsdl.JSDLJobDescription;
import eu.geclipse.jsdl.ui.internal.Activator;
import eu.geclipse.jsdl.ui.preference.ApplicationParametersRegistry;
import eu.geclipse.jsdl.ui.wizards.nodes.BasicWizardPart;
import eu.geclipse.jsdl.ui.wizards.nodes.SpecificWizardPart;
import eu.geclipse.jsdl.ui.wizards.specific.ApplicationSpecificPage;
import eu.geclipse.jsdl.ui.wizards.specific.IApplicationSpecificPage;
import eu.geclipse.ui.dialogs.GridFileDialog;
import eu.geclipse.ui.dialogs.ProblemDialog;
import eu.geclipse.ui.widgets.StoredCombo;
import eu.geclipse.ui.wizards.IProjectSelectionProvider;

/**
 * Wizard page that allows user to choose an executable for the grid job, name
 * of the job and its description
 */
public class ExecutableNewJobWizardPage extends WizardSelectionPage implements ModifyListener {

    private static final String STD_FILES_TOOL_TIP = "Specify executable file to activate this field";
    /**
     * Key for the executable file preference.
     */
    private static String INPUT_EXE_ID = "executable_file"; //$NON-NLS-1$
    boolean done;
    boolean firstTime = true;
    IVirtualOrganization virtualOrg;
    Text stdin;
    Text stdout;
    Text stderr;
    /**
     * Holds the name of the executable
     */
    StoredCombo executableFile;
    Composite parentP;
    /**
     * Button for opening {@link GridFileDialog} - a dialog for choosing local or
     * remote files
     */
    private Button gridFileDialogButton;
    /**
     * Holds name of the application
     */
    private CCombo applicationName;
    private ArrayList<WizardPage> internalPages;
    private BasicWizardPart basicNode;
    private Button chooseButton;
    private Text argumentsLine;
    private Map<String, Integer> appsWithParametersFromPrefs = new HashMap<String, Integer>();
    /**
     * Object representing basic JSDL content for an application specific
     * settings. It is parsed (created) when the "Finish" button is pressed - not
     * every time the application chosen by user changes. This is kind of lazy
     * loading. This object is passed to {@link DataStagingNewJobWizardPage} so it
     * can present data staging information form basic JSDL file to the user.
     */
    private JSDLJobDescription basicJSDL;
    private Group stdFilesGroup;
    private Button outButton;
    private Button errButton;

    /**
     * Creates new wizard page
     * 
     * @param pageName name of the page
     * @param internalPages
     */
    protected ExecutableNewJobWizardPage(final String pageName, final ArrayList<WizardPage> internalPages) {
        super(pageName);
        setTitle(Messages.getString("ExecutableNewJobWizardPage.title")); //$NON-NLS-1$
        setDescription(Messages.getString("ExecutableNewJobWizardPage.description")); //$NON-NLS-1$
        this.internalPages = internalPages;
    }

    @Override
    public IWizardPage getNextPage() {
        // If in application specific settings basic JSDL file is given its copy - a
        // temporary jsdl file - is created in workspace. This file is used to
        // generate JSDLJobDescription object which will be passed to next wizard's
        // page.
        if (this.applicationName != null && this.applicationName.getText() != null) {
            Integer aspID = this.appsWithParametersFromPrefs.get(this.applicationName.getText());
            if (aspID != null) {
                IPath path = ApplicationParametersRegistry.getInstance().getApplicationData(aspID.intValue())
                        .getJsdlPath();
                if (path != null && !path.toOSString().equals("")) { //$NON-NLS-1$
                    // getting jsdl source
                    // creating temp Eclipse's resource
                    IPath workspacePath = ((NewJobWizard) getWizard()).getProject();
                    workspacePath = workspacePath.append(".tempJSDL.jsdl"); //$NON-NLS-1$
                    IFile newFileHandle = ResourcesPlugin.getWorkspace().getRoot().getFile(workspacePath);
                    try {
                        newFileHandle.createLink(path, IResource.REPLACE, null);
                        IGridElement element = GridModel.getRoot().findElement(newFileHandle);
                        if (element instanceof JSDLJobDescription) {
                            this.basicJSDL = (JSDLJobDescription) element;
                            ((NewJobWizard) getWizard()).updateBasicJSDL(this.basicJSDL,
                                    this.applicationName.getText());
                        }
                    } catch (CoreException e) {
                        // TODO katis - error handling
                    } finally {
                        try {
                            newFileHandle.delete(true, null);
                        } catch (CoreException e) {
                            // TODO katis - error handling
                        }
                    }
                } else {
                    ((NewJobWizard) getWizard()).updateBasicJSDL(null, this.applicationName.getText());
                }
            }
        } else {
            ((NewJobWizard) getWizard()).updateBasicJSDL(null, this.applicationName.getText());
        }
        return super.getNextPage();
    }

    @Override
    public boolean isPageComplete() {
        return true;
    }

    public void createControl(final Composite parent) {
        this.parentP = parent;
        // mainComposite
        Composite mainComp = new Composite(parent, SWT.NONE);
        IPreferenceStore prefs = Activator.getDefault().getPreferenceStore();
        URL openFileIcon = Activator.getDefault().getBundle().getEntry("icons/obj16/open_file.gif"); //$NON-NLS-1$
        Image openFileImage = ImageDescriptor.createFromURL(openFileIcon).createImage();
        GridLayout gLayout = new GridLayout(3, false);
        gLayout.horizontalSpacing = 10;
        gLayout.verticalSpacing = 12;
        mainComp.setLayout(gLayout);
        // Label for application name
        GridData layout = new GridData();
        Label applicationNameLabel = new Label(mainComp,
                GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_CENTER);
        applicationNameLabel.setText(Messages.getString("ExecutableNewJobWizardPage.application_name_label")); //$NON-NLS-1$
        layout = new GridData();
        layout.horizontalAlignment = GridData.FILL;
        applicationNameLabel.setLayoutData(layout);
        // Combo - application name
        this.applicationName = new CCombo(mainComp, SWT.BORDER);
        layout = new GridData();
        layout.horizontalAlignment = GridData.FILL;
        layout.horizontalSpan = 2;
        this.applicationName.setLayoutData(layout);
        this.applicationName.addModifyListener(this);
        this.applicationName.addFocusListener(new FocusListener() {

            public void focusGained(final FocusEvent e) {
                if (ExecutableNewJobWizardPage.this.firstTime) {
                    fetchApps(ExecutableNewJobWizardPage.this.virtualOrg);
                    ExecutableNewJobWizardPage.this.applicationName.setListVisible(true);
                }
            }

            public void focusLost(final FocusEvent e) {
                // do nothing
            }
        });
        // Label - executable file
        Label inputLabel = new Label(mainComp,
                GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_CENTER);
        inputLabel.setText(Messages.getString("ExecutableNewJobWizardPage.exe_input_label")); //$NON-NLS-1$
        layout = new GridData();
        layout.horizontalAlignment = GridData.FILL;
        inputLabel.setLayoutData(layout);
        // Stored combo - executable file
        this.executableFile = new StoredCombo(mainComp, SWT.DROP_DOWN);
        this.executableFile.setPreferences(prefs, INPUT_EXE_ID);
        this.executableFile.setText(""); //$NON-NLS-1$
        layout = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL | GridData.VERTICAL_ALIGN_CENTER);
        this.executableFile.setLayoutData(layout);
        this.executableFile.addModifyListener(new ModifyListener() {

            public void modifyText(final ModifyEvent event) {
                if (ExecutableNewJobWizardPage.this.executableFile.getText().equals("")) { //$NON-NLS-1$
                    setStdFilesGroupEnabled(false);
                } else {
                    setStdFilesGroupEnabled(true);
                }
            }
        });
        // Button - browsing for executable file
        this.gridFileDialogButton = new Button(mainComp, SWT.PUSH);
        this.gridFileDialogButton.setImage(openFileImage);
        layout = new GridData(
                GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_CENTER);
        this.gridFileDialogButton.setLayoutData(layout);
        this.gridFileDialogButton.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(final SelectionEvent e) {
                GridFileDialog dialog = new GridFileDialog(getShell(),
                        GridFileDialog.STYLE_ALLOW_ONLY_EXISTING | GridFileDialog.STYLE_ALLOW_ONLY_FILES);
                if (dialog.open() == Window.OK) {
                    URI[] uris = dialog.getSelectedURIs();
                    if ((uris != null) && (uris.length > 0)) {
                        ExecutableNewJobWizardPage.this.executableFile.setText(uris[0].toString());
                    } else {
                        ExecutableNewJobWizardPage.this.executableFile.setText(""); //$NON-NLS-1$
                    }
                }
            }
        });
        // Label - arguments list
        Label argumentsLabel = new Label(mainComp, SWT.LEAD);
        argumentsLabel.setText(Messages.getString("ExecutableNewJobWizardPage.arguments_line_label")); //$NON-NLS-1$
        layout = new GridData();
        argumentsLabel.setLayoutData(layout);
        // Text - arguments list
        this.argumentsLine = new Text(mainComp, SWT.BORDER);
        layout = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
        layout.horizontalSpan = 2;
        this.argumentsLine.setLayoutData(layout);
        // Group - std files group
        this.stdFilesGroup = new Group(mainComp, SWT.NONE);
        this.stdFilesGroup.setToolTipText(STD_FILES_TOOL_TIP);
        this.stdFilesGroup.setText(Messages.getString("ExecutableNewJobWizardPage.composite_group_title")); //$NON-NLS-1$
        this.stdFilesGroup.setLayout(new GridLayout(3, false));
        layout = new GridData(GridData.FILL_HORIZONTAL);
        layout.grabExcessHorizontalSpace = true;
        layout.horizontalSpan = 3;
        this.stdFilesGroup.setLayoutData(layout);
        // Label - stdin file
        Label stdinLabel = new Label(this.stdFilesGroup, SWT.LEAD);
        layout = new GridData(GridData.VERTICAL_ALIGN_CENTER | GridData.HORIZONTAL_ALIGN_BEGINNING);
        stdinLabel.setLayoutData(layout);
        stdinLabel.setText(Messages.getString("FilesInputNewJobWizardPage.stdin_label")); //$NON-NLS-1$
        // Text - stdin file
        this.stdin = new Text(this.stdFilesGroup, SWT.NONE | SWT.BORDER);
        layout = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL | GridData.VERTICAL_ALIGN_CENTER
                | GridData.HORIZONTAL_ALIGN_CENTER);
        this.stdin.setLayoutData(layout);
        // Button - browsing for stdin file
        this.chooseButton = new Button(this.stdFilesGroup, SWT.PUSH);
        this.chooseButton.setImage(openFileImage);
        layout = new GridData(
                GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_CENTER);
        this.chooseButton.setLayoutData(layout);
        this.chooseButton.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(final SelectionEvent e) {
                GridFileDialog dialog = new GridFileDialog(getShell(),
                        GridFileDialog.STYLE_ALLOW_ONLY_FILES | GridFileDialog.STYLE_ALLOW_ONLY_EXISTING);
                if (dialog.open() == Window.OK) {
                    URI[] uris = getUrisFromDialog(dialog);
                    if ((uris != null) && (uris.length > 0)) {
                        ExecutableNewJobWizardPage.this.stdin.setText(uris[0].toString());
                    }
                }
            }
        });
        // Label - stdout file
        Label stdoutLabel = new Label(this.stdFilesGroup, SWT.NONE);
        layout = new GridData(GridData.VERTICAL_ALIGN_CENTER | GridData.HORIZONTAL_ALIGN_BEGINNING);
        stdoutLabel.setLayoutData(layout);
        stdoutLabel.setText(Messages.getString("FilesInputNewJobWizardPage.stdout_label")); //$NON-NLS-1$
        // Text - stdout file
        this.stdout = new Text(this.stdFilesGroup, SWT.NONE | SWT.BORDER);
        layout = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL | GridData.VERTICAL_ALIGN_CENTER
                | GridData.HORIZONTAL_ALIGN_CENTER);
        this.stdout.setLayoutData(layout);
        // Button - browsing for stdout files (only remote)
        this.outButton = new Button(this.stdFilesGroup, SWT.PUSH);
        this.outButton.setImage(openFileImage);
        layout = new GridData(
                GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_CENTER);
        this.outButton.setLayoutData(layout);
        this.outButton.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(final SelectionEvent e) {
                GridFileDialog dialog = new GridFileDialog(getShell(), GridFileDialog.STYLE_ALLOW_ONLY_FILES);
                if (dialog.open() == Window.OK) {
                    URI[] uris = getUrisFromDialog(dialog);
                    if ((uris != null) && ((uris.length > 0))) {
                        ExecutableNewJobWizardPage.this.stdout.setText(uris[0].toString());
                    }
                }
            }
        });
        // Label - stderr file
        Label stderrLabel = new Label(this.stdFilesGroup, SWT.NONE);
        layout = new GridData(GridData.VERTICAL_ALIGN_CENTER | GridData.HORIZONTAL_ALIGN_BEGINNING);
        stderrLabel.setLayoutData(layout);
        stderrLabel.setText(Messages.getString("FilesInputNewJobWizardPage.stderr_label")); //$NON-NLS-1$
        // Text - stderr file (only remote)
        this.stderr = new Text(this.stdFilesGroup, SWT.NONE | SWT.BORDER);
        layout = new GridData(GridData.VERTICAL_ALIGN_CENTER | GridData.HORIZONTAL_ALIGN_CENTER
                | GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL);
        this.stderr.setLayoutData(layout);
        // Button - browsing for stderr file (only remote)
        this.errButton = new Button(this.stdFilesGroup, SWT.PUSH);
        this.errButton.setImage(openFileImage);
        layout = new GridData(
                GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_CENTER);
        this.errButton.setLayoutData(layout);
        this.errButton.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(final SelectionEvent e) {
                GridFileDialog dialog = new GridFileDialog(getShell(), GridFileDialog.STYLE_ALLOW_ONLY_FILES);
                if (dialog.open() == Window.OK) {
                    URI[] uris = getUrisFromDialog(dialog);
                    if ((uris != null) && (uris.length > 0)) {
                        ExecutableNewJobWizardPage.this.stderr.setText(uris[0].toString());
                    }
                }
            }
        });
        if (this.basicNode == null) {
            this.basicNode = new BasicWizardPart(this.internalPages, getWizard());
        }
        setSelectedNode(this.basicNode);
        setStdFilesGroupEnabled(false);
        setControl(mainComp);
    }

    URI[] getUrisFromDialog(final GridFileDialog dialog) {
        URI[] uris = dialog.getSelectedURIs();
        for (int j = 0; j < uris.length; j++) {
            URI uri = uris[j];
            String query = uri.getQuery();
            if (query != null && query.trim().length() > 0) {
                String[] qParts = query.split("&"); //$NON-NLS-1$
                query = ""; //$NON-NLS-1$
                for (int i = 0; i < qParts.length; i++) {
                    String qPart = qParts[i];
                    if (!qPart.startsWith("vo")) { //$NON-NLS-1$
                        if (query.trim().length() > 0) {
                            query += "&"; //$NON-NLS-1$
                        }
                        query += qPart;
                    }
                }
                if (query.trim().length() == 0) {
                    query = null;
                }
            }

            try {
                uri = new URI(uri.getScheme(), uri.getUserInfo(), uri.getHost(), uri.getPort(), uri.getPath(),
                        query, uri.getFragment());
                uris[j] = uri;
            } catch (URISyntaxException e) {
                //TODO
            }
        }
        return uris;
    }

    void fetchApps(final IVirtualOrganization vo) {
        try {
            getContainer().run(true, true, new IRunnableWithProgress() {

                public void run(final IProgressMonitor monitor)
                        throws InvocationTargetException, InterruptedException {
                    monitor.beginTask(Messages.getString("ExecutableNewJobWizardPage.get_apps_params_progress"), 1); //$NON-NLS-1$
                    ExecutableNewJobWizardPage.this.firstTime = false;
                    try {
                        ApplicationParametersRegistry.getInstance().updateApplicationsParameters(vo, monitor);
                    } catch (ProblemException e) {
                        ProblemDialog.openProblem(getShell(),
                                Messages.getString("ExecutableNewJobWizardPage.error_fetching_title"), //$NON-NLS-1$
                                Messages.getString("ExecutableNewJobWizardPage.error_fetching_message"), //$NON-NLS-1$
                                e);
                    } finally {
                        monitor.worked(1);
                    }
                    IWorkbench workbench = PlatformUI.getWorkbench();
                    Display display = workbench.getDisplay();
                    final Map<String, Integer> map = ApplicationParametersRegistry.getInstance()
                            .getApplicationDataMapping(vo);
                    display.syncExec(new Runnable() {

                        public void run() {
                            setApplications(map);
                        }
                    });
                }
            });
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            Activator.logException(e);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            Activator.logException(e);
        }
    }

    void setStdFilesGroupEnabled(final boolean enabled) {
        this.stdin.setEnabled(enabled);
        this.chooseButton.setEnabled(enabled);
        this.stdout.setEnabled(enabled);
        this.outButton.setEnabled(enabled);
        this.stderr.setEnabled(enabled);
        this.errButton.setEnabled(enabled);
        if (enabled) {
            this.stdFilesGroup.setToolTipText(null);
        } else {
            this.stdFilesGroup.setToolTipText(STD_FILES_TOOL_TIP);
        }
    }

    String getSelectedElementDisplayName(final IGridConnectionElement element) {
        String result = ""; //$NON-NLS-1$
        result = element.getURI().toString();
        try {
            if (element.getConnectionFileStore().getFileSystem().getScheme().equalsIgnoreCase("file")) //$NON-NLS-1$
            {
                result = "file://" + result; //$NON-NLS-1$
            }
        } catch (CoreException coreExc) {
            Activator.logException(coreExc);
        }
        return result;
    }

    /**
     * Returns name of executable to run on grid
     * 
     * @return name of executable
     */
    public String getExecutableFile() {
        String result = this.executableFile.getText();
        return result;
    }

    /**
     * Returns application name to be run on the grid
     * 
     * @return name of the application
     */
    String getApplicationName() {
        String result = this.applicationName.getText();
        if (this.appsWithParametersFromPrefs.keySet().contains(result)) {
            result = ApplicationParametersRegistry.getInstance()
                    .getApplicationData((this.appsWithParametersFromPrefs.get(result)).intValue())
                    .getApplicationName();
        }
        return result;
    }

    public void modifyText(final ModifyEvent e) {
        getContainer().updateButtons();
        if (this.basicNode == null) {
            this.basicNode = new BasicWizardPart(this.internalPages, getWizard());
        }
        if (this.appsWithParametersFromPrefs.keySet().contains(this.applicationName.getText())) {
            int appId = this.appsWithParametersFromPrefs.get(this.applicationName.getText()).intValue();
            IPath pathA = ApplicationParametersRegistry.getInstance().getApplicationData(appId).getXmlPath();
            Path path = new Path(pathA.toFile().getPath());
            try {
                setSelectedNode(new SpecificWizardPart(this.basicNode, path));
                this.executableFile.setText(
                        ApplicationParametersRegistry.getInstance().getApplicationData(appId).getApplicationPath());
            } catch (SAXException e1) {
                // TODO katis what to do with this exception
            } catch (ParserConfigurationException e1) {
                // TODO katis what to do with this exception
            } catch (IOException e1) {
                // empty
            }
        } else {
            setSelectedNode(this.basicNode);
        }
    }

    /**
     * Method to access application specific page
     * 
     * @return instance of {@link ApplicationSpecificPage} or null if this page
     *         wasn't used by wizard
     */
    public ApplicationSpecificPage getApplicationSpecificPage() {
        ApplicationSpecificPage result = null;
        return result;
    }

    @Override
    protected void setSelectedNode(final IWizardNode node) {
        super.setSelectedNode(node);
    }

    /**
     * Returns list of pages created from parsing XML with description of
     * additional pages specific to application
     * 
     * @return list of application specific pages
     */
    public List<IApplicationSpecificPage> getApplicationSpecificPages() {
        List<IApplicationSpecificPage> result = new ArrayList<IApplicationSpecificPage>();
        if (getSelectedNode() != null && getSelectedNode() != this.basicNode) {
            SpecificWizardPart specificNode = (SpecificWizardPart) getSelectedNode();
            for (IWizardPage asp : specificNode.getPages()) {
                result.add((IApplicationSpecificPage) asp);
            }
        }
        return result;
    }

    /**
     * Method to access value of field holding path to stdin file
     * 
     * @return String representing remote path to stdin file
     */
    public String getStdin() {
        return this.stdin.getText();
    }

    /**
     * Method to access value of a field holding path to stdout
     * 
     * @return String representing remote path to stdout file
     */
    public String getStdout() {
        return this.stdout.getText();
    }

    /**
     * Method to access job's arguments given by user.
     * 
     * @return list of arguments
     */
    public ArrayList<String> getArgumentsList() {
        ArrayList<String> result = new ArrayList<String>();
        String[] table = this.argumentsLine.getText().split(" "); //$NON-NLS-1$
        for (String tableElement : table) {
            result.add(tableElement);
        }
        return result;
    }

    /**
     * Method to access basic JSDL file used by application specific settings.
     * 
     * @return object representing information kept in basic JSDL file or
     *         <code>null</code> if no such file is present.
     */
    public JSDLJobDescription getBasicJSDL() {
        // If in application specific settings basic JSDL file is given its copy - a
        // temporary jsdl file - is created in workspace. This file is used to
        // generate JSDLJobDescription object which will be passed to next wizard's
        // page.
        Integer aspID = this.appsWithParametersFromPrefs.get(this.applicationName.getText());
        if (aspID != null) {
            IPath path = ApplicationParametersRegistry.getInstance().getApplicationData(aspID.intValue())
                    .getJsdlPath();
            if (path != null && !path.toOSString().equals("")) { //$NON-NLS-1$
                IPath workspacePath = ((NewJobWizard) getWizard()).getProject();
                workspacePath = workspacePath.append(".tempJSDL.jsdl"); //$NON-NLS-1$
                IFile newFileHandle = ResourcesPlugin.getWorkspace().getRoot().getFile(workspacePath);
                try {
                    newFileHandle.createLink(path, IResource.REPLACE, null);
                    IGridElement element = GridModel.getRoot().findElement(newFileHandle);
                    if (element instanceof JSDLJobDescription) {
                        this.basicJSDL = (JSDLJobDescription) element;
                    }
                } catch (CoreException e) {
                    // TODO katis - error handling
                } finally {
                    try {
                        newFileHandle.delete(true, null);
                    } catch (CoreException e) {
                        // TODO katis - error handling
                    }
                }
            } else {
                this.basicJSDL = null;
            }
        } else {
            this.basicJSDL = null;
        }
        return this.basicJSDL;
    }

    /**
     * Updates buttons as a reaction to changes in page's fields content.
     */
    public void updateButtons() {
        getContainer().updateButtons();
    }

    class ModifyTextListener implements ModifyListener {

        public void modifyText(final ModifyEvent event) {
            updateButtons();
        }
    }

    /**
     * Method to access value of path to standard error file
     * 
     * @return string value kept in standard error text field
     */
    public String getStderr() {
        return this.stderr.getText();
    }

    @Override
    public void setVisible(final boolean visible) {
        final IVirtualOrganization vo = ((IProjectSelectionProvider) getWizard()).getGridProject().getVO();
        if (this.virtualOrg == null || this.virtualOrg != vo) {
            this.firstTime = true;
            if (this.applicationName != null) {
                this.applicationName.removeAll();
                // this.applicationName.setText( "" );
            }
        }
        this.virtualOrg = vo;
        // Job job = new Job( Messages.getString(
        // "ExecutableNewJobWizardPage.fetching_apps_job_name" ) ) { //$NON-NLS-1$
        //
        // @Override
        // protected IStatus run( final IProgressMonitor monitor ) {
        // if( visible == true && ExecutableNewJobWizardPage.this.firstTime ) {
        // ExecutableNewJobWizardPage.this.firstTime = false;
        // try {
        // ApplicationParametersRegistry.getInstance()
        // .updateApplicationsParameters( vo );
        // } catch( ProblemException e ) {
        // ProblemDialog.openProblem( getShell(),
        // Messages.getString( "ExecutableNewJobWizardPage.error_fetching_title" ),
        // //$NON-NLS-1$
        // Messages.getString( "ExecutableNewJobWizardPage.error_fetching_message"
        // ), //$NON-NLS-1$
        // e );
        // }
        // IWorkbench workbench = PlatformUI.getWorkbench();
        // Display display = workbench.getDisplay();
        // final Map<String, Integer> map =
        // ApplicationParametersRegistry.getInstance()
        // .getApplicationDataMapping( vo );
        // display.syncExec( new Runnable() {
        //
        // public void run() {
        // setApplications( map );
        // }
        // } );
        // }
        // return Status.OK_STATUS;
        // }
        // };
        // job.setUser( false );
        // if( this.firstTime ) {
        // setMessage( Messages.getString(
        // "ExecutableNewJobWizardPage.fetching_apps" ), //$NON-NLS-1$
        // IMessageProvider.WARNING );
        // }
        // job.schedule();
        super.setVisible(visible);
    }

    void setApplications(final Map<String, Integer> map) {
        this.appsWithParametersFromPrefs = map;
        for (String name : this.appsWithParametersFromPrefs.keySet()) {
            this.applicationName.add(name);
        }
        this.setMessage(null);
    }
}