org.squale.squalecommon.enterpriselayer.applicationcomponent.display.ResultsApplicationComponentAccess.java Source code

Java tutorial

Introduction

Here is the source code for org.squale.squalecommon.enterpriselayer.applicationcomponent.display.ResultsApplicationComponentAccess.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/>.
 */
package org.squale.squalecommon.enterpriselayer.applicationcomponent.display;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

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

import org.squale.jraf.commons.exception.JrafEnterpriseException;
import org.squale.jraf.provider.accessdelegate.DefaultExecuteComponent;
import org.squale.squalecommon.daolayer.result.QualityResultDAOImpl;
import org.squale.squalecommon.datatransfertobject.component.AuditDTO;
import org.squale.squalecommon.datatransfertobject.component.AuditGridDTO;
import org.squale.squalecommon.datatransfertobject.component.ComponentDTO;
import org.squale.squalecommon.datatransfertobject.result.MarkDTO;
import org.squale.squalecommon.datatransfertobject.result.QualityResultDTO;
import org.squale.squalecommon.datatransfertobject.result.ResultsDTO;
import org.squale.squalecommon.datatransfertobject.rule.PracticeRuleDTO;
import org.squale.squalecommon.enterpriselayer.applicationcomponent.ACMessages;
import org.squale.squalecommon.enterpriselayer.businessobject.component.AuditBO;
import org.squale.squalecommon.enterpriselayer.facade.component.AuditFacade;
import org.squale.squalecommon.enterpriselayer.facade.component.ComponentFacade;
import org.squale.squalecommon.enterpriselayer.facade.export.audit.AuditReportFacade;
import org.squale.squalecommon.enterpriselayer.facade.quality.ErrorFacade;
import org.squale.squalecommon.enterpriselayer.facade.quality.MeasureFacade;
import org.squale.squalecommon.enterpriselayer.facade.quality.QualityResultFacade;
import org.squale.squalecommon.enterpriselayer.facade.quality.SqualeReferenceFacade;
import org.squale.squalecommon.enterpriselayer.facade.rule.QualityGridFacade;
import org.squale.squalecommon.util.messages.CommonMessages;

/**
 * Classe permetant d'effectuer la rcupration des rsultats
 * <p>
 * Title : ResultsApplicationComponentAccess.java
 * </p>
 * <p>
 * Description : Application component d'affichage de resultats
 * </p>
 * 
 * @author m400841
 */
public class ResultsApplicationComponentAccess extends DefaultExecuteComponent {

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

    /**
     * Nombre d'audits a rcuprer par defaut
     */
    private static final Integer NB_AUDITS = new Integer(CommonMessages.getInt("audit.nombre"));

    /**
     * Index a partir duquel on souhaite rcuprer les audits par defaut Les donnes sont rcupres du plus rcent au
     * plus vieux
     */
    private static final Integer INDEX_DEPART_AUDIT = new Integer(CommonMessages.getInt("audit.index"));

    /**
     * Constructeur par dfaut
     * 
     * @roseuid 42CBFBFC02AF
     */
    public ResultsApplicationComponentAccess() {
    }

    /**
     * Permet de rcuprer une liste de valeurs pour une liste de types de rsultat, un type de composant et un audit
     * donn
     * 
     * @param pAudit AuditDTO renseignant l'ID de l'audit sinon <code>null</code> pour le dernier audit de suivi
     * @param pComponent ComponentDTO renseignant l'ID du composant
     * @param pMetrics indique si l'on veut les mtriques ou les rsultats qualit
     * @return ResultsDTO <br/> Format de ResultsDTO : 2 lignes : <br/> -- Cl : null -- Valeur : liste des cls des
     *         TREs<br/> -- Cl : ComponentDTO -- Valeur : liste des rsultats associes en valeur
     * @throws JrafEnterpriseException Exception JRAF
     * @roseuid 42CBFBFD0008
     */
    public ResultsDTO getComponentResults(AuditDTO pAudit, ComponentDTO pComponent, Boolean pMetrics)
            throws JrafEnterpriseException {
        // Initialisation
        ResultsDTO results = null; // retour de la methode
        ComponentDTO currentComponent = validateComponent(pComponent); // parametre de la facade
        AuditDTO currentAudit = initAudit(pAudit, pComponent); // parametre de la facade

        ResultsDTO measuresResults = null;
        ResultsDTO qresultsResults = null;

        if (currentAudit != null && currentComponent != null) {

            // Envoi des collections aux facades et recuperation des resultats
            if (pMetrics.booleanValue()) {
                measuresResults = MeasureFacade.getAllMeasures(currentAudit, currentComponent);
                results = measuresResults;
            } else {
                qresultsResults = QualityResultFacade.getAllQResults(currentAudit, currentComponent);
                results = qresultsResults;
            }
        } else {
            LOG.error(ACMessages.getString("ac.exception.results.getbytre.auditorcomponentnull"));
        }

        return results;
    }

    /**
     * @param pAudit l'audit concern
     * @param pProject le projet
     * @return la liste des pratiques
     * @throws JrafEnterpriseException en cas d'chec
     */
    public Collection getAllPractices(AuditDTO pAudit, ComponentDTO pProject) throws JrafEnterpriseException {
        return QualityResultFacade.findPracticesWhere(new Long(pProject.getID()), new Long(pAudit.getID()));
    }

    /**
     * Rcupre les noms de toutes les pratiques lies  un audit et  un projet
     * 
     * @param pAudit l'audit concern
     * @param pProject le projet
     * @return la liste des noms des pratiques
     * @throws JrafEnterpriseException en cas d'chec
     */
    public Collection getAllPracticeNames(AuditDTO pAudit, ComponentDTO pProject) throws JrafEnterpriseException {
        return QualityResultFacade.findPracticeNameWhere(new Long(pProject.getID()), new Long(pAudit.getID()));
    }

    /**
     * Permet de rcuprer des valeurs pour un type de rsultat, un type de composant et plusieurs audits donns
     * 
     * @param pProject ComponentDTO renseignant l'ID du composant
     * @param pRuleId Cl du TRE
     * @param pAuditDTOs liste des IDs des audits. Si <code>null</code> alors recuperation des deux derniers audits de
     *            suivi
     * @return ResultsDTO <br/> Format de ResultsDTO : 2 lignes : <br/> -- Cl : null -- Valeur : liste des AuditDTOs<br/> --
     *         Cl : ComponentDTO -- Valeur : liste des rsultats associes<br/>
     * @throws JrafEnterpriseException Exception JRAF
     * @roseuid 42CBFBFD01E9
     */
    public ResultsDTO getByAudit(List pAuditDTOs, ComponentDTO pProject, Long pRuleId)
            throws JrafEnterpriseException {

        // Initialisation
        ResultsDTO results = null; // retour de l'AC
        ComponentDTO currentComponent = validateComponent(pProject); // parametre de la facade
        List currentAudits = initAuditList(pAuditDTOs, pProject); // parametre de la facade

        if (currentAudits != null && currentComponent != null) {
            results = QualityResultFacade.getQResultsByAudit(currentAudits, pRuleId, pProject);
        } else {
            LOG.error(ACMessages.getString("ac.exception.results.getbyaudit.notvalidparameter"));
        }

        return results;
    }

    /**
     * Permet de rcuprer des valeurs pour une liste de types de rsultat, une liste de types de composant et un audit
     * donns
     * 
     * @param pAudit AuditDTO renseignant l'ID de l'audit. Si <code>null</code> pass en parametre, alors recuperation
     *            des deux derniers audits de suivi.
     * @param pComponentDTOs liste des IDs des composants
     * @return ResultsDTO <br/> Format de ResultsDTO : n+1 lignes : <br/> -- Cl : null -- Valeur : liste des cls de
     *         TREs <br/> -- Cl : ComponentDTO -- Valeur : liste des rsultats associes ( n fois ) <br/>
     * @throws JrafEnterpriseException Exception JRAF
     * @roseuid 42CBFBFD0289
     */
    private ResultsDTO getByFactorAndProject(AuditDTO pAudit, List pComponentDTOs) throws JrafEnterpriseException {
        // Initialisation
        ResultsDTO results = null; // retour de la facade
        List currentComponents = validateComponents(pComponentDTOs); // parametre pour la facade
        AuditDTO currentAudit = pAudit;
        if (currentComponents != null) {
            currentAudit = initAudit(pAudit, (ComponentDTO) currentComponents.iterator().next());
            // parametre de la facade
        }

        if (currentComponents != null && currentAudit != null) {
            results = QualityResultFacade.getQResultsByFactorAndProject(currentComponents, currentAudit);
        }

        return results;
    }

    /**
     * Permet de rcuprer des valeurs pour une liste de types de rsultat, un type de composant et une liste d'audits
     * donns
     * 
     * @param pProject ComponentDTO renseignant l'ID du composant
     * @param pAuditDTOs liste des IDs des audits. Si <code>null</code> pass en parametre, alors recuperation des
     *            deux derniers audits de suivi.
     * @return ResultsDTO <br/> Format de ResultsDTO : n+1 lignes : <br/> -- Cl : null -- Valeur : liste des cls de
     *         TREs <br/> -- Cl : AuditDTO -- Valeur : liste des rsultats associes en valeur ( n fois )
     * @throws JrafEnterpriseException Exception JRAF
     * @roseuid 42CBFBFD030B
     */
    public ResultsDTO getProjectResults(List pAuditDTOs, ComponentDTO pProject) throws JrafEnterpriseException {

        // Initialisation
        ResultsDTO results = null; // retour de l'AC
        List currentAudits = initAuditList(pAuditDTOs, pProject); // parametre de la facade

        if (currentAudits != null && pProject != null) {
            // Envoi des collections aux facades et recuperation des resultats
            results = QualityResultFacade.getQResultsByTREAndAudit(currentAudits, pProject);
        }

        return results;
    }

    /**
     * Obtention de la grille d'audit correspondant  un projet
     * 
     * @param pProject projet
     * @param pAudit audit
     * @return grille d'audit
     * @throws JrafEnterpriseException si erreur
     */
    public AuditGridDTO getProjectAuditGrid(ComponentDTO pProject, AuditDTO pAudit) throws JrafEnterpriseException {
        return QualityResultFacade.getAuditGrid(pProject, pAudit);
    }

    /**
     * Permet de rcuprer la volumtrie d'un projet
     * 
     * @param pProject ComponentDTO renseignant l'ID du composant
     * @param pAuditId l'ID de l'audit.
     * @return ResultsDTO <br/> Format de ResultsDTO : n+1 lignes : <br/> -- Cl : null -- Valeur : liste des cls de
     *         TREs <br/> -- Cl : ComponentDTO -- Valeur : liste des rsultats associes en valeur ( n fois )
     * @throws JrafEnterpriseException Exception JRAF
     */
    public ResultsDTO getProjectVolumetry(Long pAuditId, ComponentDTO pProject) throws JrafEnterpriseException {
        // Appel mthode de la faade
        return MeasureFacade.getProjectVolumetry(pAuditId, pProject);
    }

    /**
     * Permet de rcuprer les rsultats de tous les projets dans le rfrentiel
     * 
     * @param pNbLignes nombre de lignes, sinon <code>null</code> pour tous les projets avec le parametre pIndexDepart
     *             <code>null</code>
     * @param pIndexDepart index de depart, sinon <code>null</code> pour tous les projets
     * @param pIsAdmin boolen permettant de savoir si on doit rcuprer les projets masqus ou non
     * @param pUserId l'id de l'utilisateur
     * @return Collection de SqualeReferenceDTO
     * @throws JrafEnterpriseException Exception JRAF
     */
    public Collection getReference(Integer pNbLignes, Integer pIndexDepart, Boolean pIsAdmin, Long pUserId)
            throws JrafEnterpriseException {
        Collection collection = null;
        collection = SqualeReferenceFacade.getProjectResults(pNbLignes, pIndexDepart, pIsAdmin.booleanValue(),
                pUserId);
        return collection;
    }

    /**
     * Obtention des mtriques d'applications
     * 
     * @param pComponentDTOs collection d'applications
     * @return mtriques associs au projet
     * @throws JrafEnterpriseException si erreur
     */
    public List getApplicationResults(Collection pComponentDTOs) throws JrafEnterpriseException {
        List result = new ArrayList();
        // Initialisation de la recuperation de projets
        Iterator componentIterator = pComponentDTOs.iterator(); // iterateur
        while (componentIterator.hasNext()) {
            // Obtention du composant
            ComponentDTO currentComponent = (ComponentDTO) componentIterator.next();

            // Recuperation des composants fils
            Iterator children = new ArrayList(ComponentFacade.getChildren(currentComponent, null, null, null))
                    .iterator();
            // Obtention du dernier audit
            AuditDTO lastAudit = initAudit(null, currentComponent);
            // Ce cas se prsente sur une nouvelle application ou bien
            // en cas de purge d'audit
            if (lastAudit != null) {
                while (children.hasNext()) {
                    ComponentDTO currentChild = (ComponentDTO) children.next();
                    // Obtention des mesures lies  cet audit pour chacun des fils
                    ResultsDTO results = MeasureFacade.getAllMeasures(lastAudit, currentChild);
                    result.add(results);
                }
            }
        }
        return result;
    }

    /**
     * Permet de rcuprer les rsultats relatifs aux applications
     * 
     * @param pComponentDTOs Collection de ComponentDTOs renseignant l'ID du composant
     * @param pAudits liste des audits souhaits, sinon <code>null</code> pour le cas ou on souhaite les deux derniers
     *            audits (paramtr dans le fichier de proprits)
     * @return liste de liste de resultDTOs tris dans le meme ordre que les pComponentDTOs<br/> Format de la liste :
     *         <br/> liste de liste - le nombre d'lment tant gal au nombre d'lments de pComponentDTOs {ResultsDTO
     *         du dernier audit, ResultsDTO de l'avant-dernier audit, etc. }<br/><br/> Format du ResultsDTO :<br/> --
     *         Cl : null -- Valeur : liste des TREs disponibles<br/> -- Cl : ComponentDTO relatif au projet -- Valeur :
     *         liste de valeurs associs (n fois) (n fois avec n le nombre total de projets appartenant a l'utilisateur)
     * @throws JrafEnterpriseException Exception JRAF
     * @roseuid 42CBFBFE0154
     */
    public List getApplicationResults(Collection pComponentDTOs, List pAudits) throws JrafEnterpriseException {

        // Initialisation
        List resultDTOs = new ArrayList(); // retour de la fonction
        List children = new ArrayList(); // retour de la facade ComponentFacade
        List currentAudits = null; // parametre des facades de resultats

        // Validation des composants
        List componentTemps = new ArrayList(pComponentDTOs);
        List currentComponents = validateComponents(componentTemps);

        // Initialisation de la recuperation de projets
        Iterator componentIterator = pComponentDTOs.iterator(); // iterateur
        ComponentDTO currentComponent = null;
        // ApplicationDTO sous forme de ComponentDTO

        // Initialisation du retour de la methode
        ResultsDTO resultsTemp = null;

        if (currentComponents != null) {
            // ajout de tous les projets concerns
            while (componentIterator.hasNext()) {

                // Obtention du composant
                currentComponent = (ComponentDTO) componentIterator.next();

                // Recuperation des composants fils
                children = new ArrayList(ComponentFacade.getChildren(currentComponent, null, null, null));

                // Initialisation des audits
                currentAudits = initAuditList(pAudits, currentComponent);

                List currentResults = new ArrayList();
                // Initialisation du retour de la methode
                if (currentAudits != null) {
                    // Construction de la liste des rsultats intermdiaires
                    for (int i = 0; i < currentAudits.size(); i++) {
                        resultsTemp = new ResultsDTO();
                        currentResults.add(resultsTemp);
                    }
                    // Obtention des rsultats
                    currentResults = getProjectResultList(currentResults, currentAudits, children);
                }
                // Ajout des rsultats vides pour les applications non encore audits
                if (currentResults == null || currentResults.size() == 0) {
                    currentResults = new ArrayList();
                    currentResults.add(createEmptyResults(children));
                }
                // Ajout des rsultats
                resultDTOs.add(currentResults);
            }
        } else {
            resultDTOs = null;
        }

        return resultDTOs;
    }

    /**
     * Cration de rsultats nuls pour des projets
     * 
     * @param pChildren applications
     * @return rsultats vides respectant le format suivant : -- Cl : null -- Valeur : liste des TREs demands<br/> --
     *         Cl : ComponentDTO relatif  chaque sous-projet -- Valeur : liste de valeurs nulles
     */
    private ResultsDTO createEmptyResults(List pChildren) {
        ResultsDTO result = new ResultsDTO();
        if (result != null) {
            return result;
        }
        // TODO extraire la liste des facteurs associs
        // et renvoyer celle-ci
        return result;
    }

    /**
     * @param pAuditId l'id de l'audit
     * @param pProjectId l'id du projet
     * @return un boolen indiquant si le projet a provoqu des erreurs
     * @throws JrafEnterpriseException en cas d'chec
     */
    public Boolean getHaveErrors(Long pAuditId, Long pProjectId) throws JrafEnterpriseException {
        return new Boolean(getNumberOfErrors(pAuditId, pProjectId).intValue() > 0);
    }

    /**
     * @param pAuditId l'id de l'audit
     * @param pProjectId l'id du projet
     * @return le nombre d'erreurs provoqu par le projet
     * @throws JrafEnterpriseException en cas d'chec
     */
    public Integer getNumberOfErrors(Long pAuditId, Long pProjectId) throws JrafEnterpriseException {
        return new Integer(ErrorFacade.getNumberOfErrors(pAuditId, pProjectId));
    }

    /**
     * @param pAuditId l'id de l'audit
     * @param pProjectId l'id du projet
     * @return le nombre d'erreurs provoqu par le projet par niveau
     * @throws JrafEnterpriseException en cas d'chec
     */
    public Integer[] getErrorsRepartition(Long pAuditId, Long pProjectId) throws JrafEnterpriseException {
        return ErrorFacade.getErrorsRepartition(pAuditId, pProjectId);
    }

    /**
     * @param pAuditId l'id de l'audit
     * @param pProjectId l'id du projet
     * @return les noms des tches en chec
     * @throws JrafEnterpriseException en cas d'chec
     */
    public List getFailedTasks(Long pAuditId, Long pProjectId) throws JrafEnterpriseException {
        return ErrorFacade.getFailedTasks(pAuditId, pProjectId);
    }

    /**
     * Ajoute  pResultDTOs les ResultDTO correspondant.Recupere pour tous les audits les ResultsDTO au format composant
     * en fonction des tres, et les ajoute a la liste de ResultsDTO  renvoyer  l'utilisateur.
     * 
     * @param pResultDTOs la liste de ResultDTO donnant les projets
     * @param pCurrentAudits liste des AuditDTO concerns
     * @param pChildren enfants dont on veut les rsultats parametres des facades MeasureFacade et QResultFacade
     * @return une liste de ResultDTO au mme format que dans la methode getApplicationResults()
     * @throws JrafEnterpriseException Exception JRAF
     */
    private List getProjectResultList(List pResultDTOs, List pCurrentAudits, List pChildren)
            throws JrafEnterpriseException {
        ListIterator auditIterator = pCurrentAudits.listIterator();
        AuditDTO currentAudit = null;
        // audit sur lequel on requiert des resultats
        ResultsDTO currentResults = null;
        // ResultsDTO pour les projets et les TREs
        List newResultDTOs = pResultDTOs;
        while (auditIterator.hasNext() && newResultDTOs != null) {

            // Initialisation de l'audit courant et chargement de resultats projets / TREs
            currentAudit = (AuditDTO) auditIterator.next();
            currentResults = getByFactorAndProject(currentAudit, pChildren);

            // Ajout a des resultats des projets / TREs a la collection de ResultsDTO pour un audit donn
            // L'indice dans la liste de ResultsDTO correspond a l'indice dans la liste d'audits
            /*
             * TODO tester que la premiere ligne de resultsDTO pour chaque projet est la meme SINON throw une exception
             */
            if (currentResults != null) {
                // Ajout des rsultats sur le RsultDTO de pResultDTOs correspondant au bon audit
                ResultsDTO resultDTO = ((ResultsDTO) newResultDTOs.get(auditIterator.nextIndex() - 1));
                resultDTO.getResultMap().putAll(currentResults.getResultMap());
            } else {
                newResultDTOs = null;
            }
        }
        return newResultDTOs;
    }

    /**
     * Permet d'effectuer la navigation par qualite
     * 
     * @param pComponent composant concern par la navigation qualite (projet)
     * @param pTreParent tre parent dont on souahite les fils
     * @param pAudits audits concernes
     * @return ResultsDTO du format suivant :<br /> -- Cl : null -- Valeur : liste des cls de TREs<br /> -- Cl :
     *         AuditDTO -- Valeur : liste des rsultats associes ( n fois )<br />
     * @throws JrafEnterpriseException exception Jraf
     */
    public ResultsDTO getTreChildrenResults(ComponentDTO pComponent, Long pTreParent, List pAudits)
            throws JrafEnterpriseException {

        // Initialisation
        ResultsDTO resultsDTO = null; // retour de l'AC
        Collection treChildren = null; // liste des TREs enfants

        // Validation du composant (id et test de nullit)
        ComponentDTO currentComponent = validateComponent(pComponent); // parametre de la facade

        if (currentComponent != null) {
            // rcupre les audits si la liste d'audits est nulles
            List currentAudits = initAuditList(pAudits, currentComponent);

            try {

                // rcupration des tre enfants
                treChildren = ComponentFacade.getTREChildren(pTreParent);

                if (treChildren != null) {
                    List treChildrenList = new ArrayList(treChildren);
                    // rcupration des rsultats correspondant aux TREs enfants, aux audits et au composant concern
                    resultsDTO = QualityResultFacade.getQResults(currentAudits, currentComponent, treChildrenList);
                }

            } catch (JrafEnterpriseException e) {
                String obj[] = { String.valueOf(currentComponent.getID()) };
                LOG.error(ACMessages.getString("ac.exception.results.gettrechildrenresults", obj), e);
            }

        }

        return resultsDTO;

    }

    /**
     * Permet de recuperer les resultats d'une pratique ainsi que sa repartition
     * 
     * @param pAudits liste des AuditDTOs ou <code>null</code> pour rcuprer les derniers audits
     * @param pProject ComponentDTO relatif a un projet
     * @param pPractice pratique
     * @return ResultsDTO avec les deux Map renseignes ResultsMap : <br/> -- Cl : null -- Valeur : Liste d'AuditDTO
     *         <br/> -- Cl : ComponentDTO -- Valuer : valeurs associ au tre <br/> <br/> PracticeMap : n lignes de la
     *         forme suivante :<br/> -- Cl : AuditDTO -- Valeur : tableau de Integer correspondant a la repartition
     * @throws JrafEnterpriseException exception Jraf
     */
    public ResultsDTO getRepartitionResults(List pAudits, ComponentDTO pProject, PracticeRuleDTO pPractice)
            throws JrafEnterpriseException {

        // Initialisation
        ResultsDTO repartitionResults = null; // retour de la methode
        ComponentDTO currentComponent = validateComponent(pProject); // composant test
        List currentAudits = null; // audits initialises
        if (currentComponent != null) {
            currentAudits = initAuditList(pAudits, pProject);
        }

        if (currentAudits != null) {
            repartitionResults = QualityResultFacade.getRepartition(currentAudits, currentComponent, pPractice);
        }

        return repartitionResults;

    }

    /**
     * Obtention des rsultats de rulecheking sur un projet
     * 
     * @param pAudits liste des AuditDTOs ou <code>null</code> pour rcuprer les derniers audits
     * @param pProject ComponentDTO relatif a un projet
     * @param pPractice pratique
     * @return ResultsDTO avec les deux Map renseignes ResultsMap : <br/> -- Cl : null -- Valeur : Liste d'AuditDTO
     *         <br/> -- Cl : ComponentDTO -- Valeurs : notes associes aux audits dans le mme ordre que la liste
     *         d'audit de type java.lang.Float<br/> <br/> PracticeMap : n lignes de la forme suivante :<br/> -- Cl :
     *         AuditDTO -- Valeur : map de <RuleCheckingDTO,java.lang.Integer>
     * @throws JrafEnterpriseException exception Jraf
     */
    public ResultsDTO getRuleCheckingResults(List pAudits, ComponentDTO pProject, PracticeRuleDTO pPractice)
            throws JrafEnterpriseException {
        // Initialisation
        ResultsDTO repartitionResults = null; // retour de la methode
        ComponentDTO currentComponent = validateComponent(pProject); // composant test
        List currentAudits = null; // audits initialises
        if (currentComponent != null) {
            currentAudits = initAuditList(pAudits, pProject);
        }

        if (currentAudits != null) {
            repartitionResults = QualityResultFacade.getRuleChecking(currentAudits, currentComponent, pPractice);
        }

        return repartitionResults;
    }

    /**
     * Rcupre les dtails d'une transgressions pour une rgle donne.
     * 
     * @param pMeasureID l'id de la mesure
     * @param pRuleID l'id de la rgle
     * @return les dtails de la mesure concernant la rgle d'id <code>pRuleID</code>
     * @throws JrafEnterpriseException si erreur
     */
    public Collection getRuleCheckingItemResults(Long pMeasureID, Long pRuleID) throws JrafEnterpriseException {
        return QualityResultFacade.getRuleCheckingItems(pMeasureID, pRuleID);
    }

    /**
     * Permet de recuperer les composants et leurs resultats associs a une valeur donne d'une note et un audit
     * 
     * @param pAudit AuditDTO renseignant l'identifiant. Ne peut etre <code>null</code>
     * @param pProject ComponentDTO relatif au projet
     * @param pTreKey cl de tre relatif a une pratique
     * @param pValue Integer representant l'index de rpartition
     * @param pMax Nombre maximum de composants retourn
     * @return ResultsDTO de la forme suivante :<br/> -- Cl : null -- Valeur : Liste de cls de tre relatifs a une
     *         pratique -- Cl : ComponentDTO -- Valeur : Liste de valeur associe
     * @throws JrafEnterpriseException exception Jraf
     */
    public ResultsDTO getValueResults(AuditDTO pAudit, ComponentDTO pProject, Long pTreKey, Integer pValue,
            Integer pMax) throws JrafEnterpriseException {

        // Initialisation
        ResultsDTO results = null; // retour de la methode

        Collection components = null; // composants ayant la valeur donne
        List componentList = null; // liste associee aux composants recuperes
        Collection treChildren = null; // liste des tres fils
        List treKeyList = null; // liste associee aux tres recuperes

        AuditDTO currentAudit = pAudit;
        ComponentDTO currentProject = validateComponent(pProject);
        if (currentProject != null) {
            currentAudit = initAudit(currentAudit, currentProject);
        }

        // rcupration des composants souhaits et des tres de mesures
        if (pValue != null) {

            components = ComponentFacade.get(pAudit, currentProject, pTreKey, pValue, pMax);
            treChildren = ComponentFacade.getTREChildren(pTreKey);

            // Initialisation des listes
            if (components != null && treChildren != null) {

                componentList = new ArrayList(components);
                treKeyList = new ArrayList(treChildren);

                /* recuperation des resultats */
                results = MeasureFacade.getMeasuresByTREAndComponent(pTreKey, treKeyList, componentList, pAudit);

            }
        }
        return results;
    }

    /**
     * Permet de recuperer les composants et leurs resultats associs a une valeur donne d'une note et un audit
     * 
     * @param pAudit AuditDTO renseignant l'identifiant. Ne peut etre <code>null</code>
     * @param pProject ComponentDTO relatif au projet
     * @param pTreKey cl de tre relatif a une pratique
     * @param pMinValue Integer representant la note min de l'interval
     * @param pMaxValue Integer representant la note max de l'interval
     * @param pMax Nombre maximum de composants retourn
     * @return ResultsDTO de la forme suivante :<br/> -- Cl : null -- Valeur : Liste de cls de tre relatifs a une
     *         pratique -- Cl : ComponentDTO -- Valeur : Liste de valeur associe
     * @throws JrafEnterpriseException exception Jraf
     */
    public ResultsDTO getValueResultsForInterval(AuditDTO pAudit, ComponentDTO pProject, Long pTreKey,
            Double pMinValue, Double pMaxValue, Integer pMax) throws JrafEnterpriseException {

        // Initialisation
        ResultsDTO results = null; // retour de la methode

        Collection components = null; // composants ayant la valeur donne
        List componentList = null; // liste associee aux composants recuperes
        Collection treChildren = null; // liste des tres fils
        List treKeyList = null; // liste associee aux tres recuperes

        AuditDTO currentAudit = pAudit;
        ComponentDTO currentProject = validateComponent(pProject);
        if (currentProject != null) {
            currentAudit = initAudit(currentAudit, currentProject);
        }

        // rcupration des composants souhaits et des tres de mesures
        if (pMinValue != null && pMaxValue != null) {

            components = ComponentFacade.getComponentsInInterval(pAudit, currentProject, pTreKey, pMinValue,
                    pMaxValue, pMax);
            treChildren = ComponentFacade.getTREChildren(pTreKey);

            // Initialisation des listes
            if (components != null && treChildren != null) {

                componentList = new ArrayList(components);
                treKeyList = new ArrayList(treChildren);

                /* recuperation des resultats */
                results = MeasureFacade.getMeasuresByTREAndComponent(pTreKey, treKeyList, componentList, pAudit);

            }
        }
        return results;
    }

    /**
     * @param pAudit audit courant
     * @return l'audit prcdent
     * @throws JrafEnterpriseException si pb hibernate
     */
    public AuditDTO getPreviousAudit(AuditDTO pAudit) throws JrafEnterpriseException {
        return AuditFacade.getPreviousAudit(pAudit, null);
    }

    /**
     * Permet de rcuprer les notes de tous les composants d'un type donn relatifs a un projet
     * 
     * @param pProject ComponentDTO de type projet
     * @param pComponentType type du composant fils souhait
     * @param pAudit AuditDTO
     * @param pTre Tre dont on souhaite connatre le classment
     * @param pMax nombre maximum de top remont
     * @return ResultsDTO du meme format que dans getByComponent()
     * @throws JrafEnterpriseException exception Jraf
     */
    public ResultsDTO getTopResults(ComponentDTO pProject, String pComponentType, AuditDTO pAudit, String pTre,
            Integer pMax) throws JrafEnterpriseException {

        // Initiailisation
        ResultsDTO results = null; // retour de la methode
        ComponentDTO currentProject = null; // sous-projet apres verification
        AuditDTO currentAudit = null; // audit apres verification
        Collection children = null; // fils du sous-projet d'un type donn

        currentProject = validateComponent(pProject);
        if (currentProject != null) {
            currentAudit = initAudit(pAudit, currentProject);
        }

        if (currentAudit != null) {
            results = MeasureFacade.getTop(currentProject, pComponentType, currentAudit, pTre, pMax);
        }

        return results;

    }

    /**
     * Retrieves components which have a precise score for some tres
     * 
     * @param pProjectId project id
     * @param pAuditId Audit id
     * @param pTreKeys keys of tres to find
     * @param pTreValues value of tres
     * @param pMax number of components max to return
     * @return list of components
     * @throws JrafEnterpriseException if error
     */
    public List<ComponentDTO> getComponentsWhereTres(Long pProjectId, Long pAuditId, String[] pTreKeys,
            String[] pTreValues, Integer pMax) throws JrafEnterpriseException {
        return MeasureFacade.getComponentsWhereTres(pProjectId, pAuditId, pTreKeys, pTreValues, pMax);
    }

    /**
     * Initialise l'audit si celui-ci n'est pas renseigne (null ou identifiant negatif)
     * 
     * @param pAudit AuditDTO  valider
     * @param pComponent ComponentDTO associ  l'audit
     * @return AuditDTO renseignant un identifiant valide
     * @throws JrafEnterpriseException exception Jraf
     */
    private AuditDTO initAudit(AuditDTO pAudit, ComponentDTO pComponent) throws JrafEnterpriseException {

        // Initialisation
        AuditDTO audit = pAudit; // retour de la methode

        if (audit == null || audit.getID() < 0) {
            audit = AuditFacade.getLastAudit(pComponent, null);
        }

        // Test si le composant possede bien un audit pour loguer l'erreur
        if (audit == null) {
            String obj[] = { String.valueOf(pComponent.getID()) };
            LOG.error(ACMessages.getString("ac.exception.results.initAudit.noauditforcomponent", obj));
        }

        return audit;
    }

    /**
     * Initialise les audits si ceux-ci ne sont pas renseignes
     * 
     * @param pAudits liste des AuditsDTO a renseigner
     * @param pComponent composant associe
     * @return liste de AuditDTO renseignant un identifiant valide
     * @throws JrafEnterpriseException exception Jraf
     */
    private List initAuditList(List pAudits, ComponentDTO pComponent) throws JrafEnterpriseException {

        // Initialisation
        List audits = pAudits; // retour de la methode

        if (audits == null) {
            audits = AuditFacade.getLastAudits(pComponent, NB_AUDITS, INDEX_DEPART_AUDIT, null, AuditBO.TERMINATED);
        } else {
            /* TODO : lancer une methode d'integrite des audits */
        }

        return audits;

    }

    /**
     * Verifie que le composant n'est pas null et que son identifiant est >= 0
     * 
     * @param pComponent ComponentDTO
     * @return ComponentDTO si valide, sinon <code>null</code>
     */
    private ComponentDTO validateComponent(ComponentDTO pComponent) {
        ComponentDTO newComponent = pComponent;
        if (newComponent != null) {
            if (newComponent.getID() < 0) {
                newComponent = null;
                LOG.error(ACMessages.getString("ac.exception.results.validatecomponent.idnegative"));
            }
        } else {
            LOG.error(ACMessages.getString("ac.exception.results.validatecomponent.componentnull"));
        }
        return newComponent;
    }

    /**
     * Verifie que la liste de composants est valide
     * 
     * @param pComponents Liste de ComponentDTO
     * @return Liste de ComponentDTO avec les composants uniquement valides
     */
    private List validateComponents(List pComponents) {

        // Initialisation
        List components = pComponents; // retour de la methode
        // On parcourt chaque composant pour
        // les valider un par un
        if (pComponents != null) {
            Object currentObject = null;
            Iterator componentIterator = pComponents.iterator();
            // Verification de l'integrite de chaque composant
            while ((componentIterator.hasNext()) && (components != null)) {
                currentObject = componentIterator.next();
                // TODO voir si on doit faire ce test ou supposer que
                // la collection est bien compose exclusivement de componentDTO
                // code defensif ?
                if (currentObject instanceof ComponentDTO) {
                    ComponentDTO componentTemp = validateComponent((ComponentDTO) currentObject);
                    if (componentTemp == null) {
                        components = null;
                    }
                } else { // objets differents de ComponentDTO
                    components = null;
                }
            }
        } else {
            LOG.error(ACMessages.getString("ac.exception.results.validatecomponents.componentlistnull"));
        }

        return components;

    }

    /**
     * @param firstAudit le premier audit
     * @param secondAudit le second pour comparer
     * @param project le projet
     * @param filter le filtre  utiliser
     * @param pLimit le nombre max de rsultats  rcuprer
     * @return les changements entre le premier et le second audit
     * @throws JrafEnterpriseException si erreur
     */
    public Collection getChangedComponentResults(AuditDTO firstAudit, AuditDTO secondAudit, ComponentDTO project,
            Object[] filter, Integer pLimit) throws JrafEnterpriseException {
        // On rcupre la liste des nouveaux composants, des composants qui ont t supprims
        // et ceux dont la note sur une ou plusieurs pratiques a chang.
        Collection components = QualityResultFacade.getChangedComponents(firstAudit, secondAudit, project, filter,
                pLimit);
        return components;
    }

    /**
     * Rcupre les pratiques  corriger pour le plan d'action (sous forme ActionPlanDTO)
     * 
     * @param pAuditId l'id de l'audit
     * @param pProjectId l'id du projet
     * @param pHasLimit indique si il y a une limite du nombre de corrections  remonter
     * @return les 100 (au maximum) composants ou transgressions " corriger" (si <code>pHasLimit</code>) tris par
     *         pratique (de la pratique la plus facile  corriger  la moins facile). Une pratique est plus facile 
     *         corriger si l'effort * nombre de corrections  faire est bas.
     * @throws JrafEnterpriseException si erreur
     */
    public Collection getWorstPractices(String pAuditId, String pProjectId, Boolean pHasLimit)
            throws JrafEnterpriseException {
        return QualityResultFacade.getWorstPractices(pAuditId, pProjectId, pHasLimit.booleanValue());
    }

    /**
     * Build list of projects for audit report
     * 
     * @param pAppliId application id
     * @param pCurAuditId current audit id
     * @param pPrevAuditId previous audit id
     * @param nbTop number of top to retrieve (maximum)
     * @param maxScore maximal score for score's components for top
     * @return list of project for audit report
     * @throws JrafEnterpriseException if error
     */
    public List getProjectReports(Long pAppliId, Long pCurAuditId, Long pPrevAuditId, Integer nbTop, Float maxScore)
            throws JrafEnterpriseException {
        return AuditReportFacade.getProjectReports(pAppliId, pCurAuditId, pPrevAuditId, nbTop, maxScore);
    }

    /**
     * Get back the list of manual practices for a project
     * 
     * @param projectId Id of the project
     * @return a list of QualityResultDTO
     * @throws JrafEnterpriseException exception happened during the process
     */
    public List<QualityResultDTO> listOfManualMark(Long projectId) throws JrafEnterpriseException

    {
        // Recover the practices link to the project
        HashSet<PracticeRuleDTO> practicesRuleList = QualityGridFacade
                .loadManualPracticesRulesByProjectId(projectId);
        ArrayList<QualityResultDTO> manualResult = new ArrayList<QualityResultDTO>();
        // For each practices
        for (PracticeRuleDTO ruleDTO : practicesRuleList) {
            // We search the last manual mark linked to the rule
            QualityResultDTO result = QualityResultFacade.findManualQualityResult(projectId, ruleDTO.getId());
            if (result == null) {
                result = new QualityResultDTO();
                ComponentDTO compoDto = new ComponentDTO();
                compoDto.setID(projectId);
                result.setProject(compoDto);
                result.setRule(ruleDTO);
            }
            // We add the result to the map
            manualResult.add(result);
        }
        return manualResult;
    }

    /**
     * This method save a result for a manual practice
     * 
     * @param dto The QualityresultDTO to save
     * @throws JrafEnterpriseException Exception happen during the record
     */
    public void saveManualResult(QualityResultDTO dto) throws JrafEnterpriseException {
        QualityResultFacade.createManualResult(dto);
    }

    /**
     * This method get back the last result record for a manual practice
     * 
     * @param projectId The id of the project
     * @param ruleId The id of the rule
     * @return The last mark
     * @throws JrafEnterpriseException exception happen during the serach in the db
     */
    public QualityResultDTO lastManualMark(Long projectId, Long ruleId) throws JrafEnterpriseException {
        QualityResultDTO result = QualityResultFacade.findManualQualityResult(projectId, ruleId);
        return result;
    }

    /**
     * This method gets back the last result record for a manual practice and an audit
     * 
     * @param projectId The ID of the project
     * @param ruleId The ID of the practice rule
     * @param auditId The ID of the audit
     * @return The last mark for this audit
     * @throws JrafEnterpriseException exception happen during the serach in the db
     */
    public QualityResultDTO lastManualMarkByAudit(Long projectId, Long ruleId, Long auditId)
            throws JrafEnterpriseException {
        QualityResultDTO result = QualityResultFacade.findManualQualityResultByAudit(projectId, ruleId, auditId);
        return result;
    }

    /**
     * Get back the result link to the project , audit and rule guive in argument
     * 
     * @param projectId The id of the project
     * @param auditId The id of the audit
     * @param ruleId the id of the rule
     * @return the result link to the three argument
     * @throws JrafEnterpriseException Exception happen during the search in the db
     */
    public MarkDTO auditManualMark(Long projectId, Long auditId, Long ruleId) throws JrafEnterpriseException {
        MarkDTO dto = QualityResultFacade.getPracticeByAuditRuleProject(projectId, auditId, ruleId);
        return dto;
    }
}