/* * 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)); } } } }