/*
* codjo.net
*
* Common Apache License 2.0
*/
package net.codjo.persistent.sql;
// Persistance
import net.codjo.persistent.AbstractModel;
import net.codjo.persistent.PersistenceException;
import net.codjo.persistent.Persistent;
import net.codjo.persistent.Reference;
import net.codjo.utils.QueryHelper;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
/**
* Cette Classe facilite l'implantation de la couche de persistence pour les classes Home
* de Penelope.
*
* @author $Author: blazart $
* @version $Revision: 1.3 $
*
*/
public abstract class AbstractHome extends AbstractModel {
/** Le QueryHelper utilise pour acceder a la base. */
protected QueryHelper queryHelper;
/**
* Constructor for the AbstractHome object
*
* @param con Description of Parameter
*/
public AbstractHome(Connection con) {
super(con);
}
/**
* Retourne toutes les instances de ce home pr�sents dans la base.
*
* @return Une liste de Reference
*
* @exception PersistenceException -
*/
public List getAllObjects() throws PersistenceException {
List allObjects = null;
try {
allObjects = loadAllObjects();
}
catch (SQLException ex) {
throw new PersistenceException(ex);
}
return allObjects;
}
/**
* Enregistre une reference.
*
* @param ref La reference.
*
* @exception java.lang.Exception -
*/
protected void saveSQL(Reference ref) throws java.lang.Exception {
Persistent obj = ref.getLoadedObject();
if (obj.isStored()) {
fillQueryHelperSelector(ref);
fillQueryHelperForInsert(ref);
queryHelper.doUpdate();
}
else {
fillQueryHelperForInsert(ref);
queryHelper.doInsert();
}
}
/**
* Efface une reference.
*
* @param ref La reference.
*
* @exception java.lang.Exception -
*/
protected void deleteSQL(Reference ref) throws java.lang.Exception {
fillQueryHelperSelector(ref);
queryHelper.doDelete();
}
/**
* Charge une reference.
*
* @param ref Le reference
*
* @exception java.lang.Exception -
* @throws net.codjo.persistent.UnknownIdException TODO
*/
protected void loadSQL(Reference ref) throws java.lang.Exception {
fillQueryHelperSelector(ref);
ResultSet rs = queryHelper.doSelect();
if (rs.next() == false) {
throw new net.codjo.persistent.UnknownIdException("Identifiant inconnue : "
+ ref.getId().toString() + "(" + getClass().toString() + ")");
}
loadObject(rs, ref);
rs.close();
}
/**
* Construction d'une reference a partir d'un ResultSet.
*
* @param rs Le ResultSet a utilise pour la construction.
*
* @return Une instance non null.
*
* @exception SQLException En cas d'erreur d'acces a la base
*/
protected abstract Reference loadReference(ResultSet rs)
throws SQLException;
/**
* Construction d'une instance de ce Home. L'objet est instanci� en fonction des
* information contenu dans le ResultSet.
*
* @param rs Le ResultSet utilise pour la construction.
* @param ref Reference sur l'instance a construire.
*
* @return Une instance non null.
*
* @exception SQLException Erreur d'acces a la base
* @exception PersistenceException Erreur dans la couche de persistence.
*/
protected abstract Persistent loadObject(ResultSet rs, Reference ref)
throws SQLException, PersistenceException;
/**
* Methode utilitaire qui remplit la requete pour une insertion. L'objet reference
* doit etre en memoire. De plus, cette methode doit creer un identifiant pour
* l'enregistrement est necessaire.
*
* @param ref La reference de l'objet a inserer.
*
* @exception SQLException Si il est impossible de recuperer un ID.
*/
protected abstract void fillQueryHelperForInsert(Reference ref)
throws SQLException;
/**
* Methode utilitaire qui remplit la clause where du QueryHelper.
*
* @param ref La reference utilisee pour remplir la clause.
*/
protected abstract void fillQueryHelperSelector(Reference ref);
/**
* Retourne une liste de toute les instances de ce home.
*
* @return Une liste de reference.
*
* @exception SQLException En cas d'erreur d'acces a la base
* @exception PersistenceException -
*/
private List loadAllObjects() throws SQLException, PersistenceException {
List allObjects = new java.util.ArrayList();
ResultSet rs = queryHelper.doSelectAll();
while (rs.next()) {
Reference ref = loadReference(rs);
loadObject(rs, ref);
allObjects.add(ref);
}
rs.close();
return allObjects;
}
}