it.eng.spagobi.meta.querybuilder.ui.shared.result.ResultTableViewer.java Source code

Java tutorial

Introduction

Here is the source code for it.eng.spagobi.meta.querybuilder.ui.shared.result.ResultTableViewer.java

Source

/**
 SpagoBI, the Open Source Business Intelligence suite
    
 Copyright (C) 2012 Engineering Ingegneria Informatica S.p.A. - SpagoBI Competency Center
 This Source Code Form is subject to the terms of the Mozilla Public
 License, v. 2.0. If a copy of the MPL was not distributed with this file,
 You can obtain one at http://mozilla.org/MPL/2.0/.
     
**/
package it.eng.spagobi.meta.querybuilder.ui.shared.result;

import it.eng.qbe.query.Query;
import it.eng.qbe.statement.IStatement;
import it.eng.qbe.statement.QbeDatasetFactory;
import it.eng.spagobi.meta.querybuilder.SpagoBIMetaQueryBuilderPlugin;
import it.eng.spagobi.meta.querybuilder.ui.QueryBuilder;
import it.eng.spagobi.tools.dataset.bo.IDataSet;
import it.eng.spagobi.tools.dataset.common.datastore.IDataStore;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.RowData;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.TableColumn;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author Alberto Ghedin (alberto.ghedin@eng.it)
 *
 */

public class ResultTableViewer extends TableViewer {

    private QueryBuilder queryBuilder;
    private IDataSet dataSet;
    private ResultTableComparator comparator;
    private static final int defaultColumnWidth = 100;
    private int offset = 0;
    private int pageSize = 25;
    private int maxResults = 10000;
    private int resultSize = 0;
    private Label pages; //label for pagination

    private static Logger logger = LoggerFactory.getLogger(ResultTableViewer.class);

    /**
     * Constructor
     * @param groupQueryResult
     * @param modelStructure
     */
    public ResultTableViewer(Group groupQueryResult, QueryBuilder queryBuilder) {
        super(groupQueryResult, SWT.BORDER | SWT.FULL_SELECTION);
        this.queryBuilder = queryBuilder;
        getTable().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
        setLabelProvider(new ResultTableLabelProvider());
        setContentProvider(new ResultTableContentProvider());
        getTable().setLinesVisible(true);
        getTable().setHeaderVisible(true);

        //COLUMN SORTING
        comparator = new ResultTableComparator();
        setComparator(comparator);

        //Pagination
        addPagination(groupQueryResult);

    }

    /**
     * Add the pagination grid to the result page
     * @param groupQueryResult
     */
    private void addPagination(Group groupQueryResult) {

        Composite bottonContainer = new Composite(groupQueryResult, SWT.NONE);
        bottonContainer.setLayout(new RowLayout());

        Button prevoiusButton = new Button(bottonContainer, SWT.PUSH);
        prevoiusButton.setText("<<");
        prevoiusButton.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event event) {
                offset = offset - pageSize;
                if (offset < 0) {
                    offset = 0;
                }
                setInput(updateTableData());
            }
        });

        pages = new Label(bottonContainer, SWT.CENTER);
        pages.setLayoutData(new RowData(200, 20));
        int end = offset + pageSize;
        if (end > resultSize) {
            end = resultSize;
        }
        int maxResultSize = (resultSize > maxResults) ? maxResults : resultSize;
        pages.setText(offset + " - " + end + " / " + maxResultSize);

        Button nextButton = new Button(bottonContainer, SWT.PUSH);
        nextButton.setText(">>");
        nextButton.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event event) {
                int maxResultSize = (resultSize > maxResults) ? maxResults : resultSize;
                offset = offset + pageSize;
                if (offset >= maxResultSize) {
                    offset = maxResultSize - pageSize;
                    if (offset < 0) {
                        offset = 0;
                    }
                }
                setInput(updateTableData());
            }
        });
    }

    /**
     * Update the table: delete the columns,  reload the query, execute the query 
     */
    public void updateTable() {
        String name;
        Class type;

        //execute the query
        offset = 0;
        IDataStore dataStore = updateTableData();

        //delete the old columns
        TableColumn[] columns = getTable().getColumns();
        if (columns != null) {
            for (int i = 0; i < columns.length; i++) {
                columns[i].dispose();
            }
        }

        //build the new columns
        logger.debug("Building the result table");
        List<Map<String, Object>> headers = new ArrayList<Map<String, Object>>();
        headers = DataStoreReader.getColumnMetaData(dataStore);
        for (int i = 0; i < headers.size(); i++) {
            final TableColumn column = new TableColumn(getTable(), SWT.NONE);
            name = (String) headers.get(i).get("title");
            type = (Class) headers.get(i).get("type");
            column.setWidth(defaultColumnWidth);
            column.setText(name);
            column.setResizable(true);
            column.setMoveable(true);
            column.addSelectionListener(getSelectionAdapter(column, i, type));
        }

        setInput(dataStore);
        logger.debug("Result table built");
    }

    /**
     * Update the table: reload the query, execute the query 
     */
    public IDataStore updateTableData() {

        Query query;
        IStatement statement;
        IDataStore dataStore;

        dataStore = null;

        try {
            query = queryBuilder.getQuery();
            logger.debug("Query created sucesfully [{}]", query);

            if (!query.isEmpty()) {

                statement = queryBuilder.getDataSource().createStatement(query);
                logger.debug("Statement created sucesfully");

                dataSet = QbeDatasetFactory.createDataSet(statement);
                logger.debug("Data set created succesfully");

                dataSet.loadData(offset, pageSize, maxResults);
                dataStore = dataSet.getDataStore();
                logger.debug("Date set loaded succesfully");

                //Update variables for pagination
                resultSize = DataStoreReader.getMaxResult(dataStore);
                int end = offset + pageSize;
                if (end > resultSize) {
                    end = resultSize;
                }
                pages.setText(offset + " - " + end + " / " + resultSize);
            } else {
                logger.debug("The query is empty");
            }

            return dataStore;
        } catch (Throwable t) {
            showError("Error", "Impossible to refresh results page", t);
            throw new RuntimeException("Impossible to refresh results page");
        }

    }

    /**
     * For every column build a selection adapter (now we manage only the order)
     * @param column TableColumn
     * @param index index of the column
     * @param type type of the data in the column
     * @return
     */
    private SelectionAdapter getSelectionAdapter(final TableColumn column, final int index, final Class type) {
        SelectionAdapter selectionAdapter = new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                comparator.setColumn(index, type);
                int dir = getTable().getSortDirection();
                if (getTable().getSortColumn() == column) {
                    dir = dir == SWT.UP ? SWT.DOWN : SWT.UP;
                } else {

                    dir = SWT.DOWN;
                }
                getTable().setSortDirection(dir);
                getTable().setSortColumn(column);
                refresh();
            }
        };
        return selectionAdapter;
    }

    public void setOffset(int offset) {
        this.offset = offset;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    public void setMaxResults(int maxResults) {
        this.maxResults = maxResults;
    }

    public void showError(final String title, final String message, final Throwable t) {
        Display.getDefault().asyncExec(new Runnable() {
            @Override
            public void run() {
                IStatus status = new Status(IStatus.ERROR, SpagoBIMetaQueryBuilderPlugin.PLUGIN_ID, 1,
                        "Exception found.", t.getCause());
                ExceptionDetailsErrorDialog.openError(null, title, message, status);
                //MessageDialog.openError(null, title, message);
            }
        });
    }

    //   public void showError(final String title, Throwable t) {
    //      showError(title, getStackTrace(t));
    //   }

    public String getStackTrace(Throwable t) {
        StringWriter stringWritter = new StringWriter();
        PrintWriter printWritter = new PrintWriter(stringWritter, true);
        t.printStackTrace(printWritter);
        printWritter.flush();
        stringWritter.flush();
        return stringWritter.toString();
    }
}