eu.geclipse.jsdl.ui.internal.pages.sections.PosixApplicationSection.java Source code

Java tutorial

Introduction

Here is the source code for eu.geclipse.jsdl.ui.internal.pages.sections.PosixApplicationSection.java

Source

/******************************************************************************
 * Copyright (c) 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):
 *     UCY (http://www.ucy.cs.ac.cy)
 *      - Nicholas Loulloudes (loulloudes.n@cs.ucy.ac.cy)
 *
 *****************************************************************************/
package eu.geclipse.jsdl.ui.internal.pages.sections;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.util.BasicEList;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.widgets.FormToolkit;

import eu.geclipse.jsdl.model.base.ApplicationType;
import eu.geclipse.jsdl.model.base.JobDefinitionType;
import eu.geclipse.jsdl.model.base.JobDescriptionType;
import eu.geclipse.jsdl.model.base.JsdlFactory;
import eu.geclipse.jsdl.model.base.JsdlPackage;
import eu.geclipse.jsdl.model.posix.ArgumentType;
import eu.geclipse.jsdl.model.posix.DocumentRoot;
import eu.geclipse.jsdl.model.posix.EnvironmentType;
import eu.geclipse.jsdl.model.posix.FileNameType;
import eu.geclipse.jsdl.model.posix.POSIXApplicationType;
import eu.geclipse.jsdl.model.posix.PosixFactory;
import eu.geclipse.jsdl.model.posix.PosixPackage;
import eu.geclipse.jsdl.ui.internal.Activator;
import eu.geclipse.jsdl.ui.internal.dialogs.ArgumentsDialog;
import eu.geclipse.jsdl.ui.internal.dialogs.EnvironmentVarDialog;
import eu.geclipse.jsdl.ui.internal.pages.FormSectionFactory;
import eu.geclipse.jsdl.ui.internal.pages.Messages;
import eu.geclipse.jsdl.ui.providers.FeatureContentProvider;
import eu.geclipse.jsdl.ui.providers.FeatureLabelProvider;

/**
 * @author nloulloud
 * 
 * This class is responsible for displaying the POSIX Application section in the 
 * Application Page of the JSDL editor. It provides widgets to manipulate the 
 * elements specified in the "POSIX Application Elements" section of 
 * the Job Submission Description Language (JSDL) Specification, Version 1.0.
 */
public class PosixApplicationSection extends JsdlFormPageSection {

    private static final int WIDGET_HEIGHT = 100;
    protected Text txtExecutable = null;
    protected Text txtPosixName = null;
    protected Text txtInput = null;
    protected Text txtOutput = null;
    protected Text txtError = null;
    protected Button btnArgAdd = null;
    protected Button btnArgEdit = null;
    protected Button btnArgDel = null;
    protected Button btnEnVarAdd = null;
    protected Button btnEnVarEdit = null;
    protected Button btnEnVarDel = null;
    protected Label lblPosixName = null;
    protected Label lblExecutable = null;
    protected Label lblArgument = null;
    protected Label lblInput = null;
    protected Label lblOutput = null;
    protected Label lblError = null;
    protected Label lblEnvironment = null;
    protected Table tblEnvironment = null;
    protected TableViewer environmentViewer = null;
    protected Table tblArgument = null;
    protected TableViewer argumentViewer = null;
    protected Object value = null;
    protected JobDefinitionType jobDefinitionType = null;
    protected JobDescriptionType jobDescriptionType = null;
    protected ApplicationType applicationType = null;
    protected DocumentRoot documentRoot = PosixFactory.eINSTANCE.createDocumentRoot();
    protected POSIXApplicationType posixApplicationType;
    protected EnvironmentType environmentType = PosixFactory.eINSTANCE.createEnvironmentType();
    protected ArgumentType argumentType = PosixFactory.eINSTANCE.createArgumentType();

    private TableColumn column;
    private Composite containerComposite = null;

    /**
     * Class constructor. Creates the section.
     *  
     * @param formPage The FormPage that contains this Section
     * @param parent The parent composite.
     * @param toolkit The parent Form Toolkit.
     */
    public PosixApplicationSection(final Composite parent, final FormToolkit toolkit) {

        this.containerComposite = parent;
        createSection(parent, toolkit);

    }

    /*
     * Create the Posix Application Section 
     */
    private void createSection(final Composite parent, final FormToolkit toolkit) {

        String sectionTitle = Messages.getString("JobApplicationPage_PosixApplicationtitle"); //$NON-NLS-1$
        String sectionDescripiton = Messages.getString("JobApplicationPage_PosixApplicationDescription"); //$NON-NLS-1$
        GridData gd;

        Composite client = FormSectionFactory.createGridStaticSection(toolkit, parent, sectionTitle,
                sectionDescripiton, 4);
        gd = new GridData();
        gd.grabExcessHorizontalSpace = true;
        gd.verticalAlignment = GridData.CENTER;
        gd.verticalSpan = 1;
        gd.horizontalSpan = 3;
        gd.widthHint = 330;

        /* ===================== Posix Name Widget ======================= */
        this.lblPosixName = toolkit.createLabel(client, Messages.getString("JobApplicationPage_PosixName")); //$NON-NLS-1$
        this.txtPosixName = toolkit.createText(client, "", SWT.NONE); //$NON-NLS-1$
        this.txtPosixName.addModifyListener(new ModifyListener() {

            public void modifyText(final ModifyEvent e) {
                checkPosixApplicationElement();

                if (!PosixApplicationSection.this.txtPosixName.getText().equals(EMPTY_STRING)) {

                    PosixApplicationSection.this.posixApplicationType
                            .setName(PosixApplicationSection.this.txtPosixName.getText());
                } else {
                    if (null != PosixApplicationSection.this.posixApplicationType.getName()) {
                        PosixApplicationSection.this.posixApplicationType.setName(null);
                    }
                }
                contentChanged();

            }
        });

        this.txtPosixName.setLayoutData(gd);

        /* =========================== Executable Widget ======================== */
        gd = new GridData();
        gd.horizontalSpan = 1;
        this.lblExecutable = toolkit.createLabel(client, Messages.getString("JobApplicationPage_Executable")); //$NON-NLS-1$
        this.lblExecutable.setLayoutData(gd);
        this.txtExecutable = toolkit.createText(client, "", SWT.NONE); //$NON-NLS-1$
        this.txtExecutable.addModifyListener(new ModifyListener() {
            FileNameType fileName = null;

            public void modifyText(final ModifyEvent e) {
                checkPosixApplicationElement();
                if (!PosixApplicationSection.this.txtExecutable.getText().equals(EMPTY_STRING)) {
                    if (null == this.fileName) {
                        this.fileName = PosixFactory.eINSTANCE.createFileNameType();
                    }
                    this.fileName.setValue(PosixApplicationSection.this.txtExecutable.getText());
                    this.fileName = (FileNameType) checkProxy(this.fileName);
                    PosixApplicationSection.this.posixApplicationType.setExecutable(this.fileName);
                } else {

                    if (null != this.fileName) {
                        this.fileName = (FileNameType) checkProxy(this.fileName);
                        this.fileName = null;
                    }
                    if (null != PosixApplicationSection.this.posixApplicationType.getExecutable()) {
                        PosixApplicationSection.this.posixApplicationType.setExecutable(null);
                    }
                }
                contentChanged();

            }
        });

        gd = new GridData();
        gd.widthHint = 330;
        gd.horizontalSpan = 3;
        gd.grabExcessHorizontalSpace = true;
        gd.verticalAlignment = GridData.CENTER;
        gd.verticalSpan = 1;
        this.txtExecutable.setLayoutData(gd);

        /* ============================= Argument Widget ======================== */
        gd = new GridData();
        gd.verticalSpan = 2;
        gd.horizontalSpan = 1;
        gd.verticalAlignment = GridData.BEGINNING;
        this.lblArgument = toolkit.createLabel(client, Messages.getString("JobApplicationPage_Argument")); //$NON-NLS-1$
        this.lblArgument.setLayoutData(gd);
        gd = new GridData();
        gd.horizontalAlignment = GridData.FILL;
        gd.verticalAlignment = GridData.FILL;
        gd.verticalSpan = 3;
        gd.horizontalSpan = 1;
        gd.widthHint = 250;
        gd.heightHint = WIDGET_HEIGHT;

        this.argumentViewer = new TableViewer(client, SWT.BORDER | SWT.FULL_SELECTION);
        this.tblArgument = this.argumentViewer.getTable();
        this.tblArgument.setHeaderVisible(true);
        this.argumentViewer.setContentProvider(new FeatureContentProvider());
        this.argumentViewer.setLabelProvider(new FeatureLabelProvider());
        this.column = new TableColumn(this.tblArgument, SWT.NONE);
        this.column.setText("File System Name"); //$NON-NLS-1$
        this.column.setWidth(150);
        this.column = new TableColumn(this.tblArgument, SWT.NONE);
        this.column.setText("Value"); //$NON-NLS-1$
        this.column.setWidth(100);

        this.argumentViewer.addSelectionChangedListener(new ISelectionChangedListener() {

            public void selectionChanged(final SelectionChangedEvent event) {
                updateButtons((TableViewer) event.getSource());
            }
        });
        this.tblArgument.setData(FormToolkit.KEY_DRAW_BORDER);
        this.tblArgument.setLayoutData(gd);

        /* Create "Add" Button */
        gd = new GridData();
        gd.horizontalSpan = 2;
        gd.verticalSpan = 1;
        gd.widthHint = 60;
        this.btnArgAdd = toolkit.createButton(client, Messages.getString("JsdlEditor_AddButton"), //$NON-NLS-1$
                SWT.PUSH);
        this.btnArgAdd.addSelectionListener(new SelectionListener() {

            public void widgetSelected(final SelectionEvent event) {
                handleArguments(Messages.getString("JobApplicationPage_ArgumentDialog"), //$NON-NLS-1$
                        (Button) event.getSource());

                addNewArgument(PosixApplicationSection.this.argumentViewer, PosixApplicationSection.this.value);
            }

            public void widgetDefaultSelected(final SelectionEvent event) {
                // Do Nothing - Required method
            }
        });
        this.btnArgAdd.setLayoutData(gd);
        /* Create "Edit" Button */
        gd = new GridData();
        gd.horizontalSpan = 2;
        gd.verticalSpan = 1;
        gd.widthHint = 60;
        this.btnArgEdit = toolkit.createButton(client, Messages.getString("JsdlEditor_EditButton"), //$NON-NLS-1$
                SWT.PUSH);

        this.btnArgEdit.addSelectionListener(new SelectionListener() {

            public void widgetSelected(final SelectionEvent event) {
                handleArguments(Messages.getString("JobApplicationPage_ArgumentDialog"), //$NON-NLS-1$
                        (Button) event.getSource());

                performEdit(PosixApplicationSection.this.argumentViewer, PosixApplicationSection.this.value);
            }

            public void widgetDefaultSelected(final SelectionEvent event) {
                // Do Nothing - Required method
            }
        });

        this.btnArgEdit.setEnabled(false);
        this.btnArgEdit.setLayoutData(gd);
        /* Create "Remove" Button */
        gd = new GridData();
        gd.horizontalSpan = 2;
        gd.verticalSpan = 1;
        gd.widthHint = 60;
        gd.verticalAlignment = GridData.BEGINNING;
        this.btnArgDel = toolkit.createButton(client, Messages.getString("JsdlEditor_RemoveButton"), //$NON-NLS-1$
                SWT.PUSH);
        this.btnArgDel.setEnabled(false);
        this.btnArgDel.addSelectionListener(new SelectionListener() {

            public void widgetSelected(final SelectionEvent event) {
                performDelete(PosixApplicationSection.this.argumentViewer);
            }

            public void widgetDefaultSelected(final SelectionEvent event) {
                // Do Nothing - Required method
            }
        });

        this.btnArgDel.setLayoutData(gd);

        /* ============================= Input Widget =========================== */
        gd = new GridData();
        gd.horizontalSpan = 1;
        this.lblInput = toolkit.createLabel(client, Messages.getString("JobApplicationPage_Input")); //$NON-NLS-1$
        this.lblInput.setLayoutData(gd);
        gd = new GridData();
        gd.verticalAlignment = GridData.FILL;
        gd.horizontalSpan = 3;
        gd.widthHint = 330;
        this.txtInput = toolkit.createText(client, "", SWT.NONE); //$NON-NLS-1$

        this.txtInput.addModifyListener(new ModifyListener() {
            FileNameType fileName = null;

            public void modifyText(final ModifyEvent e) {

                checkPosixApplicationElement();
                if (!PosixApplicationSection.this.txtInput.getText().equals(EMPTY_STRING)) {
                    if (null == this.fileName) {
                        this.fileName = PosixFactory.eINSTANCE.createFileNameType();
                    }
                    this.fileName.setValue(PosixApplicationSection.this.txtInput.getText());
                    this.fileName = (FileNameType) checkProxy(this.fileName);
                    PosixApplicationSection.this.posixApplicationType.setInput(this.fileName);
                } else {
                    if (null != this.fileName) {
                        this.fileName = (FileNameType) checkProxy(this.fileName);
                        this.fileName = null;
                    }
                    if (null != PosixApplicationSection.this.posixApplicationType.getInput()) {
                        PosixApplicationSection.this.posixApplicationType.setInput(null);
                    }
                }
                contentChanged();

            }
        });

        this.txtInput.setLayoutData(gd);

        /* ============================= Output Widget =========================== */
        gd = new GridData();
        this.lblOutput = toolkit.createLabel(client, Messages.getString("JobApplicationPage_Output")); //$NON-NLS-1$
        this.lblOutput.setLayoutData(gd);
        this.txtOutput = toolkit.createText(client, "", SWT.NONE); //$NON-NLS-1$
        this.txtOutput.addModifyListener(new ModifyListener() {
            FileNameType fileName = null;

            public void modifyText(final ModifyEvent e) {
                checkPosixApplicationElement();
                if (!PosixApplicationSection.this.txtOutput.getText().equals(EMPTY_STRING)) {
                    if (null == this.fileName) {
                        this.fileName = PosixFactory.eINSTANCE.createFileNameType();
                    }
                    this.fileName.setValue(PosixApplicationSection.this.txtOutput.getText());
                    this.fileName = (FileNameType) checkProxy(this.fileName);
                    PosixApplicationSection.this.posixApplicationType.setOutput(this.fileName);
                } else {
                    if (null != this.fileName) {
                        this.fileName = (FileNameType) checkProxy(this.fileName);
                        this.fileName = null;
                    }
                    if (null != PosixApplicationSection.this.posixApplicationType.getOutput()) {
                        PosixApplicationSection.this.posixApplicationType.setOutput(null);
                    }
                }
                contentChanged();

            }
        });

        gd = new GridData();
        gd.verticalAlignment = GridData.FILL;
        gd.horizontalSpan = 3;
        gd.widthHint = 330;
        this.txtOutput.setLayoutData(gd);

        /* ============================= Error Widget =========================== */
        gd = new GridData();
        this.lblError = toolkit.createLabel(client, Messages.getString("JobApplicationPage_Error")); //$NON-NLS-1$
        this.lblError.setLayoutData(gd);
        gd = new GridData();
        gd.verticalAlignment = GridData.FILL;
        gd.horizontalSpan = 3;
        gd.widthHint = 330;
        this.txtError = toolkit.createText(client, "", SWT.NONE); //$NON-NLS-1$
        this.txtError.addModifyListener(new ModifyListener() {
            FileNameType fileName = null;

            public void modifyText(final ModifyEvent e) {
                checkPosixApplicationElement();
                if (!PosixApplicationSection.this.txtError.getText().equals(EMPTY_STRING)) {
                    if (null == this.fileName) {
                        this.fileName = PosixFactory.eINSTANCE.createFileNameType();
                    }
                    this.fileName.setValue(PosixApplicationSection.this.txtError.getText());
                    this.fileName = (FileNameType) checkProxy(this.fileName);
                    PosixApplicationSection.this.posixApplicationType.setError(this.fileName);
                } else {
                    if (null != this.fileName) {
                        this.fileName = (FileNameType) checkProxy(this.fileName);
                        this.fileName = null;
                    }
                    if (null != PosixApplicationSection.this.posixApplicationType.getError()) {
                        PosixApplicationSection.this.posixApplicationType.setError(null);
                    }
                }
                contentChanged();

            }
        });

        this.txtError.setLayoutData(gd);

        /* ======================= Environment Widget =========================== */
        gd = new GridData();
        gd.verticalSpan = 2;
        gd.horizontalSpan = 1;
        gd.verticalAlignment = GridData.BEGINNING;
        this.lblEnvironment = toolkit.createLabel(client, Messages.getString("JobApplicationPage_Environment")); //$NON-NLS-1$
        this.lblEnvironment.setLayoutData(gd);
        gd = new GridData();
        gd.horizontalAlignment = GridData.FILL;
        gd.verticalAlignment = GridData.FILL;
        gd.verticalSpan = 3;
        gd.horizontalSpan = 1;
        gd.widthHint = 250;
        gd.heightHint = WIDGET_HEIGHT;
        this.environmentViewer = new TableViewer(client, SWT.BORDER | SWT.FULL_SELECTION);
        this.tblEnvironment = this.environmentViewer.getTable();
        this.tblEnvironment.setHeaderVisible(true);
        this.environmentViewer.setContentProvider(new FeatureContentProvider());
        this.environmentViewer.setLabelProvider(new FeatureLabelProvider());
        this.column = new TableColumn(this.tblEnvironment, SWT.NONE);
        this.column.setText("Name"); //$NON-NLS-1$
        this.column.setWidth(60);
        this.column = new TableColumn(this.tblEnvironment, SWT.NONE);
        this.column.setText("File System Name"); //$NON-NLS-1$
        this.column.setWidth(130);
        this.column = new TableColumn(this.tblEnvironment, SWT.NONE);
        this.column.setText("Value"); //$NON-NLS-1$
        this.column.setWidth(60);

        this.environmentViewer.addSelectionChangedListener(new ISelectionChangedListener() {

            public void selectionChanged(final SelectionChangedEvent event) {
                updateButtons((TableViewer) event.getSource());
            }
        });
        this.tblEnvironment.setData(FormToolkit.KEY_DRAW_BORDER);
        this.tblEnvironment.setLayoutData(gd);

        /* Create "Add" Button */
        gd = new GridData();
        gd.horizontalSpan = 2;
        gd.verticalSpan = 1;
        gd.widthHint = 60;

        this.btnEnVarAdd = toolkit.createButton(client, Messages.getString("JsdlEditor_AddButton"), //$NON-NLS-1$
                SWT.BUTTON1);

        this.btnEnVarAdd.addSelectionListener(new SelectionListener() {

            public void widgetSelected(final SelectionEvent event) {
                handleEnvironmentVar(Messages.getString("JobApplicationPage_EnvironmentDialog"), //$NON-NLS-1$
                        (Button) event.getSource());

                addNewEnvVariable(PosixApplicationSection.this.environmentViewer,
                        PosixApplicationSection.this.value);
            }

            public void widgetDefaultSelected(final SelectionEvent event) {
                // Do Nothing - Required method
            }
        });

        this.btnEnVarAdd.setLayoutData(gd);
        /* Create "Edit" Button */
        gd = new GridData();
        gd.horizontalSpan = 2;
        gd.verticalSpan = 1;
        gd.widthHint = 60;
        this.btnEnVarEdit = toolkit.createButton(client, Messages.getString("JsdlEditor_EditButton"), //$NON-NLS-1$
                SWT.PUSH);

        this.btnEnVarEdit.addSelectionListener(new SelectionListener() {

            public void widgetSelected(final SelectionEvent event) {
                handleEnvironmentVar(Messages.getString("JobApplicationPage_EnvironmentDialog"), //$NON-NLS-1$
                        (Button) event.getSource());

                performEdit(PosixApplicationSection.this.environmentViewer, PosixApplicationSection.this.value);

            }

            public void widgetDefaultSelected(final SelectionEvent event) {
                // Do Nothing - Required method
            }
        });

        this.btnEnVarEdit.setEnabled(false);
        this.btnEnVarEdit.setLayoutData(gd);
        /* Create "Remove" Button */
        gd = new GridData();
        gd.horizontalSpan = 2;
        gd.verticalSpan = 1;
        gd.widthHint = 60;
        gd.verticalAlignment = GridData.BEGINNING;
        this.btnEnVarDel = toolkit.createButton(client, Messages.getString("JsdlEditor_RemoveButton"), //$NON-NLS-1$
                SWT.PUSH);
        this.btnEnVarDel.setEnabled(false);
        this.btnEnVarDel.addSelectionListener(new SelectionListener() {

            public void widgetSelected(final SelectionEvent event) {
                performDelete(PosixApplicationSection.this.environmentViewer);
            }

            public void widgetDefaultSelected(final SelectionEvent event) {
                // Do Nothing - Required method
            }
        });
        this.btnEnVarDel.setLayoutData(gd);
        toolkit.paintBordersFor(client);

    }

    protected void updateButtons(final TableViewer tableViewer) {

        ISelection selection = tableViewer.getSelection();
        boolean selectionAvailable = !selection.isEmpty();

        if (tableViewer == this.argumentViewer) {

            this.btnArgAdd.setEnabled(true);
            this.btnArgEdit.setEnabled(selectionAvailable);
            this.btnArgDel.setEnabled(selectionAvailable);

        } else {

            this.btnEnVarAdd.setEnabled(true);
            this.btnEnVarEdit.setEnabled(selectionAvailable);
            this.btnEnVarDel.setEnabled(selectionAvailable);

        } // end else

    } // End updateButtons

    protected void handleArguments(final String dialogTitle, final Button button) {

        this.value = null;

        ArgumentsDialog dialog = new ArgumentsDialog(this.containerComposite.getShell(), dialogTitle,
                this.jobDefinitionType);

        if (button == this.btnArgEdit) {
            IStructuredSelection structSelection = (IStructuredSelection) this.argumentViewer.getSelection();
            ArgumentType argType = (ArgumentType) structSelection.getFirstElement();

            dialog.setInput(argType);

        }

        if (dialog.open() != Window.OK) {
            return;
        } // end if ( dialog.open() )

        this.value = dialog.getValue();

    } // end void handleArguments

    protected void handleEnvironmentVar(final String dialogTitle, final Button button) {

        this.value = null;

        EnvironmentVarDialog dialog = new EnvironmentVarDialog(this.containerComposite.getShell(), dialogTitle,
                this.jobDefinitionType);

        if (button == this.btnEnVarEdit) {
            IStructuredSelection structSelection = (IStructuredSelection) this.environmentViewer.getSelection();
            EnvironmentType envType = (EnvironmentType) structSelection.getFirstElement();

            dialog.setInput(envType);

        }

        if (dialog.open() != Window.OK) {
            return;
        } // end if ( dialog.open() )

        this.value = dialog.getValue();

    } // end void handleArguments

    //  protected void contentChanged() {
    //    
    //    if( this.isNotifyAllowed ) {
    //      fireNotifyChanged( null );
    //    }
    //  }

    /**
     * @param jobDefinition The JSDL Job Definition element.
     */
    public void setInput(final JobDefinitionType jobDefinition) {

        this.adapterRefreshed = true;
        if (null != jobDefinition) {
            this.jobDefinitionType = jobDefinition;

            TreeIterator<EObject> iterator = this.jobDefinitionType.eAllContents();

            while (iterator.hasNext()) {

                EObject testType = iterator.next();

                if (testType instanceof JobDescriptionType) {
                    this.jobDescriptionType = (JobDescriptionType) testType;
                } else if (testType instanceof ApplicationType) {
                    this.applicationType = (ApplicationType) testType;
                    if (false == this.applicationType.eAdapters().contains(this)) {
                        this.applicationType.eAdapters().add(this);
                    }

                } else if (testType instanceof POSIXApplicationType) {
                    this.posixApplicationType = (POSIXApplicationType) testType;
                    if (false == this.posixApplicationType.eAdapters().contains(this)) {
                        this.posixApplicationType.eAdapters().add(this);
                    }

                }

            }

            fillFields();
        }

    }

    /* 
     * If the POSIX Application Element is set, check for any possible contents which may
     * be set. If none of the above are true, then delete the Posix Application elemet from it's
     * container (ApplicationType).
     */
    @Override
    public void notifyChanged(final Notification msg) {

        //    Enable Line Below to debug event notifications from JSDL model types.
        //    System.out.println("Message: " + msg.toString());
        if (this.isNotifyAllowed) {
            if (null != this.posixApplicationType && this.posixApplicationType.eContents().size() == 0) {
                EcoreUtil.remove(this.posixApplicationType);
                this.posixApplicationType = null;
            }
        }

    }

    private void fillFields() {

        this.isNotifyAllowed = false;

        if (null != this.posixApplicationType) {
            if (null != this.posixApplicationType.getName()) {
                this.txtPosixName.setText(this.posixApplicationType.getName());
            } else {
                this.txtPosixName.setText(EMPTY_STRING);
            }
            if (null != this.posixApplicationType.getExecutable()) {
                this.txtExecutable.setText(this.posixApplicationType.getExecutable().getValue());
            } else {
                this.txtExecutable.setText(EMPTY_STRING);
            }
            if (null != this.posixApplicationType.getInput()) {
                this.txtInput.setText(this.posixApplicationType.getInput().getValue());
            } else {
                this.txtInput.setText(EMPTY_STRING);
            }
            if (null != this.posixApplicationType.getOutput()) {
                this.txtOutput.setText(this.posixApplicationType.getOutput().getValue());
            } else {
                this.txtOutput.setText(EMPTY_STRING);
            }
            if (null != this.posixApplicationType.getError()) {
                this.txtError.setText(this.posixApplicationType.getError().getValue());
            } else {
                this.txtError.setText(EMPTY_STRING);
            }

            this.argumentViewer.setInput(this.posixApplicationType.getArgument());
            this.environmentViewer.setInput(this.posixApplicationType.getEnvironment());

        }
        this.isNotifyAllowed = true;

        if (this.adapterRefreshed) {
            this.adapterRefreshed = false;
        }

    }

    /*
     * Check if the EObject is lazy loaded.
     */
    protected EObject checkProxy(final EObject refEObject) {

        EObject eObject = refEObject;

        if ((eObject != null) && (eObject.eIsProxy())) {

            eObject = EcoreUtil.resolve(eObject, this.posixApplicationType);
        }

        return eObject;

    }

    protected void checkApplicationElement() {

        EStructuralFeature eStructuralFeature = this.jobDescriptionType.eClass()
                .getEStructuralFeature(JsdlPackage.JOB_DESCRIPTION_TYPE__APPLICATION);

        /*
         * Check if the Application element is not set. If not set then set it to its 
         * container (JobDescriptionType).
         */
        if (!this.jobDescriptionType.eIsSet(eStructuralFeature)) {
            if (null == this.applicationType) {
                this.applicationType = JsdlFactory.eINSTANCE.createApplicationType();
            }
            this.jobDescriptionType.eSet(eStructuralFeature, this.applicationType);
        }
    }

    protected void checkPosixApplicationElement() {

        EStructuralFeature eStructuralFeature = this.documentRoot.eClass()
                .getEStructuralFeature(PosixPackage.DOCUMENT_ROOT__POSIX_APPLICATION);

        checkApplicationElement();

        if (!this.applicationType.eIsSet(eStructuralFeature)) {
            if (null == this.posixApplicationType) {
                this.posixApplicationType = PosixFactory.eINSTANCE.createPOSIXApplicationType();
                Collection<POSIXApplicationType> collection = new ArrayList<POSIXApplicationType>();
                collection.add(this.posixApplicationType);
                this.applicationType = (ApplicationType) checkProxy(this.applicationType);
                this.applicationType.eSet(eStructuralFeature, collection);
            }

        }
    }

    /**
     * Add a new Argument element to the associated Table Viewers input.
     * 
     * @param tableViewer The {@link TableViewer} in which the new element will be added.
     * @param innerValue The new element that will be added.
     */
    @SuppressWarnings("unchecked")
    protected void addNewArgument(final TableViewer tableViewer, final Object innerValue) {

        boolean elementExists = false;
        String newElement;

        if (innerValue == null) {
            return;
        }

        EList<ArgumentType> newInputList = (EList<ArgumentType>) tableViewer.getInput();

        if (newInputList == null) {
            newInputList = new BasicEList<ArgumentType>();
        }

        /* Check if PosixApplication Element Exists */
        checkPosixApplicationElement();

        this.argumentType = PosixFactory.eINSTANCE.createArgumentType();
        this.argumentType = (ArgumentType) innerValue;
        newElement = this.argumentType.getValue();

        Iterator<ArgumentType> iter = newInputList.iterator();

        while (iter.hasNext() && !elementExists) {
            elementExists = iter.next().getValue().equals(newElement);
        }

        if (!elementExists) {
            newInputList.add(this.argumentType);

            /* Add the Argument to PosixApplication */

            this.applicationType = (ApplicationType) checkProxy(this.applicationType);
            this.posixApplicationType = (POSIXApplicationType) checkProxy(this.posixApplicationType);
            this.argumentType = (ArgumentType) checkProxy(this.argumentType);
            this.posixApplicationType.getArgument().addAll(newInputList);

            tableViewer.setInput(this.posixApplicationType.getArgument());

            tableViewer.refresh();
            contentChanged();

        } else {
            MessageDialog.openError(tableViewer.getControl().getShell(),
                    Messages.getString("Arguments_DuplicateEntryDialog_Title"), //$NON-NLS-1$
                    Messages.getString("Arguments_New_DuplicateEntryDialog_Message")); //$NON-NLS-1$
        }
    }

    /**
     * Add a new Argument element to the associated Table Viewers input.
     * 
     * @param tableViewer The {@link TableViewer} in which the new element will be added.
     * @param innerValue The new element that will be added.
     */
    @SuppressWarnings("unchecked")
    protected void addNewEnvVariable(final TableViewer tableViewer, final Object innerValue) {

        boolean elementExists = false;
        String newElement;

        if (innerValue == null) {
            return;
        }

        EList<EnvironmentType> newInputList = (EList<EnvironmentType>) tableViewer.getInput();

        if (newInputList == null) {
            newInputList = new BasicEList<EnvironmentType>();
        }

        /* Check if PosixApplication Element Exists */
        checkPosixApplicationElement();

        this.environmentType = PosixFactory.eINSTANCE.createEnvironmentType();
        this.environmentType = (EnvironmentType) innerValue;
        newElement = this.environmentType.getValue();

        Iterator<EnvironmentType> iter = newInputList.iterator();

        while (iter.hasNext() && !elementExists) {
            elementExists = iter.next().getValue().equals(newElement);
        }

        if (!elementExists) {
            newInputList.add(this.environmentType);

            /* Add the Argument to PosixApplication */
            this.posixApplicationType.getEnvironment().addAll(newInputList);
            tableViewer.setInput(this.posixApplicationType.getEnvironment());

            tableViewer.refresh();
            contentChanged();

        } else {
            MessageDialog.openError(tableViewer.getControl().getShell(),
                    Messages.getString("EnvironmentalVar_DuplicateEntryDialog_Title"), //$NON-NLS-1$
                    Messages.getString("EnvironmentalVar_New_DuplicateEntryDialog_Message")); //$NON-NLS-1$
        }
        newInputList = null;
    }

    protected void deleteElement(final int featureID) {
        EStructuralFeature eStructuralFeature = this.posixApplicationType.eClass().getEStructuralFeature(featureID);
        EcoreUtil.remove(eStructuralFeature);

    }

    protected void performDelete(final TableViewer viewer) {

        IStructuredSelection structSelection = (IStructuredSelection) viewer.getSelection();

        Iterator<?> it = structSelection.iterator();

        /*
         * Iterate over the selections and delete them from the model.
         */
        while (it.hasNext()) {

            Object feature = it.next();

            if (feature instanceof ArgumentType) {

                ArgumentType argument = (ArgumentType) feature;

                try {
                    EcoreUtil.remove(argument);

                } catch (Exception e) {
                    Activator.logException(e);
                }

            } //end ArgumentType
            else if (feature instanceof EnvironmentType) {
                EnvironmentType environment = (EnvironmentType) feature;

                try {
                    EcoreUtil.remove(environment);
                    viewer.setInput(this.posixApplicationType.getEnvironment());
                } catch (Exception e) {
                    Activator.logException(e);
                }

            } // end EnvironmentType
        }

        viewer.refresh();
        contentChanged();

    } // End void performDelete()

    /**
     * Edit an element that appears in a Table Viewers.
     * 
     * @param tableViewer The {@link TableViewer} in which the new element appears.
     * @param innerValue The new value of the element.
     */
    @SuppressWarnings("unchecked")
    public void performEdit(final TableViewer tableViewer, final Object innerValue) {

        boolean elementExists = false;
        String newElement;

        int featureID;

        if (innerValue == null) {
            return;
        }

        EStructuralFeature eStructuralFeature;

        /*
         * Get the TableViewer Selection
         */
        IStructuredSelection structSelection = (IStructuredSelection) tableViewer.getSelection();

        /* If the selection is not null then Change the selected element */
        if (structSelection != null) {

            Object feature = structSelection.getFirstElement();

            if (tableViewer == this.argumentViewer) {

                EList<ArgumentType> newInputList = (EList<ArgumentType>) tableViewer.getInput();

                if (newInputList == null) {
                    newInputList = new BasicEList<ArgumentType>();
                }

                Iterator<ArgumentType> iter = newInputList.iterator();

                featureID = PosixPackage.POSIX_APPLICATION_TYPE__ARGUMENT;

                eStructuralFeature = this.posixApplicationType.eClass().getEStructuralFeature(featureID);

                /* Get the Index of the Element that needs to be changed */
                int index = ((java.util.List<Object>) this.posixApplicationType.eGet(eStructuralFeature))
                        .indexOf(feature);

                /* 
                 * Create a new Argument Type EObject with the new values that will 
                 * substitute the old EObject.
                 */
                this.argumentType = PosixFactory.eINSTANCE.createArgumentType();
                this.argumentType = (ArgumentType) innerValue;
                newElement = this.argumentType.getValue();

                /* Change the element. The element is located through it's index position
                 *   in the list.
                 */
                while (iter.hasNext() && !elementExists) {

                    ArgumentType tempArgumentType = iter.next();
                    if ((tempArgumentType.getValue().equals(newElement)) && (!tempArgumentType.equals(feature))) {
                        elementExists = true;
                    }
                }

                if (!elementExists) {

                    ((java.util.List<Object>) this.posixApplicationType.eGet(eStructuralFeature)).set(index,
                            this.argumentType);
                    contentChanged();

                } else {
                    MessageDialog.openError(tableViewer.getControl().getShell(),
                            Messages.getString("Arguments_DuplicateEntryDialog_Title"), //$NON-NLS-1$
                            Messages.getString("Arguments_New_DuplicateEntryDialog_Message")); //$NON-NLS-1$
                }

            } else {

                EList<EnvironmentType> newInputList = (EList<EnvironmentType>) tableViewer.getInput();

                if (newInputList == null) {
                    newInputList = new BasicEList<EnvironmentType>();
                }

                Iterator<EnvironmentType> iter = newInputList.iterator();

                featureID = PosixPackage.POSIX_APPLICATION_TYPE__ENVIRONMENT;

                eStructuralFeature = this.posixApplicationType.eClass().getEStructuralFeature(featureID);

                /* Get the Index of the Element that needs to be changed */
                int index = ((java.util.List<Object>) this.posixApplicationType.eGet(eStructuralFeature))
                        .indexOf(feature);

                /* 
                 * Create a new Environment Type EObject with the new values that will 
                 * substitute the old EObject.
                 */
                this.environmentType = PosixFactory.eINSTANCE.createEnvironmentType();
                this.environmentType = (EnvironmentType) innerValue;
                newElement = this.environmentType.getName();

                /* Change the element. The element is located through it's index position
                 *   in the list.
                 */
                while (iter.hasNext() && !elementExists) {

                    EnvironmentType tempEnvironmentType = iter.next();
                    if ((tempEnvironmentType.getName().equals(newElement))
                            && (!tempEnvironmentType.equals(feature))) {
                        elementExists = true;
                    }
                }

                if (!elementExists) {

                    ((java.util.List<Object>) this.posixApplicationType.eGet(eStructuralFeature)).set(index,
                            this.environmentType);
                    contentChanged();

                } else {
                    MessageDialog.openError(tableViewer.getControl().getShell(),
                            Messages.getString("EnvironmentalVar_DuplicateEntryDialog_Title"), //$NON-NLS-1$
                            Messages.getString("EnvironmentalVar_New_DuplicateEntryDialog_Message")); //$NON-NLS-1$
                }

            }

            feature = null;
            eStructuralFeature = null;
            tableViewer.refresh();

        }
    }

}