package com.bagri.tools.vvm.ui;
import javax.management.ObjectName;
import javax.swing.*;
import com.bagri.tools.vvm.event.ApplicationEvent;
import com.bagri.tools.vvm.event.EventBus;
import com.bagri.tools.vvm.event.EventHandler;
import com.bagri.tools.vvm.model.*;
import com.bagri.tools.vvm.service.SchemaManagementService;
import com.bagri.tools.vvm.service.ServiceException;
import com.bagri.tools.vvm.util.ErrorUtil;
import static com.bagri.tools.vvm.util.Icons.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Properties;
import java.util.logging.Logger;
public class SchemaManagementPanel extends JPanel {
private static final Logger LOGGER = Logger.getLogger(SchemaManagementPanel.class.getName());
private final SchemaManagementService schemaService;
private final EventBus<ApplicationEvent> eventBus;
private JTabbedPane tabbedPane;
private JToolBar schemasToolBar;
private XTable schemasGrid;
private JToolBar propsToolBar;
private XTable propsGrid;
public SchemaManagementPanel(SchemaManagementService schemaService, EventBus<ApplicationEvent> eventBus) {
super(new GridLayout(1, 1));
this.schemaService= schemaService;
this.eventBus = eventBus;
tabbedPane = new JTabbedPane();
tabbedPane.addTab(SchemaManagement.SCHEMA_MANAGEMENT, createSchemaManagementPanel());
tabbedPane.addTab(SchemaManagement.PROPERTIES_MANAGEMENT, createPropertiesManagementPanel());
add(tabbedPane);
tabbedPane.setBorder(BorderFactory.createEmptyBorder());
setBorder(BorderFactory.createEmptyBorder());
}
private JPanel createSchemaManagementPanel() {
JPanel panel = new JPanel(new BorderLayout());
schemasToolBar = new JToolBar();
// "Add schema" button
JButton addNode = new JButton("Add");
addNode.setToolTipText("Adds new schema");
addNode.setIcon(ADD_ICON);
addNode.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
onAddSchema();
}
});
schemasToolBar.add(addNode);
schemasToolBar.addSeparator();
// "Edit Schema" button
JButton editNode = new JButton("Edit");
editNode.setToolTipText("Edit selected schema");
editNode.setIcon(EDIT_ICON);
editNode.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
onEditSchema();
}
});
schemasToolBar.add(editNode);
schemasToolBar.addSeparator();
// "Delete Schema" button
JButton deleteNode = new JButton("Delete");
deleteNode.setToolTipText("Delete selected schema");
deleteNode.setIcon(DELETE_ICON);
deleteNode.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
onDeleteSchema();
}
});
schemasToolBar.add(deleteNode);
schemasToolBar.addSeparator();
schemasToolBar.setFloatable(false);
panel.add(schemasToolBar, BorderLayout.PAGE_START);
// Column configs
ArrayList<ColumnConfig> configs = new ArrayList<ColumnConfig>();
ColumnConfig c = new ColumnConfig();
c.setHeader("Schema Name");
c.setColumnClass(String.class);
c.setWidth(40);
c.setResizable(true);
configs.add(c);
c = new ColumnConfig();
c.setHeader("Description");
c.setColumnClass(String.class);
c.setWidth(140);
c.setResizable(true);
configs.add(c);
c = new ColumnConfig();
c.setHeader("Persistent");
c.setColumnClass(Boolean.class);
c.setWidth(40);
c.setResizable(true);
configs.add(c);
c = new ColumnConfig();
c.setHeader("Data format");
c.setColumnClass(String.class);
c.setWidth(40);
c.setResizable(true);
configs.add(c);
c = new ColumnConfig();
c.setHeader("State");
c.setColumnClass(String.class);
c.setWidth(40);
c.setResizable(true);
configs.add(c);
c = new ColumnConfig();
c.setHeader("Active");
c.setColumnClass(Boolean.class);
c.setFixedWidth(45);
c.setResizable(true);
configs.add(c);
schemasGrid = new XTable(configs, new GridDataLoader() {
@Override
public java.util.List<GridRow> loadData() {
java.util.List<Schema> schemas;
try {
schemas = schemaService.getSchemas();
} catch (ServiceException e) {
ErrorUtil.showError(SchemaManagementPanel.this, e);
return null;
}
java.util.List<GridRow> rows = new ArrayList<GridRow>();
if (null == schemas) {
return rows;
}
for (Schema schema : schemas) {
rows.add(new DefaultGridRow(schema.getObjectName(), new Object[]{
schema.getSchemaName()
, schema.getDescription()
, schema.isPersistent()
, schema.getDataFormat()
, schema.getState()
, schema.isActive()
}));
}
return rows;
}
});
schemasGrid.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() >= 2) {
onEditSchema();
}
}
});
eventBus.addEventHandler(new EventHandler<ApplicationEvent>() {
@Override
public void handleEvent(ApplicationEvent e) {
if (SchemaManagement.SCHEMA_STATE_CHANGED.equals(e.getCommand())) {
schemasGrid.reload();
invalidate();
}
}
});
panel.add(new JScrollPane(schemasGrid), BorderLayout.CENTER);
return panel;
}
private JPanel createPropertiesManagementPanel() {
JPanel panel = new JPanel(new BorderLayout());
propsToolBar = new JToolBar();
// "Add schema" button
JButton addNode = new JButton("Add");
addNode.setToolTipText("Add new default property");
addNode.setIcon(ADD_ICON);
addNode.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
onAddProperty();
}
});
propsToolBar.add(addNode);
propsToolBar.addSeparator();
// "Edit Schema" button
JButton editNode = new JButton("Edit");
editNode.setToolTipText("Edit selected property");
editNode.setIcon(EDIT_ICON);
editNode.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
onEditProperty();
}
});
propsToolBar.add(editNode);
propsToolBar.addSeparator();
// "Delete Schema" button
JButton deleteNode = new JButton("Delete");
deleteNode.setToolTipText("Delete selected property");
deleteNode.setIcon(DELETE_ICON);
deleteNode.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
onDeleteProperty();
}
});
propsToolBar.add(deleteNode);
propsToolBar.addSeparator();
propsToolBar.setFloatable(false);
panel.add(propsToolBar, BorderLayout.PAGE_START);
// Column configs
ArrayList<ColumnConfig> configs = new ArrayList<ColumnConfig>();
ColumnConfig c = new ColumnConfig();
c.setHeader("Property Name");
c.setColumnClass(String.class);
c.setWidth(40);
c.setResizable(true);
configs.add(c);
c = new ColumnConfig();
c.setHeader("Property Value");
c.setColumnClass(String.class);
c.setWidth(140);
c.setResizable(true);
configs.add(c);
propsGrid = new XTable(configs, new GridDataLoader() {
@Override
public java.util.List<GridRow> loadData() {
Properties properties;
try {
properties = schemaService.getDefaultProperties();
} catch (ServiceException e) {
ErrorUtil.showError(SchemaManagementPanel.this, e);
return null;
}
java.util.List<GridRow> rows = new ArrayList<GridRow>();
if (null == properties || properties.isEmpty()) { return rows; }
for (String propertyName : properties.stringPropertyNames()) {
rows.add(new DefaultGridRow(propertyName, new Object[]{
propertyName
, properties.get(propertyName)
}));
}
return rows;
}
});
propsGrid.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() >= 2) {
onEditProperty();
}
}
});
eventBus.addEventHandler(new EventHandler<ApplicationEvent>() {
@Override
public void handleEvent(ApplicationEvent e) {
if (SchemaManagement.SCHEMA_PROPERTIES_CHANGED.equals(e.getCommand())) {
propsGrid.reload();
invalidate();
}
}
});
panel.add(new JScrollPane(propsGrid), BorderLayout.CENTER);
return panel;
}
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
if (!enabled) {
schemasGrid.clearSelection();
schemasGrid.getTableHeader().setEnabled(false);
schemasGrid.setEnabled(false);
for (Component c : schemasToolBar.getComponents()) {
c.setEnabled(false);
}
schemasToolBar.setEnabled(false);
for (Component c : tabbedPane.getComponents()) {
c.setEnabled(false);
}
propsGrid.clearSelection();
propsGrid.getTableHeader().setEnabled(false);
propsGrid.setEnabled(false);
for (Component c : propsToolBar.getComponents()) {
c.setEnabled(false);
}
propsToolBar.setEnabled(false);
for (Component c : tabbedPane.getComponents()) {
c.setEnabled(false);
}
tabbedPane.setEnabled(false);
}
}
@Override
public void invalidate() {
super.invalidate();
if (!schemasGrid.isLoaded()) {
schemasGrid.reload();
}
if (!propsGrid.isLoaded()) {
propsGrid.reload();
}
}
// --- Event Handlers --- //
private void onAddSchema() {
final EditSchemaDialog dlg = new EditSchemaDialog(null, SchemaManagementPanel.this);
dlg.setSuccessListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Schema schema = dlg.getSchema();
try {
schemaService.addSchema(schema);
} catch (ServiceException e1) {
LOGGER.throwing(SchemaManagementPanel.class.getName(), "onAddSchema", e1);
ErrorUtil.showError(SchemaManagementPanel.this, e1);
}
eventBus.fireEvent(new ApplicationEvent(dlg, SchemaManagement.SCHEMA_STATE_CHANGED));
}
});
}
});
dlg.setVisible(true);
}
private void onEditSchema() {
int selectedIndex = schemasGrid.getSelectionModel().getLeadSelectionIndex();
if (selectedIndex >= 0 && selectedIndex < schemasGrid.getModel().getRowCount()) {
final GridRow row = ((GridTableModel) schemasGrid.getModel()).getRow(selectedIndex);
Schema schema = null;
try {
schema = schemaService.getSchema((ObjectName) row.getId());
} catch (ServiceException e) {
LOGGER.throwing(SchemaManagementPanel.class.getName(), "onEditSchema", e);
ErrorUtil.showError(SchemaManagementPanel.this, e);
}
final EditSchemaDialog dlg = new EditSchemaDialog(schema, SchemaManagementPanel.this);
dlg.setSuccessListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Schema updated = dlg.getSchema();
try {
schemaService.saveSchema(updated);
} catch (ServiceException e1) {
LOGGER.throwing(SchemaManagementPanel.class.getName(), "onEditSchema", e1);
ErrorUtil.showError(SchemaManagementPanel.this, e1);
}
eventBus.fireEvent(new ApplicationEvent(dlg, SchemaManagement.SCHEMA_STATE_CHANGED));
}
});
}
});
dlg.setVisible(true);
}
}
private void onDeleteSchema() {
int selectedIndex = schemasGrid.getSelectionModel().getLeadSelectionIndex();
if (selectedIndex >= 0 && selectedIndex < schemasGrid.getModel().getRowCount()) {
final GridRow row = ((GridTableModel) schemasGrid.getModel()).getRow(selectedIndex);
int n = JOptionPane.showConfirmDialog(
SchemaManagementPanel.this,
"Are you sure you want to delete selected schema \"" + row.getValueAt(0) + "\"?",
"Confirm deletion",
JOptionPane.YES_NO_OPTION);
if (JOptionPane.YES_OPTION == n) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
Schema schema = schemaService.getSchema((ObjectName)row.getId());
schemaService.deleteSchema(schema);
} catch (ServiceException e1) {
LOGGER.throwing(SchemaManagementPanel.class.getName(), "onDeleteSchema", e1);
ErrorUtil.showError(SchemaManagementPanel.this, e1);
}
eventBus.fireEvent(new ApplicationEvent(SchemaManagementPanel.this, SchemaManagement.SCHEMA_STATE_CHANGED));
}
});
}
}
}
private void onAddProperty() {
final EditPropertyDialog dlg = new EditPropertyDialog(null, "Default Property", SchemaManagementPanel.this);
dlg.setSuccessListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Property prop = dlg.getProperty();
if (null != prop.getPropertyName()) {
try {
schemaService.setDefaultProperty(prop);
} catch (ServiceException e1) {
LOGGER.throwing(SchemaManagementPanel.class.getName(), "onAddDefaultProperty", e1);
ErrorUtil.showError(SchemaManagementPanel.this, e1);
}
eventBus.fireEvent(new ApplicationEvent(dlg, SchemaManagement.SCHEMA_PROPERTIES_CHANGED));
}
}
});
}
});
dlg.setVisible(true);
}
private void onEditProperty() {
int selectedIndex = propsGrid.getSelectionModel().getLeadSelectionIndex();
if (selectedIndex >= 0 && selectedIndex < propsGrid.getModel().getRowCount()) {
final GridRow row = ((GridTableModel) propsGrid.getModel()).getRow(selectedIndex);
final EditPropertyDialog dlg = new EditPropertyDialog(new Property((String) row.getValueAt(0), (String) row.getValueAt(1)), "Default Property", SchemaManagementPanel.this);
dlg.setSuccessListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Property prop = dlg.getProperty();
try {
schemaService.setDefaultProperty(prop);
} catch (ServiceException e1) {
LOGGER.throwing(SchemaManagementPanel.class.getName(), "onEditDefaultProperty", e1);
ErrorUtil.showError(SchemaManagementPanel.this, e1);
}
eventBus.fireEvent(new ApplicationEvent(dlg, SchemaManagement.SCHEMA_PROPERTIES_CHANGED));
}
});
}
});
dlg.setVisible(true);
}
}
private void onDeleteProperty() {
int selectedIndex = propsGrid.getSelectionModel().getLeadSelectionIndex();
if (selectedIndex >= 0 && selectedIndex < propsGrid.getModel().getRowCount()) {
final GridRow row = ((GridTableModel) propsGrid.getModel()).getRow(selectedIndex);
int n = JOptionPane.showConfirmDialog(
SchemaManagementPanel.this,
"Are you sure you want to delete selected property \"" + row.getValueAt(0) + "\"?",
"Confirm deletion",
JOptionPane.YES_NO_OPTION);
if (JOptionPane.YES_OPTION == n) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
schemaService.setDefaultProperty(new Property((String) row.getId(), null));
} catch (ServiceException e1) {
LOGGER.throwing(SchemaManagementPanel.class.getName(), "onDeleteDefaultProperty", e1);
ErrorUtil.showError(SchemaManagementPanel.this, e1);
}
eventBus.fireEvent(new ApplicationEvent(SchemaManagementPanel.this, SchemaManagement.SCHEMA_PROPERTIES_CHANGED));
}
});
}
}
}
}