package app.database.odb.gui;
import app.navigps.gui.NaviRootWindow;
import app.navigps.utils.NaviPoint;
import app.navigps.utils.Utils;
import app.config.DataBaseConfig;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.net.URL;
import java.util.Vector;
import javax.swing.ImageIcon;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.MouseInputAdapter;
import javax.swing.table.DefaultTableModel;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import app.database.odb.core.Category;
import app.database.odb.core.ServiceAttributes;
import app.database.odb.core.ServiceCore;
import app.database.odb.core.ServiceDescription;
import app.database.odb.core.Subcategory;
import app.database.odb.utils.Constants;
import app.navigps.gui.MyPopupMenu;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.KeyStroke;
import org.neodatis.odb.ODB;
import org.neodatis.odb.OID;
import org.neodatis.odb.ObjectRepresentation;
import org.neodatis.odb.Objects;
import org.neodatis.odb.core.query.IQuery;
import org.neodatis.odb.core.query.criteria.Where;
import org.neodatis.odb.core.trigger.DeleteTrigger;
import org.neodatis.odb.core.trigger.InsertTrigger;
import org.neodatis.odb.core.trigger.UpdateTrigger;
import org.neodatis.odb.impl.core.query.criteria.CriteriaQuery;
import org.w3c.dom.svg.SVGDocument;
/**
* @author ACME
*/
public class DatabaseManager extends javax.swing.JDialog {
private ODBInsertTrigger insertTrigger = new ODBInsertTrigger();
private ODBUpdateTrigger updateTrigger = new ODBUpdateTrigger();
private ODBDeleteTrigger deleteTrigger = new ODBDeleteTrigger();
private WindowCloseListener winOpenCloseListener = new WindowCloseListener();
private MouseCoordinateListener mouseCoordListener = new MouseCoordinateListener();
/** Creates new form Manager
* @param parent
* @param modal
*/
public DatabaseManager(JFrame parent, boolean modal) {
super(parent, modal);
setLocationRelativeTo(parent);
addWindowListener(winOpenCloseListener);
initComponents();
refreshTreeData();
initServicesTable();
initDatabaseTriggers();
getRootPane().getActionMap().put("closeWindow", new AbstractAction("closeWindow") {
@Override
public void actionPerformed(ActionEvent e) {
//setVisible(false);
getToolkit().getSystemEventQueue().postEvent(
new WindowEvent(DatabaseManager.this, WindowEvent.WINDOW_CLOSING));
}
});
getRootPane().getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "closeWindow");
}
@Override
public void dispose() {
System.err.println("DatabaseManager dispose !!!");
insertTrigger = null;
deleteTrigger = null;
updateTrigger = null;
removeAll();
removeWindowListener(winOpenCloseListener);
super.dispose();
}
@Override
protected void finalize() throws Throwable {
System.err.println("DatabaseManager Method finalize !!!");
super.finalize();
}
private void initDatabaseTriggers() {
ODB odb = null;
try{
odb = Constants.getDbConnection();
}catch(NullPointerException e){
System.err.println(""+e.getMessage());
return;
}
odb.addInsertTrigger(Category.class, insertTrigger);
odb.addInsertTrigger(Subcategory.class, insertTrigger);
odb.addInsertTrigger(ServiceCore.class, insertTrigger);
odb.addUpdateTrigger(Category.class, updateTrigger);
odb.addUpdateTrigger(Subcategory.class, updateTrigger);
odb.addUpdateTrigger(ServiceCore.class, updateTrigger);
odb.addDeleteTrigger(Category.class, deleteTrigger);
odb.addDeleteTrigger(Subcategory.class, deleteTrigger);
odb.addDeleteTrigger(ServiceCore.class, deleteTrigger);
}
public void initServicesTable() {
jTable1.setToolTipText("Double click to edit!");
jTable1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
//JTABLE selection listener
jTable1.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
ODB odb = null;
try{
odb = Constants.getDbConnection();
}catch(NullPointerException ex){
System.err.println(""+ex.getMessage());
return;
}
int selectedRow;
jTextArea1.setText("");
if (jTable1.getSelectedRow() == -1) {
selectedRow = 0;
} else {
selectedRow = jTable1.convertRowIndexToModel(jTable1.getSelectedRow());
}
System.out.println("Selected row " + selectedRow);
if (selectedRow != -1) {
Float sx = (Float) jTable1.getModel().getValueAt(selectedRow, 3);
Float sy = (Float) jTable1.getModel().getValueAt(selectedRow, 4);
System.out.println("sx: " + sx + " sy: " + sy);
IQuery query = new CriteriaQuery(ServiceAttributes.class, Where.and().add(Where.equal("x", sx)).add(Where.equal("y", sy)));
Objects cats = odb.getObjects(query);
if (cats != null && !cats.isEmpty()) {
ServiceAttributes sa = (ServiceAttributes) cats.getFirst();
ServiceDescription sd = sa.getServiceCore().getServiceDescription();
String msg = "Attributes:\nService at "+sa+"\n"+sd;
jTextArea1.setText(msg);
} else {
System.out.println("empty selection");
}
} else {
System.err.println(this.getClass().getCanonicalName() + " valueChanged -> selected row is -1 !!!");
}
}
});
refreshTableModel();
}
private void invokeServiceEditor(ServiceCore sc) {
ServiceEditor se = new ServiceEditor(this, false, sc);
se.setVisible(true);
}
public void refreshTableModel() {
ODB odb = null;
try{
odb = Constants.getDbConnection();
}catch(NullPointerException ex){
System.err.println(""+ex.getMessage());
return;
}
Vector v = new Vector();
if (odb != null) {
Objects services = odb.getObjects(ServiceCore.class);
Object[] columns = {"Name", "Category", "Subcategory", "X", "Y"};
DefaultTableModel model = new DefaultTableModel() {
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
};
model.setColumnIdentifiers(columns);
if (!services.isEmpty()) {
while (services.hasNext()) {
v = new Vector();
ServiceCore sc = (ServiceCore) services.next();
v.add(sc.getServiceDescription().getServiceName());
v.add(sc.getServiceDescription().getCategory().getName());
if (sc.getServiceDescription().getServiceSubCategory() == null) {
v.add("empty");
} else {
v.add(sc.getServiceDescription().getServiceSubCategory().getName());
}
v.add(sc.getServiceAttributes().getX());
v.add(sc.getServiceAttributes().getY());
model.addRow(v);
}
} else {
System.out.println("no services avaliable!");
}
jTable1.setModel(model);
} else {
System.err.println("DataBase not initialized!");
}
}
private void addNewService() {
addNewService(null);
}
private void addNewService(NaviPoint np) {
ServiceFactory sf = new ServiceFactory(this, true);
if (np != null) {
sf.setCoordinate(np);
}
sf.setVisible(true);
}
private void removeServiceByDescription(ServiceDescription sd) {
ODB odb = null;
try{
odb = Constants.getDbConnection();
}catch(NullPointerException ex){
System.err.println(""+ex.getMessage());
return;
}
ServiceCore sc = sd.getServiceCore();
ServiceAttributes sa = sc.getServiceAttributes();
odb.delete(sa);
odb.delete(sd);
odb.delete(sc);
}
private void removeSubcategory(Category catt, Subcategory sub) {
ODB odb = null;
try{
odb = Constants.getDbConnection();
}catch(NullPointerException ex){
System.err.println(""+ex.getMessage());
return;
}
catt.removeSubcategory(sub);
odb.delete(sub);
odb.store(catt);
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
jTabbedPane1 = new javax.swing.JTabbedPane();
jPanel1 = new javax.swing.JPanel();
jPanel2 = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane();
jTable1 = new javax.swing.JTable();
jButton3 = new javax.swing.JButton();
jPanel5 = new javax.swing.JPanel();
jScrollPane2 = new javax.swing.JScrollPane();
jTextArea1 = new javax.swing.JTextArea();
jPanel3 = new javax.swing.JPanel();
jScrollPane3 = new javax.swing.JScrollPane();
jTree1 = new javax.swing.JTree();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
setTitle("Database manager");
setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0), 2, true), "Avaliable services", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Dialog", 0, 11), new java.awt.Color(51, 153, 255))); // NOI18N
jTable1.setAutoCreateRowSorter(true);
jTable1.setBackground(new java.awt.Color(255, 255, 204));
jTable1.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
jTable1.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
},
new String [] {
}
));
jTable1.addMouseListener(new java.awt.event.MouseAdapter() {
public void mousePressed(java.awt.event.MouseEvent evt) {
jTable1MousePressed(evt);
}
public void mouseReleased(java.awt.event.MouseEvent evt) {
jTable1MouseReleased(evt);
}
});
jScrollPane1.setViewportView(jTable1);
javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
jPanel2.setLayout(jPanel2Layout);
jPanel2Layout.setHorizontalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 537, Short.MAX_VALUE)
);
jPanel2Layout.setVerticalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 263, Short.MAX_VALUE)
);
jButton3.setFont(new java.awt.Font("Verdana", 0, 11));
jButton3.setText("New ...");
jButton3.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton3ActionPerformed(evt);
}
});
jPanel5.setBorder(javax.swing.BorderFactory.createTitledBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0), 2, true), "Attributes", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Dialog", 0, 11), new java.awt.Color(51, 153, 255))); // NOI18N
jTextArea1.setColumns(20);
jTextArea1.setRows(5);
jScrollPane2.setViewportView(jTextArea1);
javax.swing.GroupLayout jPanel5Layout = new javax.swing.GroupLayout(jPanel5);
jPanel5.setLayout(jPanel5Layout);
jPanel5Layout.setHorizontalGroup(
jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 537, Short.MAX_VALUE)
);
jPanel5Layout.setVerticalGroup(
jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 132, Short.MAX_VALUE)
);
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(jButton3, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 549, Short.MAX_VALUE)
.addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jPanel5, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addContainerGap())
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jButton3, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jPanel5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
);
jTabbedPane1.addTab("Services", jPanel1);
jPanel3.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Category tree", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Dialog", 0, 11), new java.awt.Color(51, 153, 255))); // NOI18N
jScrollPane3.setBorder(null);
jTree1.setFont(new java.awt.Font("Verdana", 0, 11));
javax.swing.tree.DefaultMutableTreeNode treeNode1 = new javax.swing.tree.DefaultMutableTreeNode("root");
jTree1.setModel(new javax.swing.tree.DefaultTreeModel(treeNode1));
jTree1.setToolTipText("Right-Click for options !");
jTree1.setRootVisible(false);
jTree1.setScrollsOnExpand(false);
jTree1.setShowsRootHandles(true);
jTree1.addMouseListener(new java.awt.event.MouseAdapter() {
public void mousePressed(java.awt.event.MouseEvent evt) {
jTree1MousePressed(evt);
}
public void mouseReleased(java.awt.event.MouseEvent evt) {
jTree1MouseReleased(evt);
}
});
jScrollPane3.setViewportView(jTree1);
javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
jPanel3.setLayout(jPanel3Layout);
jPanel3Layout.setHorizontalGroup(
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane3, javax.swing.GroupLayout.DEFAULT_SIZE, 557, Short.MAX_VALUE)
);
jPanel3Layout.setVerticalGroup(
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane3, javax.swing.GroupLayout.DEFAULT_SIZE, 484, Short.MAX_VALUE)
);
jTabbedPane1.addTab("Categories", jPanel3);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jTabbedPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jTabbedPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 539, Short.MAX_VALUE)
);
pack();
}// </editor-fold>//GEN-END:initComponents
private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton3ActionPerformed
addNewService();
}//GEN-LAST:event_jButton3ActionPerformed
private void jTree1MouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jTree1MouseReleased
showTreePopup(evt);
}//GEN-LAST:event_jTree1MouseReleased
private void jTree1MousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jTree1MousePressed
showTreePopup(evt);
}//GEN-LAST:event_jTree1MousePressed
private void jTable1MousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jTable1MousePressed
showTablePopup(evt);
}//GEN-LAST:event_jTable1MousePressed
private void jTable1MouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jTable1MouseReleased
showTablePopup(evt);
}//GEN-LAST:event_jTable1MouseReleased
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton jButton3;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JPanel jPanel5;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JScrollPane jScrollPane3;
private javax.swing.JTabbedPane jTabbedPane1;
private javax.swing.JTable jTable1;
private javax.swing.JTextArea jTextArea1;
private javax.swing.JTree jTree1;
// End of variables declaration//GEN-END:variables
private void addCategory(String category) {
ODB odb = null;
try{
odb = Constants.getDbConnection();
}catch(NullPointerException ex){
System.err.println(""+ex.getMessage());
return;
}
odb.store(new Category(category));
odb.commit();
}
private void addSubcategory(Category category, String subcategory) {
ODB odb = null;
try{
odb = Constants.getDbConnection();
}catch(NullPointerException ex){
System.err.println(""+ex.getMessage());
return;
}
category.addSubcategory(new Subcategory(category, subcategory));
odb.store(category);
odb.commit();
}
private void showTreePopup(MouseEvent evt) {
if (evt.isPopupTrigger()) {
MyPopupMenu treePopup = new MyPopupMenu("Tree popup menu");
JMenu newMenu = new JMenu("New");
JMenuItem categoryMenu = new JMenuItem(new TreeCategoryMenuAction("Category"));
JMenuItem subcategoryMenu = new JMenuItem(new TreeSubcategoryMenuAction("Subcategory"));
JMenuItem removeMenu = new JMenuItem(new TreeRemoveMenuAction("Remove"));
JMenuItem editMenu = new JMenuItem(new TreeEditMenuAction("Edit"));
newMenu.add(categoryMenu);
newMenu.add(subcategoryMenu);
treePopup.add(newMenu);
treePopup.add(new JPopupMenu.Separator());
treePopup.add(editMenu);
treePopup.add(removeMenu);
treePopup.show(evt.getComponent(), evt.getX(), evt.getY());
}
}
private void showTablePopup(MouseEvent evt) {
if (evt.isPopupTrigger()) {
MyPopupMenu tablePopup = new MyPopupMenu();
JMenuItem tableRemoveMenu = new JMenuItem(new TableRemoveMenuAction("Remove"));
JMenuItem tableEditMenu = new JMenuItem(new TableEditMenuAction("Edit"));
tablePopup.add(tableEditMenu);
tablePopup.add(tableRemoveMenu);
tablePopup.show(evt.getComponent(), evt.getX(), evt.getY());
}
}
private void refreshTreeData() {
ODB odb = null;
try{
odb = Constants.getDbConnection();
}catch(NullPointerException ex){
System.err.println(""+ex.getMessage());
return;
}
Category category;
Subcategory subcategory;
DefaultMutableTreeNode root = new DefaultMutableTreeNode("root");
ImageIcon leafIcon = DatabaseManager.getIcon("22");
ImageIcon openIcon = DatabaseManager.getIcon("8");
ImageIcon closedIcon = DatabaseManager.getIcon("5");
Objects categories = odb.getObjects(Category.class);
if (categories != null) {
if (categories.isEmpty()) {
System.out.println("jTree model: no categories present");
jTree1.setModel(new DefaultTreeModel(root));
DefaultTreeModel model = (DefaultTreeModel) jTree1.getModel();
model.reload();
} else {
jTree1.setModel(new DefaultTreeModel(root));
DefaultTreeModel model = (DefaultTreeModel) jTree1.getModel();
DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer();
renderer.setLeafIcon(leafIcon);
renderer.setClosedIcon(closedIcon);
renderer.setOpenIcon(openIcon);
jTree1.setCellRenderer(renderer);
while (categories.hasNext()) {
category = (Category) categories.next();
DefaultMutableTreeNode cat = new DefaultMutableTreeNode(category.getName());
model.insertNodeInto(cat, root, root.getChildCount());
if (category.getSubcategories() != null) {
for (int i = 0; i < category.getSubcategories().size(); i++) {
subcategory = (Subcategory) category.getSubcategories().get(i);
DefaultMutableTreeNode sub = new DefaultMutableTreeNode(subcategory.getName());
model.insertNodeInto(sub, cat, cat.getChildCount());
}
}
model.reload();
}
}
} else {
System.out.println("Categories is null");
}
}
/**
*
* @param name
* @return
*/
public static ImageIcon getIcon(String name) {
return getIcon(name, "png");
}
/**
*
* @param name
* @param ext
* @return
*/
public static ImageIcon getIcon(String name, String ext) {
String imgLocation = DataBaseConfig.getIconPath() + name + "." + ext;
URL imageURL = DatabaseManager.class.getResource(imgLocation);
if (imageURL == null) {
System.err.println("Resource not found: " + imgLocation);
return null;
} else {
return new ImageIcon(imageURL);
}
}
private class ODBInsertTrigger extends InsertTrigger {
@Override
public boolean beforeInsert(Object object) {
//System.out.println("before inserting " + object);
return true;
}
@Override
public void afterInsert(Object arg0, OID arg1) {
System.out.println("after inserting " + arg0 + " OID: " + arg1);
refreshTreeData();
refreshTableModel();
}
}
private class ODBDeleteTrigger extends DeleteTrigger {
@Override
public boolean beforeDelete(Object arg0, OID arg1) {
return true;
}
@Override
public void afterDelete(Object arg0, OID arg1) {
refreshTreeData();
refreshTableModel();
}
}
private class ODBUpdateTrigger extends UpdateTrigger {
int counter = 0;
@Override
public boolean beforeUpdate(ObjectRepresentation arg0, Object arg1, OID arg2) {
counter++;
System.err.println("counter update trigger "+counter);
return true;
}
@Override
public void afterUpdate(ObjectRepresentation arg0, Object arg1, OID arg2) {
refreshTreeData();
refreshTableModel();
}
}
private class MouseCoordinateListener extends MouseInputAdapter {
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("mouse klicked");
SVGDocument doc = NaviRootWindow.getSVGCanvas().getSVGDocument();
if (doc != null) {
NaviPoint retPoint =
Utils.getLocalPointFromDomElement(doc.getRootElement(), e.getX(), e.getY());
addNewService(retPoint);
}
}
}
class WindowCloseListener extends WindowAdapter {
@Override
public void windowClosing(WindowEvent e) {
System.out.println("Window closing");
NaviRootWindow.getSVGCanvas().removeMouseListener(mouseCoordListener);
mouseCoordListener = null;
}
@Override
public void windowOpened(WindowEvent e) {
System.out.println("Window opened");
NaviRootWindow.getSVGCanvas().addMouseListener(mouseCoordListener);
}
}
/*
* Difine all actions
*/
private class TableRemoveMenuAction extends AbstractAction{
public TableRemoveMenuAction(String name){
super(name);
}
@Override
public void actionPerformed(ActionEvent e) {
ODB odb = null;
try{
odb = Constants.getDbConnection();
}catch(NullPointerException ex){
System.err.println(""+ex.getMessage());
return;
}
if (jTable1.getSelectedRow() != -1) {
int selection = jTable1.convertRowIndexToModel(jTable1.getSelectedRow());
IQuery query = new CriteriaQuery(ServiceAttributes.class, Where.and().add(Where.equal("x", jTable1.getModel().getValueAt(selection, 3))).add(Where.equal("y", jTable1.getModel().getValueAt(selection, 4))));
Objects cats = odb.getObjects(query);
if (cats != null && !cats.isEmpty()) {
ServiceAttributes sa = (ServiceAttributes) cats.getFirst();
ServiceCore sc = sa.getServiceCore();
ServiceDescription sd = sc.getServiceDescription();
removeServiceByDescription(sd);
odb.commit();
} else {
System.err.println("Service empty!");
}
} else {
JOptionPane.showMessageDialog(DatabaseManager.this, "Nothing selected!", "Error!", JOptionPane.ERROR_MESSAGE);
}
}
}
private class TableEditMenuAction extends AbstractAction{
public TableEditMenuAction(String name){
super(name);
}
@Override
public void actionPerformed(ActionEvent e) {
ODB odb = null;
try{
odb = Constants.getDbConnection();
}catch(NullPointerException ex){
System.err.println(""+ex.getMessage());
return;
}
if (jTable1.getSelectedRow() != -1) {
int selection = jTable1.convertRowIndexToModel(jTable1.getSelectedRow());
IQuery query = new CriteriaQuery(ServiceAttributes.class, Where.and().add(Where.equal("x", jTable1.getModel().getValueAt(selection, 3))).add(Where.equal("y", jTable1.getModel().getValueAt(selection, 4))));
Objects cats = odb.getObjects(query);
if (cats != null && !cats.isEmpty()) {
ServiceAttributes sa = (ServiceAttributes) cats.getFirst();
ServiceCore sc = sa.getServiceCore();
invokeServiceEditor(sc);
} else {
System.err.println("Service empty!");
}
} else {
JOptionPane.showMessageDialog(DatabaseManager.this, "Nothing selected!", "Error!", JOptionPane.ERROR_MESSAGE);
}
}
}
private class TreeRemoveMenuAction extends AbstractAction{
public TreeRemoveMenuAction(String name){
super(name);
}
@Override
public void actionPerformed(ActionEvent e) {
ODB odb = null;
try{
odb = Constants.getDbConnection();
}catch(NullPointerException ex){
System.err.println(""+ex.getMessage());
return;
}
if (jTree1.isSelectionEmpty()) {
JOptionPane.showMessageDialog(DatabaseManager.this, "Nothing selected!", "Error!", JOptionPane.ERROR_MESSAGE);
} else {
String selectedNode = jTree1.getLastSelectedPathComponent().toString();
if (jTree1.getSelectionPath().getPath().length == 2) {
System.out.println("Removing category: " + jTree1.getLastSelectedPathComponent().toString());
Object[] options = {"Yes", "No", "Cancel"};
int n = JOptionPane.showOptionDialog(rootPane, "Remove category " +
jTree1.getLastSelectedPathComponent().toString() +
"? Removing category will cause all of its subcategories and services be removed as well!",
"Prompt", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, null);
if (n == 0) {
IQuery query = new CriteriaQuery(ServiceDescription.class,
Where.equal("category.name", selectedNode));
Objects services = odb.getObjects(query);
//remove services inside category
if (!services.isEmpty() && services != null) {
System.out.println("number of services to be deleted: " + services.size());
while (services.hasNext()) {
ServiceDescription sd = (ServiceDescription) services.next();
removeServiceByDescription(sd);
}
odb.commit();
} else {
System.out.println("No services in category!");
}
//remove subcategories inside category
IQuery query1 = new CriteriaQuery(Subcategory.class,
Where.equal("category.name", selectedNode));
Objects subcategories = odb.getObjects(query1);
if (!subcategories.isEmpty() && subcategories != null) {
System.out.println("number of subcategories to be deleted: " + subcategories.size());
while (subcategories.hasNext()) {
Subcategory sub = (Subcategory) subcategories.next();
Category catt = sub.getCategory();
removeSubcategory(catt, sub);
}
odb.commit();
} else {
System.out.println("No subcategories in category!");
}
//remove selected category
IQuery query2 = new CriteriaQuery(Category.class,
Where.equal("name", selectedNode));
Objects cats = odb.getObjects(query2);
if (!cats.isEmpty() && cats != null) {
System.out.println("Categories to be deleted: " + cats.size());
Category category = (Category) cats.getFirst();
odb.delete(category);
odb.commit();
} else {
System.err.println("No category match!");
}
refreshTreeData();
refreshTableModel();
}
} else if (jTree1.getSelectionPath().getPath().length == 3) {
System.out.println("Removing subcategory: " + selectedNode);
Object[] options = {"Yes", "No", "Cancel"};
int n = JOptionPane.showOptionDialog(rootPane, "Remove subcategory " + selectedNode + "? Removing subcategory will cause all of its services be removed as well!", "Prompt", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, null);
if (n == 0) {
IQuery query3 = new CriteriaQuery(ServiceDescription.class, Where.equal("serviceSubCategory.name", jTree1.getLastSelectedPathComponent().toString()));
Objects services = odb.getObjects(query3);
//remove services inside subcategory
if (!services.isEmpty() && services != null) {
System.out.println("number of services to be deleted: " + services.size());
while (services.hasNext()) {
ServiceDescription sd = (ServiceDescription) services.next();
removeServiceByDescription(sd);
}
odb.commit();
} else {
System.out.println("No services in category!");
}
//remove subcategory
IQuery query4 = new CriteriaQuery(Subcategory.class, Where.equal("name", selectedNode));
Objects subcategories = odb.getObjects(query4);
if (!subcategories.isEmpty() && subcategories != null) {
System.out.println("number of subcategories to be deleted: " + subcategories.size());
Subcategory sub = (Subcategory) subcategories.getFirst();
Category catt = sub.getCategory();
removeSubcategory(catt, sub);
odb.commit();
} else {
System.out.println("No such subcategory!");
}
refreshTreeData();
refreshTableModel();
}
}
}
}
}//TreeRemoveMenuAction
private class TreeCategoryMenuAction extends AbstractAction{
public TreeCategoryMenuAction(String name){
super(name);
}
@Override
public void actionPerformed(ActionEvent e) {
ODB odb = null;
try{
odb = Constants.getDbConnection();
}catch(NullPointerException ex){
System.err.println(""+ex.getMessage());
return;
}
String newCat = JOptionPane.showInputDialog(DatabaseManager.this, "Enter new category name", "new category");
if (newCat != null && !newCat.equals("")) {
Objects categories = odb.getObjects(Category.class);
if (!categories.isEmpty()) {
//check duplicate name
while (categories.hasNext()) {
Category category = (Category) categories.next();
if (category.getName().equalsIgnoreCase(newCat)) {
JOptionPane.showMessageDialog(null, "Category already exists! Change new category name.", "Warning", JOptionPane.ERROR_MESSAGE);
return;
}
}
//no duplicate name
addCategory(newCat);
} else {
//if no cat present
addCategory(newCat);
}
} else {
System.out.println("no name input");
}
}
}
private class TreeSubcategoryMenuAction extends AbstractAction{
public TreeSubcategoryMenuAction(String name){
super(name);
}
@Override
public void actionPerformed(ActionEvent e) {
ODB odb = null;
try{
odb = Constants.getDbConnection();
}catch(NullPointerException ex){
System.err.println(""+ex.getMessage());
return;
}
if (jTree1.isSelectionEmpty()) {
JOptionPane.showMessageDialog(DatabaseManager.this, "No category selected!", "Error!", JOptionPane.ERROR_MESSAGE);
} else {
if (jTree1.getSelectionPath().getPath().length == 2) {
String newsubCat = JOptionPane.showInputDialog(DatabaseManager.this, "Enter new subcategory name:", "new subcategory");
if (newsubCat == null) {
} else if (newsubCat.equals("")) {
JOptionPane.showMessageDialog(DatabaseManager.this, "You have to input name!", "Warning", JOptionPane.ERROR_MESSAGE);
} else {
IQuery query = new CriteriaQuery(Category.class, Where.equal("name", jTree1.getLastSelectedPathComponent().toString()));
Objects categories = odb.getObjects(query);
Category category = (Category) categories.getFirst();
if (category.getSubcategories() == null) {
category.setSubcategories(new Vector());
addSubcategory(category, newsubCat);
odb.commit();
} else {
if (category.getSubcategories().isEmpty()) {
addSubcategory(category, newsubCat);
odb.commit();
} else {
for (Object sub : category.getSubcategories()) {
Subcategory sc = (Subcategory) sub;
if (sc.getName().equalsIgnoreCase(newsubCat)) {
JOptionPane.showMessageDialog(DatabaseManager.this, "Subcategory already exists! Change new subcategory name.", "Warning", JOptionPane.ERROR_MESSAGE);
return;
}
}
addSubcategory(category, newsubCat);
odb.commit();
}
}
}
} else {
JOptionPane.showMessageDialog(DatabaseManager.this, "Selection is not a category!", "Error!", JOptionPane.ERROR_MESSAGE);
}
}
}
}//TreeSubcategoryMenuAction
private class TreeEditMenuAction extends AbstractAction{
public TreeEditMenuAction(String name){
super(name);
}
@Override
public void actionPerformed(ActionEvent e) {
ODB odb = null;
try{
odb = Constants.getDbConnection();
}catch(NullPointerException ex){
System.err.println(""+ex.getMessage());
return;
}
boolean FL_D = false;
boolean FL_DD = false;
if (jTree1.isSelectionEmpty()) {
JOptionPane.showMessageDialog(DatabaseManager.this, "Nothing selected!", "Error!", JOptionPane.ERROR_MESSAGE);
} else {
if (jTree1.getSelectionPath().getPath().length == 2) {
String newcat = JOptionPane.showInputDialog("Please input new name for the selected category " + jTree1.getLastSelectedPathComponent().toString() + ":", "new name");
if (newcat == null) {
} else if (newcat.equalsIgnoreCase("")) {
JOptionPane.showMessageDialog(DatabaseManager.this, "You have to enter valid category name!", "Warning", JOptionPane.ERROR_MESSAGE);
} else {
IQuery query = new CriteriaQuery(Category.class, Where.equal("name", newcat));
Objects categories = odb.getObjects(query);
if (!categories.isEmpty()) {
JOptionPane.showMessageDialog(DatabaseManager.this, "Category already exists! Change category name.", "Warning", JOptionPane.ERROR_MESSAGE);
} else {
IQuery query1 = new CriteriaQuery(Category.class, Where.equal("name", jTree1.getLastSelectedPathComponent().toString()));
Objects cats = odb.getObjects(query1);
Category cat = (Category) cats.getFirst();
cat.setName(newcat);
odb.store(cat);
odb.commit();
}
}
} else if (jTree1.getSelectionPath().getPath().length == 3) {
String newsubcat = JOptionPane.showInputDialog("Please input new name for the selected subcategory " + jTree1.getLastSelectedPathComponent().toString() + ":", "new name");
if (newsubcat == null) {
} else if (newsubcat.equalsIgnoreCase("")) {
JOptionPane.showMessageDialog(DatabaseManager.this, "You have to enter valid subcategory name!", "Warning", JOptionPane.ERROR_MESSAGE);
} else {
IQuery query = new CriteriaQuery(Category.class, Where.equal("name", jTree1.getSelectionPath().getParentPath().getLastPathComponent().toString()));
Objects cats = odb.getObjects(query);
Category c = (Category) cats.getFirst();
for (Object subcategory : c.getSubcategories()) {
Subcategory s = (Subcategory) subcategory;
if (s.getName().equalsIgnoreCase(newsubcat)) {
JOptionPane.showMessageDialog(DatabaseManager.this, "Subcategory already exists! Change new subcategory name.", "Warning", JOptionPane.ERROR_MESSAGE);
return;
}
}
for (Object subcategory : c.getSubcategories()) {
Subcategory s = (Subcategory) subcategory;
if (s.getName().equalsIgnoreCase(jTree1.getLastSelectedPathComponent().toString())) {
s.setName(newsubcat);
odb.store(c);
odb.commit();
break;
}
}
}
}
}//actionPerformed
}
}//TreeEditMenuActio
}