package net.sourceforge.pain.tools.guitool.dbbrowse;
import net.sourceforge.pain.network.guitool.*;
import net.sourceforge.pain.tools.guitool.*;
import net.sourceforge.pain.tools.guitool.dialog.*;
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;
import com.intellij.uiDesigner.core.*;
public class GTRawDbBrowser {
private JButton findButton;
private JTextField oidEdit;
private JLabel oidLabel;
private JButton refreshButton;
private JButton nextButton;
private JButton prevButton;
private JPanel mainPanel;
private JTable contentTable;
private JLabel classNameLabel;
private TableModel tableModel;
private static GTRawDbBrowser single;
private DatabaseSchema schema = null;
Vector fields = new Vector();
String activeQuery;
Vector history = new Vector();
int histPos = 0;
public GTRawDbBrowser() {
init();
}
private void ensureSchemaLoaded() throws IOException, InterruptedException {
if (schema == null) {
GuiTool.log("Loading database schema.");
schema = loadSchema();
GuiTool.log("Database schema loaded!");
}
}
private DatabaseSchema loadSchema() throws IOException, InterruptedException {
GTNetPacket p = GlobalPerformer.getConnection().sendBlocking(new GTNetPacket("DbLoadSchemaEvent", ""));
return new DatabaseSchema(p);
}
private void init() {
tableModel = new GTDbBrowserTableModel();
contentTable.setModel(tableModel);
contentTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
final TableColumn valueColumn = contentTable.getColumn("Field Value");
GTRawDbBrowserValueCellHandler re = new GTRawDbBrowserValueCellHandler(this);
valueColumn.setCellEditor(re);
valueColumn.setCellRenderer(re);
findButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
processQuery();
}
});
refreshButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
refreshActiveObject();
}
});
refreshButton.setEnabled(false);
prevButton.setEnabled(false);
nextButton.setEnabled(false);
oidEdit.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
e.consume();
processQuery();
}
}
});
mainPanel.addFocusListener(new FocusAdapter() {
public void focusGained(FocusEvent e) {
oidEdit.selectAll();
oidEdit.requestFocus();
}
});
prevButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
goPrev();
}
});
nextButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
goNext();
}
});
}
public synchronized static Component instance() {
if (single == null) {
single = new GTRawDbBrowser();
}
return single.mainPanel;
}
private class GTDbBrowserTableModel extends AbstractTableModel {
public int getColumnCount() {
return 3;
}
public int getRowCount() {
return fields.size();
}
public Object getValueAt(int rowIndex, int columnIndex) {
FieldInfo info = (FieldInfo) fields.get(rowIndex);
if (columnIndex == 0) {
return info.name;
} else if (columnIndex == 1) {
return info.getTypeName();
} else {
return info;
}
}
public String getColumnName(int column) {
return column == 0 ? "Field Name" : (column == 1) ? "Field Type" : "Field Value";
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return columnIndex == 2;
}
}
void executeQuery(String query) {
GuiTool.log("Changing active object..");
if (_updateActiveData(query)) {
GuiTool.log("Done.");
if (activeQuery != null && (history.isEmpty() || !history.get(histPos).equals(activeQuery))) {
for (int i = history.size(); --i > histPos;) {
history.remove(i);
}
history.addElement(activeQuery);
histPos = history.size() - 1;
}
} else {
GuiTool.log("Failed.");
}
updateButtons();
}
void processQuery() {
String query = oidEdit.getText();
if (query == null || query.length() == 0) {
return;
}
executeQuery(query);
}
private void refreshActiveObject() {
GuiTool.log("Refreshing obj info..");
_updateActiveData(activeQuery);
GuiTool.log("Refresh done.");
}
private void updateButtons() {
refreshButton.setEnabled(activeQuery != null);
nextButton.setEnabled(histPos < history.size() - 1);
prevButton.setEnabled(histPos > 0);
}
private boolean _updateActiveData(String query) {
try {
ensureSchemaLoaded();
query = query.trim();
if (!"root".equals(query) && !(query.startsWith("[") && query.endsWith("]"))) {
int fieldNameStart = query.indexOf('.');
int eqIndex = query.indexOf('=');
if (fieldNameStart <= 0 || fieldNameStart == query.length() || eqIndex < fieldNameStart || eqIndex == query.length()-1) {
JOptionPane.showMessageDialog(mainPanel, "Illegal ClassName.fieldName='..' construct!", "Error", JOptionPane.ERROR_MESSAGE);
return false;
}
String className = query.substring(0, fieldNameStart);
String fieldName = query.substring(fieldNameStart + 1, eqIndex);
DatabaseSchema.ClassInfo clazz = schema.findClassName(className);
if (clazz == null) {
JOptionPane.showMessageDialog(mainPanel, "Class not found:" + className, "Error", JOptionPane.ERROR_MESSAGE);
return false;
}
int type = clazz.getFieldType(fieldName);
if (type == -1) {
JOptionPane.showMessageDialog(mainPanel, "No such field:" + fieldName, "Error", JOptionPane.ERROR_MESSAGE);
return false;
}
}
GTNetPacket p = GlobalPerformer.getConnection().sendBlocking(new GTNetPacket("DbBrowseEvent", new String[]{"retrieve", query}));
final Object values[] = (Object[]) p.data;
if (values.length == 1) {
JOptionPane.showMessageDialog(mainPanel, values[0], "Error", JOptionPane.ERROR_MESSAGE);
} else {
oidLabel.setText((String) values[0]);
classNameLabel.setText((String) values[1]);
fields.clear();
for (int i = 2; i < values.length; i += 3) {
fields.add(new FieldInfo((String) values[i], ((Integer) values[i + 1]).intValue(), values[i + 2]));
}
activeQuery = (String) values[0];
contentTable.setVisible(false);
TableCellEditor cellEditor = contentTable.getCellEditor();
if (cellEditor != null) {
cellEditor.cancelCellEditing();
}
oidEdit.requestFocus();
contentTable.setVisible(true);
return true;
}
} catch (Exception e) {
GuiTool.showFailInfo(e);
GuiTool.log("Error." + e.getMessage());
}
return false;
}
private void goNext() {
if (histPos < history.size() - 1) {
histPos++;
String oid = (String) history.get(histPos);
_updateActiveData(oid);
updateButtons();
}
}
private void goPrev() {
if (histPos > 0) {
histPos--;
String oid = (String) history.get(histPos);
_updateActiveData(oid);
updateButtons();
}
}
{
// GUI initializer generated by IntelliJ IDEA GUI Designer
// >>> IMPORTANT!! <<<
// DO NOT EDIT OR ADD ANY CODE HERE!
$$$setupUI$$$();
}
/**
* Method generated by IntelliJ IDEA GUI Designer
* >>> IMPORTANT!! <<<
* DO NOT edit this method OR call it in your code!
*/
private void $$$setupUI$$$() {
mainPanel = new JPanel();
mainPanel.setLayout(new GridLayoutManager(3, 1, new Insets(0, 0, 0, 0), -1, -1));
final JPanel panel1 = new JPanel();
panel1.setLayout(new GridLayoutManager(1, 1, new Insets(0, 0, 0, 0), -1, -1));
mainPanel.add(panel1, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null));
panel1.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), null));
final JPanel panel2 = new JPanel();
panel2.setLayout(new GridLayoutManager(1, 7, new Insets(0, 0, 0, 0), -1, -1));
panel1.add(panel2, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null));
prevButton = new JButton();
prevButton.setText("Prev");
prevButton.setToolTipText("Goto prev object");
panel2.add(prevButton, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_VERTICAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null));
nextButton = new JButton();
nextButton.setText("Next");
nextButton.setToolTipText("Goto next object");
panel2.add(nextButton, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null));
refreshButton = new JButton();
refreshButton.setText("Refresh");
refreshButton.setToolTipText("Refresh fields values");
panel2.add(refreshButton, new GridConstraints(0, 2, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null));
final Spacer spacer1 = new Spacer();
panel2.add(spacer1, new GridConstraints(0, 3, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, 1, null, null, null));
oidEdit = new JTextField();
oidEdit.setToolTipText("Enter object oid or 'root' ");
oidEdit.setFocusCycleRoot(false);
oidEdit.setText("root");
panel2.add(oidEdit, new GridConstraints(0, 5, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null));
findButton = new JButton();
findButton.setText("Find");
findButton.setToolTipText("Find object with specified oid");
panel2.add(findButton, new GridConstraints(0, 6, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null));
final JLabel label1 = new JLabel();
label1.setText("Query:");
panel2.add(label1, new GridConstraints(0, 4, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null));
final JPanel panel3 = new JPanel();
panel3.setLayout(new GridLayoutManager(1, 7, new Insets(0, 0, 0, 0), -1, -1));
mainPanel.add(panel3, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null));
panel3.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), null));
final Spacer spacer2 = new Spacer();
panel3.add(spacer2, new GridConstraints(0, 6, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, 1, null, null, null));
classNameLabel = new JLabel();
classNameLabel.setText("None");
panel3.add(classNameLabel, new GridConstraints(0, 5, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null));
final JLabel label2 = new JLabel();
label2.setText("Class:");
panel3.add(label2, new GridConstraints(0, 4, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null));
final Spacer spacer3 = new Spacer();
panel3.add(spacer3, new GridConstraints(0, 3, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_FIXED, 1, null, null, null));
oidLabel = new JLabel();
oidLabel.setText("None");
panel3.add(oidLabel, new GridConstraints(0, 2, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null));
final Spacer spacer4 = new Spacer();
panel3.add(spacer4, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_FIXED, 1, null, null, null));
final JLabel label3 = new JLabel();
label3.setText("Query:");
panel3.add(label3, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null));
final JPanel panel4 = new JPanel();
panel4.setLayout(new GridLayoutManager(1, 1, new Insets(0, 0, 0, 0), -1, -1));
mainPanel.add(panel4, new GridConstraints(2, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, null, null, null));
final JScrollPane scrollPane1 = new JScrollPane();
panel4.add(scrollPane1, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, null, null, null));
contentTable = new JTable();
scrollPane1.setViewportView(contentTable);
}
}