ca.qc.cegepoutaouais.tge.pige.server.LoanTermVerificatorTask.java Source code

Java tutorial

Introduction

Here is the source code for ca.qc.cegepoutaouais.tge.pige.server.LoanTermVerificatorTask.java

Source

/*
 * 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();
    }

}