Java tutorial
/* * Copyright 2010, 2011 Renaud Brub * * This file is part of PIGE. * * PIGE is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PIGE is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PIGE. If not, see <http://www.gnu.org/licenses/>. */ package ca.qc.cegepoutaouais.tge.pige.server; import ca.qc.cegepoutaouais.tge.pige.client.LoanStatus; import ca.qc.cegepoutaouais.tge.pige.client.UserStatus; import ca.qc.cegepoutaouais.tge.pige.dao.pojos.Loan; import ca.qc.cegepoutaouais.tge.pige.dao.pojos.ServerConfigs; import ca.qc.cegepoutaouais.tge.pige.dao.pojos.User; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Properties; import java.util.Set; import java.util.TimerTask; import org.apache.log4j.Logger; import org.hibernate.Criteria; import org.hibernate.FetchMode; import org.hibernate.Filter; import org.hibernate.Session; import org.hibernate.Transaction; /** * Cette classe est responsable de la vrification d'chance est emprunt. * Elle dmarre en tche de fond chaque mme heure chaque jour (selon les * configurations du fichier pige.properties. * * @author Renaud Brub */ public class LoanTermVerificatorTask extends TimerTask { private static final Logger logger = LogHelper.getLogger(LoanTermVerificatorTask.class); private final Properties configs = Configurations.getProperties(); private final String msgToUser; public LoanTermVerificatorTask() { msgToUser = configs.getProperty("msg.user.account_frozed"); } @Override public void run() { Boolean enabled = Boolean.parseBoolean(Configurations.getProperties() .getProperty(ServerConfigs.LOAN_TERM_VERIFICATOR_ENABLED, Boolean.FALSE.toString())); if (!enabled) { logger.info("Le vrificateur d'chance des emprunts est " + "dsactiv. Pour le ractiver, changez la valeur de la " + "ligne 'server.loan_verificator.enabled' 'true' dans " + "le fichier de configurations et redmarrez le serveur ou " + "bien ractiver-le partir du menu 'Gestion' dans PIGE. " + "(ne ncessite pas de redmarrage)."); return; } logger.info("Dmarrage de la vrification des chances des emprunts..."); Transaction tx = null; List<User> users = null; Session session = null; try { session = PigeHibernateUtil.openSession(); tx = session.beginTransaction(); // Activer le filtre permettant d'exclure les demandes d'emprunt // qui ne sont ni acceptes, ni en retard. Ce filtre est appliqu // la jointure qui permet de rcuprer les demandes d'emprunt // associ au compte. Filter filter = session.enableFilter(Loan.STATUS_FILTER_2PARAM); filter.setParameter(Loan.STATUS_FILTER_PARAM1, LoanStatus.STATUS_LENT); filter.setParameter(Loan.STATUS_FILTER_PARAM2, LoanStatus.STATUS_LATE); // Construire et excuter la requte permettant de rcuprer les // comptes. Une jointure externe permet de rcuprer les demandes // d'emprunt du compte immdiatement dans la mme requte SQL. Criteria crit = session.createCriteria(User.class).setFetchMode(User.LOAN_COLLECTION_REF, FetchMode.JOIN); users = (List) crit.list(); if (users == null) { users = new ArrayList(); } Set userSet = new HashSet(users); Set loans; User user; Loan loan; // Construire une date et heure prdfinie afin de servir de // comparaison pour les chances. Calendar today = Calendar.getInstance(); today.setTime(new Date()); today.set(Calendar.MILLISECOND, 0); today.set(Calendar.SECOND, 0); today.set(Calendar.MINUTE, 0); today.set(Calendar.HOUR, 0); // Date et heure pour l'chance. Calendar term = Calendar.getInstance(); // Itrer dans chaque usager contenant des emprunts en retard... for (Iterator<User> itr = userSet.iterator(); itr.hasNext();) { user = itr.next(); loans = user.getLoans(); boolean hasLate = false; int lateLoanCount = 0; StringBuffer lateLoansDesc = new StringBuffer("<ul>"); // Itrer dans chacun des emprunts en retard de l'usager... for (Iterator<Loan> itr2 = loans.iterator(); itr2.hasNext();) { loan = itr2.next(); // L'heure exacte laquelle un emprunt devient en retard. // 18h00 1 milliseconde. term.setTime(loan.getTerm()); // Rcuprer la date. term.set(Calendar.MILLISECOND, 1); term.set(Calendar.SECOND, 0); term.set(Calendar.MINUTE, 0); term.set(Calendar.HOUR, 18); if (today.after(term)) { logger.debug("Emprunts en retard pour " + user.toString() + ":"); logger.debug(" Today = " + today.getTime().toString()); logger.debug(" Term = " + term.getTime().toString()); // Changer l'tat de l'emprunt. loan.setStatus(LoanStatus.STATUS_LATE); hasLate = true; lateLoanCount++; lateLoansDesc.append( "<li>Qt: " + loan.getQuantity() + ", Desc: " + loan.getDescription() + "</li>"); } } lateLoansDesc.append("</ul><br/><br/>"); if (hasLate) { // Geler le compte de l'utilisateur et indiquer un message // de retard. user.setStatus(UserStatus.STATUS_FROZEN); user.setServerMessage(MessageFormat.format(msgToUser, lateLoanCount)); // Crer un envoi de courriel. Il sera envoy la fin de la // vrification avec les autres retards. EmailService email = new EmailService(); email.setRecipient(user.getEmail()); email.setSubjet( Configurations.getProperties().getProperty("msg.user.email.loan_lateness.subject")); email.setBody(MessageFormat.format( Configurations.getProperties().getProperty("msg.user.email.loan_lateness.body"), lateLoanCount, lateLoansDesc.toString()), true); email.addToBatch(); logger.info("Le compte suivant a t gel cause qu'il " + "contient des emprunts en retard: " + user.asString()); } } // Confirmer les changements la base de donnes. tx.commit(); sendNotifications(today); } catch (Exception hex) { logger.error(hex); if (tx != null) { tx.rollback(); } } finally { if (session != null) { session.close(); } } logger.info("Vrification termine!"); } private void sendNotifications(Calendar today) { Boolean sendDuringWeekEndEnabled = Boolean.parseBoolean(Configurations.getProperties() .getProperty("server.loan_verificator.email_during_weekend.enabled", Boolean.FALSE.toString())); int dow = today.get(Calendar.DAY_OF_WEEK); if ((dow == Calendar.SATURDAY || dow == Calendar.SUNDAY) && !sendDuringWeekEndEnabled) { return; } // Envoyer tous les courriels de retard. EmailService.sendBatch(); } }