/* * codjo.net * * Common Apache License 2.0 */ package net.codjo.model; // Persistance import net.codjo.persistent.PersistenceException; import net.codjo.persistent.sql.SimpleHome; import net.codjo.utils.sql.event.DbChangeListener; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.sql.SQLException; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.ResourceBundle; /** * Classe qui fait le lien entre l'objet Period et la BDD. * * <p> Cette classe lance un evenement lors de la modification de la periode courante (property * "currentPeriod"). </p> * * @version $Revision: 1.3 $ * @see net.codjo.model.Period */ public class PeriodHome extends SimpleHome { private static final DateFormat periodDateFormat = new SimpleDateFormat("yyyyMM"); private Period currentPeriod; private transient PropertyChangeSupport propertyChangeListeners = new PropertyChangeSupport(this); /** * Constructeur de l'objet PeriodHome * * @param con Connection a la base. * * @throws SQLException En cas d'erreur lors de l'acces a la base. */ public PeriodHome(java.sql.Connection con) throws SQLException { super(con, ResourceBundle.getBundle("PeriodHome")); periodDateFormat.setLenient(false); } /** * Constructeur de l'objet PeriodHome * * @param con Connection a la base. * @param resb Le ressourceBundle contenant la definition du home * * @throws SQLException En cas d'erreur lors de l'acces a la base. */ public PeriodHome(java.sql.Connection con, ResourceBundle resb) throws SQLException { super(con, resb); periodDateFormat.setLenient(false); } /** * Positionne la periode courante * * @param newCurrentPeriod La nouvelle periode courante */ public void setCurrentPeriod(Period newCurrentPeriod) { Period oldCurrentPeriod = currentPeriod; currentPeriod = newCurrentPeriod; propertyChangeListeners.firePropertyChange("currentPeriod", oldCurrentPeriod, newCurrentPeriod); } /** * Retourne un listener mettant a jours la couche de persistance au niveau de PortfolioGroupHome lors des * changements directe en Base. * * @return The DbChangeListener value */ public DbChangeListener getDbChangeListener() { return new DefaultDbChangeListener(); } /** * Retourne la periode precedante. * * @param period La periode courante * * @return La periode precedente * * @throws PersistenceException Periode precedente non definie. * @throws ParseException Impossible de decoder la periode courante, elle n'est pas au format * 'YYYYMM' */ public Period getPreviousPeriod(Period period) throws PersistenceException, ParseException { String prevPeriodTxt = determinePreviousPeriod(period.getPeriod()); return (Period)getReference(prevPeriodTxt).getObject(); } /** * Retourne la periode courante. * * @return La periode courante (ou null) */ public Period getCurrentPeriod() { return currentPeriod; } /** * Determine le nom de la periode precedante. * * @param period La periode courante * * @return La periode precedente * * @throws ParseException Impossible de decoder la periode courante, elle n'est pas au format 'YYYYMM' */ public String determinePreviousPeriod(String period) throws ParseException { Date date = periodDateFormat.parse(period.substring(0, 6)); Calendar calendar = periodDateFormat.getCalendar(); calendar.setTime(date); calendar.add(Calendar.MONTH, -1); return periodDateFormat.format(calendar.getTime()); } /** * Enleve un listener. * * @param l Le listener */ public synchronized void removePropertyChangeListener(PropertyChangeListener l) { propertyChangeListeners.removePropertyChangeListener(l); } /** * Ajoute un listener sur une Property de ce home. * * @param l Le Listener */ public synchronized void addPropertyChangeListener(PropertyChangeListener l) { propertyChangeListeners.addPropertyChangeListener(l); } }