org.squale.squalecommon.enterpriselayer.facade.component.AuditFacade.java Source code

Java tutorial

Introduction

Here is the source code for org.squale.squalecommon.enterpriselayer.facade.component.AuditFacade.java

Source

/**
 * Copyright (C) 2008-2010, Squale Project - http://www.squale.org
 *
 * This file is part of Squale.
 *
 * Squale is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or any later version.
 *
 * Squale 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 Lesser General Public License
 * along with Squale.  If not, see <http://www.gnu.org/licenses/>.
 */
//Source file: D:\\CC_VIEWS\\SQUALE_V0_0_ACT\\SQUALE\\SRC\\squaleCommon\\src\\org\\squale\\squalecommon\\enterpriselayer\\facade\\AuditFacade.java

package org.squale.squalecommon.enterpriselayer.facade.component;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import org.squale.jraf.commons.exception.JrafDaoException;
import org.squale.jraf.commons.exception.JrafEnterpriseException;
import org.squale.jraf.helper.PersistenceHelper;
import org.squale.jraf.provider.persistence.hibernate.facade.FacadeHelper;
import org.squale.jraf.spi.enterpriselayer.IFacade;
import org.squale.jraf.spi.persistence.IPersistenceProvider;
import org.squale.jraf.spi.persistence.ISession;
import org.squale.squalecommon.daolayer.component.AuditDAOImpl;
import org.squale.squalecommon.daolayer.component.ApplicationDAOImpl;
import org.squale.squalecommon.datatransfertobject.component.AuditDTO;
import org.squale.squalecommon.datatransfertobject.component.ComponentDTO;
import org.squale.squalecommon.datatransfertobject.transform.component.AuditTransform;
import org.squale.squalecommon.enterpriselayer.businessobject.component.AuditBO;
import org.squale.squalecommon.enterpriselayer.businessobject.component.ApplicationBO;
import org.squale.squalecommon.enterpriselayer.facade.FacadeMessages;

/**
 */
public class AuditFacade implements IFacade {

    /**
     * Entier renseignant que l'on souhaite tous les audits
     */
    public static final int ALL_AUDIT = 0;

    /**
     * Entier renseignant que l'on souhaite uniquement les audits de suivi
     */
    public static final int PERIODIC_ONLY = 1;

    /**
     * Entier renseignant qu'on souhaite uniquement les audits de jalon
     */
    public static final int MILESTONE_ONLY = 2;

    /** log */
    private static Log LOG = LogFactory.getLog(AuditFacade.class);

    /**
     * provider de persistence
     */
    private static final IPersistenceProvider PERSISTENTPROVIDER = PersistenceHelper.getPersistenceProvider();

    /**
     * Permet de supprimer un audit donn et tous ses rsultats associs
     * 
     * @use by PurgeComponent.purgeApplication()
     * @param pAudit AuditDTO renseignant l'ID de l'audit
     * @throws JrafEnterpriseException exception JRAF
     * @roseuid 42CBFFB0024D
     */
    public static void delete(AuditDTO pAudit) throws JrafEnterpriseException {
        delete(pAudit, null);
    }

    /**
     * Charge l'audit
     * 
     * @param pAudit l'audit  rcuprer (on ne fourni que l'id)
     * @return l'audit
     * @throws JrafEnterpriseException en cas d'chec
     */
    public static AuditDTO get(AuditDTO pAudit) throws JrafEnterpriseException {
        return getById(new Long(pAudit.getID()));
    }

    /**
     * Permet de supprimer un audit donn et tous ses rsultats associs
     * 
     * @use by PurgeComponent.purgeApplication()
     * @param pAudit AuditDTO renseignant l'ID de l'audit
     * @param pSession session JRAF
     * @throws JrafEnterpriseException exception JRAF
     * @roseuid 42CBFFB0024F
     */
    public static void delete(AuditDTO pAudit, ISession pSession) throws JrafEnterpriseException {

        // Initialisation
        AuditBO auditBO = null; // objet metier a supprimer
        Long auditID = new Long(pAudit.getID()); // identifiant de l'audit
        try {
            if (pSession == null) {
                // CHECKSTYLE:OFF
                pSession = PERSISTENTPROVIDER.getSession();
                // CHECKSTYLE:ON
            }
            AuditDAOImpl auditDAO = AuditDAOImpl.getInstance();
            // Chargement de l'objet AuditBO + suppression
            auditBO = (AuditBO) auditDAO.load(pSession, auditID);
            if (auditBO != null) {
                auditDAO.remove(pSession, auditBO);
            } else {
                LOG.error(FacadeMessages.getString("facade.exception.auditfacade.delete.auditnull"));
            }
        } catch (JrafDaoException e) {
            FacadeHelper.convertException(e, AuditFacade.class.getName() + ".delete");
        } finally {
            FacadeHelper.closeSession(pSession, AuditFacade.class.getName() + ".delete");
        }
    }

    /**
     * Renvoie le dernier audit DE SUIVI de l'application en cours
     * 
     * @use by ResultsComponent
     * @param pApplication ComponentDTO de l'application concerne
     * @param pAuditType type d'Audit sous forme de chanes de caractres
     * @return AuditDTO dernier audit effectu
     * @throws JrafEnterpriseException exception JRAF
     * @roseuid 42CBFFB00258
     */
    public static AuditDTO getLastAudit(ComponentDTO pApplication, String pAuditType)
            throws JrafEnterpriseException {
        return getLastAudit(pApplication, pAuditType, null);
    }

    /**
     * Renvoie l'audit prcedent pour la mme application
     * 
     * @param pAudit audit courant
     * @param pSession session hibernat
     * @return l'audit prcedent s'il existe
     * @throws JrafEnterpriseException si pb hibernate
     */
    public static AuditDTO getPreviousAudit(AuditDTO pAudit, ISession pSession) throws JrafEnterpriseException {
        AuditDTO auditDTO = null;
        AuditDAOImpl auditDAO = AuditDAOImpl.getInstance();
        ISession session = pSession;
        try {
            // cration d'une session Hibernate
            if (session == null) {
                session = PERSISTENTPROVIDER.getSession();
            }
            // On rcupre l'audit en base
            Long auditId = new Long(pAudit.getID());
            AuditBO curAudit = (AuditBO) auditDAO.load(session, auditId);
            // et l'application associe
            ApplicationBO appli = ApplicationDAOImpl.getInstance().loadByAuditId(session, auditId);
            if (curAudit != null && appli != null) {
                AuditBO audit = auditDAO.findPreviousAudit(session, curAudit.getId(), curAudit.getHistoricalDate(),
                        appli.getId(), null);
                if (audit != null) {
                    auditDTO = AuditTransform.bo2Dto(audit, pAudit.getApplicationId());
                }
            }

        } catch (JrafDaoException e) {
            LOG.error(AuditFacade.class.getName() + ".getLastAudit", e);
        } finally {
            FacadeHelper.closeSession(session, AuditFacade.class.getName() + ".getLastAudit");
        }
        return auditDTO;
    }

    /**
     * Renvoie le dernier audit DE SUIVI de l'application en cours
     * 
     * @use by ResultsComponent
     * @param pApplication ComponentDTO de l'application concerne
     * @param pAuditType type d'Audit sous forme de chanes de caractres
     * @param pSession session jraf
     * @return AuditDTO dernier audit effectu
     * @throws JrafEnterpriseException exception JRAF
     */
    public static AuditDTO getLastAudit(ComponentDTO pApplication, String pAuditType, ISession pSession)
            throws JrafEnterpriseException {

        // Initialisation
        AuditDTO auditDTO = null; // retour de la facade
        AuditBO auditBO = null; // retour de AuditDAO

        ISession session = pSession;
        try {
            // cration d'une session Hibernate
            if (session == null) {
                session = PERSISTENTPROVIDER.getSession();
            }

            AuditDAOImpl auditDAO = AuditDAOImpl.getInstance();

            auditBO = auditDAO.getLastAuditByApplication(session, pApplication.getID(), pAuditType,
                    AuditBO.TERMINATED);

            if (auditBO != null) {
                auditDTO = AuditTransform.bo2Dto(auditBO, pApplication.getID());
            } else {
                LOG.error(FacadeMessages.getString("facade.exception.auditfacade.getlastaudit.auditnull"));
            }

        } catch (JrafDaoException e) {
            LOG.error(AuditFacade.class.getName() + ".getLastAudit", e);
        } finally {
            FacadeHelper.closeSession(session, AuditFacade.class.getName() + ".getLastAudit");
        }
        return auditDTO;
    }

    /**
     * Permet de rcuprer une liste d'audits en chec pour une application donne
     * 
     * @use by ResultsComponent
     * @param pComponent ApplicationDTO renseignant l'ID de l'application
     * @param pNbLignes nombre de lignes
     * @param pIndexDepart index de depart
     * @return Collection de AuditDTO
     * @throws JrafEnterpriseException exception JRAF
     */
    public static List getFailedAudits(ComponentDTO pComponent, Integer pNbLignes, Integer pIndexDepart)
            throws JrafEnterpriseException {
        return getAudits(pComponent, pNbLignes, pIndexDepart, null, AuditBO.FAILED);
    }

    /**
     * Permet de rcuprer une liste d'audits termins pour une application donne
     * 
     * @use by ResultsComponent
     * @param pComponent ApplicationDTO renseignant l'ID de l'application
     * @param pNbLignes nombre de lignes
     * @param pIndexDepart index de depart
     * @return Collection de AuditDTO
     * @throws JrafEnterpriseException exception JRAF
     */
    public static List getTerminatedAudits(ComponentDTO pComponent, Integer pNbLignes, Integer pIndexDepart)
            throws JrafEnterpriseException {
        return getAudits(pComponent, pNbLignes, pIndexDepart, null, AuditBO.TERMINATED);
    }

    /**
     * Permet de rcuprer une liste d'audits pour une application donne
     * 
     * @use by ResultsComponent
     * @param pComponent ApplicationDTO renseignant l'ID de l'application
     * @param pNbLignes nombre de lignes
     * @param pIndexDepart index de depart
     * @param pType type de l'audit
     * @param pStatus statut de l'audit
     * @return Collection de AuditDTO
     * @throws JrafEnterpriseException exception JRAF
     */
    public static List getAudits(ComponentDTO pComponent, Integer pNbLignes, Integer pIndexDepart, String pType,
            int pStatus) throws JrafEnterpriseException {
        // Initialisation
        List auditBOs = null; // retour de la DAO
        List auditDTOs = new ArrayList(); // retour de la facade

        ISession session = null;
        try {
            // cration d'une session Hibernate
            session = PERSISTENTPROVIDER.getSession();

            AuditDAOImpl auditDAO = AuditDAOImpl.getInstance();
            // Obtention des audits dans la base
            auditBOs = auditDAO.findWhereComponent(session, pComponent.getID(), pNbLignes, pIndexDepart, pType,
                    pStatus);

            // Parcours de chaque audit et transformation de l'audit
            Iterator iterator = auditBOs.iterator();
            AuditBO auditBO = null;
            while (iterator.hasNext()) {
                auditBO = (AuditBO) iterator.next();
                // Recuperation du BO dans la collection + transformation en DTO
                // ajout du AuditDTO a la collection de DTOs
                AuditDTO auditDTO = AuditTransform.bo2Dto(auditBO, pComponent.getID());
                auditDTOs.add(auditDTO);
            }
        } catch (JrafDaoException e) {
            auditDTOs = null;
            LOG.error(AuditFacade.class.getName() + ".getLastAudits", e);
        } finally {
            FacadeHelper.closeSession(session, AuditFacade.class.getName() + ".getLastAudits");
        }
        return auditDTOs;
    }

    /**
     * Permet de rcuprer laudits termins pour une application donne
     * 
     * @use by ResultsComponent
     * @param pComponent ApplicationDTO renseignant l'ID du projet
     * @param pNbLignes nombre de lignes
     * @param pIndexDepart index de depart
     * @param pType type de l'audit
     * @param pStatus le status de l'audit
     * @return Collection de AuditDTO
     * @throws JrafEnterpriseException exception JRAF
     * @roseuid 42CBFFB00275
     */
    public static List getLastAudits(ComponentDTO pComponent, Integer pNbLignes, Integer pIndexDepart, String pType,
            int pStatus) throws JrafEnterpriseException {
        return getAudits(pComponent, pNbLignes, pIndexDepart, pType, pStatus);
    }

    /**
     * The list of audits for the applications of pApplications which have been done after pDate (if this parameter is
     * not null) and whose status aren't in pExcludedStatus.
     * 
     * @param pApplications The applications
     * @param pDate The date
     * @param pExcludedStatus The list of status which should be excluded
     * @return The list of audits
     * @throws JrafEnterpriseException If an error occur
     */
    public static Collection getAllAuditsAfterDate(Collection pApplications, Date pDate, Integer[] pExcludedStatus)
            throws JrafEnterpriseException {

        // Initialization
        List auditBOs = null;
        List auditDTOs = new ArrayList();
        List appliIds = new ArrayList();
        ISession session = null;

        // Creation of the list of applications id's
        Iterator it = pApplications.iterator();
        while (it.hasNext()) {
            ComponentDTO currentComponent = (ComponentDTO) it.next();
            appliIds.add(new Long(currentComponent.getID()));
        }

        try {
            // The hibernate session
            session = PERSISTENTPROVIDER.getSession();
            AuditDAOImpl auditDAO = AuditDAOImpl.getInstance();
            auditBOs = auditDAO.findAfterDateWhereComponents(session, appliIds, pDate, pExcludedStatus, null);
            auditDTOs = bo2DtoWithApplication(session, auditBOs);
        } catch (JrafDaoException e) {
            FacadeHelper.convertException(e, AuditFacade.class.getName() + ".getAllAuditsAfterDate");
        }

        finally {
            FacadeHelper.closeSession(session, AuditFacade.class.getName() + ".getAllAuditsAfterDate");
        }
        return auditDTOs;
    }

    /**
     * @param pApplication l' application renseignant l'id
     * @param pDate la date limite de rcupration des audits
     * @param pWithFailedAudits indique si les audits en chec doivent galement tre collects
     * @return les audits correspondants aux critres de recherche
     * @throws JrafEnterpriseException exception JRAF
     */
    private static Collection getAllAuditsAfterDate(ComponentDTO pApplication, Date pDate,
            boolean pWithFailedAudits) throws JrafEnterpriseException {
        // Initialisation
        List auditBOs = null; // retour de la DAO
        List auditDTOs = new ArrayList(); // retour de la facade

        ISession session = null;
        try {
            // cration d'une session Hibernate
            session = PERSISTENTPROVIDER.getSession();

            AuditDAOImpl auditDAO = AuditDAOImpl.getInstance();
            // Obtention des audits dans la base
            auditBOs = auditDAO.findAfterDateWhereComponent(session, pApplication.getID(), pDate,
                    pWithFailedAudits);

            // Parcours de chaque audit et transformation de l'audit
            Iterator iterator = auditBOs.iterator();
            AuditBO auditBO = null;
            while (iterator.hasNext()) {
                auditBO = (AuditBO) iterator.next();
                // Recuperation du BO dans la collection + transformation en DTO
                // ajout du AuditDTO a la collection de DTOs
                AuditDTO auditDTO = AuditTransform.bo2Dto(auditBO, pApplication.getID());
                auditDTO.setApplicationName(pApplication.getName());
                auditDTOs.add(auditDTO);
            }
        } catch (JrafDaoException e) {
            auditDTOs = null;
            LOG.error(AuditFacade.class.getName() + ".getAllAuditsAfterDate", e);
        } finally {
            FacadeHelper.closeSession(session, AuditFacade.class.getName() + ".getAllAuditsAfterDate");
        }
        return auditDTOs;
    }

    /**
     * @param pApplications les applications
     * @param pDate la date
     * @param pExcludedStatus les statuts  exclure
     * @param pExcludedApplications les ids des applications  ne pas prendre en compte
     * @param pNbAuditsPerAppli le nombre max d'audits par application
     * @return les audits pour les applications de pApplications dont l'excution s'est effectu aprs pDate (si ce
     *         paramtre n'est pas nul) et dont le statut n'est pas dans <code>pExcludedStatus</code>
     * @throws JrafEnterpriseException si erreur
     */
    public static Collection getAuditsForPortlet(Collection pApplications, Date pDate, Integer[] pExcludedStatus,
            String[] pExcludedApplications, Integer pNbAuditsPerAppli) throws JrafEnterpriseException {
        // Initialisation
        List auditBOs = null; // retour de la DAO
        List auditDTOs = new ArrayList(); // retour de la facade
        // DAO
        AuditDAOImpl auditDAO = AuditDAOImpl.getInstance();
        ApplicationDAOImpl appliDAO = ApplicationDAOImpl.getInstance();

        ISession session = null;
        try {
            // cration d'une session Hibernate
            session = PERSISTENTPROVIDER.getSession();

            List excludedApplisList = new ArrayList(0);
            if (null != pExcludedApplications) {
                excludedApplisList = Arrays.asList(pExcludedApplications);
            }
            List appliIds = new ArrayList();
            // On construit la liste des ids des applications en prenant en compte les applications exclues
            for (Iterator it = pApplications.iterator(); it.hasNext();) {
                ComponentDTO currentComponent = (ComponentDTO) it.next();
                if (!excludedApplisList.contains("" + currentComponent.getID())) {
                    appliIds.add(new Long(currentComponent.getID()));
                }
            }
            auditBOs = auditDAO.findAfterDateWhereComponents(session, appliIds, pDate, pExcludedStatus,
                    pNbAuditsPerAppli);
            if (0 == auditBOs.size()) {
                // On rcupre le dernier audit effectu
                auditBOs = auditDAO.findAfterDateWhereComponents(session, appliIds, null, pExcludedStatus,
                        new Integer(1));
            }
            // On transforme les audits afin que l'application associe soit aussi renseigne
            auditDTOs = bo2DtoWithApplication(session, auditBOs);
        } catch (JrafDaoException e) {
            auditDTOs = null;
            LOG.error(AuditFacade.class.getName() + ".getAuditsForPortlet", e);
        } finally {
            FacadeHelper.closeSession(session, AuditFacade.class.getName() + ".getAuditsForPortlet");
        }
        return auditDTOs;
    }

    /**
     * permet d'ajouter un audit  une application donne (cas d'un milestone)
     * 
     * @use by ApplicationAdministratorComponent
     * @param pAudit AuditDTO
     * @return AuditDTO avec l'identifiant renseign
     * @throws JrafEnterpriseException exception JRAF
     * @roseuid 42CBFFB00289
     */
    public static AuditDTO insertAudit(AuditDTO pAudit) throws JrafEnterpriseException {
        return insertAudit(pAudit, null);
    }

    /**
     * permet d'ajouter un audit  une application donne (cas d'un milestone)
     * 
     * @use by ApplicationAdministratorComponent
     * @param pAudit AuditDTO
     * @param pSession session JRAF
     * @return AuditDTO avec l'identifiant renseign
     * @throws JrafEnterpriseException exception JRAF
     * @roseuid 42CBFFB0028C
     */
    public static AuditDTO insertAudit(AuditDTO pAudit, ISession pSession) throws JrafEnterpriseException {

        // Initialisation
        AuditDTO auditDTO = null; // retour de la facade
        AuditBO auditBO = null; // objet metier audit a ajouter
        ApplicationBO applicationBO = null; // projet relatif a l'audit
        Long applicationID = new Long(pAudit.getApplicationId());

        // identifiant du projet relatif a un audit
        try {
            // creation d'une session Hibernate
            if (pSession == null) {
                // CHECKSTYLE:OFF
                pSession = PERSISTENTPROVIDER.getSession();
                // CHECKSTYLE:ON
            }

            // Initialisation des DAO
            AuditDAOImpl auditDAO = AuditDAOImpl.getInstance();
            ApplicationDAOImpl applicationDAO = ApplicationDAOImpl.getInstance();

            // Chargement du projet relatif
            applicationBO = (ApplicationBO) applicationDAO.get(pSession, applicationID);

            if (applicationBO != null) {
                // Verification qu'un premier audit de jalon n'a pas ete pos
                int nbAudits = auditDAO.countWhereType(pSession, applicationBO, pAudit.getType(),
                        pAudit.getStatus());

                if (nbAudits == 0) {
                    // transformation de l'audit
                    auditBO = AuditTransform.dto2Bo(pAudit);
                    // Creation de l'audit sans aucune relation
                    auditDAO.create(pSession, auditBO);
                    // ajout de l'audit et sauvegarde du projet
                    applicationBO.addAudit(auditBO);
                    applicationDAO.save(pSession, applicationBO);
                    auditDTO = AuditTransform.bo2Dto(auditBO, applicationID.longValue());
                }

            } else {
                LOG.error(FacadeMessages.getString("facade.exception.auditfacade.insertaudit.applicationnull"));
            }

        } catch (JrafDaoException e) {
            FacadeHelper.convertException(e, AuditFacade.class.getName() + ".insertNextAudit");
        } finally {
            FacadeHelper.closeSession(pSession, AuditFacade.class.getName() + ".insertNextAudit");
        }

        return auditDTO;

    }

    /**
     * Insertion d'un audit.
     * 
     * @param pAuditDTO l'audit  insrer
     * @param pSession la session hibernate
     * @return le DTO de l'audit insr (null en cas d'erreur d'insertion)
     * @throws JrafEnterpriseException si erreur
     */
    private static AuditDTO insertNormalAudit(AuditDTO pAuditDTO, ISession pSession)
            throws JrafEnterpriseException {
        Long applicationID = new Long(pAuditDTO.getApplicationId());
        AuditDTO lAuditDTO = null;
        try {
            AuditDAOImpl lAuditDAO = AuditDAOImpl.getInstance();
            ApplicationDAOImpl lApplicationDAO = ApplicationDAOImpl.getInstance();

            ApplicationBO lApplicationBO = (ApplicationBO) lApplicationDAO.get(pSession, applicationID);
            if (lApplicationBO != null) {
                AuditBO lAuditBO = AuditTransform.dto2Bo(pAuditDTO);
                lAuditDAO.create(pSession, lAuditBO);
                lApplicationBO.addAudit(lAuditBO);
                lApplicationDAO.save(pSession, lApplicationBO);
                lAuditDTO = AuditTransform.bo2Dto(lAuditBO);
            }
        } catch (JrafDaoException e) {
            FacadeHelper.convertException(e, AuditFacade.class.getName() + ".insertNormalAudit");
        }
        return lAuditDTO;
    }

    /**
     * Constructeur par defaut
     * 
     * @roseuid 42CBFFB00296
     */
    private AuditFacade() {
    }

    /**
     * Permet de reprogramm un audit sur une application au lendemain. si il s'agit d'un audit de suivi, l'audit dj
     * programm est supprim
     * 
     * @param pAudit AuditDTO dfinissant l'id de l'audit
     * @return l'audit reprogramm
     * @throws JrafEnterpriseException si erreur
     */
    public static AuditDTO restartAudit(AuditDTO pAudit) throws JrafEnterpriseException {
        AuditDTO auditDTO = null;
        ISession session = null;
        try {
            // cration d'une session Hibernate
            session = PERSISTENTPROVIDER.getSession();
            AuditDAOImpl auditDAO = AuditDAOImpl.getInstance();
            // On rcupre l'audit dont l'id est renseign par pAudit
            AuditBO failedAudit = (AuditBO) auditDAO.load(session, new Long(pAudit.getID()));
            // On transforme le bo en dto
            auditDTO = AuditTransform.bo2Dto(failedAudit, pAudit.getApplicationId());
            // On change la date pour le lancer le lendemain  0:00
            GregorianCalendar cal = new GregorianCalendar();
            cal.add(GregorianCalendar.HOUR_OF_DAY,
                    ApplicationFacade.HOUR_OF_AUDIT - cal.get(GregorianCalendar.HOUR_OF_DAY));
            cal.add(GregorianCalendar.MINUTE,
                    ApplicationFacade.MINUTE_OF_AUDIT - cal.get(GregorianCalendar.MINUTE));
            auditDTO.setDate(cal.getTime());
            // Son status sera en attente d'excution
            auditDTO.setStatus(AuditBO.NOT_ATTEMPTED);
            // On insre l'audit avec un traitement diffrent selon le type de l'audit
            if (auditDTO.getType().equals(AuditBO.MILESTONE)) {
                auditDTO = insertAudit(auditDTO);
            } else { // Il s'agit d'un audit de suivi
                auditDTO = restartNormalAudit(auditDTO);
            }
        } catch (JrafDaoException e) {
            FacadeHelper.convertException(e, AuditFacade.class.getName() + ".restartAudit");
        } finally {
            FacadeHelper.closeSession(session, AuditFacade.class.getName() + ".restartAudit");
        }
        return auditDTO;
    }

    /**
     * Insre un audit de suivi et supprime celui cre normalement
     * 
     * @param pAudit l'audit de suivi  insrer
     * @return l'audit insr ou null si l'insertion a chou
     * @throws JrafEnterpriseException si erreur
     */
    private static AuditDTO restartNormalAudit(AuditDTO pAudit) throws JrafEnterpriseException {
        // Initialisation
        AuditDTO auditDTO = null; // retour de la facade
        AuditBO auditBO = null; // objet metier audit a ajouter
        ApplicationBO applicationBO = null; // projet relatif a l'audit
        ISession session = null; // session hibernate
        // identifiant du projet relatif a un audit
        Long applicationID = new Long(pAudit.getApplicationId());
        try {
            session = PERSISTENTPROVIDER.getSession();
            // Initialisation des DAO
            AuditDAOImpl auditDAO = AuditDAOImpl.getInstance();
            ApplicationDAOImpl applicationDAO = ApplicationDAOImpl.getInstance();
            // Chargement du projet relatif
            applicationBO = (ApplicationBO) applicationDAO.get(session, applicationID);
            if (applicationBO != null) {
                // Rcupration du prochain audit lanc normalement
                AuditBO nextAudit = auditDAO.getLastAuditByApplication(session, pAudit.getApplicationId(),
                        pAudit.getType(), pAudit.getStatus());

                if (null != nextAudit) {
                    // On supprime le prochain audit
                    auditDAO.remove(session, nextAudit);
                }
                // On insre le nouveau
                // transformation de l'audit
                auditBO = AuditTransform.dto2Bo(pAudit);
                // Creation de l'audit sans aucune relation
                auditDAO.create(session, auditBO);
                // ajout de l'audit et sauvegarde du projet
                applicationBO.addAudit(auditBO);
                applicationDAO.save(session, applicationBO);
                auditDTO = AuditTransform.bo2Dto(auditBO, applicationID.longValue());

            } else {
                LOG.error(FacadeMessages.getString("facade.exception.auditfacade.insertaudit.applicationnull"));
            }

        } catch (JrafDaoException e) {
            FacadeHelper.convertException(e, AuditFacade.class.getName() + ".restartNormalAudit");
        } finally {
            FacadeHelper.closeSession(session, AuditFacade.class.getName() + ".restartNormalAudit");
        }

        return auditDTO;

    }

    /**
     * Rcupre l'audit de jalon programm pour l'application d'id <code>pApplicationId</code> si il existe
     * 
     * @param pApplicationId l'id de l'application
     * @return l'audit trouv ou null sinon
     * @throws JrafEnterpriseException si erreur
     */
    public static AuditDTO getMilestoneAudit(Long pApplicationId) throws JrafEnterpriseException {
        AuditDTO auditDTO = null;
        ISession session = null; // session hibernate
        try {
            session = PERSISTENTPROVIDER.getSession();
            // Initialisation du DAO
            AuditDAOImpl auditDAO = AuditDAOImpl.getInstance();
            AuditBO auditBO = auditDAO.findMilestoneAudit(session, pApplicationId.longValue());
            if (null != auditBO) {
                auditDTO = AuditTransform.bo2Dto(auditBO, pApplicationId.longValue());
            }
        } catch (JrafDaoException e) {
            FacadeHelper.convertException(e, AuditFacade.class.getName() + ".getMilestoneAudit");
        } finally {
            FacadeHelper.closeSession(session, AuditFacade.class.getName() + ".getMilestoneAudit");
        }
        return auditDTO;
    }

    /**
     * Liste des audits de suivi programm pour une application.
     * 
     * @param pApplicationId l'id de l'application
     * @param pAuditDTO l'audit de suivi  insrer
     * @param pSession la session hibernate
     * @return le DTO de l'audit insr (null en cas d'erreur d'insertion)
     * @throws JrafEnterpriseException si erreur
     */
    public static AuditDTO modifyNextNormalAudit(long pApplicationId, AuditDTO pAuditDTO, ISession pSession)
            throws JrafEnterpriseException {
        AuditDTO lAuditDTO = null;
        List lList = new ArrayList();
        try {
            AuditDAOImpl lAuditDAO = AuditDAOImpl.getInstance();

            // suppression des audits de suivi programms
            lList = lAuditDAO.findWhereComponent(pSession, pApplicationId, null, null, AuditBO.NORMAL,
                    AuditBO.NOT_ATTEMPTED);
            Iterator lAuditIt = lList.iterator();
            while (lAuditIt.hasNext()) {
                AuditBO lAuditBO = (AuditBO) lAuditIt.next();
                lAuditDAO.removeWhereId(pSession, lAuditBO.getId());
            }
            // ajout de l'audit de suivi
            lAuditDTO = insertNormalAudit(pAuditDTO, pSession);
        } catch (Exception e) {
        }
        return lAuditDTO;
    }

    /**
     * Supprime l'audit de jalon d'id <code>removeAudit</code>
     * 
     * @param pAuditId l'id de l'audit
     * @return Integer : 0 pour la russite de la methode sinon 1
     * @throws JrafEnterpriseException si erreur
     */
    public static Integer removeAudit(Long pAuditId) throws JrafEnterpriseException {
        Integer status = new Integer(0);
        ISession session = null; // session hibernate
        try {
            session = PERSISTENTPROVIDER.getSession();
            // Initialisation du DAO
            AuditDAOImpl auditDAO = AuditDAOImpl.getInstance();
            auditDAO.removeWhereId(session, pAuditId.longValue());
        } catch (JrafDaoException e) {
            FacadeHelper.convertException(e, AuditFacade.class.getName() + ".removeAudit");
            status = new Integer(1);
        } finally {
            FacadeHelper.closeSession(session, AuditFacade.class.getName() + ".removeAudit");
        }
        return status;
    }

    /**
     * Modifie l'audit de jalon d'id <code>removeAudit</code>
     * 
     * @param pAudit l'audit  mettre  jour
     * @return l'audit modifi
     * @throws JrafEnterpriseException si erreur
     */
    public static AuditDTO modifyAudit(AuditDTO pAudit) throws JrafEnterpriseException {
        AuditDTO auditDTO = null;
        ISession session = null; // session hibernate
        try {
            session = PERSISTENTPROVIDER.getSession();
            // Initialisation du DAO
            AuditDAOImpl auditDAO = AuditDAOImpl.getInstance();
            AuditBO auditBO = AuditTransform.dto2Bo(pAudit);
            auditDAO.save(session, auditBO);
            auditDTO = pAudit;
        } catch (JrafDaoException e) {
            FacadeHelper.convertException(e, AuditFacade.class.getName() + ".modifyAudit");
        } finally {
            FacadeHelper.closeSession(session, AuditFacade.class.getName() + ".modifyAudit");
        }
        return auditDTO;
    }

    /**
     * @param pType le type d'audit
     * @param pStatus le status de l'audit
     * @return les audits dont le statut est <code>pStatus</code> de type <code>pType</code>
     * @throws JrafEnterpriseException si erreur
     */
    public static Collection getAudits(String pType, int pStatus) throws JrafEnterpriseException {
        // Initialisation
        List auditBOs = null; // retour de la DAO
        List auditDTOs = new ArrayList(); // retour de la facade

        ISession session = null;
        try {
            // cration d'une session Hibernate
            session = PERSISTENTPROVIDER.getSession();

            AuditDAOImpl auditDAO = AuditDAOImpl.getInstance();
            // Obtention des audits dans la base
            auditBOs = auditDAO.findWhereStatusAndType(session, pType, pStatus);
            // On transforme les audits afin que l'application associe soit aussi renseigne
            auditDTOs = bo2DtoWithApplication(session, auditBOs);
        } catch (JrafDaoException e) {
            auditDTOs = null;
            LOG.error(AuditFacade.class.getName() + ".getAudits", e);
        } finally {
            FacadeHelper.closeSession(session, AuditFacade.class.getName() + ".getAudits");
        }
        return auditDTOs;
    }

    /**
     * Permet de transformer un ensemble d'audits sous forme BO en DTO en rcuprant au pralable l'application
     * associe.
     * 
     * @param pSession la session
     * @param pAuditBOs les audits sous forme BO
     * @return les audits sous forme DTO avec l'application rensigne
     * @throws JrafDaoException si erreur
     */
    private static List bo2DtoWithApplication(ISession pSession, Collection pAuditBOs) throws JrafDaoException {
        List auditDTOs = new ArrayList(); // retour de la facade
        // Parcours de chaque audit et transformation de l'audit
        Iterator iterator = pAuditBOs.iterator();
        AuditBO auditBO = null;
        while (iterator.hasNext()) {
            auditBO = (AuditBO) iterator.next();
            // Recuperation du BO dans la collection + transformation en DTO
            // On rcupre l'application associe
            ApplicationBO appliBO = ApplicationDAOImpl.getInstance().loadByAuditId(pSession,
                    new Long(auditBO.getId()));
            // Code dfensif, ne devrait normalement pas se produire
            if (appliBO != null) {
                AuditDTO auditDTO = AuditTransform.bo2Dto(auditBO, appliBO.getId());
                auditDTO.setApplicationName(appliBO.getName());
                // ajout du AuditDTO a la collection de DTOs
                auditDTOs.add(auditDTO);
            }
        }
        return auditDTOs;
    }

    /**
     * Met  jour la date et/ou le status d'un audit
     * 
     * @param pAudits les audits dont la date ou le status est  mettre  jour
     * @return le nombre d'audits mis  jour
     * @throws JrafEnterpriseException exception Jraf
     */
    public static Integer updateAuditsDateOrStatus(Collection pAudits) throws JrafEnterpriseException {
        // Initialisation
        ISession session = null;
        int nbChanged = 0;
        try {
            // cration d'une session Hibernate
            session = PERSISTENTPROVIDER.getSession();
            AuditDAOImpl auditDAO = AuditDAOImpl.getInstance();
            // Parcours de chaque audit et transformation de l'audit
            Iterator iterator = pAudits.iterator();
            AuditDTO auditDTO = null;
            while (iterator.hasNext()) {
                auditDTO = (AuditDTO) iterator.next();
                // On rcupre l'audit en base
                AuditBO auditBO = (AuditBO) auditDAO.load(session, auditDTO.getID());
                // update du bo
                auditBO.setDate(auditDTO.getDate());
                auditBO.setStatus(auditDTO.getStatus());
                auditDAO.save(session, auditBO);
                nbChanged++;
            }
        } catch (JrafDaoException e) {
            nbChanged = 0;
            LOG.error(AuditFacade.class.getName() + ".updateAuditsDateOrStatus", e);
        } finally {
            FacadeHelper.closeSession(session, AuditFacade.class.getName() + ".updateAuditsDateOrStatus");
        }
        return new Integer(nbChanged);
    }

    /**
     * @param pComponent le composant
     * @param pNbLignes le nombre de lignes remontes
     * @param pIndexDepart l'index de dpart
     * @return les audits partiels
     * @throws JrafEnterpriseException en cas d'chec
     */
    public static Collection getPartialAudits(ComponentDTO pComponent, Integer pNbLignes, Integer pIndexDepart)
            throws JrafEnterpriseException {
        return getAudits(pComponent, pNbLignes, pIndexDepart, null, AuditBO.PARTIAL);
    }

    /**
     * @param pAuditId l'id de l'audit qu'on veut rcuprer
     * @return l'auditDTO
     * @throws JrafEnterpriseException en cas d'chec
     */
    public static AuditDTO getById(Long pAuditId) throws JrafEnterpriseException {
        ISession session = null;
        AuditDTO auditDTO = null;
        try {
            session = PERSISTENTPROVIDER.getSession();
            AuditDAOImpl auditDAO = AuditDAOImpl.getInstance();
            // Chargement de l'objet AuditBO + transformation
            AuditBO auditBO = (AuditBO) auditDAO.load(session, pAuditId);
            if (auditBO != null) {
                auditDTO = AuditTransform.bo2Dto(auditBO);
            }
        } catch (JrafDaoException e) {
            FacadeHelper.convertException(e, AuditFacade.class.getName() + ".getById");
        } finally {
            FacadeHelper.closeSession(session, AuditFacade.class.getName() + ".getById");
        }
        return auditDTO;
    }

    /**
     * @return le dernier audit termin de chaque application
     * @throws JrafEnterpriseException si erreur
     */
    public static Collection getLastTerminatedAudits() throws JrafEnterpriseException {
        return getLastAudits(ApplicationBO.class, AuditBO.ALL_TYPES, AuditBO.TERMINATED);
    }

    /**
     * @param pComponentType la classe des composants concerns
     * @param pType le type des audits
     * @param pStatus le status des audits
     * @return les derniers audits des composants de type <pComponentType</code> de type <code>pType</code> dont le
     *         status est <code>pStatus</code>
     * @throws JrafEnterpriseException si erreur
     */
    private static Collection getLastAudits(Class pComponentType, String pType, int pStatus)
            throws JrafEnterpriseException {
        // indice du tableau pour le nom du serveur de l'application
        final int SERVER_NAME_ID = 3;
        // Initialisation
        ISession session = null;
        Collection audits = new ArrayList();
        try {
            // cration d'une session Hibernate
            session = PERSISTENTPROVIDER.getSession();
            AuditDAOImpl auditDAO = AuditDAOImpl.getInstance();
            // On rcupre les derniers audits selon les paramtres de la mthode
            Collection lastAudits = auditDAO.findAllLastAudits(session, pComponentType, pType, pStatus);
            // Parcours de chaque audit et transformation de l'audit
            Iterator iterator = lastAudits.iterator();
            Object[] tab;
            while (iterator.hasNext()) {
                // On rcupre le tableau  trois lment du type {applicationId, applicationName, auditBO}
                tab = (Object[]) iterator.next();
                AuditDTO auditDTO = AuditTransform.bo2Dto((AuditBO) tab[2], ((Long) tab[0]).longValue());
                auditDTO.setApplicationName((String) tab[1]);
                if (tab.length > SERVER_NAME_ID) {
                    auditDTO.setServerName((String) tab[SERVER_NAME_ID]);
                }
                audits.add(auditDTO);
            }
        } catch (JrafDaoException e) {
            LOG.error(AuditFacade.class.getName() + ".getLastAudits", e);
        } finally {
            FacadeHelper.closeSession(session, AuditFacade.class.getName() + ".getLastAudits");
        }
        return audits;
    }

    /**
     * This method retrieves all the successful audit for the application given in argument
     * 
     * @param appId The application id
     * @return The list of successful audit
     * @throws JrafEnterpriseException Ecpetion occurs during the retrieve of the audits
     */
    public static List<AuditDTO> getAllSuccessfulAudits(long appId) throws JrafEnterpriseException {
        ISession session = null;
        List<AuditDTO> listAuditDTO = new ArrayList<AuditDTO>();
        try {
            session = PERSISTENTPROVIDER.getSession();
            AuditDAOImpl auditDAO = AuditDAOImpl.getInstance();
            List<AuditBO> succesfullAudits = auditDAO.succesfullAudit(session, appId);
            for (AuditBO auditBO : succesfullAudits) {
                AuditDTO auditDTO = AuditTransform.bo2Dto(auditBO);
                listAuditDTO.add(auditDTO);
            }
        } catch (JrafDaoException e) {
            LOG.error(AuditFacade.class.getName() + ".getLastAudits", e);
        } finally {
            FacadeHelper.closeSession(session, AuditFacade.class.getName() + ".getLastAudits");
        }
        return listAuditDTO;
    }

    /**
     * This method retrieves the application linked to the audit given in argument
     * 
     * @param auditId the current audit
     * @return the aplication linked to the current audit
     * @throws JrafEnterpriseException Exception occurs during the retrieve of the audit
     */
    public static ComponentDTO getLinkedApplication(long auditId) throws JrafEnterpriseException {
        ISession session = null;
        ComponentDTO compo = null;
        try {
            session = PERSISTENTPROVIDER.getSession();
            compo = ApplicationFacade.loadByAuditId(auditId, session);
        } catch (JrafDaoException e) {
            LOG.error(AuditFacade.class.getName() + ".getLinkedApplication", e);
        } finally {
            FacadeHelper.closeSession(session, AuditFacade.class.getName() + ".getLinkedApplication");
        }
        return compo;
    }
}