eu.geclipse.jsdl.ui.internal.dialogs.CandidateHostsDialog.java Source code

Java tutorial

Introduction

Here is the source code for eu.geclipse.jsdl.ui.internal.dialogs.CandidateHostsDialog.java

Source

/******************************************************************************
 * Copyright (c) 2007 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.dialogs;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import eu.geclipse.core.model.IGridComputing;
import eu.geclipse.core.model.IGridElement;
import eu.geclipse.core.model.IGridResource;
import eu.geclipse.core.model.impl.GridResourceCategoryFactory;
import eu.geclipse.jsdl.JSDLJobDescription;
import eu.geclipse.jsdl.ui.internal.Activator;
import eu.geclipse.jsdl.ui.internal.dialogs.MultipleInputDialog.Validator;
import eu.geclipse.jsdl.ui.providers.FeatureContentProvider;
import eu.geclipse.jsdl.ui.providers.FeatureLabelProvider;

/**
 * 
 * Create a new <code>CandidateHostsDialog</code>. The dialog consists of 
 * a {@link CheckboxTableViewer} that displays all Computing
 * Elements that support a specific Virtual Organization (VO). 
 * This VO is the same as the VO of the Grid Project the JSDL file belongs. 
 */
public class CandidateHostsDialog extends Dialog {

    protected CheckboxTableViewer hostsViewer = null;
    protected Composite panel = null;
    protected String title = null;
    protected List<Validator> validators = new ArrayList<Validator>();
    private IGridElement gridElement = null;
    private JSDLJobDescription jobDescription = null;
    private List<String> existingHostsInViewer = new ArrayList<String>();
    private String[] selectedHosts = null;

    /**
     * <code>CandidateHostsDialog</code> class constructor. Create a new dialog with
     * the following:
     * 
     * @param shell The Parent shell.
     * @param title The dialog title.
     */
    public CandidateHostsDialog(final Shell shell, final String title) {

        super(shell);
        this.title = title;
        setShellStyle(getShellStyle() | SWT.RESIZE | SWT.APPLICATION_MODAL);

    } // end Class Constructor

    @Override
    protected void configureShell(final Shell shell) {

        shell.setSize(600, 300);

        super.configureShell(shell);
        if (this.title != null) {
            shell.setText(this.title);
        }
    }

    @Override
    protected Control createButtonBar(final Composite parent) {

        Control btnBar = super.createButtonBar(parent);
        getButton(IDialogConstants.OK_ID).setEnabled(false);
        return btnBar;

    }

    private void enableOKButton(final boolean value) {

        getButton(IDialogConstants.OK_ID).setEnabled(value);

    } // end void enableOKButton()

    @Override
    protected Control createDialogArea(final Composite parent) {

        Composite container = (Composite) super.createDialogArea(parent);
        GridData gd = new GridData(GridData.FILL_BOTH);
        container.setLayout(new GridLayout(1, false));
        gd.grabExcessHorizontalSpace = true;
        gd.grabExcessVerticalSpace = true;
        container.setLayoutData(gd);
        this.panel = new Composite(container, SWT.NONE);
        GridLayout layout = new GridLayout(1, false);
        this.panel.setLayout(layout);
        gd.grabExcessHorizontalSpace = true;
        gd.grabExcessVerticalSpace = true;
        this.panel.setLayoutData(gd);

        Label label = new Label(this.panel, SWT.NONE);
        label.setText(Messages.getString("ResourcesPage_NewHostsDialogDescr")); //$NON-NLS-1$
        label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));

        gd = new GridData(GridData.FILL_BOTH);
        gd.grabExcessHorizontalSpace = true;
        gd.grabExcessVerticalSpace = true;
        gd.verticalSpan = 3;
        gd.horizontalSpan = 2;
        gd.widthHint = 300;
        gd.heightHint = 100;

        Table table = new Table(this.panel, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.CHECK);
        table.setLayoutData(gd);

        this.hostsViewer = new CheckboxTableViewer(table);

        this.hostsViewer.setContentProvider(new FeatureContentProvider());
        FeatureLabelProvider hostsLabelProvider = new FeatureLabelProvider();
        hostsLabelProvider.setStringType(FeatureLabelProvider.STRING_TYPE_CANDIDATE_HOSTS);
        this.hostsViewer.setLabelProvider(hostsLabelProvider);

        this.hostsViewer.addCheckStateListener(new ICheckStateListener() {

            public void checkStateChanged(final CheckStateChangedEvent event) {
                setValue(CandidateHostsDialog.this.hostsViewer.getCheckedElements());

            }

        });

        try {

            Collection<String> computingElements = new ArrayList<String>();

            IGridResource[] gridComputings = this.jobDescription.getProject().getVO().getInfoService()
                    .fetchResources(this.jobDescription.getProject().getVO(),
                            this.jobDescription.getProject().getVO(),
                            GridResourceCategoryFactory.getCategory(GridResourceCategoryFactory.ID_COMPUTING),
                            false, IGridComputing.class, new NullProgressMonitor());

            //      IGridComputing[] gridComputings =  this.jobDescription.getProject().getVO()
            //                                                                            .getComputing( new NullProgressMonitor() ) ;
            String hostnameOnly;

            for (int i = 0; i < gridComputings.length; i++) {

                /* Get only the CE host name substring
                 * 
                 * Start from (last occurrence of empty space + 1) to remove the "CE @ " prefix.
                 * Finish to the indexOf ":" character to remove any trailing characters.
                 * 
                 */
                if (gridComputings[i].getName().indexOf(":") != -1) { //$NON-NLS-1$
                    hostnameOnly = gridComputings[i].getName()
                            .substring(gridComputings[i].getName().lastIndexOf(" ") + 1 //$NON-NLS-1$
                                    , gridComputings[i].getName().indexOf(":")); //$NON-NLS-1$

                    /*
                     * If there are elements in the Candidate Hosts Table Viewer then
                     */
                    if (this.existingHostsInViewer != null) {
                        /* check to see if the host name is already included. If not add it.*/
                        if (!this.existingHostsInViewer.contains(hostnameOnly)) {
                            /* Check if the host name appears twice from the InfoSystem and if it does do not
                             * include it twice.
                             */
                            if (!computingElements.contains(hostnameOnly))
                                computingElements.add(hostnameOnly);
                        }
                    } else {
                        /* Check if the host name appears twice from the InfoSystem and if it does do not
                         * include it twice.
                         */
                        if (!computingElements.contains(hostnameOnly))
                            computingElements.add(hostnameOnly);
                    }
                } // end 
            }
            this.hostsViewer.setInput(computingElements);
        } catch (Exception e) {
            Activator.logException(e);
        }

        Dialog.applyDialogFont(container);
        return parent;

    } // end Control createDialogArea()

    @Override
    protected void okPressed() {

        super.okPressed();
    }

    @Override
    public int open() {

        applyDialogFont(this.panel);

        return super.open();
    }

    private String getDialogSettingsSectionName() {
        return IDebugUIConstants.PLUGIN_ID + ".CANDIDATE_HOSTS_DIALOG"; //$NON-NLS-1$
    }

    @Override
    protected IDialogSettings getDialogBoundsSettings() {

        IDialogSettings settings = Activator.getDefault().getDialogSettings();
        IDialogSettings section = settings.getSection(getDialogSettingsSectionName());
        if (section == null) {

            section = settings.addNewSection(getDialogSettingsSectionName());
        }
        return section;

    } // end IDialogSetting getDialogBoundsSettings()

    /**
     * This method specifies the input the for {@link CheckboxTableViewer} in the 
     * dialog. The input is of type {@link IGridElement} and is obtained by getting
     * the input file of the JSDL editor.
     *  
     * @param input The IGridElement obtained from the JSDL editor.
     */
    public void setDialogInput(final IGridElement input) {
        this.gridElement = input;
        getJobDescription(this.gridElement);
    }

    /**
     * This is a optional method that allows to filter the Computing Elements shown
     * in the {@link CheckboxTableViewer} of the dialog. Computing Elements that
     * already are included in the Candidate Hosts {@link TableViewer} of the JSDL 
     * Resources page are not shown. 
     * 
     * @param input The Input of the Candidates Hosts {@link TableViewer} 
     */
    @SuppressWarnings("unchecked")
    public void setExistingCandidateHosts(final Object input) {

        this.existingHostsInViewer = (List<String>) input;

    }

    protected void setValue(final Object[] value) {

        Object[] checkedElements = value;
        if (checkedElements != null && checkedElements.length > 0) {
            enableOKButton(true);
            this.selectedHosts = new String[checkedElements.length];
            for (int i = 0; i < checkedElements.length; i++) {
                this.selectedHosts[i] = (String) checkedElements[i];
            }
        } else {
            enableOKButton(false);
        }

    } // end void setValue()

    /**
     * Get's the selected Candidate Hosts in the Dialog.
     * 
     * @return The selected Candidate Host(s).
     */
    public Object[] getValue() {

        String[] returnHosts = new String[this.selectedHosts.length];

        System.arraycopy(this.selectedHosts, 0, returnHosts, 0, this.selectedHosts.length);

        return returnHosts;
    }

    private JSDLJobDescription getJobDescription(final IGridElement input) {

        if (input instanceof JSDLJobDescription) {

            this.jobDescription = (JSDLJobDescription) input;
        } else {
            this.jobDescription = null;
        }

        return this.jobDescription;

    }

} // end Class