/*
* codjo.net
*
* Common Apache License 2.0
*/
package net.codjo.utils.sql;
import net.codjo.model.Table;
import net.codjo.utils.ConnectionManager;
import net.codjo.utils.sql.event.DbChangeEvent;
import net.codjo.utils.sql.event.DbChangeListener;
import java.awt.AWTEventMulticaster;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TooManyListenersException;
import javax.swing.AbstractAction;
import javax.swing.JDesktopPane;
import javax.swing.JInternalFrame;
/**
* Classe abstraite pour les actions BD.
*
* <p> Une action est connectee avec sa table source. </p>
*
* <p> Une action gere deux types d'evenements : (1) ActionEvent, cet evenement est declenche avant que
* l'action soit execute, (2) DbChangeEvent, cet evenement est declenche quand l'action s'est termine
* correctement. </p>
*
* @author $Author: spinae $
* @version $Revision: 1.2 $
*/
abstract class AbstractDbAction extends AbstractAction {
private GenericTable genericTable;
private JInternalFrame windowTable;
private JDesktopPane gexPane;
private DbChangeListener dbChangeListener;
private Map genericTablePK;
// Connection optionnelle : precisee pour faire des Transactions
private Connection connection;
private ActionListener actionListenerManager = null;
private boolean forcedDisabled = false;
/**
* Constructor for the AbstractDbAction object
*/
AbstractDbAction() {
setEnabled(false);
}
/**
* Constructor for the AbstractDbAction object
*
* @param dp DesktopPane
* @param frm JInternalFrame contenant la table g�n�rique source
* @param gt Table g�n�rique source
*/
AbstractDbAction(JDesktopPane dp, JInternalFrame frm, GenericTable gt) {
gexPane = dp;
genericTable = gt;
windowTable = frm;
}
/**
* Sets the Connection attribute of the AbstractDbAction object
*
* @param con The new Connection value
*/
public void setConnection(Connection con) {
connection = con;
}
/**
* Ajoute un listener qui ecoute le declenchement de l'action.
*
* @param l
*/
public synchronized void addActionListener(ActionListener l) {
actionListenerManager = AWTEventMulticaster.add(actionListenerManager, l);
}
/**
* Enleve un listener.
*
* @param l
*/
public synchronized void removeActionListener(ActionListener l) {
actionListenerManager = AWTEventMulticaster.remove(actionListenerManager, l);
}
/**
* Ajoute un ecouteur sur les modifications BD.
*
* @param l Le listener
*
* @throws TooManyListenersException Si il existe deja un ecouteur
*/
public void addDbChangeListener(DbChangeListener l)
throws TooManyListenersException {
if (dbChangeListener != null) {
throw new TooManyListenersException();
}
dbChangeListener = l;
}
/**
* Enleve un ecouteur sur les modifications BD.
*
* @param l Le listener
*/
public void removeDbChangeListener(DbChangeListener l) {
if (dbChangeListener == l) {
dbChangeListener = null;
}
}
/**
* Retourne le desktopPane
*
* @return Le JDesktopPane
*/
protected JDesktopPane getDesktopPane() {
return gexPane;
}
/**
* Retourne le nom physique de la table
*
* @return The DbTableName value
*/
protected String getDbTableName() {
return genericTable.getTable().getDBTableName();
}
/**
* Retourne l'objet Table
*
* @return La Table
*/
protected Table getTable() {
return genericTable.getTable();
}
/**
* Retourne la table g�n�rique source.
*
* @return La g�n�rique table
*/
protected GenericTable getGenericTable() {
return genericTable;
}
/**
* Retourne la fenetre contenant la genericTable.
*
* @return Une JInternalFrame
*/
protected JInternalFrame getWindowTable() {
return windowTable;
}
/**
* Retourne une connection
*
* @return The Connection value
*
* @throws SQLException Description of Exception
*/
protected Connection getConnection() throws SQLException {
if (connection != null) {
return connection;
}
else {
return getConnectionManager().getConnection();
}
}
/**
* Retourne la liste des cl�s primaires definie dans la table source.
*
* @return Map de nom de colonne / valeur
*/
protected Map getGenericTablePK() {
return genericTablePK;
}
/**
* Retourne la liste de Maps (DbKeyName, KeyValue) correspondant aux lignes s�lectionn�es sur la
* GenericTable.
*
* @return La List
*/
protected List getPrimaryKeys() {
List listKeys = new ArrayList();
int[] lineNumbers = genericTable.getSelectedRows();
for (int i = 0; i < lineNumbers.length; i++) {
listKeys.add(genericTable.getKey(lineNumbers[i]));
}
return listKeys;
}
/**
* Declenche un evenement ActionEvent. Cette methode doit etre appele avant d'executer l'action.
*
* @param evt Description of Parameter
*/
protected final void fireActionEvent(ActionEvent evt) {
if (actionListenerManager != null) {
actionListenerManager.actionPerformed(evt);
}
if (genericTable.getSelectedRow() >= 0) {
setGenericTablePK(genericTable.getKey(genericTable.getSelectedRow()));
}
else {
setGenericTablePK(null);
}
}
/**
* Remets la connection dans le Pool.
*
* @param con
*
* @throws SQLException
*/
protected void releaseConnection(Connection con)
throws SQLException {
if (con != connection) {
getConnectionManager().releaseConnection(con);
}
}
/**
* Averti le Listener d'un changement en BD. La clef primaire sous forme de Map (nom de colonne / valeur)
*
* @param evtType Description of Parameter
* @param pk Description of Parameter
*
* @todo a finir (evt construit fixe >
*/
protected void fireDbChange(int evtType, Map pk) {
synchronized (this) {
if (dbChangeListener != null) {
DbChangeEvent evt = new DbChangeEvent(this, evtType, pk);
dbChangeListener.succeededChange(evt);
}
}
}
/**
* Positionne la liste des cl�s primaires.
*
* @param pk The new GenericTablePK value
*/
void setGenericTablePK(Map pk) {
genericTablePK = pk;
}
/**
* Retourne le connection manager
*
* @return -
*/
private ConnectionManager getConnectionManager() {
return Dependency.getConnectionManager();
}
public void setForcedDisabled(boolean forcedDisabled) {
this.forcedDisabled = forcedDisabled;
setEnabled(isEnabled());
}
@Override
public void setEnabled(boolean newValue) {
if (forcedDisabled) {
super.setEnabled(false);
}
else {
super.setEnabled(newValue);
}
}
}