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

Java tutorial

Introduction

Here is the source code for ca.qc.cegepoutaouais.tge.pige.server.MaintenanceRecallServiceTask.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.dao.pojos.Maintenance;
import ca.qc.cegepoutaouais.tge.pige.dao.pojos.ServerConfigs;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import java.util.TimerTask;
import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;

/**
 *
 * @author Renaud Brub
 */
public class MaintenanceRecallServiceTask extends TimerTask {

    private static final Logger logger = LogHelper.getLogger(MaintenanceRecallServiceTask.class);
    private final Properties configs = Configurations.getProperties();

    @Override
    public void run() {
        Boolean enabled = Boolean.parseBoolean(
                configs.getProperty(ServerConfigs.MAINTENANCE_RECALL_SERVICE_ENABLED, Boolean.FALSE.toString()));

        if (!enabled) {
            logger.info("Le service de rappel des maintenances est "
                    + "dsactiv. Pour le ractiver, changez la valeur de la "
                    + "ligne 'server.maintenance_recall_service.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 du service de rappel des maintenances...");

        Transaction tx = null;
        List<Maintenance> maintenances = null;
        Session session = null;
        StringBuilder recallMsg = new StringBuilder();
        recallMsg.append("<b>Rappel des maintenances:</b><br/>");
        recallMsg.append("<ul>");
        Boolean recallToSend = Boolean.FALSE;

        try {
            session = PigeHibernateUtil.openSession();
            tx = session.beginTransaction();

            maintenances = session.createCriteria(Maintenance.class)
                    .add(Restrictions.eq(Maintenance.USE_RECALL_REF, Boolean.TRUE))
                    .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list();

            if (maintenances == null || maintenances.size() == 0) {
                logger.info("Aucun rappel  traiter. Termin.");
                return;
            }

            logger.debug("Nombre de rappel  effectuer: " + maintenances.size());

            // Construire une date et heure prdfinie afin de servir de
            // comparaison pour les chances.
            final Date today = ServerUtil.getTodayDate();
            Date startDate = null;
            Date endDate = null;
            Date lastRecallDate = null;
            Integer days = 0;
            final Long conv = 1000L * 60L * 60L * 24L;

            for (Maintenance m : maintenances) {

                logger.debug("Traitement de la maintenance: " + m.toString());

                startDate = m.getStartDate();
                endDate = m.getEndDate();

                logger.debug("Vrification des dates de dmarrage et de fin de rappel...");

                if (startDate != null) {
                    startDate = ServerUtil.getZeroDate(startDate);
                    if (today.getTime() < startDate.getTime()) {
                        logger.debug("La date de dpart n'est pas encore atteinte: " + startDate.toString());
                        continue;
                    }
                }

                if (endDate != null) {
                    endDate = ServerUtil.getZeroDate(endDate);
                    if (today.getTime() > endDate.getTime()) {
                        logger.debug("La date de fin est dpasse: " + endDate.toString());
                        continue;
                    }
                }

                logger.debug("Vrification de la frquence du rappel...");

                lastRecallDate = m.getLastRecallDate();
                if (lastRecallDate == null) {
                    lastRecallDate = today;
                }

                logger.debug("Calcule du nombre de jour pass...");

                float ms = today.getTime() - lastRecallDate.getTime();
                days = new Float(ms / (float) conv).intValue();

                logger.debug("ms = " + ms + ", days = " + days);

                Integer freq = (m.getFrequency() == null ? 0 : m.getFrequency());

                if (days >= freq) {
                    logger.debug("Ajout du rappel de maintenance  la liste...");
                    m.setLastRecallDate(today);
                    session.update(m);
                    addTooRecallList(m, recallMsg);
                    recallToSend = Boolean.TRUE;
                }
            }

            // Confirmer les changements  la base de donnes.
            tx.commit();

        } catch (Exception hex) {
            logger.error(hex);
            if (tx != null) {
                tx.rollback();
            }
        } finally {
            if (session != null) {
                session.close();
            }
        }

        if (recallToSend) {
            logger.debug("Envoi du courriel contenant les rappels...");
            EmailService email = new EmailService();
            email.setRecipient(configs.getProperty("server.maintenance_recall_service.email"));
            email.setSubjet(configs.getProperty("msg.user.email.maintenance_recall_title"));
            email.setBody(recallMsg.toString(), Boolean.TRUE);
            email.sendAsync();
        }

        logger.info("Rappels des maintenances effectus!");
    }

    private void addTooRecallList(Maintenance m, StringBuilder builder) {
        builder.append("<li>ID: ").append(m.getId()).append(", Nom: ").append(m.getName()).append(", Description: ")
                .append(m.getDescription()).append("</li>");
    }
}