ro.nextreports.designer.wizrep.QueryWizardPanel.java Source code

Java tutorial

Introduction

Here is the source code for ro.nextreports.designer.wizrep.QueryWizardPanel.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package ro.nextreports.designer.wizrep;

import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.util.List;
import java.util.Map;
import java.util.ArrayList;

import javax.swing.*;

import ro.nextreports.engine.queryexec.Query;
import ro.nextreports.engine.queryexec.QueryParameter;
import ro.nextreports.engine.querybuilder.sql.ParameterConstants;
import ro.nextreports.engine.querybuilder.sql.SelectQuery;
import ro.nextreports.engine.querybuilder.sql.Column;
import ro.nextreports.engine.querybuilder.sql.Table;
import ro.nextreports.engine.querybuilder.sql.dialect.CSVDialect;
import ro.nextreports.engine.querybuilder.sql.dialect.Dialect;
import ro.nextreports.engine.Report;
import ro.nextreports.engine.util.DialectUtil;
import ro.nextreports.engine.exporter.ResultExporter;
import ro.nextreports.engine.persistence.TablePersistentObject;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import ro.nextreports.designer.Globals;
import ro.nextreports.designer.datasource.DataSource;
import ro.nextreports.designer.datasource.DefaultDataSourceManager;
import ro.nextreports.designer.dbviewer.common.DBColumn;
import ro.nextreports.designer.persistence.ReportPersistence;
import ro.nextreports.designer.persistence.ReportPersistenceFactory;
import ro.nextreports.designer.querybuilder.ParameterManager;
import ro.nextreports.designer.querybuilder.ParametersPanel;
import ro.nextreports.designer.querybuilder.QueryBrowserPanel;
import ro.nextreports.designer.ui.list.CheckListBox;
import ro.nextreports.designer.ui.sqleditor.EditorPanel;
import ro.nextreports.designer.ui.wizard.WizardPanel;
import ro.nextreports.designer.util.I18NSupport;
import ro.nextreports.designer.util.TableUtil;

/**
 * Created by IntelliJ IDEA.
 * User: mihai.panaitescu
 * Date: Oct 9, 2008
 * Time: 3:36:11 PM
 */
public class QueryWizardPanel extends WizardPanel {

    private EditorPanel editor;
    private JLabel queryLabel;
    private QueryBrowserPanel queryPanel;
    private JLabel sqlLabel;
    private ParametersPanel parametersPanel;
    private EasySelectColumnsPanel easyPanel;
    private Dimension buttonDim = new Dimension(20, 20);
    private Dimension dim = new Dimension(150, 20);
    private Dimension comboDim = new Dimension(200, 20);
    private JRadioButton selectionRB = new JRadioButton(I18NSupport.getString("wizard.panel.query.selection"));
    private JRadioButton queryRB = new JRadioButton(I18NSupport.getString("wizard.panel.query.query"));
    private JRadioButton editRB = new JRadioButton(I18NSupport.getString("wizard.panel.query.edit"));
    private JLabel emptyLabel = new JLabel("");

    private static final Log LOG = LogFactory.getLog(QueryWizardPanel.class);

    public QueryWizardPanel() {
        super();
        banner.setTitle(I18NSupport.getString("wizard.panel.step", 3, 5)
                + I18NSupport.getString("wizard.panel.query.title"));
        banner.setSubtitle(I18NSupport.getString("wizard.panel.query.subtitle", ParameterConstants.START_PARAM,
                ParameterConstants.END_PARAM));
        WizardUtil.resetParametersAndLanguages();
        init();
    }

    /**
     * Called when the panel is set.
     */
    public void onDisplay() {
    }

    /**
     * Is there be a next panel?
     *
     * @return true if there is a panel to move to next
     */
    public boolean hasNext() {
        return true;
    }

    /**
     * Called to validate the panel before moving to next panel.
     *
     * @param messages a List of messages to be displayed.
     * @return true if the panel is valid,
     */
    public boolean validateNext(List<String> messages) {

        String sql = editor.getText();
        if ("".equals(sql.trim())) {

            List<DBColumn> list = easyPanel.getSelectedColumns();
            if (list.size() == 0) {
                if (selectionRB.isSelected()) {
                    messages.add(I18NSupport.getString("wizard.panel.query.validate.column"));
                } else if (queryRB.isSelected()) {
                    messages.add(I18NSupport.getString("wizard.panel.query.validate.query"));
                } else {
                    messages.add(I18NSupport.getString("wizard.panel.query.validate.enter"));
                }
                return false;
            } else {
                SelectQuery selectQuery = new SelectQuery();
                for (DBColumn col : list) {
                    Table table = new Table(col.getTable());
                    table.setSchemaName(easyPanel.getSchemaName());
                    try {
                        Dialect dialect = DialectUtil.getDialect(Globals.getConnection());
                        table.setDialect(dialect);
                        selectQuery.setDialect(dialect);
                    } catch (Exception e) {
                        e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
                        LOG.error(e.getMessage(), e);
                    }
                    Column column = new Column(table, col.getName(), TableUtil.getJavaTypeForColumn(col));
                    DataSource ds = DefaultDataSourceManager.getInstance().getConnectedDataSource();
                    if (ds.getDriver().equals(CSVDialect.DRIVER_CLASS)) {
                        column.setUseTableName(false);
                    }
                    column.setOutput(true);
                    column.setfKey(col.isForeignKey());
                    column.setpKey(col.isPrimaryKey());
                    selectQuery.addColumn(column);
                    sql = selectQuery.toString();
                }
            }
        }
        ParameterManager paramManager = ParameterManager.getInstance();
        Map<String, QueryParameter> parametersMap = paramManager.getParametersMap();
        try {
            checkSqlHasParametersDefined(sql, parametersMap);
        } catch (Exception e) {
            messages.add(e.getMessage());
            return false;
        }

        context.setAttribute(WizardConstants.QUERY, new Query(sql));
        return true;
    }

    private List<TablePersistentObject> getTables(List<DBColumn> list) {
        List<TablePersistentObject> tables = new ArrayList<TablePersistentObject>();
        int x = 100;
        int y = 100;
        for (DBColumn col : list) {
            TablePersistentObject tpo = new TablePersistentObject();
            Table table = new Table(col.getTable());
            table.setSchemaName(easyPanel.getSchemaName());
            try {
                table.setDialect(DialectUtil.getDialect(Globals.getConnection()));
            } catch (Exception e) {
                e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
                LOG.error(e.getMessage(), e);
            }
            tpo.setTable(table);
            tpo.setPoint(new Point(x + 250, 100));
            tpo.setDim(CheckListBox.tableDim);
            tables.add(tpo);
        }
        return tables;
    }

    /**
     * Get the next panel to go to.
     */
    public WizardPanel getNextPanel() {
        String entity = (String) context.getAttribute(WizardConstants.ENTITY);
        Integer reportType = (Integer) context.getAttribute(WizardConstants.REPORT_TYPE);
        if (WizardConstants.ENTITY_REPORT.equals(entity)) {
            if (reportType.equals(ResultExporter.ALARM_TYPE) || reportType.equals(ResultExporter.INDICATOR_TYPE)) {
                return new SelectOneColumnWizardPanel();
            } else if (reportType.equals(ResultExporter.DISPLAY_TYPE)) {
                return new SelectTwoColumnsWizardPanel();
            } else {
                return new SelectColumnsWizardPanel();
            }
        } else {
            return new SelectChartColumnsWizardPanel();
        }
    }

    /**
     * Can this panel finish the wizard?
     *
     * @return true if this panel can finish the wizard.
     */
    public boolean canFinish() {
        return false;
    }

    /**
     * Called to validate the panel before finishing the wizard. Should return
     * false if canFinish returns false.
     *
     * @param messages a List of messages to be displayed.
     * @return true if it is valid for this wizard to finish.
     */
    public boolean validateFinish(List<String> messages) {
        return false;
    }

    /**
     * Handle finishing the wizard.
     */
    public void onFinish() {
    }

    private void init() {
        setLayout(new BorderLayout());

        ButtonGroup bg = new ButtonGroup();
        bg.add(selectionRB);
        bg.add(queryRB);
        bg.add(editRB);
        selectionRB.setSelected(true);

        selectionRB.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                selection();
            }
        });
        queryRB.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                selection();
            }
        });
        editRB.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                selection();
            }
        });

        editor = new EditorPanel();
        parametersPanel = new ParametersPanel();
        parametersPanel.setPreferredSize(new Dimension(120, 200));

        queryPanel = new QueryBrowserPanel() {
            protected void selection() {
                String name = queryPanel.getSelectedFilePath();
                if (queryPanel.querySelected()) {
                    ReportPersistence repPersist = ReportPersistenceFactory
                            .createReportPersistence(Globals.getReportPersistenceType());
                    Report report = repPersist.loadReport(name);
                    context.setAttribute(WizardConstants.LOAD_REPORT, report);
                    String sql = report.getSql();
                    if (sql == null) {
                        sql = report.getQuery().toString();
                    }
                    editor.setText(sql);
                    parametersPanel.set(report.getParameters());
                } else {
                    context.setAttribute(WizardConstants.LOAD_REPORT, null);
                    editor.setText("");
                    parametersPanel.set(new ArrayList<QueryParameter>());
                }
            }
        };

        sqlLabel = new JLabel("<html><b>Sql</b></html>");

        easyPanel = new EasySelectColumnsPanel();

        JPanel qPanel = new JPanel(new GridBagLayout());

        JPanel radioPanel = new JPanel();
        radioPanel.setLayout(new BoxLayout(radioPanel, BoxLayout.X_AXIS));
        radioPanel.add(selectionRB);
        radioPanel.add(Box.createHorizontalStrut(5));
        radioPanel.add(queryRB);
        radioPanel.add(Box.createHorizontalStrut(5));
        radioPanel.add(editRB);

        qPanel.add(radioPanel, new GridBagConstraints(0, 0, 4, 1, 1.0, 0.0, GridBagConstraints.WEST,
                GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0));

        queryLabel = new JLabel(I18NSupport.getString("query.name"));
        qPanel.add(queryLabel, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0, GridBagConstraints.NORTHWEST,
                GridBagConstraints.NONE, new Insets(5, 5, 0, 0), 0, 0));
        qPanel.add(queryPanel, new GridBagConstraints(1, 1, 1, 1, 1.0, 1.0, GridBagConstraints.WEST,
                GridBagConstraints.BOTH, new Insets(5, 5, 0, 0), 0, 0));

        qPanel.add(sqlLabel, new GridBagConstraints(0, 2, 3, 1, 0.0, 0.0, GridBagConstraints.WEST,
                GridBagConstraints.NONE, new Insets(5, 5, 0, 0), 0, 0));
        qPanel.add(editor, new GridBagConstraints(0, 3, 3, 1, 1.0, 1.0, GridBagConstraints.WEST,
                GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0));
        qPanel.add(parametersPanel, new GridBagConstraints(3, 2, 1, 2, 0.0, 1.0, GridBagConstraints.WEST,
                GridBagConstraints.VERTICAL, new Insets(0, 5, 5, 5), 0, 0));
        qPanel.add(emptyLabel, new GridBagConstraints(0, 4, 4, 1, 1.0, 1.0, GridBagConstraints.WEST,
                GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));

        qPanel.add(easyPanel, new GridBagConstraints(0, 2, 4, 1, 1.0, 1.0, GridBagConstraints.WEST,
                GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0));

        selection();

        add(qPanel, BorderLayout.CENTER);
    }

    private void selection() {
        if (selectionRB.isSelected()) {
            editor.setText("");
            queryPanel.clearSelection();
            parametersPanel.set(new ArrayList<QueryParameter>());
            easyPanel.setVisible(true);
        } else {
            easyPanel.setVisible(false);
        }
        if (queryRB.isSelected()) {
            editor.setText("");
            easyPanel.resetSelectedColumns();
            queryLabel.setVisible(true);
            queryPanel.setVisible(true);
            emptyLabel.setVisible(true);
        } else {
            queryLabel.setVisible(false);
            queryPanel.setVisible(false);
            emptyLabel.setVisible(false);
        }
        if (editRB.isSelected()) {
            queryPanel.clearSelection();
            editor.setText("");
            parametersPanel.set(new ArrayList<QueryParameter>());
            easyPanel.resetSelectedColumns();
            sqlLabel.setVisible(true);
            editor.setVisible(true);
            parametersPanel.setVisible(true);
        } else {
            sqlLabel.setVisible(false);
            editor.setVisible(false);
            parametersPanel.setVisible(false);
        }
    }

    public void checkSqlHasParametersDefined(String sql, Map<String, QueryParameter> params) throws Exception {
        // create the query object
        Query query = new Query(sql);

        // get parameter names
        String[] paramNames = query.getParameterNames();

        // execute query if no parameters
        if (paramNames.length == 0) {
            return;
        }

        for (String name : paramNames) {
            QueryParameter param = params.get(name);
            if (param == null) {
                throw new Exception(I18NSupport.getString("run.parameter.not.defined", name));
            }
        }
    }

}