ro.nextreports.designer.util.NextReportsUtil.java Source code

Java tutorial

Introduction

Here is the source code for ro.nextreports.designer.util.NextReportsUtil.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.util;

import ro.nextreports.engine.Report;
import ro.nextreports.engine.util.ParameterUtil;
import ro.nextreports.engine.util.ReportUtil;
import ro.nextreports.engine.util.StringUtil;
import ro.nextreports.engine.queryexec.Query;
import ro.nextreports.engine.queryexec.QueryParameter;
import ro.nextreports.engine.exporter.util.ParametersBean;
import ro.nextreports.engine.i18n.I18nString;
import ro.nextreports.engine.chart.Chart;

import javax.swing.*;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import ro.nextreports.designer.FormLoader;
import ro.nextreports.designer.FormSaver;
import ro.nextreports.designer.Globals;
import ro.nextreports.designer.LayoutHelper;
import ro.nextreports.designer.action.chart.SaveChartAction;
import ro.nextreports.designer.action.query.SaveQueryAction;
import ro.nextreports.designer.action.report.NewReportAction;
import ro.nextreports.designer.action.report.SaveReportAction;
import ro.nextreports.designer.chart.ChartUtil;
import ro.nextreports.designer.datasource.DataSource;
import ro.nextreports.designer.persistence.ReportPersistence;
import ro.nextreports.designer.persistence.ReportPersistenceFactory;
import ro.nextreports.designer.querybuilder.ParameterManager;
import ro.nextreports.designer.querybuilder.QueryBuilderPanel;
import ro.nextreports.designer.querybuilder.RuntimeParametersDialog;
import ro.nextreports.designer.querybuilder.RuntimeParametersPanel;

import java.sql.Connection;
import java.sql.SQLException;
import java.text.Collator;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.LinkedHashMap;
import java.util.HashMap;
import java.util.Set;
import java.util.TreeSet;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

/**
 * Created by IntelliJ IDEA.
 * User: mihai.panaitescu
 * Date: Jul 31, 2006
 * Time: 11:17:37 AM
 */
public class NextReportsUtil {

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

    /**
     * Helper method which is used when a query from a report is modified
     * @return true if the query has to be modified, and in this case
     * a new report will be regenerated
     */
    public static boolean doQueryOperation() {
        if (Globals.isReportLoaded()) {
            Object[] options = { I18NSupport.getString("report.util.yes"),
                    I18NSupport.getString("report.util.no") };
            int option = JOptionPane.showOptionDialog(Globals.getMainFrame(),
                    I18NSupport.getString("report.regenerated"), I18NSupport.getString("report.util.confirm"),
                    JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[1]);

            return (option == JOptionPane.YES_OPTION);
        } else {
            return true;
        }
    }

    /**
     * Helper method for report recreation
     * @return true if report will be recreated
     */
    public static boolean reportRecreation() {
        if (Globals.isReportLoaded()) {
            Object[] options = { I18NSupport.getString("report.util.yes"),
                    I18NSupport.getString("report.util.no") };
            int option = JOptionPane.showOptionDialog(Globals.getMainFrame(),
                    I18NSupport.getString("report.util.query.modified"),
                    I18NSupport.getString("report.util.confirm"), JOptionPane.YES_NO_OPTION,
                    JOptionPane.QUESTION_MESSAGE, null, options, options[1]);

            return (option == JOptionPane.YES_OPTION);
        } else {
            return true;
        }
    }

    /**
     * Helper method to recreate a report if the query inside it was modified
     */
    private static void recreateReport() {
        if (Globals.isReportLoaded()) {
            new NewReportAction(true).actionPerformed(null);
        }
    }

    public static boolean saveYesNoCancel(String titleMessage) {
        return saveYesNoCancel(titleMessage, JOptionPane.YES_NO_CANCEL_OPTION);
    }

    // return false if save operation is cancelled (closed)
    // return true if user selects YES or NO (saves or not the current report)
    public static boolean saveYesNoCancel(String titleMessage, int options) {
        final QueryBuilderPanel builderPanel = Globals.getMainFrame().getQueryBuilderPanel();
        if (!builderPanel.isCleaned()) {
            String message;
            if (Globals.isChartLoaded()) {
                if (!chartModification()) {
                    return true;
                }
                message = I18NSupport.getString("existing.chart.save");
            } else if (Globals.isReportLoaded()) {
                if (!reportModification()) {
                    return true;
                }
                message = I18NSupport.getString("existing.report.save");
            } else {
                if (!queryModification()) {
                    return true;
                }
                message = I18NSupport.getString("existing.query.save");
            }

            int option = JOptionPane.showConfirmDialog(Globals.getMainFrame(), message, titleMessage, options);
            if ((option == JOptionPane.CANCEL_OPTION) || (option == JOptionPane.CLOSED_OPTION)) {
                return false;
            } else if (option == JOptionPane.YES_OPTION) {
                if (Globals.isChartLoaded()) {
                    new SaveChartAction().actionPerformed(null);
                } else if (Globals.isReportLoaded()) {
                    new SaveReportAction().actionPerformed(null);
                } else {
                    new SaveQueryAction().actionPerformed(null);
                }
            }
        }
        return true;
    }

    public static boolean saveYesNoCancel() {
        QueryBuilderPanel builderPanel = Globals.getMainFrame().getQueryBuilderPanel();
        if (!builderPanel.isCleaned()) {
            String message;
            if (Globals.isChartLoaded()) {
                if (!chartModification()) {
                    return true;
                }
                message = I18NSupport.getString("existing.chart.save");
            } else if (Globals.isReportLoaded()) {
                if (!reportModification()) {
                    return true;
                }
                message = I18NSupport.getString("existing.report.save");
            } else {
                if (!queryModification()) {
                    return true;
                }
                message = I18NSupport.getString("existing.query.save");
            }

            int option = JOptionPane.showConfirmDialog(Globals.getMainFrame(), message,
                    I18NSupport.getString("exit"), JOptionPane.YES_NO_CANCEL_OPTION);
            if ((option == JOptionPane.CANCEL_OPTION) || (option == JOptionPane.CLOSED_OPTION)) {
                return false;
            } else if (option == JOptionPane.YES_OPTION) {
                if (Globals.isChartLoaded()) {
                    SaveChartAction action = new SaveChartAction();
                    action.actionPerformed(null);
                    if (action.isCancel()) {
                        return false;
                    }
                } else if (Globals.isReportLoaded()) {
                    SaveReportAction action = new SaveReportAction();
                    action.actionPerformed(null);
                    if (action.isCancel()) {
                        return false;
                    }
                } else {
                    SaveQueryAction action = new SaveQueryAction();
                    action.actionPerformed(null);
                    if (action.isCancel()) {
                        return false;
                    }
                }
            }
        }
        return true;
    }

    public static boolean saveReportForInserting(String message) {
        QueryBuilderPanel builderPanel = Globals.getMainFrame().getQueryBuilderPanel();
        if (!builderPanel.isCleaned()) {
            if (Globals.isReportLoaded()) {
                if (!reportModification()) {
                    return true;
                }
                int option = JOptionPane.showConfirmDialog(Globals.getMainFrame(), message,
                        I18NSupport.getString("exit"), JOptionPane.YES_NO_OPTION);
                if ((option == JOptionPane.NO_OPTION) || (option == JOptionPane.CLOSED_OPTION)) {
                    return false;
                } else if (option == JOptionPane.YES_OPTION) {
                    SaveReportAction action = new SaveReportAction();
                    action.actionPerformed(null);
                    if (action.isCancel()) {
                        return false;
                    }
                }
            }
        }
        return true;
    }

    private static boolean reportModification() {
        String loadedFilePath = Globals.getCurrentReportAbsolutePath();
        QueryBuilderPanel builderPanel = Globals.getMainFrame().getQueryBuilderPanel();
        if (loadedFilePath != null) {
            Report reportLoaded = FormLoader.getInstance().load(loadedFilePath);
            if (reportLoaded == null) {
                return true;
            }
            reportLoaded.setName(FormSaver.getInstance().getReportFileName(reportLoaded.getName()));
            Report reportToSave = builderPanel.createReport(Globals.getCurrentReportName());
            reportToSave.setLayout(LayoutHelper.getReportLayout());
            if ((reportLoaded != null) && reportLoaded.equals(reportToSave)) {
                return false;
            }
        }
        return true;
    }

    private static boolean chartModification() {
        String loadedFilePath = Globals.getCurrentChartAbsolutePath();
        QueryBuilderPanel builderPanel = Globals.getMainFrame().getQueryBuilderPanel();
        if (loadedFilePath != null) {
            Chart chartLoaded = ChartUtil.loadChart(loadedFilePath);
            if (chartLoaded == null) {
                return true;
            }
            //chartLoaded.setName(ChartUtil.getChartFileName(chartLoaded.getName()));
            Chart chartToSave = Globals.getChartDesignerPanel().getChart();
            chartToSave.setReport(builderPanel.createReport(chartToSave.getReport().getName()));
            if ((chartLoaded != null) && chartLoaded.equals(chartToSave)) {
                return false;
            }
        }
        return true;
    }

    private static boolean queryModification() {
        QueryBuilderPanel builderPanel = Globals.getMainFrame().getQueryBuilderPanel();
        String queryPath = Globals.getCurrentQueryAbsolutePath();
        if (queryPath != null) {
            ReportPersistence repPersist = ReportPersistenceFactory
                    .createReportPersistence(Globals.getReportPersistenceType());
            Report reportLoaded = repPersist.loadReport(queryPath);
            Report reportToSave = builderPanel.createReport(Globals.getCurrentQueryName());
            if ((reportLoaded != null) && reportLoaded.equals(reportToSave)) {
                return false;
            }
        }
        return true;
    }

    public static String getSql(Report report) {
        String sql;
        if (report.getSql() != null) {
            sql = report.getSql();
        } else {
            sql = report.getQuery().toString();
        }
        return sql;
    }

    public static ParametersBean selectParameters(Report report, DataSource runDS) {
        String sql = getSql(report);
        return selectParameters(sql, runDS);
    }

    public static ParametersBean selectParameters(String sql, DataSource runDS) {
        if (sql == null) {
            return null;
        }
        Query query = new Query(sql);
        //String[] paramNames = query.getParameterNames();
        Map<String, QueryParameter> params = new LinkedHashMap<String, QueryParameter>();
        Map<String, Object> paramValues = new HashMap<String, Object>();

        // used in query or just hidden (may not be used anywhere)
        params = ParameterManager.getInstance().getUsedParametersMap(query);
        if (params.size() > 0) {

            final UIActivator activator = new UIActivator(Globals.getMainFrame(),
                    I18NSupport.getString("run.load.parameters"));
            activator.start();

            if (ParameterUtil.allParametersAreHidden(params)) {
                // no parameter to show at runtime
                if (activator != null) {
                    SwingUtilities.invokeLater(new Runnable() {
                        public void run() {
                            activator.stop();
                        }
                    });
                }
            } else {
                boolean error = false;
                RuntimeParametersPanel runtimePanel = null;
                try {
                    runtimePanel = new RuntimeParametersPanel(params, runDS);
                } catch (Throwable e) {
                    LOG.error(e.getMessage(), e);
                    error = true;
                }

                if (error || ((runtimePanel != null) && runtimePanel.isError())) {
                    if (activator != null) {
                        SwingUtilities.invokeLater(new Runnable() {

                            public void run() {
                                activator.stop();
                            }

                        });
                    }

                    return null;
                }
                final RuntimeParametersDialog runtimeDialog = new RuntimeParametersDialog(runtimePanel);
                final ReporterPreferencesManager lpm = ReporterPreferencesManager.getInstance();
                Rectangle bounds = lpm.loadBoundsForWindow(RuntimeParametersDialog.class);
                runtimeDialog.addWindowListener(new WindowAdapter() {
                    public void windowClosed(WindowEvent event) {
                        lpm.storeBoundsForWindow(RuntimeParametersDialog.class, runtimeDialog.getBounds());
                    }
                });
                if (bounds != null) {
                    runtimeDialog.setBounds(bounds);
                } else {
                    runtimeDialog.pack();
                    Show.centrateComponent(Globals.getMainFrame(), runtimeDialog);
                }

                if (activator != null) {
                    SwingUtilities.invokeLater(new Runnable() {
                        public void run() {
                            activator.stop();
                        }
                    });
                }

                runtimeDialog.setVisible(true);
                Connection con = runtimeDialog.getTemporaryConnection();
                if (con != null) {
                    try {
                        con.close();
                    } catch (SQLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                if (runtimeDialog.okPressed()) {
                    paramValues = runtimeDialog.getParametersValues();
                } else {
                    return null;
                }
            }
        }
        return new ParametersBean(query, params, paramValues);
    }

    /**
     * Test (by name) if sub-report parameters types are incompatible with
     * report parameter types (where we want the sub-report to be inserted)
     * 
     * @return list of incompatible parameters
     */
    public static List<String> incompatibleParametersType(Report report) {
        ParameterManager paramManager = ParameterManager.getInstance();
        List<QueryParameter> reportParams = paramManager.getParameters();
        List<QueryParameter> chartParams = report.getParameters();
        List<String> result = new ArrayList<String>();
        for (QueryParameter cqp : chartParams) {
            for (QueryParameter rqp : reportParams) {
                if (rqp.getName().equals(cqp.getName())) {
                    if (!rqp.getValueClassName().equals(cqp.getValueClassName())) {
                        result.add(rqp.getName());
                    } else if (!rqp.getSelection().equals(cqp.getSelection())) {
                        result.add(rqp.getName());
                    }
                }
            }
        }
        return result;
    }

    /**
     * Helper method to notify user if he is editing an inner report or chart
     *    
     * @return true if an inner report or chart is loaded
     */
    public static boolean isInnerEdit() {
        boolean isInner = Globals.isInner();
        if (isInner) {
            JOptionPane.showMessageDialog(Globals.getMainFrame(), I18NSupport.getString("inner.edit"));
        }
        return isInner;
    }

    /**
     * Get i18n keys for current loaded report
     * 
     * @return a set of i18n keys
     */
    public static List<String> getReportKeys() {
        Set<String> keys = new TreeSet<String>();
        if (Globals.isReportLoaded()) {
            keys.addAll(ReportUtil.getKeys(LayoutHelper.getReportLayout()));
        } else if (Globals.isChartLoaded()) {
            String loadedFilePath = Globals.getCurrentChartAbsolutePath();
            if (loadedFilePath != null) {
                Chart chartLoaded = ChartUtil.loadChart(loadedFilePath);
                keys.addAll(ChartUtil.getKeys(chartLoaded));
            }
        }

        List<QueryParameter> params = ParameterManager.getInstance().getParameters();
        for (QueryParameter p : params) {
            if (p.getRuntimeName().contains(I18nString.MARKUP)) {
                keys.add(StringUtil.getKey(p.getRuntimeName()));
            }
        }
        List<String> result = new ArrayList(keys);
        Collections.sort(result, new Comparator<String>() {

            @Override
            public int compare(String o1, String o2) {
                return Collator.getInstance().compare(o1, o2);
            }
        });
        return result;
    }
}