org.eclipse.birt.report.designer.data.ui.dataset.DataSetBasePage.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.birt.report.designer.data.ui.dataset.DataSetBasePage.java

Source

/*******************************************************************************
 * Copyright (c) 2004, 2011 Actuate Corporation.
 * 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
 *
 * Contributors:
 *  Actuate Corporation  - initial API and implementation
 *******************************************************************************/

package org.eclipse.birt.report.designer.data.ui.dataset;

import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.eclipse.birt.report.designer.data.ui.util.DTPUtil;
import org.eclipse.birt.report.designer.data.ui.util.DataSetProvider;
import org.eclipse.birt.report.designer.data.ui.util.DataUIConstants;
import org.eclipse.birt.report.designer.data.ui.util.IHelpConstants;
import org.eclipse.birt.report.designer.data.ui.util.Utility;
import org.eclipse.birt.report.designer.internal.ui.util.ExceptionHandler;
import org.eclipse.birt.report.designer.nls.Messages;
import org.eclipse.birt.report.designer.ui.ReportPlugin;
import org.eclipse.birt.report.designer.ui.odadatasource.wizards.AbstractDataSetWizard;
import org.eclipse.birt.report.model.adapter.oda.ModelOdaAdapter;
import org.eclipse.birt.report.model.api.DataSetHandle;
import org.eclipse.birt.report.model.api.DataSourceHandle;
import org.eclipse.birt.report.model.api.DesignElementHandle;
import org.eclipse.birt.report.model.api.ModuleHandle;
import org.eclipse.birt.report.model.api.OdaDataSetHandle;
import org.eclipse.birt.report.model.api.OdaDataSourceHandle;
import org.eclipse.birt.report.model.api.ScriptDataSetHandle;
import org.eclipse.birt.report.model.api.ScriptDataSourceHandle;
import org.eclipse.birt.report.model.api.activity.SemanticException;
import org.eclipse.birt.report.model.api.elements.ReportDesignConstants;
import org.eclipse.birt.report.model.api.util.StringUtil;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.datatools.connectivity.oda.OdaException;
import org.eclipse.datatools.connectivity.oda.design.DataSourceDesign;
import org.eclipse.datatools.connectivity.oda.design.ui.designsession.DataSetDesignSession;
import org.eclipse.datatools.connectivity.oda.design.ui.designsession.DesignSessionUtil;
import org.eclipse.datatools.connectivity.oda.util.manifest.DataSetType;
import org.eclipse.datatools.connectivity.oda.util.manifest.ExtensionManifest;
import org.eclipse.datatools.connectivity.oda.util.manifest.ManifestExplorer;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.WizardPage;
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.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.dialogs.FilteredTree;
import org.eclipse.ui.dialogs.PatternFilter;

/**
 * Base information page for dataset wizards
 * 
 * 
 */

public class DataSetBasePage extends WizardPage {

    private transient Text nameEditor = null;
    private transient ComboViewer dataSetTypeChooser = null;

    private transient boolean useTransaction = true;

    final private static String EMPTY_NAME = Messages.getString("error.DataSet.emptyName");//$NON-NLS-1$
    final private static String DUPLICATE_NAME = Messages.getString("error.duplicateName");//$NON-NLS-1$
    final private static String CREATE_PROMPT = Messages.getString("dataset.message.create");//$NON-NLS-1$

    private transient DataSourceHandle newDataSource = null;

    private Hashtable htDataSetWizards = new Hashtable(10);

    // store latest selection data source
    private ISelection dateSetTypeSelection = null;
    private transient DataSetDesignSession m_designSession = null;
    private boolean useODAV3 = false;

    private WizardFilter wizardFilter = null;

    private FilteredTree dataSourceFilteredTree;
    private DataSetBasePageHelper helper;

    private IWizardPage nextPage;

    private final static String SCRIPT_DATASET_NAME = Messages.getString("DataSetBasePage.ScriptedDataSet.name");//$NON-NLS-1$
    private final static String SCRIPT_DATASOURCE_NAME = Messages
            .getString("DataSetBasePage.ScriptedDataSource.name"); //$NON-NLS-1$
    private final static String CASSANDRA_DATASET_NAME = Messages
            .getString("DataSetBasePage.CassandraScriptedDataSet.name");//$NON-NLS-1$
    private final static String CASSANDRA_DATASOURCE_NAME = Messages
            .getString("DataSetBasePage.CassandraScriptedDataSource.name"); //$NON-NLS-1$

    /**
     * Creates a new data set wizard page
     * 
     * @param useTransaction
     *            the style of page
     */
    public DataSetBasePage(boolean useTransaction) {
        super("DataSet Base Page");//$NON-NLS-1$
        setTitle(Messages.getString("dataset.new"));//$NON-NLS-1$
        this.setMessage(Messages.getString("AbstractDataSetWizard.ModelTrans.Create")); //$NON-NLS-1$
        this.useTransaction = useTransaction;
        setImage();
    }

    /**
     * Sets the Image for the page
     */
    private void setImage() {
        URL url = null;
        try {
            url = new URL(ReportPlugin.getDefault().getBundle().getEntry("/"), //$NON-NLS-1$
                    "icons/wizban/dataset_wizard.gif");//$NON-NLS-1$
        } catch (MalformedURLException e) {
            ExceptionHandler.handle(e);
        }
        ImageDescriptor desc = ImageDescriptor.createFromURL(url);
        this.setImageDescriptor(desc);

    }

    /**
     * Creates the top level control for this dialog page under the given parent
     * composite.
     * <p>
     * Implementors are responsible for ensuring that the created control can be
     * accessed via <code>getControl</code>
     * </p>
     * 
     * @param parent
     *            the parent composite
     */
    public void createControl(Composite parent) {
        helper = new DataSetBasePageHelper();

        // initialize the dialog layout
        Composite composite = new Composite(parent, SWT.NULL);
        composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        GridLayout layout = new GridLayout();
        composite.setLayout(layout);

        final Group group = new Group(composite, SWT.NONE);
        group.setLayout(new GridLayout());
        group.setText(Messages.getString("DataSetBasePage.Group.DataSourceSelection")); //$NON-NLS-1$
        group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 8));// GridData.FILL_BOTH));

        wizardFilter = new WizardFilter();
        dataSourceFilteredTree = new FilteredTree(group,
                SWT.BORDER | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL, this.wizardFilter, true);
        GridData treeData = new GridData(GridData.FILL_BOTH);
        treeData.grabExcessHorizontalSpace = true;
        treeData.grabExcessVerticalSpace = true;
        treeData.heightHint = 300;
        treeData.widthHint = 600;
        dataSourceFilteredTree.setLayoutData(treeData);
        SelectionListener listener = new SelectionListener() {

            TreeItem parent = null;

            public void widgetDefaultSelected(SelectionEvent arg0) {
            }

            public void widgetSelected(SelectionEvent event) {
                if (event.item.getData() instanceof DataSourceHandle) {
                    dataSetTypeChooser.getCombo().setEnabled(true);
                    if (parent == null || parent != ((TreeItem) event.item).getParentItem()) {
                        parent = ((TreeItem) event.item).getParentItem();
                        doDataSourceSelectionChanged(parent.getData());
                    }
                    setPageComplete(!hasWizard() && (getMessageType() != ERROR));
                } else {
                    dataSetTypeChooser.getCombo().clearSelection();
                    dataSetTypeChooser.getCombo().setEnabled(false);
                    setPageComplete(false);
                }
                dataSourceFilteredTree.getViewer().getTree().setFocus();
            }
        };
        dataSourceFilteredTree.getViewer().getTree().addSelectionListener(listener);
        createDataSetTypeViewer(composite);

        setDataSourceTreeViewer();
        setPageStatus();

        // initialize name editor
        new Label(composite, SWT.RIGHT).setText(Messages.getString("dataset.wizard.label.datasetName"));//$NON-NLS-1$
        nameEditor = new Text(composite, SWT.BORDER);
        String name = ReportPlugin.getDefault().getCustomName(ReportDesignConstants.DATA_SET_ELEMENT);
        if (name != null) {
            nameEditor.setText(Utility.getUniqueDataSetName(name));
        } else
        // can't get defaut name
        {
            nameEditor.setText(Utility.getUniqueDataSetName(Messages.getString("dataset.new.defaultName")));//$NON-NLS-1$         
        }

        nameEditor.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        nameEditor.setToolTipText(Messages.getString("DataSetBasePage.tooltip")); //$NON-NLS-1$
        nameEditor.addModifyListener(new ModifyListener() {

            public void modifyText(ModifyEvent e) {
                if (StringUtil.isBlank(nameEditor.getText().trim())) {
                    setMessage(EMPTY_NAME, ERROR);
                } else if (isDuplicateName()) {// name is duplicated
                    setMessage(DUPLICATE_NAME, ERROR);
                } else if (containInvalidCharactor(nameEditor.getText())) {// name contains invalid ".", "/", "\", "!", ";", ","
                                                                           // character
                    String msg = Messages.getFormattedString("error.invalidName", //$NON-NLS-1$
                            new Object[] { nameEditor.getText() });
                    setMessage(msg, ERROR);
                } else {// everything is OK
                    setMessage(CREATE_PROMPT);
                }

                setPageComplete(!hasWizard() && (getMessageType() != ERROR) && getSelectedDataSource() != null);

                nameEditor.setFocus();
            }
        });
        setControl(composite);

        Utility.setSystemHelp(getControl(), IHelpConstants.CONEXT_ID_DATASET_NEW);
    }

    private void setDataSourceTreeViewer() {

        dataSourceFilteredTree.getViewer().setContentProvider(new ITreeContentProvider() {

            DataSourceType[] types = null;

            public void dispose() {
            }

            public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
            }

            public Object[] getElements(Object inputElement) {
                types = new DataSourceType[((Collection) inputElement).size()];
                Iterator iter = ((Collection) inputElement).iterator();
                int i = 0;
                while (iter.hasNext()) {
                    types[i] = (DataSourceType) iter.next();
                    i++;
                }
                return types;
            }

            public Object[] getChildren(Object parentElement) {
                if (parentElement instanceof DataSourceType) {
                    return ((DataSourceType) parentElement).getDataSourceList().toArray();
                } else {
                    return new Object[0];
                }
            }

            public Object getParent(Object element) {
                if (types != null) {
                    for (int i = 0; i < types.length; i++) {
                        if (types[i].getDataSourceList().contains(element))
                            return types[i];
                    }
                }
                return null;
            }

            public boolean hasChildren(Object element) {
                if (element instanceof DataSourceType) {
                    return true;
                } else if (element instanceof DataSourceHandle) {
                    return false;
                }
                return false;
            }
        });

        dataSourceFilteredTree.getViewer().setLabelProvider(new ILabelProvider() {

            public Image getImage(Object element) {
                return null;
            }

            public String getText(Object element) {
                if (element instanceof DataSourceType) {
                    return ((DataSourceType) element).getDataSourceDisplayName();
                } else if (element instanceof DataSourceHandle) {
                    return ((DataSourceHandle) element).getName();
                }
                return element.toString();
            }

            public void addListener(ILabelProviderListener listener) {
            }

            public void dispose() {
            }

            public boolean isLabelProperty(Object element, String property) {
                return false;
            }

            public void removeListener(ILabelProviderListener listener) {
            }
        });

        dataSourceFilteredTree.getViewer().addSelectionChangedListener(new ISelectionChangedListener() {

            public void selectionChanged(SelectionChangedEvent event) {
                setPageStatus();
            }
        });

        dataSourceFilteredTree.getViewer().setComparator(new ViewerComparator(new Comparator() {

            public int compare(Object o1, Object o2) {
                return o1.toString().compareTo(o2.toString());
            }
        }));

        Map sourceMap = getDataSourceMap();
        dataSourceFilteredTree.getViewer().setInput(sourceMap.values());
        dataSourceFilteredTree.getViewer().expandAll();
        if (dataSourceFilteredTree.getViewer().getTree().getItems().length > 0) {
            dataSourceFilteredTree.getViewer().getTree()
                    .select(dataSourceFilteredTree.getViewer().getTree().getItem(0).getItem(0));
            doDataSourceSelectionChanged(dataSourceFilteredTree.getViewer().getTree().getItem(0).getData());
            dataSetTypeChooser.getCombo().setEnabled(true);
        }
        setPageComplete(!hasWizard() && (getMessageType() != ERROR));
    }

    private void setPageStatus() {
        if (dataSourceFilteredTree == null || dataSourceFilteredTree.getViewer().getTree().getSelectionCount() <= 0)
            setPageComplete(false);
    }

    private Map getDataSourceMap() {
        List dataSources = Utility.getDataSources();

        Map sourceTypeMap = new HashMap();
        for (int i = 0; i < dataSources.size(); i++) {
            DataSourceHandle handle = (DataSourceHandle) dataSources.get(i);
            if (handle instanceof OdaDataSourceHandle) {
                String type = ((OdaDataSourceHandle) handle).getExtensionID();
                if (!sourceTypeMap.containsKey(type)) {
                    try {
                        // Find the data source
                        ExtensionManifest extMF = ManifestExplorer.getInstance().getExtensionManifest(type);
                        if (extMF != null) {
                            // Find the data sets for this data source.
                            DataSetType[] dataSetTypes = extMF.getDataSetTypes();
                            OdaDataSetTypeElement[] element = new OdaDataSetTypeElement[dataSetTypes.length];
                            for (int n = 0; n < dataSetTypes.length; n++) {
                                if (!dataSetTypes[n].isDeprecated()) {
                                    element[n] = new OdaDataSetTypeElement(dataSetTypes[n],
                                            DataSetProvider.findDataSetElement(dataSetTypes[n].getID(), type));
                                }
                            }
                            DataSourceType dataSourceType = new DataSourceType(type,
                                    extMF.getDataSourceDisplayName(), element);
                            sourceTypeMap.put(type, dataSourceType);
                            dataSourceType.addDataSource(handle);
                        }
                    } catch (Exception ex) {
                        ExceptionHandler.handle(ex);
                    }
                } else {
                    DataSourceType sourceType = (DataSourceType) sourceTypeMap.get(type);
                    sourceType.addDataSource(handle);
                }
            } else if (handle instanceof ScriptDataSourceHandle) {
                useODAV3 = false;
                getScriptDataSourceMap(handle, sourceTypeMap, getScriptDataSetName(handle),
                        getScriptDataSourceName(handle));
            } else {
                useODAV3 = false;
                helper.addExternalDataSource(sourceTypeMap, handle);
            }
        }
        return sourceTypeMap;
    }

    private void getScriptDataSourceMap(DataSourceHandle handle, Map sourceTypeMap, String DataSetName,
            String DataSourceName) {
        if (!sourceTypeMap.containsKey(DataSourceName)) {
            DataSetTypeElement[] element = new DataSetTypeElement[1];
            element[0] = new DataSetTypeElement(DataSetName);
            DataSourceType dataSourceType = new DataSourceType(DataSourceName, DataSourceName, element);
            sourceTypeMap.put(DataSourceName, dataSourceType);
            dataSourceType.addDataSource(handle);
        } else {
            DataSourceType sourceType = (DataSourceType) sourceTypeMap.get(DataSourceName);
            sourceType.addDataSource(handle);
        }
    }

    /**
     * Create the data set type viewer
     * 
     * @param composite
     */
    private void createDataSetTypeViewer(Composite composite) {
        // create the data set type chooser combo
        new Label(composite, SWT.RIGHT).setText(Messages.getString("dataset.wizard.label.datasetType"));//$NON-NLS-1$
        dataSetTypeChooser = new ComboViewer(composite, SWT.DROP_DOWN | SWT.READ_ONLY);
        dataSetTypeChooser.getControl().setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        DataSetTypesProvider dataSetTypes = new DataSetTypesProvider();
        dataSetTypeChooser.setContentProvider(dataSetTypes);
        dataSetTypeChooser.setLabelProvider(dataSetTypes);
        dataSetTypeChooser.getCombo().setEnabled(false);
    }

    /**
     * checks if the name is duplicate
     * 
     * @return Returns true if the name is duplicate,and false if it is
     *         duplicate
     */
    private boolean isDuplicateName() {
        String name = nameEditor.getText().trim();
        return Utility.checkDataSetName(name);
    }

    private String getDataSetName() {
        if (dataSetName != null)
            return dataSetName;
        return (nameEditor.getText());
    }

    /**
     * whether name contains ".", "/", "\", "!", ";", "," charactors
     * 
     * @param name
     * @return
     */
    private boolean containInvalidCharactor(String name) {
        if (name == null)
            return false;
        else if (name.indexOf(".") > -1 || //$NON-NLS-1$
                name.indexOf("\\") > -1 || name.indexOf("/") > -1 || //$NON-NLS-1$ //$NON-NLS-2$
                name.indexOf("!") > -1 || name.indexOf(";") > -1 || //$NON-NLS-1$ //$NON-NLS-2$
                name.indexOf(",") > -1) //$NON-NLS-1$
            return true;
        else
            return false;
    }

    protected final DataSourceHandle getSelectedDataSource() {
        if (dataSource != null)
            return dataSource;

        if (((IStructuredSelection) dataSourceFilteredTree.getViewer().getSelection())
                .getFirstElement() instanceof DataSourceHandle)
            return (DataSourceHandle) ((IStructuredSelection) dataSourceFilteredTree.getViewer().getSelection())
                    .getFirstElement();
        else
            return null;
    }

    /**
     * @return Returns the newDataSource.
     */
    final DataSourceHandle getNewDataSource() {
        return newDataSource;
    }

    /**
     * @param newDataSourceHandle
     *            The newDataSource to set.
     */
    final void setNewDataSource(DataSourceHandle newDataSourceHandle) {
        this.newDataSource = newDataSourceHandle;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.wizard.IWizardPage#getNextPage()
     */
    public IWizardPage getNextPage() {
        setPageComplete(true);
        if (((IStructuredSelection) dataSetTypeChooser.getSelection())
                .getFirstElement() instanceof DataSetTypeElement) {
            return getDataSetPage();
        }
        // switch to script data set page
        return super.getNextPage();
    }

    public IWizardPage getDataSetPage() {
        if (useODAV3) {
            nextPage = getNextPageODAV3();
            return nextPage;
        } else {
            nextPage = getNextPageODAV2();
            return nextPage;
        }
    }

    private String dataSetID;
    private DataSourceHandle dataSource;
    private String dataSetName;

    public IWizardPage getExtensionDataSetNextPage(String dataSourceID, String dataSetID,
            DataSourceHandle dataSource, String dataSetName) {
        this.dataSetID = dataSetID;
        this.dataSource = dataSource;
        this.dataSetName = dataSetName;

        setPageComplete(true);
        isUseODAV3(dataSourceID);
        return getDataSetPage();
    }

    /**
     * 
     * @param dataSourceDesign
     * @return
     */
    private IWizardPage getNextPageODAV3() {
        DataSourceDesign dataSourceDesign = new ModelOdaAdapter()
                .createDataSourceDesign((OdaDataSourceHandle) getSelectedDataSource());
        String dataSetID = getDataSetID();
        try {
            DTPUtil.getInstance().supplementDesignAttributes(dataSourceDesign);

            if (m_designSession == null)
                m_designSession = DataSetDesignSession.startNewDesign(getDataSetName().trim(), dataSetID,
                        dataSourceDesign);
            else
                m_designSession.restartNewDesign(getDataSetName().trim(), dataSetID, dataSourceDesign);

            return m_designSession.getWizardStartingPage();
        } catch (OdaException e) {
            // TODO Auto-generated catch block
            return null;
        } catch (URISyntaxException e) {
            ExceptionHandler.handle(e);
            return null;
        }
    }

    public String getDataSetID() {
        if (dataSetID != null)
            return dataSetID;
        OdaDataSetTypeElement dataSetElement = (OdaDataSetTypeElement) getSelectedDataSet();
        return dataSetElement.getDataSetType().getID();
    }

    public void setPageFocus() {
        if (nameEditor != null && !nameEditor.isDisposed()) {
            nameEditor.setFocus();
        }
    }

    public boolean canFinish() {
        if (!validStatus())
            return false;

        try {
            if (m_designSession != null)
                return m_designSession.getNewWizard().canFinish();
            else {
                if (this.nextPage != null) {
                    return nextPage.isPageComplete();
                }
                return isPageComplete();
            }
        } catch (OdaException e) {
            return false;
        }
    }

    /**
     * 
     * @return
     */
    private IWizardPage getNextPageODAV2() {
        // Get the currently selected Data Set type and invoke its wizard
        // class
        DataSetTypeElement dataSetElement = (DataSetTypeElement) ((IStructuredSelection) dataSetTypeChooser
                .getSelection()).getFirstElement();

        if (m_designSession != null)
            m_designSession = null;

        if (dataSetElement instanceof OdaDataSetTypeElement) {
            OdaDataSetTypeElement dElement = (OdaDataSetTypeElement) dataSetElement;
            IConfigurationElement element = dElement.getIConfigurationElement();
            AbstractDataSetWizard newWizard = null;
            if (element != null) {
                newWizard = (AbstractDataSetWizard) htDataSetWizards.get(element.getAttribute("id"));//$NON-NLS-1$
            }
            if (newWizard == null && element != null) {
                // Get the new wizard from this element
                IConfigurationElement[] elements = element.getChildren("newDataSetWizard");//$NON-NLS-1$
                if (elements.length > 0) {
                    // Use only the first one.
                    // There can only be one data set wizard for a data set
                    try {
                        Object wizard = elements[0].createExecutableExtension("class");//$NON-NLS-1$
                        if (wizard instanceof AbstractDataSetWizard) {
                            newWizard = (AbstractDataSetWizard) wizard;
                            newWizard.setConfigurationElement(element);
                            // Allow the wizard to create its pages
                            newWizard.addPages();
                            newWizard.setUseTransaction(useTransaction);
                            htDataSetWizards.put(element.getAttribute("id"), //$NON-NLS-1$
                                    newWizard);
                        }
                    } catch (CoreException e) {
                        ExceptionHandler.handle(e);
                    }
                }
            }

            if (newWizard != null) {
                newWizard.setDataSource(getSelectedDataSource());
                newWizard.setDataSetName(nameEditor.getText().trim());

                // if the data set has been created
                // update it in the data set as well
                if (newWizard.getDataSet() != null) {
                    try {
                        newWizard.getDataSet().setDataSource(newWizard.getDataSource().getName());
                        newWizard.getDataSet().setName(newWizard.getDataSetName());
                    } catch (SemanticException e) {
                        ExceptionHandler.handle(e);
                    }
                }
                return newWizard.getStartingPage();
            }
        } else {
            IWizardPage page = helper.getNextPage(getSelectedDataSource(), dataSetElement);
            if (page == null)
                return super.getNextPage();
            else
                return page;
        }
        return super.getNextPage();
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.wizard.IWizardPage#canFlipToNextPage()
     */
    public boolean canFlipToNextPage() {
        return validStatus();
    }

    public boolean validStatus() {
        return this.getMessageType() != ERROR && !StringUtil.isBlank(getDataSetName())
                && (getSelectedDataSource() != null || dataSource != null)
                && (getSelectedDataSet() != null || dataSetID != null);
    }

    /**
     * The action after data source is selected
     * 
     */
    private void doDataSourceSelectionChanged(Object data) {
        if (data instanceof DataSourceType) {
            DataSetTypeElement[] types = ((DataSourceType) data).getDataSetTypes();
            dataSetTypeChooser.setInput(types);
            dateSetTypeSelection = new StructuredSelection(types[0]);
            dataSetTypeChooser.setSelection(dateSetTypeSelection);
            String dataSourceID = ((DataSourceType) data).getDataSourceID();
            isUseODAV3(dataSourceID);
        }
    }

    private void isUseODAV3(String dataSourceID) {
        if (isScriptDataSet(dataSourceID)) {
            useODAV3 = false;
        } else {
            useODAV3 = DesignSessionUtil.hasValidOdaDesignUIExtension(dataSourceID);
        }
    }

    private Object getSelectedDataSet() {
        return ((IStructuredSelection) dataSetTypeChooser.getSelection()).getFirstElement();
    }

    private boolean hasWizard() {
        DataSetTypeElement dTypeElement = (DataSetTypeElement) getSelectedDataSet();
        if (dTypeElement == null) {
            return false;
        }
        if (dTypeElement instanceof OdaDataSetTypeElement) {
            // Get the currently selected Data Set type and invoke its wizard
            // class
            IConfigurationElement element = ((OdaDataSetTypeElement) dTypeElement).getIConfigurationElement();
            if (element != null) {
                AbstractDataSetWizard newWizard = (AbstractDataSetWizard) htDataSetWizards
                        .get(element.getAttribute("id"));//$NON-NLS-1$
                if (newWizard != null) {
                    return true;
                }
                // Get the new wizard from this element
                IConfigurationElement[] v3elements = element.getChildren("dataSetWizard");//$NON-NLS-1$
                IConfigurationElement[] v2elements = element.getChildren("newDataSetWizard");//$NON-NLS-1$
                if (v3elements.length > 0 || v2elements.length > 0) {
                    return true;
                }
            }
        } else if (isScriptDataSet(dTypeElement.getDataSetTypeName())) {
            return true;
        } else
            return helper.hasWizard(getSelectedDataSource());
        return false;
    }

    public DataSetHandle createSelectedDataSet() {
        DataSetHandle dataSetHandle = null;

        try {
            if (useODAV3) {
                dataSetHandle = createDataSetODAV3();
            } else {
                dataSetHandle = createDataSetODAV2();
            }

            if (nameEditor != null && !nameEditor.isDisposed())
                dataSetHandle.setName(nameEditor.getText());

            return dataSetHandle;
        } catch (SemanticException e) {
            ExceptionHandler.handle(e);
            return null;
        } catch (IllegalStateException e) {
            ExceptionHandler.handle(e);
            return null;
        } catch (OdaException e) {
            ExceptionHandler.handle(e);
            return null;
        }
    }

    /**
     * 
     * @return
     * @throws OdaException
     * @throws SemanticException
     * @throws IllegalStateException
     */
    private DataSetHandle createDataSetODAV3() throws OdaException, SemanticException, IllegalStateException {
        DesignElementHandle parentHandle = Utility.getReportModuleHandle();

        DataSetHandle dataSetHandle = DTPUtil.getInstance()
                .createOdaDataSetHandle(m_designSession.finish().getResponse(), (ModuleHandle) parentHandle);
        m_designSession = null; // reset

        return dataSetHandle;
    }

    /**
     * 
     * @return
     * @throws SemanticException
     */
    private DataSetHandle createDataSetODAV2() throws SemanticException {
        String dataSetTypeName = null;
        if (getSelectedDataSet() instanceof Object[]) {
            DataSetType dataSetElement = (DataSetType) ((Object[]) getSelectedDataSet())[0];
            dataSetTypeName = dataSetElement.getID();
        } else if (getSelectedDataSet() instanceof OdaDataSetTypeElement) {
            dataSetTypeName = ((OdaDataSetTypeElement) getSelectedDataSet()).getDataSetType().getID();
        } else if (getSelectedDataSet() instanceof DataSetTypeElement) {
            dataSetTypeName = ((DataSetTypeElement) getSelectedDataSet()).getDataSetTypeName();
        }

        return createDataSet(dataSetTypeName);
    }

    private DataSetHandle createDataSet(String dataSetType) throws SemanticException {
        DataSourceHandle source = getSelectedDataSource();
        if (source instanceof OdaDataSourceHandle) {
            OdaDataSetHandle dsHandle = Utility.newOdaDataSet(getDataSetName().trim(), dataSetType);
            dsHandle.setDataSource(source.getQualifiedName());
            dsHandle.setQueryText(""); //$NON-NLS-1$ //Need a empty query in the dataset.
            return dsHandle;
        } else if (source instanceof ScriptDataSourceHandle) {
            ScriptDataSetHandle dsHandle = Utility.newScriptDataSet(getDataSetName());
            dsHandle.setDataSource(source.getName());
            return dsHandle;
        } else
            return helper.createDataSet(getDataSetName().trim(), dataSetType);
    }

    public String getScriptDataSetName(DataSourceHandle dataSourceHandle) {
        if (dataSourceHandle instanceof ScriptDataSourceHandle) {
            if (dataSourceHandle.getProperty(DataUIConstants.SCRIPT_TYPE) != null && dataSourceHandle
                    .getProperty(DataUIConstants.SCRIPT_TYPE).equals(DataUIConstants.CASSANDRA_DATA_SOURCE_VALUE)) {
                return CASSANDRA_DATASET_NAME;
            } else
                return SCRIPT_DATASET_NAME;
        }
        return null;
    }

    public String getScriptDataSourceName(DataSourceHandle dataSourceHandle) {
        if (dataSourceHandle instanceof ScriptDataSourceHandle) {
            if (dataSourceHandle.getProperty(DataUIConstants.SCRIPT_TYPE) != null && dataSourceHandle
                    .getProperty(DataUIConstants.SCRIPT_TYPE).equals(DataUIConstants.CASSANDRA_DATA_SOURCE_VALUE)) {
                return CASSANDRA_DATASOURCE_NAME;
            } else
                return SCRIPT_DATASOURCE_NAME;
        }
        return null;
    }

    public boolean isScriptDataSet(String dataSourceID) {
        if (SCRIPT_DATASOURCE_NAME.equals(dataSourceID) || CASSANDRA_DATASOURCE_NAME.equals(dataSourceID)) {
            return true;
        }
        return false;
    }
}

class DataSetTypesProvider implements IStructuredContentProvider, ILabelProvider {

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java
     * .lang.Object)
     */
    public Object[] getElements(Object inputElement) {
        if (inputElement != null && (inputElement instanceof DataSetTypeElement[])) {
            return (Object[]) inputElement;
        }
        return new Object[] {};
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.viewers.IContentProvider#dispose()
     */
    public void dispose() {
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface
     * .viewers.Viewer, java.lang.Object, java.lang.Object)
     */
    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
     */
    public Image getImage(Object element) {
        return null;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
     */
    public String getText(Object element) {
        if (element instanceof DataSetTypeElement) {
            DataSetTypeElement type = (DataSetTypeElement) element;
            return type.getDataSetTypeName();
        }
        return element.toString();
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.
     * jface.viewers.ILabelProviderListener)
     */
    public void addListener(ILabelProviderListener listener) {
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang
     * .Object, java.lang.String)
     */
    public boolean isLabelProperty(Object element, String property) {
        return true;
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse
     * .jface.viewers.ILabelProviderListener)
     */
    public void removeListener(ILabelProviderListener listener) {
    }

}

class WizardFilter extends PatternFilter {

    public WizardFilter() {
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.ui.dialogs.PatternFilter#isElementVisible(org.eclipse.jface
     * .viewers.Viewer, java.lang.Object)
     */
    public boolean isElementVisible(Viewer viewer, Object element) {
        if (isLeafMatch(viewer, element)) {
            return true;
        }

        if (element instanceof DataSourceType) {
            ITreeContentProvider contentProvider = (ITreeContentProvider) ((TreeViewer) viewer)
                    .getContentProvider();
            DataSourceType node = (DataSourceType) element;
            Object[] children = contentProvider.getChildren(node);
            // Will return true if any subnode of the element matches the search
            if (filter(viewer, element, children).length > 0) {
                return true;
            }
        }
        return false;
    }

    protected boolean isLeafMatch(Viewer viewer, Object element) {

        String text;
        if (element instanceof DataSourceType) {
            return false;
        } else if (element instanceof DataSourceHandle) {
            DataSourceHandle node = (DataSourceHandle) element;
            text = node.getName();

            if (wordMatches(text)) {
                return true;
            }
        }
        return false;
    }
}

class DataSourceType {

    private String dataSourceID, dataSourceDisplayName;
    private DataSetTypeElement[] dataSetType;
    private List dataSourceList = new ArrayList();

    public DataSourceType(String dataSourceID, String dataSourceDisplayName, DataSetTypeElement[] dataSetType) {
        this.dataSourceID = dataSourceID;
        this.dataSourceDisplayName = dataSourceDisplayName;
        this.dataSetType = dataSetType;
    }

    public String getDataSourceID() {
        return this.dataSourceID;
    }

    public DataSetTypeElement[] getDataSetTypes() {
        return this.dataSetType;
    }

    public String getDataSourceDisplayName() {
        return this.dataSourceDisplayName;
    }

    public void addDataSource(DataSourceHandle handle) {
        dataSourceList.add(handle);
    }

    public List getDataSourceList() {
        return this.dataSourceList;
    }

    /*
     * @see java.lang.Object#equals(java.lang.Object)
     */
    public boolean equals(Object obj) {
        if (obj == null || !(obj instanceof DataSourceType)) {
            return false;
        }
        if (this.dataSourceID != null && this.dataSourceID.equals((((DataSourceType) obj)).getDataSourceID())) {
            return true;
        } else {
            return false;
        }
    }

    /*
     * @see java.lang.Object#hashCode()
     */
    public int hashCode() {
        return this.dataSourceID == null ? 0 : this.dataSourceID.hashCode();
    }
}

class DataSetTypeElement {

    private String name;

    public DataSetTypeElement(String name) {
        this.name = name;
    }

    public String getDataSetTypeName() {
        return this.name;
    }
}

class OdaDataSetTypeElement extends DataSetTypeElement {

    private DataSetType dataSetType;
    private IConfigurationElement configureElement;

    public OdaDataSetTypeElement(DataSetType dataSetType, IConfigurationElement configureElement) {
        super(dataSetType.getDisplayName());
        this.dataSetType = dataSetType;
        this.configureElement = configureElement;
    }

    public DataSetType getDataSetType() {
        return this.dataSetType;
    }

    public IConfigurationElement getIConfigurationElement() {
        return this.configureElement;
    }
}