org.eclipse.bpmn2.modeler.ui.property.dialogs.DefaultSchemaImportDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.bpmn2.modeler.ui.property.dialogs.DefaultSchemaImportDialog.java

Source

/*******************************************************************************
 * Copyright (c) 2011, 2012 Red Hat, Inc.
 *  All rights reserved.
 * This program is made available under the terms of the
 * Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 * Red Hat, Inc. - initial API and implementation
 *
 * @author Bob Brodt
 ******************************************************************************/

package org.eclipse.bpmn2.modeler.ui.property.dialogs;

import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.bpmn2.DocumentRoot;
import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerResourceSetImpl;
import org.eclipse.bpmn2.modeler.core.utils.JavaProjectClassLoader;
import org.eclipse.bpmn2.modeler.core.utils.ModelUtil;
import org.eclipse.bpmn2.modeler.ui.Activator;
import org.eclipse.bpmn2.modeler.ui.Messages;
import org.eclipse.bpmn2.modeler.ui.editor.BPMN2Editor;
import org.eclipse.bpmn2.modeler.ui.property.providers.BPMN2DefinitionsTreeContentProvider;
import org.eclipse.bpmn2.modeler.ui.property.providers.JavaTreeContentProvider;
import org.eclipse.bpmn2.modeler.ui.property.providers.ModelTreeLabelProvider;
import org.eclipse.bpmn2.modeler.ui.property.providers.ServiceTreeContentProvider;
import org.eclipse.bpmn2.modeler.ui.property.providers.TreeNode;
import org.eclipse.bpmn2.modeler.ui.property.providers.VariableTypeTreeContentProvider;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
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.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.dialogs.SelectionStatusDialog;
import org.eclipse.wst.wsdl.Definition;
import org.eclipse.xsd.XSDSchema;

/**
 * Browse for complex/simple types available in the process and choose that
 * simple type.
 * 
 */

public class DefaultSchemaImportDialog extends SelectionStatusDialog {

    // Button id for browsing the workspace
    protected final static int BID_BROWSE_WORKSPACE = IDialogConstants.CLIENT_ID + 1;
    // Button id for browsing URLs
    protected final static int BID_BROWSE_URL = IDialogConstants.CLIENT_ID + 2;
    // Button id for browse files
    protected final static int BID_BROWSE_FILE = IDialogConstants.CLIENT_ID + 3;
    // Browse button id
    protected static final int BID_BROWSE = IDialogConstants.CLIENT_ID + 4;
    // Button id for import XML file types
    protected static final int BID_IMPORT_XML = IDialogConstants.CLIENT_ID + 6;
    // Button id for import XSD file types
    protected static final int BID_IMPORT_XSD = IDialogConstants.CLIENT_ID + 7;
    // Button id for import WSDL file types
    protected static final int BID_IMPORT_WSDL = IDialogConstants.CLIENT_ID + 8;
    // Button id for import BPMN 2.0 file types
    protected static final int BID_IMPORT_BPMN2 = IDialogConstants.CLIENT_ID + 9;

    ///////////////////////////////////////////////////////////////////////////////
    // TODO: we may want to use JavaUI.createTypeDialog(...) instead of cluttering
    // up this dialog with java types here...
    ///////////////////////////////////////////////////////////////////////////////
    // Button id for import Java types
    protected static final int BID_IMPORT_JAVA = IDialogConstants.CLIENT_ID + 10;

    // the current import type
    protected int fImportType = BID_IMPORT_XSD;
    // the current import source
    protected int fImportSource = BID_BROWSE_WORKSPACE;
    // the import type setting, remembered in the dialog settings
    protected static final String IMPORT_TYPE = "ImportType"; //$NON-NLS-1$
    // the import source setting, remembered in the dialog settings
    protected static final String IMPORT_SOURCE = "ImportSource"; //$NON-NLS-1$

    protected static final String EMPTY = ""; //$NON-NLS-1$

    protected String[] FILTER_EXTENSIONS;
    protected String[] FILTER_NAMES;
    protected String resourceFilter;
    protected String fResourceKind;

    protected BPMN2Editor bpmn2Editor;
    protected EObject modelObject;
    protected int allowedResourceTypes;

    protected Tree fTree;
    protected TreeViewer fTreeViewer;

    protected Text fLocation;
    protected String fLocationText;
    protected Label fLocationLabel;
    protected Label fStructureLabel;

    protected Composite fLocationComposite;
    protected FileSelectionGroup fResourceComposite;

    protected Text filterText;
    protected String fFilter = ""; //$NON-NLS-1$

    protected Button fBrowseButton;

    protected Group fTypeGroup;

    protected Group fKindGroup;
    protected Composite fKindButtonComposite;

    protected IDialogSettings fSettings;

    protected String fStructureTitle;

    protected ITreeContentProvider fTreeContentProvider;

    protected Object fInput;

    protected Bpmn2ModelerResourceSetImpl fHackedResourceSet;

    long fRunnableStart;
    protected URI fRunnableLoadURI;
    protected Job fLoaderJob;

    protected IPreferenceStore fPrefStore = Activator.getDefault().getPreferenceStore();
    protected Button fBtnResource;

    /**
     * Create a brand new shiny Schema Import Dialog.
     * 
     * @param parent
     */
    public DefaultSchemaImportDialog(Shell parent, int allowedResourceTypes) {

        super(parent);
        setStatusLineAboveButtons(true);
        int shellStyle = getShellStyle();
        setShellStyle(shellStyle | SWT.MAX | SWT.RESIZE);

        fSettings = Activator.getDefault().getDialogSettingsFor(this);

        try {
            fImportSource = fSettings.getInt(IMPORT_SOURCE);
            fImportType = fSettings.getInt(IMPORT_TYPE);
        } catch (java.lang.NumberFormatException nfe) {
            fImportSource = BID_BROWSE_WORKSPACE;
            fImportType = BID_IMPORT_XSD;
        }

        setDialogBoundsSettings(fSettings, getDialogBoundsStrategy());

        this.allowedResourceTypes = allowedResourceTypes;
        if ((allowedResourceTypes & SchemaImportDialog.ALLOW_XSD) == 0) {
            if (fImportType == BID_IMPORT_XML || fImportType == BID_IMPORT_XSD)
                fImportType = 0;
        }
        if ((allowedResourceTypes & SchemaImportDialog.ALLOW_WSDL) == 0) {
            if (fImportType == BID_IMPORT_WSDL)
                fImportType = 0;
        }
        if ((allowedResourceTypes & SchemaImportDialog.ALLOW_BPMN2) == 0) {
            if (fImportType == BID_IMPORT_BPMN2)
                fImportType = 0;
        }
        if ((allowedResourceTypes & SchemaImportDialog.ALLOW_JAVA) == 0) {
            if (fImportType == BID_IMPORT_JAVA)
                fImportType = 0;
        }
        if (fImportType == 0) {
            if ((allowedResourceTypes & SchemaImportDialog.ALLOW_XSD) != 0)
                fImportType = BID_IMPORT_XSD;
            if ((allowedResourceTypes & SchemaImportDialog.ALLOW_WSDL) != 0)
                fImportType = BID_IMPORT_WSDL;
            if ((allowedResourceTypes & SchemaImportDialog.ALLOW_BPMN2) != 0)
                fImportType = BID_IMPORT_BPMN2;
            if ((allowedResourceTypes & SchemaImportDialog.ALLOW_JAVA) != 0)
                fImportType = BID_IMPORT_JAVA;
        }

        if (fImportType == BID_IMPORT_XML)
            configureAsXMLImport();
        else if (fImportType == BID_IMPORT_XSD)
            configureAsSchemaImport();
        else if (fImportType == BID_IMPORT_WSDL)
            configureAsWSDLImport();
        else if (fImportType == BID_IMPORT_BPMN2)
            configureAsBPMN2Import();
        else if (fImportType == BID_IMPORT_JAVA)
            configureAsJavaImport();

        bpmn2Editor = BPMN2Editor.getActiveEditor();
        ResourceSet rs = bpmn2Editor.getResourceSet();
        fHackedResourceSet = ModelUtil.slightlyHackedResourceSet(rs);
    }

    public DefaultSchemaImportDialog(Shell parent) {
        this(parent, -1);
    }

    /**
     * 
     * @see Dialog#createDialogArea(Composite)
     * 
     * @param parent
     *            the parent composite to use
     * @return the composite it created to be used in the dialog area.
     */

    @Override
    public Control createDialogArea(Composite parent) {

        Composite contents = (Composite) super.createDialogArea(parent);

        createImportType(contents);
        createImportLocation(contents);
        createImportStructure(contents);

        buttonPressed(fImportSource, true);
        return contents;
    }

    @Override
    protected void buttonPressed(int buttonId) {
        switch (buttonId) {
        case BID_BROWSE:
            if (fImportSource == BID_BROWSE_URL) {
                String loc = fLocation.getText();
                if (loc.length() > 0) {
                    attemptLoad(loc);
                }
            } else {
                FileDialog fileDialog = new FileDialog(getShell());
                fileDialog.setFilterExtensions(FILTER_EXTENSIONS);
                fileDialog.setFilterNames(FILTER_NAMES);
                String path = fileDialog.open();
                if (path == null) {
                    return;
                }
                fLocation.setText(path);
                attemptLoad(path);
            }
            break;

        case IDialogConstants.CANCEL_ID:
            if (fLoaderJob != null) {
                if (fLoaderJob.getState() == Job.RUNNING) {
                    fLoaderJob.cancel();
                }
            }
            setSelectionResult(null);
            break;
        }

        super.buttonPressed(buttonId);
    }

    protected void buttonPressed(int id, boolean checked) {

        if (id == BID_BROWSE_FILE || id == BID_BROWSE_WORKSPACE || id == BID_BROWSE_URL) {
            if (checked == false) {
                return;
            }

            fImportSource = id;
            fSettings.put(IMPORT_SOURCE, fImportSource);
        } else if (id == BID_IMPORT_XML || id == BID_IMPORT_XSD || id == BID_IMPORT_WSDL || id == BID_IMPORT_BPMN2
                || id == BID_IMPORT_JAVA) {
            if (checked == false) {
                return;
            }
            if (id == BID_IMPORT_XML) {
                configureAsXMLImport();
                setVisibleControl(fKindButtonComposite, true);
            } else if (id == BID_IMPORT_XSD) {
                configureAsSchemaImport();
                setVisibleControl(fKindButtonComposite, true);
            } else if (id == BID_IMPORT_WSDL) {
                configureAsWSDLImport();
                setVisibleControl(fKindButtonComposite, true);
            } else if (id == BID_IMPORT_BPMN2) {
                configureAsBPMN2Import();
                setVisibleControl(fKindButtonComposite, true);
            } else if (id == BID_IMPORT_JAVA) {
                configureAsJavaImport();
                setVisibleControl(fKindButtonComposite, false);
            }

            fImportType = id;
            fSettings.put(IMPORT_TYPE, fImportType);
        }

        setVisibleControl(fResourceComposite,
                fImportSource == BID_BROWSE_WORKSPACE && fImportType != BID_IMPORT_JAVA);
        setVisibleControl(fLocationComposite, fImportSource == BID_BROWSE_URL || fImportSource == BID_BROWSE_FILE
                || fImportType == BID_IMPORT_JAVA);
        if (fImportType == BID_IMPORT_JAVA) {
            setVisibleControl(fKindButtonComposite, false);
            setVisibleControl(fBrowseButton, false);
            fLocationLabel.setText(Messages.SchemaImportDialog_Type_Label);
        } else {
            setVisibleControl(fKindButtonComposite, true);
            setVisibleControl(fBrowseButton, true);
            fLocationLabel.setText(Messages.SchemaImportDialog_Location_Label);
            fBrowseButton.setText(fImportSource == BID_BROWSE_FILE ? Messages.SchemaImportDialog_Browse_Button
                    : Messages.SchemaImportDialog_Load_Button);
        }
        fLocation.setText(EMPTY);
        fTypeGroup.getParent().layout(true);
        fKindGroup.getParent().layout(true);

        markEmptySelection();
    }

    protected void setVisibleControl(Control c, boolean b) {
        Object layoutData = c.getLayoutData();

        if (layoutData instanceof GridData) {
            GridData data = (GridData) layoutData;
            data.exclude = !b;
        }
        c.setVisible(b);
    }

    /**
     * Create the dialog.
     * 
     */

    @Override
    public void create() {
        super.create();
        buttonPressed(fImportSource, true);
    }

    protected Button createRadioButton(Composite parent, String label, int id, boolean checked) {

        Button button = new Button(parent, SWT.RADIO);
        button.setText(label);
        button.setFont(JFaceResources.getDialogFont());
        button.setData(Integer.valueOf(id));
        button.setSelection(checked);

        button.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent event) {
                Button b = (Button) event.widget;
                int bid = ((Integer) b.getData()).intValue();

                buttonPressed(bid, b.getSelection());
            }
        });

        return button;

    }

    protected void createImportType(Composite parent) {
        fTypeGroup = new Group(parent, SWT.SHADOW_ETCHED_IN);
        fTypeGroup.setText(Messages.SchemaImportDialog_Import_Type_Title);
        GridLayout layout = new GridLayout(1, true);
        GridData typeGroupGridData = new GridData();
        typeGroupGridData.grabExcessVerticalSpace = false;
        typeGroupGridData.grabExcessHorizontalSpace = true;
        typeGroupGridData.horizontalAlignment = GridData.FILL;
        typeGroupGridData.verticalAlignment = GridData.FILL;

        fTypeGroup.setLayout(layout);
        fTypeGroup.setLayoutData(typeGroupGridData);

        Composite container = new Composite(fTypeGroup, SWT.NONE);

        layout = new GridLayout();
        layout.makeColumnsEqualWidth = false;
        layout.numColumns = 4;
        container.setLayout(layout);
        GridData data = new GridData();
        data.grabExcessVerticalSpace = false;
        data.grabExcessHorizontalSpace = true;
        data.horizontalAlignment = GridData.FILL;
        data.verticalAlignment = GridData.CENTER;
        container.setLayoutData(data);

        Button button;

        //      button = createRadioButton(control, Messages.SchemaImportDialog_20,
        //            BID_IMPORT_XML, fImportType == BID_IMPORT_XML);
        //      button.setLayoutData(new GridData(SWT.FILL,SWT.FILL,true,true,1,1));
        int buttonCount = 0;
        if ((allowedResourceTypes & SchemaImportDialog.ALLOW_XSD) != 0) {
            button = createRadioButton(container, Messages.SchemaImportDialog_XSD_Button, BID_IMPORT_XSD,
                    fImportType == BID_IMPORT_XSD);
            button.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
            ++buttonCount;
        }

        if ((allowedResourceTypes & SchemaImportDialog.ALLOW_WSDL) != 0) {
            button = createRadioButton(container, Messages.SchemaImportDialog_WSDL_Button, BID_IMPORT_WSDL,
                    fImportType == BID_IMPORT_WSDL);
            button.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
            ++buttonCount;
        }

        if ((allowedResourceTypes & SchemaImportDialog.ALLOW_BPMN2) != 0) {
            button = createRadioButton(container, Messages.SchemaImportDialog_BPMN2_Button, BID_IMPORT_BPMN2,
                    fImportType == BID_IMPORT_BPMN2);
            button.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
            ++buttonCount;
        }

        if ((allowedResourceTypes & SchemaImportDialog.ALLOW_JAVA) != 0) {
            button = createRadioButton(container, Messages.SchemaImportDialog_Java_Button, BID_IMPORT_JAVA,
                    fImportType == BID_IMPORT_JAVA);
            button.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
            ++buttonCount;
        }
        if (buttonCount == 1) {
            fTypeGroup.setVisible(false);
            typeGroupGridData.exclude = true;
        }
    }

    protected void createImportLocation(Composite parent) {

        fKindGroup = new Group(parent, SWT.SHADOW_ETCHED_IN);
        fKindGroup.setText(Messages.SchemaImportDialog_Import_Source_Title);
        GridLayout layout = new GridLayout(1, true);
        GridData data = new GridData();
        data.grabExcessVerticalSpace = false;
        data.grabExcessHorizontalSpace = true;
        data.horizontalAlignment = GridData.FILL;
        data.verticalAlignment = GridData.FILL;

        fKindGroup.setLayout(layout);
        fKindGroup.setLayoutData(data);

        fKindButtonComposite = new Composite(fKindGroup, SWT.NONE);

        layout = new GridLayout();
        layout.makeColumnsEqualWidth = true;
        layout.numColumns = 4;
        fKindButtonComposite.setLayout(layout);
        data = new GridData();
        data.grabExcessVerticalSpace = false;
        data.grabExcessHorizontalSpace = true;
        data.horizontalAlignment = GridData.FILL;
        data.verticalAlignment = GridData.CENTER;
        fKindButtonComposite.setLayoutData(data);

        fBtnResource = createRadioButton(fKindButtonComposite, Messages.SchemaImportDialog_Workspace_Button,
                BID_BROWSE_WORKSPACE, fImportSource == BID_BROWSE_WORKSPACE);
        createRadioButton(fKindButtonComposite, Messages.SchemaImportDialog_File_System_Button, BID_BROWSE_FILE,
                fImportSource == BID_BROWSE_FILE);
        createRadioButton(fKindButtonComposite, Messages.SchemaImportDialog_URL_Button, BID_BROWSE_URL,
                fImportSource == BID_BROWSE_URL);

        // Create location variant
        fLocationComposite = new Composite(fKindGroup, SWT.NONE);

        layout = new GridLayout();
        layout.numColumns = 3;
        fLocationComposite.setLayout(layout);
        data = new GridData();
        data.grabExcessVerticalSpace = true;
        data.grabExcessHorizontalSpace = true;
        data.horizontalAlignment = GridData.FILL;
        data.verticalAlignment = GridData.FILL;
        fLocationComposite.setLayoutData(data);

        fLocationLabel = new Label(fLocationComposite, SWT.NONE);
        fLocationLabel.setText(Messages.SchemaImportDialog_Location_Label);

        fLocation = new Text(fLocationComposite, SWT.BORDER);
        fLocation.setText(EMPTY);
        data = new GridData();
        data.grabExcessVerticalSpace = false;
        data.grabExcessHorizontalSpace = true;
        data.horizontalAlignment = GridData.FILL;
        data.verticalAlignment = GridData.FILL;
        fLocation.setLayoutData(data);
        //      fLocation.addListener(SWT.FocusOut, new Listener() {
        //
        //         public void handleEvent(Event event) {
        //            String loc = fLocation.getText();
        //            if (loc.length() > 0) {
        //               attemptLoad(loc);
        //            }
        //         }
        //      });
        fLocation.addKeyListener(new KeyListener() {

            public void keyPressed(KeyEvent event) {
                if (fImportType == BID_IMPORT_JAVA) {
                } else if (event.keyCode == SWT.CR) {
                    attemptLoad(fLocation.getText());
                    event.doit = false;
                }
            }

            public void keyReleased(KeyEvent e) {
                if (fImportType == BID_IMPORT_JAVA) {
                    String s = fLocation.getText();
                    if (s != null && s.length() > 1) {
                        if (!s.equals(fLocationText)) {
                            fLocationText = s;
                            attemptLoad(s);
                        }
                    }
                }
            }

        });

        fBrowseButton = createButton(fLocationComposite, BID_BROWSE, Messages.SchemaImportDialog_Browse_Button,
                false);

        // End of location variant

        // Start Resource Variant
        fResourceComposite = new FileSelectionGroup(fKindGroup, new Listener() {
            public void handleEvent(Event event) {
                IResource resource = fResourceComposite.getSelectedResource();
                if (resource != null && resource.getType() == IResource.FILE) {
                    // only attempt to load a resource which is not a control
                    attemptLoad((IFile) resource);
                    return;
                }
                markEmptySelection();
            }
        }, Messages.SchemaImportDialog_Select_Resource_Title, resourceFilter); //$NON-NLS-1$

        TreeViewer viewer = fResourceComposite.getTreeViewer();
        viewer.setAutoExpandLevel(2);

        // End resource variant
    }

    protected Object createImportStructure(Composite parent) {

        fStructureLabel = new Label(parent, SWT.NONE);
        fStructureLabel.setText(fStructureTitle);

        // Tree viewer for variable structure ...
        fTree = new Tree(parent, SWT.BORDER);

        fTreeViewer = new TreeViewer(fTree);
        fTreeViewer.setContentProvider(fTreeContentProvider);
        fTreeViewer.setLabelProvider(new ModelTreeLabelProvider());
        fTreeViewer.setInput(null);
        fTreeViewer.setAutoExpandLevel(3);
        fTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                IStructuredSelection sel = (IStructuredSelection) event.getSelection();
                if (!sel.isEmpty()) {
                    computeResult();
                    if (getResult() != null)
                        updateStatus(Status.OK_STATUS);
                    else
                        updateStatus(new Status(IStatus.ERROR, Activator.getDefault().getID(), 0,
                                Messages.SchemaImportDialog_Select_Java_Message, null));
                } else {
                    markEmptySelection();
                }
            }
        });
        // end tree viewer for variable structure
        GridData data = new GridData();
        data.grabExcessVerticalSpace = true;
        data.grabExcessHorizontalSpace = true;
        data.horizontalAlignment = GridData.FILL;
        data.verticalAlignment = GridData.FILL;
        data.minimumHeight = 200;
        fTree.setLayoutData(data);

        return fTree;
    }

    protected Object attemptLoad(URI uri, String kind) {

        Resource resource = null;
        if ("java".equals(kind)) { //$NON-NLS-1$
            final String fileName = uri.lastSegment();
            final ArrayList<IType> results = new ArrayList<IType>();
            try {
                IProject p = bpmn2Editor.getProject();
                if (p.isOpen() && p.hasNature(JavaCore.NATURE_ID)) {
                    final IJavaProject javaProject = JavaCore.create(p);
                    JavaProjectClassLoader cl = new JavaProjectClassLoader(javaProject);
                    results.addAll(cl.findClasses(fileName));
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return results;
        } else {
            try {
                resource = fHackedResourceSet.getResource(uri, true, kind);
            } catch (Exception e) {
                Activator.logError(e);
                return e;
            }

            if (resource != null && resource.getErrors().isEmpty() && resource.isLoaded()) {
                return resource.getContents().get(0);
            }
        }
        return null;
    }

    Object attemptLoad(URI uri) {
        return attemptLoad(uri, fResourceKind);
    }

    void attemptLoad(IFile file) {
        attemptLoad(file.getFullPath().toString());
    }

    protected void attemptLoad(String path) {

        if (fLoaderJob != null) {
            if (fLoaderJob.getState() == Job.RUNNING) {
                fLoaderJob.cancel();
            }
        }

        updateStatus(Status.OK_STATUS);

        // empty paths are ignored
        path = path.trim();
        if (path.length() == 0) {
            return;
        }

        URI uri = convertToURI(path);
        if (uri == null) {
            return;
        }

        fRunnableLoadURI = uri;
        final String msg = MessageFormat.format(Messages.SchemaImportDialog_Loading_Message, fRunnableLoadURI);
        fLoaderJob = new Job(msg) {

            @Override
            protected IStatus run(IProgressMonitor monitor) {
                monitor.beginTask(msg, 1);
                // Bug 290090 - move this to asyncExec() as below because the method will
                // modify UI parameter, if not, will have a invalid access error.

                /* fInput = attemptLoad(fRunnableLoadURI); */

                monitor.worked(1);
                if (fBrowseButton != null && fBrowseButton.isDisposed() == false) {
                    fBrowseButton.getDisplay().asyncExec(new Runnable() {
                        public void run() {
                            fInput = attemptLoad(fRunnableLoadURI);
                            loadDone();
                        }
                    });
                }

                return Status.OK_STATUS;
            }
        };

        fLoaderJob.schedule();
        fRunnableStart = System.currentTimeMillis();

        updateStatus(new Status(IStatus.INFO, Activator.getDefault().getID(), 0, msg, null));
    }

    @SuppressWarnings("boxing")
    protected void loadDone() {

        long elapsed = System.currentTimeMillis() - fRunnableStart;

        if (fInput == null || fInput instanceof Throwable) {
            markEmptySelection();

            updateStatus(new Status(
                    IStatus.ERROR, Activator.getDefault().getID(), 0, MessageFormat
                            .format(Messages.SchemaImportDialog_Load_Failed_Message, fRunnableLoadURI, elapsed),
                    (Throwable) fInput));
            fInput = null;

        } else {

            updateStatus(new Status(IStatus.INFO, Activator.getDefault().getID(), 0,
                    MessageFormat.format(Messages.SchemaImportDialog_Loaded_Message, fRunnableLoadURI, elapsed),
                    null));

            // display a warning if this import does not define a targetNamespace
            String type = null;
            String ns = null;
            String loc = null;
            if (fInput instanceof XSDSchema) {
                XSDSchema schema = (XSDSchema) fInput;
                ns = schema.getTargetNamespace();
                loc = schema.getSchemaLocation();
                type = Messages.DefaultSchemaImportDialog_XSD_Type;
            } else if (fInput instanceof Definition) {
                Definition definition = (Definition) fInput;
                ns = definition.getTargetNamespace();
                loc = definition.getLocation();
                type = Messages.DefaultSchemaImportDialog_WSDL_Type;
            } else if (fInput instanceof org.eclipse.bpmn2.DocumentRoot) {
                DocumentRoot root = (DocumentRoot) fInput;
                org.eclipse.bpmn2.Definitions definitions = root.getDefinitions();
                ns = definitions.getTargetNamespace();
                loc = root.eResource().getURI().toString();
                type = Messages.DefaultSchemaImportDialog_BPMN2_Type;
                fInput = definitions;
            } else if (fInput instanceof List) {
                markEmptySelection();
            }
            if (type != null) {
                if (ns == null || ns.isEmpty()) {
                    updateStatus(
                            new Status(IStatus.WARNING, Activator.getDefault().getID(), 0,
                                    MessageFormat.format(
                                            Messages.DefaultSchemaImportDialog_Missing_Namespace_Message, type),
                                    null));
                }
                if (loc == null || loc.isEmpty()) {
                    updateStatus(new Status(IStatus.ERROR, Activator.getDefault().getID(), 0, MessageFormat.format(
                            Messages.SchemaImportDialog_Load_Failed_Message, fRunnableLoadURI, elapsed), null));
                    fInput = null;
                }
            }

            fTreeViewer.setInput(fInput);
            fTree.getVerticalBar().setSelection(0);
        }
    }

    protected void markEmptySelection() {
        updateStatus(Status.OK_STATUS);
        updateOK(false);
        fTreeViewer.setInput(null);
    }

    protected URI convertToURI(String path) {

        try {
            switch (fImportSource) {
            case BID_BROWSE_FILE:
                return URI.createFileURI(path);

            case BID_BROWSE_WORKSPACE:
                return URI.createPlatformResourceURI(path, true);

            case BID_BROWSE_URL:
                return URI.createURI(path);

            default:
                return null;
            }

        } catch (Exception ex) {
            updateStatus(new Status(IStatus.ERROR, Activator.getDefault().getID(), 0,
                    Messages.SchemaImportDialog_Invalid_Location, ex));
            return null;
        }
    }

    /**
     * Update the state of the OK button to the state indicated.
     * 
     * @param state
     *            false to disable, true to enable.
     */

    public void updateOK(boolean state) {
        Button okButton = getOkButton();
        if (okButton != null && !okButton.isDisposed()) {
            okButton.setEnabled(state);
        }
    }

    /**
     * @see org.eclipse.ui.dialogs.SelectionStatusDialog#computeResult()
     */

    @Override
    protected void computeResult() {
        Object object = fTreeViewer.getInput();
        if (object == null) {
            return;
        }
        if (fImportType == BID_IMPORT_JAVA) {
            IStructuredSelection sel = (IStructuredSelection) fTreeViewer.getSelection();
            if (!sel.isEmpty()) {
                TreeNode treeNode = (TreeNode) sel.getFirstElement();
                if (treeNode.getModelObject() instanceof IType)
                    setSelectionResult(new Object[] { treeNode.getModelObject() });
                else
                    setSelectionResult(null);
            }
        } else {
            setSelectionResult(new Object[] { object });
        }
    }

    /**
     * TODO: not implemented - do we need this?
     */
    public void configureAsXMLImport() {
        setTitle(Messages.SchemaImportDialog_Browse_XML_Title);
        fStructureTitle = Messages.SchemaImportDialog_Structure_Label;
        if (fStructureLabel != null)
            fStructureLabel.setText(fStructureTitle);
        fTreeContentProvider = new VariableTypeTreeContentProvider(true, true);
        if (fTreeViewer != null)
            fTreeViewer.setContentProvider(fTreeContentProvider);
        fResourceKind = "xml"; //$NON-NLS-1$

        String[] xml_FILTER_EXTENSIONS = { "*.xml", //$NON-NLS-1$
                "*.xsd", //$NON-NLS-1$
                "*.wsdl", //$NON-NLS-1$
                "*.*" //$NON-NLS-1$
        };
        FILTER_EXTENSIONS = xml_FILTER_EXTENSIONS;

        String[] xml_FILTER_NAMES = { Messages.DefaultSchemaImportDialog_XML_Filter,
                Messages.DefaultSchemaImportDialog_XSD_Filter, Messages.DefaultSchemaImportDialog_WSDL_Filter,
                Messages.DefaultSchemaImportDialog_All };
        FILTER_NAMES = xml_FILTER_NAMES;

        resourceFilter = ".xml"; //$NON-NLS-1$
        if (fResourceComposite != null)
            fResourceComposite.setFileFilter(resourceFilter);
    }

    /**
     * Configure the dialog as a schema import dialog. Set the title and the
     * structure pane message.
     * 
     */

    public void configureAsSchemaImport() {
        setTitle(Messages.SchemaImportDialog_Browse_XSD_Title);
        fStructureTitle = Messages.SchemaImportDialog_Types_Label;
        if (fStructureLabel != null)
            fStructureLabel.setText(fStructureTitle);
        fTreeContentProvider = new VariableTypeTreeContentProvider(true, true);
        if (fTreeViewer != null)
            fTreeViewer.setContentProvider(fTreeContentProvider);
        fResourceKind = "xsd"; //$NON-NLS-1$

        String[] wsdl_FILTER_EXTENSIONS = { "*.xml", //$NON-NLS-1$
                "*.xsd", //$NON-NLS-1$
                "*.wsdl", //$NON-NLS-1$
                "*.*" //$NON-NLS-1$
        };
        FILTER_EXTENSIONS = wsdl_FILTER_EXTENSIONS;

        String[] wsdl_FILTER_NAMES = { Messages.DefaultSchemaImportDialog_XML_Filter,
                Messages.DefaultSchemaImportDialog_XSD_Filter, Messages.DefaultSchemaImportDialog_WSDL_Filter,
                Messages.DefaultSchemaImportDialog_All };
        FILTER_NAMES = wsdl_FILTER_NAMES;

        resourceFilter = ".xsd"; //$NON-NLS-1$
        if (fResourceComposite != null)
            fResourceComposite.setFileFilter(resourceFilter);
    }

    /**
     * Configure the dialog as a WSDL import dialog. Set the title and the
     * structure pane message.
     * 
     */

    public void configureAsWSDLImport() {

        setTitle(Messages.SchemaImportDialog_Browse_WSDL_Title);
        fStructureTitle = Messages.SchemaImportDialog_Ports_Title;
        if (fStructureLabel != null)
            fStructureLabel.setText(fStructureTitle);
        fTreeContentProvider = new ServiceTreeContentProvider(true);
        if (fTreeViewer != null)
            fTreeViewer.setContentProvider(fTreeContentProvider);
        fResourceKind = "wsdl"; //$NON-NLS-1$

        String[] wsdl_FILTER_EXTENSIONS = { "*.wsdl", //$NON-NLS-1$
                "*.*" //$NON-NLS-1$
        };
        FILTER_EXTENSIONS = wsdl_FILTER_EXTENSIONS;

        String[] wsdl_FILTER_NAMES = { Messages.DefaultSchemaImportDialog_WSDL_Filter,
                Messages.DefaultSchemaImportDialog_All };
        FILTER_NAMES = wsdl_FILTER_NAMES;

        resourceFilter = ".wsdl"; //$NON-NLS-1$
        if (fResourceComposite != null)
            fResourceComposite.setFileFilter(resourceFilter);
    }

    public void configureAsBPMN2Import() {

        setTitle(Messages.SchemaImportDialog_Browse_BPMN2_Title);
        fStructureTitle = Messages.SchemaImportDialog_Interfaces_Label;
        if (fStructureLabel != null)
            fStructureLabel.setText(fStructureTitle);
        fTreeContentProvider = new BPMN2DefinitionsTreeContentProvider(true);
        if (fTreeViewer != null)
            fTreeViewer.setContentProvider(fTreeContentProvider);
        fResourceKind = ""; //$NON-NLS-1$

        String[] wsdl_FILTER_EXTENSIONS = { "*.bpmn", //$NON-NLS-1$
                "*.bpmn2", //$NON-NLS-1$
                "*.*" //$NON-NLS-1$
        };
        FILTER_EXTENSIONS = wsdl_FILTER_EXTENSIONS;

        String[] wsdl_FILTER_NAMES = { Messages.DefaultSchemaImportDialog_BPMN2_Filter_1,
                Messages.DefaultSchemaImportDialog_BPMN2_Filter_2, Messages.DefaultSchemaImportDialog_All };
        FILTER_NAMES = wsdl_FILTER_NAMES;

        resourceFilter = ".bpmn,.bpmn2"; //$NON-NLS-1$
        if (fResourceComposite != null)
            fResourceComposite.setFileFilter(resourceFilter);
    }

    public void configureAsJavaImport() {

        setTitle(Messages.SchemaImportDialog_Browse_Java_Title);
        fStructureTitle = Messages.SchemaImportDialog_Java_Types_Label;
        if (fStructureLabel != null)
            fStructureLabel.setText(fStructureTitle);
        fTreeContentProvider = new JavaTreeContentProvider(true);
        if (fTreeViewer != null)
            fTreeViewer.setContentProvider(fTreeContentProvider);
        fResourceKind = "java"; //$NON-NLS-1$

        String[] java_FILTER_EXTENSIONS = { "*.java", //$NON-NLS-1$
                "*.class", //$NON-NLS-1$
                "*.jar", //$NON-NLS-1$
                "*.*" //$NON-NLS-1$
        };
        FILTER_EXTENSIONS = java_FILTER_EXTENSIONS;

        String[] wsdl_FILTER_NAMES = { Messages.DefaultSchemaImportDialog_Java_Filter_1,
                Messages.DefaultSchemaImportDialog_Java_Filter_2, Messages.DefaultSchemaImportDialog_Java_Filter_3,
                Messages.DefaultSchemaImportDialog_All };
        FILTER_NAMES = wsdl_FILTER_NAMES;

        // Resource selection widget not used (yet)
        resourceFilter = ".java"; //$NON-NLS-1$
        if (fResourceComposite != null)
            fResourceComposite.setFileFilter(resourceFilter);
    }

    @Override
    public void setTitle(String title) {
        super.setTitle(title);
        if (getShell() != null)
            getShell().setText(title);
    }

    /**
     * 
     * @author Michal Chmielewski (michal.chmielewski@oracle.com)
     * @date May 4, 2007
     * 
     */
    public class TreeFilter extends ViewerFilter {

        /**
         * (non-Javadoc)
         * 
         * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer,
         *      java.lang.Object, java.lang.Object)
         */
        @Override
        public boolean select(Viewer viewer, Object parentElement, Object element) {

            return true;
        }
    }
}