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

Java tutorial

Introduction

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

Source

/*******************************************************************************
 * Copyright (c) 2004 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.util.HashMap;
import java.util.List;
import java.util.Map;

import org.eclipse.birt.core.exception.BirtException;
import org.eclipse.birt.data.engine.api.IResultIterator;
import org.eclipse.birt.data.engine.api.IResultMetaData;
import org.eclipse.birt.report.data.adapter.api.DataRequestSession;
import org.eclipse.birt.report.data.adapter.impl.DataSetMetaDataHelper;
import org.eclipse.birt.report.designer.data.ui.dataset.DataSetPreviewer.PreviewType;
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.internal.ui.util.ExceptionHandler;
import org.eclipse.birt.report.designer.nls.Messages;
import org.eclipse.birt.report.designer.ui.dialogs.properties.AbstractPropertyPage;
import org.eclipse.birt.report.engine.api.EngineConfig;
import org.eclipse.birt.report.engine.api.EngineConstants;
import org.eclipse.birt.report.model.api.DataSetHandle;
import org.eclipse.birt.report.model.api.DesignElementHandle;
import org.eclipse.birt.report.model.api.ModuleHandle;
import org.eclipse.birt.report.model.api.PropertyHandle;
import org.eclipse.birt.report.model.api.activity.NotificationEvent;
import org.eclipse.birt.report.model.api.activity.SemanticException;
import org.eclipse.birt.report.model.api.core.Listener;
import org.eclipse.birt.report.model.api.elements.structures.DataSetParameter;
import org.eclipse.datatools.connectivity.oda.util.ResourceIdentifiers;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.viewers.ColumnPixelData;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.PlatformUI;

/**
 * Property page to preview the output parameters.
 * 
 */

public class OutputParameterPreviewPage extends AbstractPropertyPage implements Listener {
    private Table outputParameterTable = null;
    private boolean modelChanged = true;

    /**
     * The constructor.
     */
    public OutputParameterPreviewPage() {
        super();
    }

    /*
     * @see org.eclipse.birt.report.designer.ui.IPropertyPage#createPageControl(org.eclipse.swt.widgets.Composite)
     */
    public Control createPageControl(Composite parent) {
        outputParameterTable = new Table(parent, SWT.FULL_SELECTION | SWT.MULTI);
        outputParameterTable.setHeaderVisible(true);
        outputParameterTable.setLinesVisible(true);
        ((DataSetHandle) getContainer().getModel()).addListener(this);

        outputParameterTable.addMouseListener(new MouseAdapter() {

            /*
             *  (non-Javadoc)
             * @see org.eclipse.swt.events.MouseListener#mouseUp(org.eclipse.swt.events.MouseEvent)
             */
            public void mouseUp(MouseEvent e) {
                // if not mouse left button
                if (e.button != 1) {
                    MenuManager menuManager = new MenuManager();

                    ResultSetTableAction copyAction = ResultSetTableActionFactory.createResultSetTableAction(
                            outputParameterTable, ResultSetTableActionFactory.COPY_ACTION);
                    ResultSetTableAction selectAllAction = ResultSetTableActionFactory.createResultSetTableAction(
                            outputParameterTable, ResultSetTableActionFactory.SELECTALL_ACTION);
                    menuManager.add(copyAction);
                    menuManager.add(selectAllAction);

                    menuManager.update();

                    copyAction.update();
                    selectAllAction.update();

                    Menu contextMenu = menuManager.createContextMenu(outputParameterTable);

                    contextMenu.setEnabled(true);
                    contextMenu.setVisible(true);
                }
            }
        });

        return outputParameterTable;
    }

    /*
     * @see org.eclipse.birt.model.core.Listener#elementChanged(org.eclipse.birt.model.api.DesignElementHandle,
     *      org.eclipse.birt.model.activity.NotificationEvent)
     */
    public void elementChanged(DesignElementHandle focus, NotificationEvent ev) {
        if (focus.equals(getContainer().getModel())) {
            modelChanged = true;
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.birt.report.designer.ui.IPropertyPage#pageActivated()
     */
    public void pageActivated() {
        getContainer().setMessage(Messages.getString("dataset.editor.outputparameters"), //$NON-NLS-1$
                IMessageProvider.NONE);

        if (modelChanged || ((DataSetEditor) this.getContainer()).modelChanged()) {
            modelChanged = false;
            runUpdateResults();
        }
    }

    /**
     * Update table result
     */
    private void runUpdateResults() {
        if (outputParameterTable != null && !outputParameterTable.isDisposed()) {
            clearResultSetTable();
            PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
                /*
                 *  (non-Javadoc)
                 * @see java.lang.Runnable#run()
                 */
                public void run() {
                    if (outputParameterTable != null && !outputParameterTable.isDisposed()) {
                        updateResults();
                    }
                }
            });
        }
    }

    /**
     * Clear table result and release its UI resource
     */
    private void clearResultSetTable() {
        // Clear the columns
        TableColumn[] columns = outputParameterTable.getColumns();
        for (int n = 0; n < columns.length; n++) {
            columns[n].dispose();
        }
        // clear everything else
        outputParameterTable.removeAll();
    }

    /**
     * update output parameter table result
     */
    private void updateResults() {
        int outputParamsSize = outputParametersSize();
        if (outputParamsSize == 0)
            return;

        DataRequestSession session = null;

        ModuleHandle handle = null;
        DataSetHandle dsHandle = ((DataSetEditor) getContainer()).getHandle();
        handle = dsHandle.getModuleHandle();
        DataSetPreviewer previewer = new DataSetPreviewer(dsHandle, 1, PreviewType.OUTPUTPARAM);

        Map appContext = new HashMap();
        Map dataSetBindingMap = new HashMap();
        Map dataSourceBindingMap = new HashMap();

        TableLayout layout = new TableLayout();
        TableColumn column = null;
        TableItem tableItem = null;
        try {
            ResourceIdentifiers identifiers = new ResourceIdentifiers();
            String resouceIDs = ResourceIdentifiers.ODA_APP_CONTEXT_KEY_CONSUMER_RESOURCE_IDS;
            identifiers.setApplResourceBaseURI(DTPUtil.getInstance().getBIRTResourcePath());
            identifiers.setDesignResourceBaseURI(DTPUtil.getInstance().getReportDesignPath());
            appContext.put(resouceIDs, identifiers);
            clearProperyBindingMap(dataSetBindingMap, dataSourceBindingMap);

            AppContextPopulator.populateApplicationContext(dsHandle, appContext);
            previewer.open(appContext, getEngineConfig(handle));
            IResultIterator iter = previewer.preview();
            iter.next();

            IResultMetaData meta = iter.getResultMetaData();
            String[] record = new String[meta.getColumnCount()];
            for (int n = 0; n < record.length; n++) {
                column = new TableColumn(outputParameterTable, SWT.LEFT);
                column.setText(meta.getColumnName(n + 1));
                column.setResizable(true);
                layout.addColumnData(new ColumnPixelData(120, true));
                record[n] = iter.getString(meta.getColumnName(n + 1));
            }
            outputParameterTable.setLayout(layout);
            outputParameterTable.layout(true);

            tableItem = new TableItem(outputParameterTable, SWT.NONE);
            tableItem.setText(record);

            iter.close();
        } catch (BirtException e) {
            ExceptionHandler.handle(e);
        } finally {
            try {
                AppContextResourceReleaser.release(appContext);
                previewer.close();
            } catch (BirtException e) {
                e.printStackTrace();
            }
            resetPropertyBinding(dataSetBindingMap, dataSourceBindingMap);
        }
    }

    private EngineConfig getEngineConfig(ModuleHandle handle) {
        EngineConfig ec = new EngineConfig();
        ClassLoader parent = Thread.currentThread().getContextClassLoader();
        if (parent == null) {
            parent = this.getClass().getClassLoader();
        }
        ClassLoader customClassLoader = DataSetProvider.getCustomScriptClassLoader(parent, handle);
        ec.getAppContext().put(EngineConstants.APPCONTEXT_CLASSLOADER_KEY, customClassLoader);
        return ec;
    }

    private void resetPropertyBinding(final Map dataSetBindingMap, final Map dataSourceBindingMap) {
        Display.getDefault().syncExec(new Runnable() {

            public void run() {
                try {
                    DataSetHandle dsHandle = ((DataSetEditor) getContainer()).getHandle();
                    DataSetMetaDataHelper.resetPropertyBinding(dsHandle, dataSetBindingMap, dataSourceBindingMap);
                } catch (SemanticException e) {
                    ExceptionHandler.handle(e);
                }
            }
        });
    }

    private void clearProperyBindingMap(final Map dataSetBindingMap, final Map dataSourceBindingMap) {
        Display.getDefault().syncExec(new Runnable() {

            public void run() {
                DataSetHandle dsHandle = ((DataSetEditor) getContainer()).getHandle();
                try {
                    DataSetMetaDataHelper.clearPropertyBindingMap(dsHandle, dataSetBindingMap,
                            dataSourceBindingMap);
                } catch (SemanticException e) {
                    ExceptionHandler.handle(e);
                }
            }
        });
    }

    /**
     * @return the count of output parameters
     */
    private int outputParametersSize() {
        // first check whether parameter list is null
        PropertyHandle propertyHandle = ((DataSetEditor) getContainer()).getHandle()
                .getPropertyHandle(DataSetHandle.PARAMETERS_PROP);
        List paramList = propertyHandle.getListValue();
        if (paramList == null || paramList.size() == 0)
            return 0;

        // second check whether there is output parameter
        int size = 0;
        int paramSize = paramList.size();
        for (int i = 0; i < paramSize; i++) {
            DataSetParameter parameter = (DataSetParameter) paramList.get(i);
            if (parameter.isOutput() == true) {
                size++;
            }
        }

        return size;
    }

    /*
     * @see org.eclipse.birt.report.designer.ui.dialogs.properties.IPropertyPage#performOk()
     */
    public boolean performOk() {
        ((DataSetHandle) getContainer().getModel()).removeListener(this);
        return super.performOk();
    }

    /*
     * @see org.eclipse.birt.report.designer.ui.dialogs.properties.IPropertyPage#performCancel()
     */
    public boolean performCancel() {
        ((DataSetHandle) getContainer().getModel()).removeListener(this);
        return super.performCancel();
    }

    /*
     * @see org.eclipse.birt.report.designer.ui.dialogs.properties.IPropertyPage#getToolTip()
     */
    public String getToolTip() {
        return Messages.getString("dataset.outputparameters.preview.tooltip"); //$NON-NLS-1$
    }

}