/*
* codjo.net
*
* Common Apache License 2.0
*/
package net.codjo.utils.sql;
import net.codjo.gui.toolkit.util.ErrorDialog;
import net.codjo.utils.QueryHelper;
import net.codjo.utils.SQLFieldList;
import net.codjo.utils.sql.event.DbChangeEvent;
import java.awt.event.ActionEvent;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.Map;
import javax.swing.ListSelectionModel;
import javax.swing.UIManager;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
/**
* Duplique l'enregistrement s�lectionn� sur la table source.
*
* @author $Author: spinae $
* @version $Revision: 1.2 $
*/
class DuplicateAction extends AbstractDbAction {
SQLFieldList allcols = new SQLFieldList();
/**
* Constructor for the DuplicateAction object
*/
public DuplicateAction() {
putValue(NAME, "Dupliquer");
putValue(SHORT_DESCRIPTION, "Duplication de l'enregistrement");
putValue(SMALL_ICON, UIManager.getIcon("ListTable.duplicate"));
}
/**
* Constructor for the DuplicateAction object
*
* @param gt GUI Table source.
*
* @throws IllegalArgumentException TODO
*/
public DuplicateAction(GenericTable gt) {
super(null, null, gt);
if (gt == null) {
throw new IllegalArgumentException();
}
putValue(NAME, "Dupliquer");
putValue(SHORT_DESCRIPTION, "Duplication de l'enregistrement");
putValue(SMALL_ICON, UIManager.getIcon("ListTable.duplicate"));
setEnabled(false);
ListSelectionModel rowSM = getGenericTable().getSelectionModel();
rowSM.addListSelectionListener(new SelectionListener());
}
/**
* Lance la duplication de l'enregistrement s�lectionn�.
*
* @param evt L'�v�nement de l'action
*/
public void actionPerformed(ActionEvent evt) {
fireActionEvent(evt);
try {
execute();
}
catch (SQLException ex) {
ex.printStackTrace();
ErrorDialog.show(getGenericTable(),
"Impossible de dupliquer l'enregistrement", ex.getLocalizedMessage());
}
}
/**
* Indique si l'action est potentiellement activable.
*
* @return 'true' si elle peut etre activee
*/
private boolean isActivatable() {
ListSelectionModel lsm = getGenericTable().getSelectionModel();
if (lsm.isSelectionEmpty() == false) {
return true;
}
return false;
}
/**
* Execute les requ�tes de duplication (select des valeurs � supprimer + sauvegarde dans un nouvel
* enregistrement).
*
* @throws SQLException -
*/
private void execute() throws SQLException {
Connection con = getConnection();
try {
for (Iterator iter = getPrimaryKeys().iterator(); iter.hasNext();) {
Map keyMap = (Map)iter.next();
QueryHelper queryHelper = buildQueryHelper(con, keyMap);
ResultSet rs = queryHelper.doSelect();
fillQueryHelper(allcols, rs, queryHelper);
queryHelper.doInsert();
}
fireDbChange(DbChangeEvent.DUPLICATE_EVENT, null);
getGenericTable().refreshData();
}
finally {
releaseConnection(con);
}
}
/**
* Construit la requ�te d'insert.
*
* @param con une connection valide
* @param keyMap Description of Parameter
*
* @return Description of the Returned Value
*
* @throws SQLException Erreur SQL
*/
private QueryHelper buildQueryHelper(Connection con, Map keyMap)
throws SQLException {
Map pk = keyMap;
Map allColumns = getTable().getAllColumns();
for (Iterator iter = allColumns.keySet().iterator(); iter.hasNext();) {
String fieldName = (String)iter.next();
if (pk.containsKey(fieldName) == false) {
Integer sqlType = (Integer)allColumns.get(fieldName);
allcols.addField(fieldName, sqlType.intValue());
}
}
SQLFieldList selector = new SQLFieldList();
for (Iterator iter = pk.keySet().iterator(); iter.hasNext();) {
String dbField = (String)iter.next();
Integer sqlType = (Integer)allColumns.get(dbField);
selector.addField(dbField, sqlType.intValue());
selector.setFieldValue(dbField, pk.get(dbField));
}
QueryHelper queryHelper =
new QueryHelper(getDbTableName(), con, allcols, selector);
return queryHelper;
}
/**
* Remplit le QueryHelper avec les valeurs des champs.
*
* @param columns Liste de colonnes a remplir dans le query helper.
* @param res Le ResultSet de la requ�te de selection.
* @param qh Le QueryHelper a remplir.
*
* @throws SQLException Description of Exception
* @throws IllegalArgumentException TODO
*/
private void fillQueryHelper(SQLFieldList columns, ResultSet res, QueryHelper qh)
throws SQLException {
Iterator iter = columns.fieldNames();
if (res.next() == false) {
throw new IllegalArgumentException("Manque une ligne");
}
while (iter.hasNext()) {
String columnName = (String)iter.next();
Object value = res.getObject(columnName);
qh.setInsertValue(columnName, value);
}
}
/**
* Active / Desactive l'action en fonction de la selection sur la table
*
* @author $Author: spinae $
* @version $Revision: 1.2 $
*/
private class SelectionListener implements ListSelectionListener {
/**
* DOCUMENT ME!
*
* @param e Description of Parameter
*/
public void valueChanged(ListSelectionEvent e) {
if (e.getValueIsAdjusting()) {
return;
}
setEnabled(isActivatable());
}
}
}