/*
// This software is subject to the terms of the Eclipse Public License v1.0
// Agreement, available at the following URL:
// http://www.eclipse.org/legal/epl-v10.html.
// You must accept the terms of that agreement to use this software.
//
// Copyright (C) 2002-2005 Julian Hyde
// Copyright (C) 2005-2011 Pentaho and others
// Copyright (C) 2006-2007 Cincom Systems, Inc.
// All Rights Reserved.
*/
package mondrian.gui;
import mondrian.gui.validate.ValidationUtils;
import mondrian.olap.*;
import mondrian.olap.Util.PropertyList;
import org.apache.log4j.Logger;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import java.util.List;
import javax.swing.*;
import javax.swing.text.DefaultEditorKit;
/**
* @author sean
*/
public class QueryPanel extends javax.swing.JPanel {
private static final Logger LOGGER = Logger.getLogger(QueryPanel.class);
Connection connection;
JMenuItem queryMenuItem;
int windowMenuIndex;
// map of schema frames and schema menu items
Map<JInternalFrame, JMenuItem> schemaWindowMap;
final Workbench workbench;
/**
* Creates new form QueryPanel
*/
public QueryPanel(Workbench workbench) {
this.workbench = workbench;
initComponents();
}
public void setConnection(Connection c) {
connection = c;
}
public Connection getConnection() {
return connection;
}
//====================================================
public void setMenuItem(JMenuItem mi) {
this.queryMenuItem = mi;
}
public void setSchemaWindowMap(
Map<JInternalFrame, JMenuItem> schemaWindowMap)
{
this.schemaWindowMap = schemaWindowMap;
setCatalogs();
}
private void setCatalogs() {
List<String> v = new ArrayList<String>();
Iterator<JMenuItem> it = schemaWindowMap.values().iterator();
while (it.hasNext()) {
JMenuItem elem = it.next();
v.add(elem.getText());
}
ComboBoxModel cCatalogs =
new DefaultComboBoxModel(new Vector<String>(v));
schemaList.setModel(cCatalogs);
}
public void setWindowMenuIndex(int i) {
this.windowMenuIndex = i;
}
/**
* @return the workbench i18n converter
*/
public I18n getResourceConverter() {
return workbench.getResourceConverter();
}
public void initConnection(String smenutext) {
schemaList.setSelectedItem(smenutext);
connectButtonActionPerformed(null);
}
//=====================================================
/**
* This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
private void initComponents() {
jScrollPane3 = new javax.swing.JScrollPane();
executeButton = new javax.swing.JButton();
jSplitPane1 = new javax.swing.JSplitPane();
jScrollPane1 = new javax.swing.JScrollPane();
queryTextPane = new javax.swing.JTextPane();
jScrollPane2 = new javax.swing.JScrollPane();
resultTextPane = new javax.swing.JTextPane();
connectButton = new javax.swing.JButton();
jPopupMenu = new JPopupMenu();
jPopupMenu.add(new DefaultEditorKit.CutAction());
jPopupMenu.add(new DefaultEditorKit.CopyAction());
jPopupMenu.add(new DefaultEditorKit.PasteAction());
schemaScrollPane1 = new javax.swing.JScrollPane();
schemaLabel = new javax.swing.JLabel();
schemaList = new JComboBox(
new String[]{
getResourceConverter().getString(
"common.join.title", "Join"),
getResourceConverter().getString(
"common.table.title", "Table")
});
//schemaScrollPane1.setViewportView(schemaList);
schemaPanel = new JPanel();
//schemaPanel.setLayout(new BorderLayout(25,0));
schemaPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 0));
setLayout(new java.awt.BorderLayout());
schemaLabel.setFont(new Font("Dialog", 1, 12));
schemaLabel.setForeground(
(Color) UIManager.getDefaults().get(
"CheckBoxMenuItem.acceleratorForeground"));
schemaLabel.setHorizontalAlignment(SwingConstants.CENTER);
schemaLabel.setText(
getResourceConverter().getString(
"common.schema.title", "Schema"));
//schemaLabel.setBorder(new EtchedBorder());
schemaList.setBackground(Color.white);
final JPanel qpanel = this;
schemaList.addItemListener(
new ItemListener() {
public void itemStateChanged(ItemEvent e) {
}
});
connectButton.setText(
getResourceConverter().getString(
"queryPanel.connect.title", "Connect"));
connectButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent evt) {
connectButtonActionPerformed(evt);
}
});
schemaPanel.add(schemaLabel); //java.awt.BorderLayout.WEST
schemaPanel.add(schemaList);
schemaPanel.add(connectButton);
add(schemaPanel, java.awt.BorderLayout.NORTH);
executeButton.setText(
getResourceConverter().getString(
"queryPanel.execute.title", "Execute"));
executeButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent evt) {
executeButtonActionPerformed(evt);
}
});
add(executeButton, java.awt.BorderLayout.SOUTH);
jSplitPane1.setDividerLocation(100);
jSplitPane1.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
queryTextPane.setFont(new java.awt.Font("Courier New", 0, 12));
queryTextPane.setText("");
queryTextPane.addMouseListener(
new MouseAdapter() {
// From MouseAdapter javadoc:
//
// Popup menus are triggered differently
// on different systems. Therefore, isPopupTrigger
// should be checked in both mousePressed
// and mouseReleased
// for proper cross-platform functionality.
public void mousePressed(MouseEvent e) {
checkPopupTrigger(e);
}
public void mouseReleased(MouseEvent e) {
checkPopupTrigger(e);
}
public void checkPopupTrigger(MouseEvent e) {
if (e.isPopupTrigger()) {
int x = e.getX();
int y = e.getY();
jPopupMenu.show(queryTextPane, x, y);
}
}
});
jScrollPane1.setViewportView(queryTextPane);
jSplitPane1.setTopComponent(jScrollPane1);
resultTextPane.setEditable(false);
resultTextPane.setFont(new java.awt.Font("Courier New", 0, 12));
jScrollPane2.setViewportView(resultTextPane);
jSplitPane1.setBottomComponent(jScrollPane2);
add(jSplitPane1, java.awt.BorderLayout.CENTER);
}
private void executeButtonActionPerformed(ActionEvent evt) {
//run the query, and show the results.
try {
if (connection == null) {
JOptionPane.showMessageDialog(
this, getResourceConverter().getString(
"queryPanel.noConnection.alert",
"No Mondrian connection. Select a Schema to connect."),
getResourceConverter().getString(
"common.alertDialog.title", "Alert"),
JOptionPane.WARNING_MESSAGE);
return;
} //common.alertDialog.title
Query q = connection.parseQuery(queryTextPane.getText());
Result r = connection.execute(q);
//document = DomBuilder.build(getResult());
java.io.StringWriter sw = new java.io.StringWriter();
java.io.PrintWriter pw = new java.io.PrintWriter(sw);
r.print(pw);
resultTextPane.setText(sw.getBuffer().toString());
} catch (Exception ex) {
ByteArrayOutputStream os = new ByteArrayOutputStream();
PrintStream p = new PrintStream(os);
Throwable e = ex;
while (e != null) {
p.println(e.getLocalizedMessage());
LOGGER.error("", e);
Throwable prev = e;
e = e.getCause();
if (e == prev) {
break;
}
p.println();
}
resultTextPane.setText(os.toString());
}
}
private void connectButtonActionPerformed(ActionEvent evt) {
File sfile = null;
try {
String sfname = (String) schemaList.getSelectedItem();
JInternalFrame sf = lookupFrame(sfname);
if (sf == null) {
// this case may arise when a schema file is opened, mdx query
// is opened and the schema frame is closed
JOptionPane.showMessageDialog(
this, getResourceConverter().getString(
"queryPanel.schemaNotOpen.alert",
"Schema file is not open"),
getResourceConverter().getString(
"common.errorDialog.title", "Error"),
JOptionPane.ERROR_MESSAGE);
return;
}
SchemaExplorer se =
(SchemaExplorer) sf.getContentPane().getComponent(0);
if (se.isNewFile()) {
JOptionPane.showMessageDialog(
this,
getResourceConverter().getString(
"queryPanel.saveSchemaFirst.alert",
"You must first save the Schema to open a Mondrian connection"),
getResourceConverter().getString(
"common.alertDialog.title", "Alert"),
JOptionPane.WARNING_MESSAGE);
sf.setSelected(true);
return;
}
sfile = se.getSchemaFile();
PropertyList list = new PropertyList();
list.put("Provider", "mondrian");
list.put("Jdbc", se.getJdbcConnectionUrl());
list.put("Catalog", se.getSchemaFile().toURL().toString());
final String jdbcUsername = se.getJdbcUsername();
if (!ValidationUtils.isEmpty(jdbcUsername)) {
list.put("JdbcUser", jdbcUsername);
}
final String jdbcPassword = se.getJdbcPassword();
if (!ValidationUtils.isEmpty(jdbcPassword)) {
list.put("JdbcPassword", jdbcPassword);
}
Connection con = DriverManager.getConnection(list, null);
// clear cache before connecting
con.getCacheControl(null).flushSchemaCache();
if (con != null) {
connection = con;
queryMenuItem.setText(
getResourceConverter().getFormattedString(
"queryPanel.successfulConnection.menuItem",
"{0} MDX - {1}",
Integer.toString(windowMenuIndex),
se.getSchemaFile().getName()));
Component o = this;
while (o != null) {
if (o.getClass() == JInternalFrame.class) {
((JInternalFrame) o).setTitle(
getResourceConverter().getFormattedString(
"queryPanel.successfulConnection.internalFrame.title",
"MDX Query - connected to {0}",
se.getSchemaFile().getName()));
break;
}
o = o.getParent();
}
JOptionPane.showMessageDialog(
this,
"Mondrian connection Successful.",
getResourceConverter().getString(
"common.informationDialog.title", "Information"),
JOptionPane.INFORMATION_MESSAGE);
} else {
JOptionPane.showMessageDialog(
this,
getResourceConverter().getFormattedString(
"queryPanel.unsuccessfulConnection.alert",
"Mondrian connection could not be done for - {0}",
se.getSchemaFile().getName()),
getResourceConverter().getString(
"common.errorDialog.title", "Error"),
JOptionPane.ERROR_MESSAGE);
}
} catch (Exception ex) {
LOGGER.error("Exception: " + ex.getMessage(), ex);
JOptionPane.showMessageDialog(
this,
getResourceConverter().getFormattedString(
"queryPanel.unsuccessfulConnection.exception",
"Mondrian connection could not be done for - {0}",
sfile == null
? getResourceConverter().getString(
"queryPanel.selectedSchema.alert",
"selected Schema")
: sfile.getName()),
getResourceConverter().getString(
"common.errorDialog.title", "Error"),
JOptionPane.ERROR_MESSAGE);
resultTextPane.setText(getResourceConverter().getFormattedString(
"queryPanel.exceptionMessage",
"Exception: {0}\n\nSee workbench log for full stacktrace.",
ex.getMessage()));
}
}
private JInternalFrame lookupFrame(String sfname) {
JInternalFrame sf = null;
for (Map.Entry<JInternalFrame, JMenuItem> entry
: schemaWindowMap.entrySet())
{
if ((entry.getValue()).getText().equals(sfname)) {
sf = entry.getKey();
break;
}
}
return sf;
}
// Variables declaration - do not modify
private javax.swing.JScrollPane jScrollPane3;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JTextPane resultTextPane;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextPane queryTextPane;
private javax.swing.JSplitPane jSplitPane1;
private javax.swing.JButton executeButton;
private javax.swing.JComboBox schemaList;
private JLabel schemaLabel;
private JPanel schemaPanel;
private javax.swing.JScrollPane schemaScrollPane1;
private javax.swing.JButton connectButton;
private JPopupMenu jPopupMenu;
// End of variables declaration
}
// End QueryPanel.java