org.squale.squaleweb.applicationlayer.action.results.project.ProjectResultsAction.java Source code

Java tutorial

Introduction

Here is the source code for org.squale.squaleweb.applicationlayer.action.results.project.ProjectResultsAction.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.squaleweb.applicationlayer.action.results.project;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.entity.StandardEntityCollection;
import org.jfree.chart.servlet.ServletUtilities;
import org.squale.jraf.commons.exception.JrafEnterpriseException;
import org.squale.jraf.helper.AccessDelegateHelper;
import org.squale.jraf.spi.accessdelegate.IApplicationComponent;
import org.squale.squalecommon.datatransfertobject.component.AuditDTO;
import org.squale.squalecommon.datatransfertobject.component.ComponentDTO;
import org.squale.squalecommon.datatransfertobject.remediation.ComponentCriticalityDTO;
import org.squale.squalecommon.datatransfertobject.result.QualityResultDTO;
import org.squale.squalecommon.datatransfertobject.result.ResultsDTO;
import org.squale.squalecommon.datatransfertobject.rule.CriteriumRuleDTO;
import org.squale.squalecommon.datatransfertobject.rule.FactorRuleDTO;
import org.squale.squalecommon.datatransfertobject.rule.PracticeRuleDTO;
import org.squale.squalecommon.datatransfertobject.sharedrepository.SharedRepoStatsDTO;
import org.squale.squalecommon.datatransfertobject.tag.TagDTO;
import org.squale.squalecommon.enterpriselayer.businessobject.component.AuditBO;
import org.squale.squalecommon.enterpriselayer.businessobject.result.PracticeResultBO;
import org.squale.squalecommon.enterpriselayer.businessobject.rule.AbstractFormulaBO;
import org.squale.squalecommon.util.manualmark.TimeLimitationParser;
import org.squale.squalemodel.definition.DataType;
import org.squale.squaleweb.applicationlayer.action.ActionUtils;
import org.squale.squaleweb.applicationlayer.action.accessRights.BaseDispatchAction;
import org.squale.squaleweb.applicationlayer.action.accessRights.ReaderAction;
import org.squale.squaleweb.applicationlayer.action.export.xls.ExcelDataMarkList;
import org.squale.squaleweb.applicationlayer.action.export.xml.IDELinkXMLData;
import org.squale.squaleweb.applicationlayer.action.export.xml.XMLData;
import org.squale.squaleweb.applicationlayer.action.export.xml.XMLFactory;
import org.squale.squaleweb.applicationlayer.formbean.LogonBean;
import org.squale.squaleweb.applicationlayer.formbean.RootForm;
import org.squale.squaleweb.applicationlayer.formbean.component.ApplicationForm;
import org.squale.squaleweb.applicationlayer.formbean.component.ProjectForm;
import org.squale.squaleweb.applicationlayer.formbean.information.PracticeInformationForm;
import org.squale.squaleweb.applicationlayer.formbean.results.ComponentForm;
import org.squale.squaleweb.applicationlayer.formbean.results.CriteriumForm;
import org.squale.squaleweb.applicationlayer.formbean.results.MarkForm;
import org.squale.squaleweb.applicationlayer.formbean.results.ProjectFactorForm;
import org.squale.squaleweb.applicationlayer.formbean.results.ProjectSummaryForm;
import org.squale.squaleweb.applicationlayer.formbean.results.ResultForm;
import org.squale.squaleweb.applicationlayer.formbean.results.ResultListForm;
import org.squale.squaleweb.applicationlayer.formbean.results.ResultRulesCheckingForm;
import org.squale.squaleweb.applicationlayer.formbean.results.RuleCheckingItemsListForm;
import org.squale.squaleweb.applicationlayer.formbean.results.RuleCheckingPDFForm;
import org.squale.squaleweb.applicationlayer.formbean.results.RulesCheckingForm;
import org.squale.squaleweb.applicationlayer.formbean.results.SharedRepoStatForm;
import org.squale.squaleweb.applicationlayer.tracker.TrackerStructure;
import org.squale.squaleweb.comparator.AuditComparator;
import org.squale.squaleweb.comparator.AuditGridComparator;
import org.squale.squaleweb.resources.WebMessages;
import org.squale.squaleweb.transformer.ComponentTransformer;
import org.squale.squaleweb.transformer.MarkTransformer;
import org.squale.squaleweb.transformer.PracticeResultTransformer;
import org.squale.squaleweb.transformer.ProjectSummaryTransformer;
import org.squale.squaleweb.transformer.ProjectTransformer;
import org.squale.squaleweb.transformer.RuleCheckingItemsListTransformer;
import org.squale.squaleweb.transformer.RulesCheckingResultTransformer;
import org.squale.squaleweb.transformer.sharedrepository.SharedReposStatTransformer;
import org.squale.squaleweb.util.SqualeWebActionUtils;
import org.squale.squaleweb.util.SqualeWebConstants;
import org.squale.squaleweb.util.graph.BubbleMaker;
import org.squale.squaleweb.util.graph.GraphMaker;
import org.squale.squaleweb.util.graph.KiviatMaker;
import org.squale.squaleweb.util.graph.RepartitionBarMaker;
import org.squale.squaleweb.util.graph.RepartitionMaker;
import org.squale.welcom.outils.excel.ExcelFactory;
import org.squale.welcom.outils.pdf.PDFDataJasperReports;
import org.squale.welcom.outils.pdf.PDFEngine;
import org.squale.welcom.outils.pdf.PDFFactory;
import org.squale.welcom.struts.bean.WActionForm;
import org.squale.welcom.struts.transformer.WTransformerException;
import org.squale.welcom.struts.transformer.WTransformerFactory;
import org.squale.welcom.struts.util.WConstants;

/**
 * @version 1.0
 * @author
 */
public class ProjectResultsAction extends ReaderAction {

    /**
     * Le nom dsignant l'attribut en session pour indiquer si on veut tous les facteurs ou non pour le kiviat.
     */
    private static final String ALL_FACTORS = "allFactors";

    /**
     * Selectionne un nouveau projet courant  visualiser.
     * 
     * @param pMapping le mapping.
     * @param pForm le formulaire  lire.
     * @param pRequest la requte HTTP.
     * @param pResponse la rponse de la servlet.
     * @return l'action  raliser.
     */
    public ActionForward select(ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
            HttpServletResponse pResponse) {

        ActionForward forward = null;
        ActionErrors errors = new ActionErrors();

        try {
            // Add an user access for this application
            addUserAccess(pRequest, ActionUtils.getCurrentApplication(pRequest).getId());
            // On supprime l'attribut en session
            pRequest.getSession().removeAttribute(ALL_FACTORS);
            forward = init(pMapping, pRequest, pForm);
            if (null == forward) {
                forward = pMapping.findForward("summaryAction");
            }
        } catch (Exception e) {
            // Traitement factoris des exceptions
            handleException(e, errors, pRequest);
        }
        if (!errors.isEmpty()) {
            // Sauvegarde des messages
            saveMessages(pRequest, errors);
            // Routage vers la page d'erreur
            forward = pMapping.findForward("total_failure");
        }
        // On est pass par un menu donc on rinitialise le traceur
        resetTracker(pRequest);
        return forward;
    }

    /*
     * ======================================================================================================= Page de
     * rsum =======================================================================================================
     */

    /**
     * Prsente les rsultats rsums du projet.
     * 
     * @param pMapping le mapping.
     * @param pForm le formulaire  lire.
     * @param pRequest la requte HTTP.
     * @param pResponse la rponse de la servlet.
     * @return l'action  raliser.
     */
    public ActionForward summary(ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
            HttpServletResponse pResponse) {

        ActionForward forward = null;
        ActionErrors errors = new ActionErrors();
        Long currentAuditId = null, previousAuditId = null;
        try {
            forward = init(pMapping, pRequest, pForm);
            if (null == forward) {
                if (getSummary(pRequest, pForm)) {
                    // Rcupration des donnes permettant la gnration du Kiviat du projet
                    // On rcupre le projet
                    ComponentDTO project = (ComponentDTO) pRequest.getSession()
                            .getAttribute(BaseDispatchAction.PROJECT_DTO);
                    AuditDTO audit = (AuditDTO) pRequest.getSession()
                            .getAttribute(BaseDispatchAction.CURRENT_AUDIT_DTO);
                    AuditDTO previousAudit = (AuditDTO) pRequest.getSession()
                            .getAttribute(BaseDispatchAction.CURRENT_AUDIT_DTO);
                    if (project != null && audit != null) {
                        // Rcupration du paramtre : tous les facteurs ou seuls les facteurs ayant une note ?
                        ProjectSummaryForm projectSummaryForm = (ProjectSummaryForm) pForm;
                        boolean pAllFactors = projectSummaryForm.isAllFactors();
                        // On met cette valeur en session
                        pRequest.getSession().setAttribute(ALL_FACTORS, new Boolean(pAllFactors));
                        // Prparation de l'appel  la couche mtier
                        IApplicationComponent ac = AccessDelegateHelper.getInstance("Graph");
                        Long projectId = new Long(project.getID());
                        currentAuditId = new Long(audit.getID());

                        Object[] paramsKiviat = { projectId, currentAuditId, String.valueOf(pAllFactors) };

                        // Recherche des donnes utiles  la gnration du Kiviat
                        // Recherche des donnes Kiviat
                        KiviatMaker maker = new KiviatMaker();
                        Object[] kiviatObject = (Object[]) ac.execute("getProjectKiviatGraph", paramsKiviat);
                        Map projectsValues = (Map) kiviatObject[0];
                        Boolean displayCheckBoxFactors = (Boolean) kiviatObject[1];
                        projectSummaryForm.setDisplayCheckBoxFactors(displayCheckBoxFactors);

                        Set keysSet = projectsValues.keySet();
                        Iterator it = keysSet.iterator();
                        while (it.hasNext()) {
                            String key = (String) it.next();
                            maker.addValues(key, (SortedMap) projectsValues.get(key), pRequest);
                        }
                        JFreeChart chartKiviat = maker.getChart();
                        ChartRenderingInfo infoKiviat = new ChartRenderingInfo(new StandardEntityCollection());
                        // Sauvegarde de l'image du Kiviat au format png dans un espace temporaire
                        String fileNameKiviat = ServletUtilities.saveChartAsPNG(chartKiviat,
                                KiviatMaker.DEFAULT_WIDTH, KiviatMaker.DEFAULT_HEIGHT, infoKiviat,
                                pRequest.getSession());
                        GraphMaker projectKiviatChart = new GraphMaker(pRequest, fileNameKiviat, infoKiviat);

                        // Pour l'export pdf en attendant de mettre les graphe dans les formulaires
                        pRequest.getSession().removeAttribute("kiviatChart");
                        pRequest.getSession().setAttribute("kiviatChart", chartKiviat
                                .createBufferedImage(KiviatMaker.DEFAULT_WIDTH, KiviatMaker.DEFAULT_HEIGHT));

                        ((ProjectSummaryForm) pForm).setKiviat(projectKiviatChart);
                        ((ProjectSummaryForm) pForm).setTags(project.getTags());
                    }
                    forward = pMapping.findForward("summary");
                } else { // Aucun audit, redirige vers la page courante
                    forward = pMapping.findForward("noAudits");
                }
            }
        } catch (Exception e) {
            // Factorisation du traitement des exceptions
            handleException(e, errors, pRequest);
        }
        if (!errors.isEmpty()) {
            // Enregistrement des messages
            saveMessages(pRequest, errors);
            // Routage vers la page d'erreur
            forward = pMapping.findForward("total_failure");
        }
        // Mise en place du traceur historique
        updateHistTracker(WebMessages.getString(pRequest, "tracker.synthesis"), "project.do?action=summary",
                TrackerStructure.UNDEFINED, pRequest, true);
        // Indique que l'on vient d'une vue synthse et pas d'une vue composant
        changeWay(pRequest, "false");
        return forward;
    }

    /**
     * Cre le rsum des donnes du projet.
     * 
     * @param pRequest la requte de l'action.
     * @param pForm le formulaire de la requte.
     * @return true
     * @throws Exception si un pb apparat.
     */
    private boolean getSummary(final HttpServletRequest pRequest, final ActionForm pForm) throws Exception {
        ComponentDTO project = (ComponentDTO) WTransformerFactory.formToObj(ProjectTransformer.class,
                ActionUtils.getCurrentProject(pRequest))[0];
        List auditsList = initAudit(pRequest, project);
        boolean result = auditsList.size() > 0;
        if (result) {

            // **************************************************************************************************
            // Rcupration des facteurs
            // **************************************************************************************************
            Collection factors = getFactorsList(auditsList, project); // auditsDTO

            // **************************************************************************************************
            // Rcupration de la volumetrie
            // **************************************************************************************************
            Long currentAuditId = new Long(((AuditDTO) auditsList.get(0)).getID());
            Object[] paramIn = { currentAuditId, project };
            IApplicationComponent ac = AccessDelegateHelper.getInstance("Results");
            ResultsDTO resultDTO = ((ResultsDTO) ac.execute("getProjectVolumetry", paramIn));
            Map volumetries = resultDTO.getResultMap();
            Object[] paramIn2 = { currentAuditId, new Long(project.getID()) };
            Boolean haveErrors = ((Boolean) ac.execute("getHaveErrors", paramIn2));
            ac = AccessDelegateHelper.getInstance("Component");
            Boolean canBeExportedToIDE = ((Boolean) ac.execute("canBeExportedToIDE",
                    new Object[] { new Long(project.getID()) }));

            IApplicationComponent acComponent = AccessDelegateHelper.getInstance("Component");
            // On Cre une application DTO temporaire pour aller chercher la vrai en base
            ComponentDTO appliTemp = new ComponentDTO();
            appliTemp.setID(project.getIDParent());
            ComponentDTO applicationDTO = ((ComponentDTO) acComponent.execute("get", new Object[] { appliTemp }));
            // une fois qu'on a rcupr l'application parente, on transfert ses tags dans la form
            ((ProjectSummaryForm) pForm).setTagsAppli(applicationDTO.getTags());

            // Conversion du formulaire
            Object[] params = { project, factors, volumetries, haveErrors, canBeExportedToIDE };
            WTransformerFactory.objToForm(ProjectSummaryTransformer.class, (ProjectSummaryForm) pForm, params);

            IApplicationComponent acSegmentation = AccessDelegateHelper.getInstance("sharedRepoStats");
            Object[] params2 = { project, DataType.FACTOR };
            Map<String, SharedRepoStatsDTO> statsDtoMap = (Map<String, SharedRepoStatsDTO>) acSegmentation
                    .execute("retrieveStatsByDataType", params2);

            Iterator<ProjectFactorForm> it = ((ProjectSummaryForm) pForm).getFactors().getFactors().iterator();
            while (it.hasNext()) {
                ProjectFactorForm projectFactorForm = (ProjectFactorForm) it.next();
                String factorName = projectFactorForm.getName().split("\\.", 2)[1];
                SharedRepoStatsDTO statsDto = statsDtoMap.get(factorName);
                if (statsDto != null) {
                    SharedRepoStatForm statForm = (SharedRepoStatForm) WTransformerFactory
                            .objToForm(SharedReposStatTransformer.class, new Object[] { statsDto });
                    projectFactorForm.setStatForm(statForm);
                }
            }

            // On rcupre l'attribut indiquant si l'on veut tous les facteurs
            Boolean allFactors = (Boolean) pRequest.getSession().getAttribute(ALL_FACTORS);
            if (null != allFactors) {
                // On modifie le form
                ((ProjectSummaryForm) pForm).setAllFactors(allFactors.booleanValue());
                // On supprime l'attribut en session
                pRequest.getSession().removeAttribute(ALL_FACTORS);
            }
        }
        return result;
    }

    /**
     * Retourne les notes des facteurs du projet sur la liste d'audit donne.
     * 
     * @param pAuditsList la liste d'audits.
     * @param pProject le projet.
     * @return le formulaire contenant la liste des facteurs.
     * @throws Exception si un problme apparat.
     */
    private Collection getFactorsList(final List pAuditsList, final ComponentDTO pProject) throws Exception {
        IApplicationComponent ac = AccessDelegateHelper.getInstance("Results");
        Object[] paramIn = { pAuditsList, pProject };
        // Les rsultats sont retourns dans l'ordre impos par la grille qualit
        // on maintient cet ordre pour l'affichage
        ResultsDTO resultDTO = ((ResultsDTO) ac.execute("getProjectResults", paramIn));
        // On rcupre la liste des collections de rsultats
        AuditGridComparator auditComp = new AuditGridComparator();
        Map resultMap = new TreeMap(auditComp);
        resultDTO.getResultMap().remove(null);
        resultMap.putAll(resultDTO.getResultMap());
        List results = new LinkedList();
        results.addAll(resultMap.entrySet());
        Collections.reverse(results);
        return results;
    }

    /*
     * ======================================================================================================= Page de
     * dtails d'un facteur
     * =======================================================================================================
     */

    /**
     * Rcupre les dtails du facteur
     * 
     * @param pMapping le mapping.
     * @param pForm le formulaire  lire.
     * @param pRequest la requte HTTP.
     * @param pResponse la rponse de la servlet.
     * @return l'action  raliser.
     */
    public ActionForward factor(ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
            HttpServletResponse pResponse) {

        ActionForward forward = null;
        ActionErrors errors = new ActionErrors();

        // Le nom du facteur pour le traceur
        String name = "";
        long factorRuleId = -1;

        try {
            // On vrifie les donnes renvoyes par le formulaire
            forward = init(pMapping, pRequest, pForm);
            if (null == forward) {
                // Rcupration des paramtres de la requte
                String param = (String) pRequest.getParameter("which");
                factorRuleId = Long.parseLong(param);
                // Obtention des audits courants
                List auditsDTO = ActionUtils.getCurrentAuditsAsDTO(pRequest);
                ComponentDTO project = (ComponentDTO) WTransformerFactory.formToObj(ProjectTransformer.class,
                        ActionUtils.getCurrentProject(pRequest))[0];

                FactorRuleDTO factor = getFactorRule(factorRuleId);
                // Rcupre le nom pour le traceur
                name = factor.getName();

                // Rcupration de la note et de l'volution du facteur
                ((ProjectSummaryForm) pForm).setResults(getFactorResult(factor, auditsDTO, project, pRequest));
                // Rcupration des critres
                ResultListForm criteria = getCriteriaList(factor, auditsDTO, project);
                pRequest.setAttribute(SqualeWebConstants.CHILDREN_KEY, criteria);
                forward = pMapping.findForward("factor");
            }
        } catch (Exception e) {
            // Traitement factoris des exceptions d'erreur
            handleException(e, errors, pRequest);
        }
        if (!errors.isEmpty()) {
            // Sauvegarde des messages et transfert vers la page
            saveMessages(pRequest, errors);
            forward = pMapping.findForward("total_failure");
        }
        // Mise en place du traceur historique
        updateHistTracker(WebMessages.getString(pRequest, name), "project.do?action=factor&which=" + factorRuleId,
                TrackerStructure.FACTOR_VIEW, pRequest, false);
        // Indique que l'on vient d'une vue synthse et pas d'une vue composant
        changeWay(pRequest, "false");
        // On ne doit pas effacer completement le traceur
        needToReset(pRequest, "false");
        return forward;
    }

    /**
     * @param pFactorRuleId l'id de la rgle
     * @return le facteur correspondant
     * @throws JrafEnterpriseException si erreur
     */
    private FactorRuleDTO getFactorRule(long pFactorRuleId) throws JrafEnterpriseException {
        // Obtention du facteur
        IApplicationComponent ac = AccessDelegateHelper.getInstance("QualityGrid");
        FactorRuleDTO factor = new FactorRuleDTO();
        factor.setId(pFactorRuleId);
        Object[] paramIn = { factor, new Boolean(true) };
        // Appel de la couche mtier
        factor = (FactorRuleDTO) ac.execute("getQualityRule", paramIn);
        return factor;
    }

    /**
     * Retourne la valeur du facteur
     * 
     * @param pFactor le nom de facteur (cl du tre)
     * @param pAudits le liste des audits
     * @param pProject le projet analys
     * @param pRequest la requte active.
     * @return un form de rsultat contenant la note du facteur
     * @throws Exception si un pb apparat.
     */
    private ResultForm getFactorResult(final FactorRuleDTO pFactor, final List pAudits, final ComponentDTO pProject,
            final HttpServletRequest pRequest) throws Exception {
        IApplicationComponent ac = AccessDelegateHelper.getInstance("Results");
        Object[] paramIn = { pAudits, pProject, new Long(pFactor.getId()) };
        ResultsDTO resultDTO = ((ResultsDTO) ac.execute("getByAudit", paramIn));

        // Rcupration et tri des audits
        List audits = new ArrayList();
        audits.addAll((List) resultDTO.getResultMap().get(null));
        resultDTO.getResultMap().remove(null);
        AuditComparator auditComp = new AuditComparator();
        audits.remove(null);
        Collections.sort(audits, auditComp);
        Collections.reverse(audits);
        ResultForm factorResult = new ResultForm();
        factorResult.setName(pFactor.getName());
        factorResult.setId("" + pFactor.getId());
        List res = (List) resultDTO.getResultMap().get(pProject);
        Float value = null;
        if (res.size() > 0) {
            value = (Float) res.get(0);
        }
        if (null != value) {
            SqualeWebActionUtils.setValue(factorResult, "setCurrentMark", "" + value.floatValue());
        }
        if (audits.size() > 1) {
            Float value2 = (Float) (((List) resultDTO.getResultMap().get(pProject)).get(1));
            factorResult.setPredecessorMark("" + value2);
        }
        return factorResult;
    }

    /**
     * Retourne la liste des critres lis au facteur paramtre.
     * 
     * @param pFactorRule le facteur parent
     * @param pAudits la liste des audits
     * @param pProject le projet analys
     * @return la liste des rsultats
     * @throws Exception si un pb apparait
     */
    private ResultListForm getCriteriaList(final FactorRuleDTO pFactorRule, final List pAudits,
            final ComponentDTO pProject) throws Exception {
        IApplicationComponent ac = AccessDelegateHelper.getInstance("Results");
        Object[] paramIn = { pProject, new Long(pFactorRule.getId()), pAudits };
        // Appel de la couche mtier
        ResultsDTO resultDTO = ((ResultsDTO) ac.execute("getTreChildrenResults", paramIn));
        ArrayList names = new ArrayList();
        names.addAll((Collection) resultDTO.getResultMap().get(null));
        resultDTO.getResultMap().remove(null);
        ResultListForm results = new ResultListForm();
        // Rcupration et tri des audits
        List audits = new LinkedList();
        audits.addAll(resultDTO.getResultMap().keySet());
        if (audits.size() > 0) {
            AuditComparator auditComp = new AuditComparator();
            // Tri des audits selon leur date
            Collections.sort(audits, auditComp);
            // Inversion des audits pour obtenir la date la plus rcente d'abord
            Collections.reverse(audits);
            CriteriumForm criteriumForm = null;
            ArrayList criteria = new ArrayList();
            // Parcours de chacun des critres pour le placer dans le formbean
            List res = (List) resultDTO.getResultMap().get(audits.get(0));
            for (int i = 0; i < names.size(); i++) {
                criteriumForm = new CriteriumForm();
                criteriumForm.setName(((CriteriumRuleDTO) names.get(i)).getName());
                criteriumForm.setId(((CriteriumRuleDTO) names.get(i)).getId() + "");
                // Mise du facteur correspondant au critre
                criteriumForm.setTreParent(pFactorRule.getId() + "");
                // Obtention de la note affecte au critre
                Float value = (Float) (res.get(i));
                if (null != value && value.floatValue() != -1) {
                    SqualeWebActionUtils.setValue(criteriumForm, "setCurrentMark", "" + value.floatValue());
                }
                // Calcul de la tendance s'il existe un audit prcdent
                if (audits.size() > 1) {
                    Float value2 = (Float) (((List) resultDTO.getResultMap().get(audits.get(1))).get(i));
                    criteriumForm.setPredecessorMark("" + value2);
                }
                getCriteriumResult((CriteriumRuleDTO) names.get(i), criteriumForm, pAudits, pProject);
                criteria.add(criteriumForm);
            }
            results.setList(criteria);
        }
        return results;
    }

    /**
     * Retourne le dtail du critre recherch, avec ses pratiques.
     * 
     * @param pCriteriumRuleDTO critre
     * @param pCriteriumForm le critre  remplir, il doit possder un nom.
     * @param pAudits la liste des audits.
     * @param pProject le projet analys.
     * @throws Exception si un pb apparat.
     */
    private void getCriteriumResult(final CriteriumRuleDTO pCriteriumRuleDTO, final CriteriumForm pCriteriumForm,
            final List pAudits, final ComponentDTO pProject) throws Exception {
        IApplicationComponent ac = AccessDelegateHelper.getInstance("Results");
        Object[] paramIn = { pProject, new Long(pCriteriumRuleDTO.getId()), pAudits };
        ResultsDTO resultDTO = ((ResultsDTO) ac.execute("getTreChildrenResults", paramIn));
        ArrayList names = new ArrayList();
        names.addAll((Collection) resultDTO.getResultMap().get(null));
        resultDTO.getResultMap().remove(null);
        ArrayList practices = new ArrayList();
        // Rcupration et tri des audits
        List audits = new LinkedList();
        audits.addAll(resultDTO.getResultMap().keySet());
        AuditComparator auditComp = new AuditComparator();
        Collections.sort(audits, auditComp);
        // Inversion de la collection pour obtenir la dernire date en premier
        Collections.reverse(audits);
        ResultForm resultForm = null;
        // Parcours des pratiques
        for (int i = 0; i < names.size(); i++) {
            resultForm = new ResultForm();
            resultForm.setName(((PracticeRuleDTO) names.get(i)).getName());
            resultForm.setId(((PracticeRuleDTO) names.get(i)).getId() + "");
            resultForm.setTreParent(pCriteriumForm.getTreParent());
            // Note associe  la pratique
            Float value = (Float) (((List) resultDTO.getResultMap().get(audits.get(0))).get(i));
            if (null != value && value.floatValue() != -1) {
                // Conversion de la valeur en texte
                SqualeWebActionUtils.setValue(resultForm, "setCurrentMark", "" + value.floatValue());
            }
            // Calcul de la tendance s'il existe un audit antrieur
            if (audits.size() > 1) {
                Float value2 = (Float) (((List) resultDTO.getResultMap().get(audits.get(1))).get(i));
                resultForm.setPredecessorMark("" + value2);
            }
            practices.add(resultForm);
        }
        pCriteriumForm.setPractices(practices);
    }

    /*
     * ======================================================================================================= Page de
     * dtails d'une pratique
     * =======================================================================================================
     */

    /**
     * Rcupre les dtails de la pratique
     * 
     * @param pMapping le mapping.
     * @param pForm le formulaire  lire.
     * @param pRequest la requte HTTP.
     * @param pResponse la rponse de la servlet.
     * @return l'action  raliser.
     */
    public ActionForward practice(ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
            HttpServletResponse pResponse) {
        ActionForward forward = null;
        ActionErrors errors = new ActionErrors();
        try {
            // On rcupre l'indicateur pour le traceur car il va tre mis  false
            // dans la mthode commune "getForm" or il se peut que l'on vienne
            // de la page composant.
            String tracker_bool = (String) pRequest.getSession().getAttribute(SqualeWebConstants.TRACKER_BOOL);
            WActionForm form = getForm(pMapping, pRequest, pForm);
            changeWay(pRequest, tracker_bool);
            if (form instanceof ResultRulesCheckingForm) {
                forward = pMapping.findForward("practiceruleschecking");
            } else {
                ResultForm resForm = (ResultForm) form;
                // rempli les champs  passer de requete en requete
                resForm.copyValues((RootForm) pForm);
                // if practice is not a manual practice
                if (resForm.getFormulaType() != null) {
                    forward = pMapping.findForward("practice");
                    // le graph
                    double[] tab;

                    // Dans les 2 cas on affiche le graph en barre
                    RepartitionBarMaker barMaker = new RepartitionBarMaker(pRequest, resForm.getProjectId(),
                            resForm.getCurrentAuditId(), resForm.getPreviousAuditId(), resForm.getId(),
                            resForm.getParentId());
                    barMaker.setValues(resForm.getIntRepartition());
                    // Sauvegarde de l'image de l'histogramme au format png dans un espace temporaire
                    ChartRenderingInfo infoRepartition = new ChartRenderingInfo(new StandardEntityCollection());
                    String repartitionFileName = ServletUtilities.saveChartAsPNG(barMaker.getChart(),
                            RepartitionBarMaker.DEFAULT_WIDTH, RepartitionBarMaker.DEFAULT_HEIGHT, infoRepartition,
                            pRequest.getSession());
                    GraphMaker repartitionChart = new GraphMaker(pRequest, repartitionFileName, infoRepartition);
                    ((ProjectSummaryForm) pForm).setBarGraph(repartitionChart);
                    // Dans ce cas l, on affiche en plus l'histogramme
                    if (resForm.getFormulaType().equals(AbstractFormulaBO.TYPE_SIMPLE)) {
                        RepartitionMaker maker = new RepartitionMaker(pRequest, resForm.getProjectId(),
                                resForm.getCurrentAuditId(), resForm.getPreviousAuditId(), resForm.getId(),
                                resForm.getParentId());
                        maker.build(resForm.getFloatRepartition());
                        // Sauvegarde de l'image de l'histogramme au format png dans un espace temporaire
                        infoRepartition = new ChartRenderingInfo(new StandardEntityCollection());
                        repartitionFileName = ServletUtilities.saveChartAsPNG(maker.getChart(),
                                RepartitionMaker.DEFAULT_WIDTH, RepartitionMaker.DEFAULT_HEIGHT, infoRepartition,
                                pRequest.getSession());
                        repartitionChart = new GraphMaker(pRequest, repartitionFileName, infoRepartition);
                        ((ProjectSummaryForm) pForm).setHistoBarGraph(repartitionChart);
                    } else { // on remet l'histogramme  null pour le rinitialiser et ne pas l'afficher
                        ((ProjectSummaryForm) pForm).setHistoBarGraph(null);
                    }
                }
                // if the practice is a manual practice
                else {
                    forward = pMapping.findForward("manualpractice");
                }
            }
            ((ProjectSummaryForm) pForm).setResults(form);
        } catch (Exception e) {
            // Traitement factoris des exceptions
            handleException(e, errors, pRequest);
        }
        if (!errors.isEmpty()) {
            // Sauvegarde des messages et renvoi vers la page d'erreur
            saveMessages(pRequest, errors);
            forward = pMapping.findForward("total_failure");
        }
        return forward;
    }

    /**
     * This method can recover the basic informations for the form such as the mark, the practice legend, etc.
     * 
     * @param pMapping le mapping
     * @param pRequest la requte
     * @param pForm le form
     * @return le formulaire
     * @throws JrafEnterpriseException si erreur
     * @throws NumberFormatException si erreur
     * @throws WTransformerException si erreur
     */
    private WActionForm getForm(ActionMapping pMapping, HttpServletRequest pRequest, ActionForm pForm)
            throws JrafEnterpriseException, NumberFormatException, WTransformerException {
        // Pour le tracer aussi
        String param = "";
        Long practiceId = new Long(-1);
        String practiceName = "";
        String paramParent = null;
        WActionForm result = null;
        // On vrifie les donnes renvoyes par le formulaire
        if (pForm == null || null == (init(pMapping, pRequest, pForm))) {
            param = (String) pRequest.getParameter("which");
            practiceId = new Long(Long.parseLong(param));
            // Obtention de la pratique
            IApplicationComponent ac = AccessDelegateHelper.getInstance("QualityGrid");
            PracticeRuleDTO practice = new PracticeRuleDTO();
            practice.setId(practiceId.longValue());
            Object[] paramIn = { practice, new Boolean(true) };
            // Appel de la couche mtier
            // On rcupre la rgle avec les mtriques utilises dans la formule
            // pour pouvoir afficher la lgende
            Object[] ruleAndTre = (Object[]) ac.execute("getQualityRuleAndUsedTres", paramIn);
            practice = (PracticeRuleDTO) ruleAndTre[0];
            practiceName = practice.getName();
            paramParent = (String) pRequest.getParameter("whichParent");
            FactorRuleDTO factor = null;
            if (paramParent != null) {
                // Cration du facteur
                factor = new FactorRuleDTO();
                factor.setId(Long.parseLong(paramParent));
                factor = (FactorRuleDTO) ac.execute("getQualityRule", new Object[] { factor, new Boolean(false) });
            }
            List auditsDTO = ActionUtils.getCurrentAuditsAsDTO(pRequest);
            ComponentDTO project = (ComponentDTO) WTransformerFactory.formToObj(ProjectTransformer.class,
                    ActionUtils.getCurrentProject(pRequest))[0];
            // Rcupration des donnes dans le cas d'un rulechecking
            String methodName;
            Class transformerClass;
            // Traitement diffrent selon le type de la pratique
            if (practice.isRuleChecking()) {
                methodName = "getRuleCheckingResults";
                transformerClass = RulesCheckingResultTransformer.class;
            } else {
                methodName = "getRepartitionResults";
                transformerClass = PracticeResultTransformer.class;
            }

            // On rcupre la description de la rgle qualite
            PracticeInformationForm infoForm = new PracticeInformationForm();
            Object[] triggerAndFormula = new InformationAction().formatFormula(pRequest, practice);
            String trigger = (String) triggerAndFormula[0];
            String elementKey = practice.getHelpKey();
            if (elementKey != null && elementKey.length() != 0) {
                // rcupration des cls pour l'affichage
                String description = WebMessages.getString(pRequest, elementKey + ".description");
                String correction = WebMessages.getString(pRequest, elementKey + ".correction");
                infoForm.setTrigger(trigger);
                // Suivant le type de la formule, on a rcupr une formule simple
                // ou une formule avec des conditions
                Object formula = triggerAndFormula[1];
                if (formula instanceof String) {
                    infoForm.setFormula((String) formula);
                }
                if (formula instanceof String[]) {
                    infoForm.setFormulaCondition((String[]) formula);
                }
                // Affectation
                infoForm.setDescription(description);
                infoForm.setCorrection(correction);
                infoForm.setName(WebMessages.getString(pRequest, elementKey));
                infoForm.setUsedTres((Collection) ruleAndTre[1]);

            }

            // Rcupration de la note et de l'volution de la pratique
            ac = AccessDelegateHelper.getInstance("Results");
            auditsDTO.remove(null);
            paramIn = new Object[] { auditsDTO, project, practice };
            ResultsDTO resultDTO = ((ResultsDTO) ac.execute(methodName, paramIn));
            resultDTO.getResultMap().remove(null);
            // Rcupration et tri des audits
            List audits = new ArrayList();
            audits.addAll(resultDTO.getIntRepartitionPracticeMap().keySet());
            AuditComparator auditComp = new AuditComparator();
            Collections.sort(audits, auditComp);
            // Inversion de la collection pour avoir le dernier audit en tte de liste
            Collections.reverse(audits);
            // Transformation en formulaire
            result = WTransformerFactory.objToForm(transformerClass,
                    new Object[] { resultDTO, factor, practice, project, audits, infoForm, pRequest.getLocale() });
            // If the practice is a manual practice
            if (practice.getFormula() == null || practice.getFormulaType() == null) {
                manualMarkSpecificFormImplementation(practiceId, result, ac, auditsDTO, project);
            }
            manageTrackerFromPractice(pRequest, paramParent, practiceName, practiceId);
        }
        return result;
    }

    /***
     * This method set the specific form implementations in case of manual practice
     * 
     * @param practiceId ID of the practice rule
     * @param result The current form
     * @param ac The application component
     * @param auditsDTO The selected audit
     * @param project The selected project
     * @throws JrafEnterpriseException Exception happened during the process
     */
    private void manualMarkSpecificFormImplementation(Long practiceId, WActionForm result, IApplicationComponent ac,
            List auditsDTO, ComponentDTO project) throws JrafEnterpriseException {
        ResultForm curForm = (ResultForm) result;
        AuditDTO curAudit = (AuditDTO) auditsDTO.get(0);
        // The mark from the audit
        QualityResultDTO lastMarkFromAudit = (QualityResultDTO) ac.execute("lastManualMarkByAudit",
                new Object[] { project.getID(), practiceId, curAudit.getID() });
        // Last mark outside audit
        QualityResultDTO lastMark = (QualityResultDTO) ac.execute("lastManualMark",
                new Object[] { project.getID(), practiceId });
        // Mark date from the audit
        Date creationDate = lastMarkFromAudit.getCreationDate();
        // Last mark date outside audit
        Date lastMarkDate = lastMark.getCreationDate();
        // To avoid incorrect message when the date has not been recovered
        if (creationDate == null) {
            curForm.setLast(true);
        } else {
            // We check that the audit mark is later than or equal to the last mark
            if (creationDate.compareTo(lastMarkDate) >= 0) {
                curForm.setLast(true);
            }
            PracticeRuleDTO rule = (PracticeRuleDTO) lastMarkFromAudit.getRule();
            boolean markValid = TimeLimitationParser.isMarkValid(rule.getTimeLimitation(), creationDate);
            if (!markValid) {
                curForm.setOutOfDate(true);
            }
        }
        // If the comments exist
        if (lastMarkFromAudit.getManualMarkComment() != null) {
            curForm.setLastComments(lastMarkFromAudit.getManualMarkComment().getComments());
        }
    }

    /**
     * @param pRequest la requete
     * @param pParamParent le parent (peut etre null)
     * @param pPracticeName le nom de la pratique
     * @param pPracticeId l'id de la pratique
     */
    private void manageTrackerFromPractice(HttpServletRequest pRequest, String pParamParent, String pPracticeName,
            Long pPracticeId) {
        // Mise en place du traceur historique
        String displayName = WebMessages.getString(pRequest, pPracticeName);
        String url = "project.do?action=practice&which=" + pPracticeId.longValue();
        if (null != pParamParent) {
            url += "&whichParent=" + pParamParent;
        }
        updateHistTracker(displayName, url, TrackerStructure.FACTOR_VIEW, pRequest, false);
        // Indique que l'on vient d'une vue synthse et pas d'une vue composant
        changeWay(pRequest, "false");
        // On ne doit pas effacer completement le traceur
        needToReset(pRequest, "false");

    }

    /*
     * ======================================================================================================= Page de
     * dtails d'une transgression
     * =======================================================================================================
     */

    /**
     * rcupre les dtails d'une transgression.
     * 
     * @param pMapping le mapping.
     * @param pForm le formulaire  lire.
     * @param pRequest la requte HTTP.
     * @param pResponse la rponse de la servlet.
     * @return l'action  raliser.
     */
    public ActionForward ruleCheckingDetails(ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
            HttpServletResponse pResponse) {
        // Initialisation des variables :
        ActionForward forward = null;
        ActionErrors errors = new ActionErrors();
        String rule = "";
        long measureId = -1;
        long ruleId = -1;
        try {
            ProjectSummaryForm projectSummaryForm = (ProjectSummaryForm) pForm;
            // Obtention de la pratique
            IApplicationComponent ac = AccessDelegateHelper.getInstance("Results");
            String ruleName = (String) pRequest.getParameter("ruleName");
            String measure = (String) pRequest.getParameter("measureId");
            rule = (String) pRequest.getParameter("ruleId");
            measureId = Long.parseLong(measure);
            ruleId = Long.parseLong(rule);
            Object[] paramIn = { new Long(measureId), new Long(ruleId) };
            Collection details = ((Collection) ac.execute("getRuleCheckingItemResults", paramIn));
            RuleCheckingItemsListForm itemsForm = (RuleCheckingItemsListForm) WTransformerFactory
                    .objToForm(RuleCheckingItemsListTransformer.class, new Object[] { ruleName, details });
            pRequest.getSession().setAttribute(SqualeWebConstants.ITEMS_KEY, itemsForm);
            pRequest.getSession().setAttribute("practiceName", pRequest.getParameter("practiceName"));
            forward = pMapping.findForward("practicerulescheckingitem");
        } catch (Exception e) {
            // Traitement factoris des exceptions
            handleException(e, errors, pRequest);
        }
        if (!errors.isEmpty()) {
            // Enregistrement des messages et routage vers une page d'erreur
            saveMessages(pRequest, errors);
            forward = pMapping.findForward("total_failure");
        }
        // Mise en place du traceur historique
        String trackerKey = "project.result.practice.rulesChecking.rule.item.intro.tracker";
        String linkName = WebMessages.getString(pRequest, trackerKey);
        String url = "project.do?action=ruleCheckingDetails&measureId=" + measureId + "&ruleId=" + ruleId
                + "&ruleName=" + rule;
        updateHistTracker(linkName, url, TrackerStructure.FACTOR_VIEW, pRequest, false);
        // Indique que l'on vient d'une vue synthse et pas d'une vue composant
        changeWay(pRequest, "false");
        // On ne doit pas effacer completement le traceur
        needToReset(pRequest, "false");
        return forward;
    }

    /*
     * ======================================================================================================= Page
     * d'affichage des composants ayant une note prcise sur une pratique
     * =======================================================================================================
     */

    /**
     * Rcupre les dtails de la pratique
     * 
     * @param pMapping le mapping.
     * @param pForm le formulaire  lire.
     * @param pRequest la requte HTTP.
     * @param pResponse la rponse de la servlet.
     * @return l'action  raliser.
     */
    public ActionForward mark(ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
            HttpServletResponse pResponse) {

        ActionForward forward = null;
        ActionErrors errors = new ActionErrors();
        // sert aussi pour le traceur
        String value = "", minValue = "", maxValue = "", factorParent = "", param = "", note = "",
                markParamForTracker = "";
        try {
            forward = init(pMapping, pRequest, pForm);
            if (null == forward) {
                param = (String) pRequest.getParameter("tre");
                factorParent = (String) pRequest.getParameter("factorParent");
                IApplicationComponent acGrid = AccessDelegateHelper.getInstance("QualityGrid");
                // Obtention de la pratique
                long practiceId = Long.parseLong((String) pRequest.getParameter("tre"));
                PracticeRuleDTO practice = new PracticeRuleDTO();
                practice.setId(practiceId);
                practice = (PracticeRuleDTO) acGrid.execute("getQualityRule",
                        new Object[] { practice, new Boolean(false) });
                FactorRuleDTO factor = new FactorRuleDTO();
                if (factorParent != null) {
                    // Obtention du facteur
                    long factorId = Long.parseLong(factorParent);
                    factor.setId(factorId);
                    factor = (FactorRuleDTO) acGrid.execute("getQualityRule",
                            new Object[] { factor, new Boolean(false) });
                } else {
                    factor.setId(-1);
                    factor.setName("");
                }
                // Prparation de l'appel des couches mtier
                IApplicationComponent ac = AccessDelegateHelper.getInstance("Results");

                AuditDTO audit = (AuditDTO) (ActionUtils.getCurrentAuditsAsDTO(pRequest).get(0));
                ComponentDTO project = (ComponentDTO) pRequest.getSession()
                        .getAttribute(BaseDispatchAction.PROJECT_DTO);

                ResultsDTO result = null;
                value = (String) pRequest.getParameter("currentMark");
                // Suivant le type de paramtre pass, on peut savoir si on vient du graph ou si
                // on vient du tableau de rpartition
                if (value != null) { // Clic sur le tableau de rpartition
                                     // Note entire  ajouter  l'url du traceur
                    markParamForTracker = "&currentMark=" + value;
                    Integer intValue = new Integer(value);
                    // Un nombre maximal de rsultats est retrouv
                    Object[] paramIn = { audit, project, new Long(practiceId), intValue,
                            new Integer(WebMessages.getString(Locale.getDefault(), "component.max")) };
                    // Appel de la couche mtier
                    result = (ResultsDTO) ac.execute("getValueResults", paramIn);
                    // Transformation vers le formulaire
                    WTransformerFactory.objToForm(MarkTransformer.class, (WActionForm) pForm,
                            new Object[] { result, factor, practice, intValue });
                    note = WebMessages.getString(pRequest, "project.results.mark.status_" + value);
                } else { // clic sur le graph
                    minValue = (String) pRequest.getParameter("minMark");
                    maxValue = (String) pRequest.getParameter("maxMark");
                    // Intervalle  ajouter  l'url du traceur
                    markParamForTracker = "&minMark=" + minValue + "&maxMark=" + maxValue;
                    // Conversion en double
                    Double minMark = new Double(minValue);
                    Double maxMark = new Double(maxValue);
                    // Un nombre maximal de rsultats est retrouv
                    Object[] paramIn = { audit, project, new Long(practiceId), minMark, maxMark,
                            new Integer(WebMessages.getString(Locale.getDefault(), "component.max")) };
                    // Appel de la couche mtier
                    result = (ResultsDTO) ac.execute("getValueResultsForInterval", paramIn);
                    // Transformation vers le formulaire
                    WTransformerFactory.objToForm(MarkTransformer.class, (WActionForm) pForm,
                            new Object[] { result, factor, practice, minMark, maxMark });
                    note = WebMessages.getString(pRequest, "project.results.mark");
                    // pour le traceur
                    note += "[" + minMark.doubleValue() + "," + maxMark.doubleValue();
                    // Suivant la note, on l'inclus ou pas la dans l'intervalle
                    // on ne l'inclus que si c'est 3
                    if (maxMark.intValue() != PracticeResultBO.EXCELLENT) {
                        note += "[";
                    } else {
                        note += "]";
                    }
                }
                forward = pMapping.findForward("mark");
            }
        } catch (Exception e) {
            // Traitement factoris des exceptions
            handleException(e, errors, pRequest);
        }
        if (!errors.isEmpty()) {
            // Enregistrement des messages et routage vers une page d'erreur
            saveMessages(pRequest, errors);
            forward = pMapping.findForward("total_failure");
        }
        // Mise en place du traceur historique
        String url = "mark.do?action=mark&tre=" + param + markParamForTracker;
        if (factorParent != null) {
            url += "&factorparent=" + factorParent;
        }

        updateHistTracker(note, url, TrackerStructure.FACTOR_VIEW, pRequest, false);
        // Indique que l'on vient d'une vue synthse et pas d'une vue composant
        changeWay(pRequest, "false");
        // ICI on doit dire qu'il faudra effacer completement le traceur
        // aprs le passage sur le prochain composant
        needToReset(pRequest, "true");
        // *****************************************************************
        return forward;
    }

    /**
     * Initialise l'action. Si une opration est  effectuer parce que les donnes de session ne permettent pas de
     * poursuivre l'action, alors un forward non null est renvoy.
     * 
     * @param pMapping le mapping.
     * @param pForm le formulaire
     * @param pRequest la requte HTTP.
     * @return l'action  raliser.
     * @throws JrafEnterpriseException exception.
     * @throws WTransformerException exception de transformation.
     */
    private ActionForward init(ActionMapping pMapping, HttpServletRequest pRequest, ActionForm pForm)
            throws JrafEnterpriseException, WTransformerException {
        ActionForward forward = null;
        ProjectForm project = null;
        Long projectId = null;
        // Obtention de l'id de projet
        String param = (String) pRequest.getAttribute("projectId");
        if (null == param) {
            param = (String) pRequest.getParameter("projectId");
        }
        if (param != null) {
            projectId = new Long(param);
        }
        // Rcupration du projet depuis la session
        ComponentDTO projectDto = (ComponentDTO) pRequest.getSession().getAttribute(BaseDispatchAction.PROJECT_DTO);
        project = (ProjectForm) WTransformerFactory.objToForm(ProjectTransformer.class,
                new Object[] { projectDto });
        // On vrifie si le projet choisi est diffrent de celui connu en session
        if ((project == null) || ((projectId != null) && (projectId.longValue() != project.getId()))) {
            project = setupProject(projectId, pRequest, pForm);
        }
        if (null == project) {
            // l'id n'est pas valide
            ActionError error = new ActionError("error.invalid_project");
            ActionErrors errors = new ActionErrors();
            errors.add("application", error);
            saveErrors(pRequest, errors);
            forward = pMapping.findForward("failure");
        }
        return forward;
    }

    /**
     * Mise en place de la session pour le projet Les donnes concernant le projet sont places en session,  savoir le
     * formulaire du projet ainsi que le contenu du menu "Top"
     * 
     * @param pProjectId id du projet
     * @param pRequest requte
     * @param pForm le form associ  l'action
     * @return form du projet ou null si erreur
     * @throws JrafEnterpriseException si erreur
     * @throws WTransformerException si erreur
     */
    ProjectForm setupProject(Long pProjectId, HttpServletRequest pRequest, ActionForm pForm)
            throws JrafEnterpriseException, WTransformerException {
        ProjectForm project = null;
        // Rcupration de l'id de projet
        ComponentDTO dto = new ComponentDTO();
        dto.setID(pProjectId.longValue());
        IApplicationComponent ac = AccessDelegateHelper.getInstance("Component");
        Object[] paramIn = { dto };
        // Obtention du projet par la couche mtier
        dto = (ComponentDTO) ac.execute("get", paramIn);
        if (null != dto) {
            Object obj[] = { dto };
            project = (ProjectForm) WTransformerFactory.objToForm(ProjectTransformer.class, obj);
            ApplicationForm currentApplication = ActionUtils.getCurrentApplication(pRequest);
            // Mise  jour de l'application courante si besoin
            if (null == currentApplication || currentApplication.getId() != dto.getIDParent()) {
                ApplicationForm application = ActionUtils.getComponent(dto.getIDParent(),
                        getUserApplicationList(pRequest));
            }
            Object paramToTransform[] = { dto };
            // Cration du form pour afficher le composant
            ComponentForm projectCompForm = (ComponentForm) WTransformerFactory
                    .objToForm(ComponentTransformer.class, paramToTransform);
            // on met  jour les valeurs concernant l'application et le projet
            // du componentForm qui va etre pass dans la requete
            projectCompForm.copyValues((ProjectSummaryForm) pForm);
            pRequest.setAttribute("componentForm", projectCompForm);
        }
        return project;
    }

    /**
     * Permet de rcuprer le dernier audit dans la session ou le charger par les AC
     * 
     * @param pRequest requete HTTP
     * @param pComponent ComponentDTO dont on souhaite les audits
     * @return Liste des derniers AuditDTOs
     * @throws JrafEnterpriseException si erreur
     * @throws WTransformerException si erreur
     */
    private List initAudit(HttpServletRequest pRequest, ComponentDTO pComponent)
            throws WTransformerException, JrafEnterpriseException {

        List auditsList = new LinkedList();

        // rcupre les audits dans la session
        // renvoie null
        List auditsDTO = ActionUtils.getCurrentAuditsAsDTO(pRequest);

        if (null != auditsDTO) {
            auditsList.addAll(auditsDTO.subList(0, Math.min(auditsDTO.size(), 2)));
        } else {
            Object[] paramIn2 = { pComponent, null, null, new Integer(AuditBO.TERMINATED) };
            IApplicationComponent ac2 = AccessDelegateHelper.getInstance("Component");
            auditsList = (List) ac2.execute("getLastAllAudits", paramIn2);
        }
        return auditsList;
    }

    /**
     * Exporte le plan d'action dtaill pour le projet
     * 
     * @param mapping le actionMapping
     * @param form le form
     * @param request la request
     * @param response la response
     * @return l'actionForward
     * @throws ServletException exception pouvant etre levee
     */
    public ActionForward exportPDFDetailedActionPlan(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response) throws ServletException {
        /*
         * 1. On rcupre les plus mauvaises pratiques tries par l'effort  fournir pour progresser 2. Pour chaque
         * pratique, on remonte les pires composants (ou transgressions) dans la limite de 100
         */
        Collection badPractices;
        // On rcupre l'id du projet et de l'audit
        RootForm rootForm = (RootForm) form;
        String projectId = rootForm.getProjectId();
        String auditId = rootForm.getCurrentAuditId();

        try {
            IApplicationComponent ac = AccessDelegateHelper.getInstance("Results");
            badPractices = (Collection) ac.execute("getWorstPractices",
                    new Object[] { auditId, projectId, new Boolean(true) });

            HashMap parameters = new HashMap();
            // Le nom de l'utilisateur
            LogonBean logon = (LogonBean) request.getSession().getAttribute(WConstants.USER_KEY);
            parameters.put("userName", logon.getMatricule());
            // La date de l'audit courant
            parameters.put("auditDate", rootForm.getAuditName());
            PDFDataJasperReports data = new PDFDataJasperReports(request.getLocale(), getResources(request),
                    badPractices, "/org/squale/squaleweb/resources/jasperreport/ActionPlan.jasper", false,
                    parameters);
            PDFFactory.generatePDFToHTTPResponse(data, response, "", PDFEngine.JASPERREPORTS);
        } catch (Exception e) {
            throw new ServletException(e);
        }
        return null;
    }

    /**
     * Export IDE au format XML. L'export comportement les plus mauvaises pratiques avec les 100 plus mauvais composants
     * (mme principe que pour le plan d'action)
     * 
     * @param mapping le mapping
     * @param form le formulaire
     * @param request la requte
     * @param response la rponse
     * @return null car aucune action doit tre faite
     * @throws ServletException si erreur
     */
    public ActionForward exportIDE(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws ServletException {
        ActionForward forward = null;
        Collection badPractices;
        // On rcupre l'id du projet et de l'audit
        RootForm rootForm = (RootForm) form;
        String projectId = rootForm.getProjectId();
        String auditId = rootForm.getCurrentAuditId();

        try {
            IApplicationComponent ac = AccessDelegateHelper.getInstance("Results");
            badPractices = (Collection) ac.execute("getWorstPractices",
                    new Object[] { auditId, projectId, new Boolean(true) });
            ac = AccessDelegateHelper.getInstance("Component");
            String workspace = (String) ac.execute("getProjectWorkspace",
                    new Object[] { new Long(Long.parseLong(projectId)) });
            XMLData xmlData = new IDELinkXMLData(request, rootForm.getAuditDate(), rootForm.getApplicationName(),
                    workspace, badPractices);
            // On rcupre le label de l'audit si il s'agit d'un audit de jalon
            if (rootForm.getAuditName().matches(".+\\(.+\\)")) { // le label se trouve avant la premire parenthse
                ((IDELinkXMLData) xmlData).setLabel(rootForm.getAuditName().replaceFirst("\\(.+\\)", "").trim());
            }
            String fileName = "actionPlan_" + rootForm.getProjectName() + ".sqa";
            XMLFactory.generateXMLtoHTTPResponse(xmlData, response, fileName);
        } catch (Exception ioe) {
            throw new ServletException(ioe);
        }
        return forward;
    }

    /**
     * Exporte le plan d'action synthtique pour le projet
     * 
     * @param mapping le actionMapping
     * @param form le form
     * @param request la request
     * @param response la response
     * @return l'actionForward
     * @throws ServletException exception pouvant etre levee
     */
    public ActionForward exportPDFActionPlan(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws ServletException {

        // 1. On rcupre les plus mauvaises pratiques tries par l'effort  fournir pour progresser
        // 2. Pour chaque pratique, on remonte le nombre des pires composants (ou transgressions)
        Collection badPractices;
        // On rcupre l'id du projet et de l'audit
        ProjectSummaryForm theForm = (ProjectSummaryForm) form;
        String projectId = theForm.getProjectId();
        String auditId = theForm.getCurrentAuditId();

        try {
            IApplicationComponent ac = AccessDelegateHelper.getInstance("Results");
            badPractices = (Collection) ac.execute("getWorstPractices",
                    new Object[] { auditId, projectId, new Boolean(false) });

            HashMap parameters = new HashMap();
            // La date de l'audit courant
            parameters.put("auditDate", theForm.getAuditName());
            // La date de l'audit prcdent
            parameters.put("previousAuditDate", theForm.getPreviousAuditName());
            // la volumtrie
            parameters.put("volumetry", theForm.getVolumetry().getList());
            // Les facteurs
            parameters.put("factors", theForm.getFactors().getFactors());
            // Le nom de l'utilisateur
            LogonBean logon = (LogonBean) request.getSession().getAttribute(WConstants.USER_KEY);
            parameters.put("userName", logon.getMatricule());
            PDFDataJasperReports data = new PDFDataJasperReports(request.getLocale(), getResources(request),
                    badPractices, "/org/squale/squaleweb/resources/jasperreport/ActionPlan.jasper", false,
                    parameters);
            PDFFactory.generatePDFToHTTPResponse(data, response, "", PDFEngine.JASPERREPORTS);
        } catch (Exception e) {
            throw new ServletException(e);
        }
        return null;
    }

    /**
     * Action exportPDF pour StyleReport ou iText
     * 
     * @param mapping le actionMapping
     * @param form le form
     * @param request la request
     * @param response la response
     * @return l'actionForward
     * @throws ServletException exception pouvant etre levee
     */
    public ActionForward exportPDF(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws ServletException {
        Collection data = new ArrayList(1);
        ProjectSummaryForm theForm = (ProjectSummaryForm) form;
        data.add(theForm);
        try {
            HashMap parameters = new HashMap();
            // L'image du kiviat
            parameters.put("kiviat", (java.awt.Image) request.getSession().getAttribute("kiviatChart"));
            // L'image du scatterplot
            JFreeChart bubbleChart = new TopAction().getBubbleChart(request);
            parameters.put("scatterplot",
                    bubbleChart.createBufferedImage(BubbleMaker.DEFAULT_WIDTH, BubbleMaker.DEFAULT_HEIGHT));
            // Le nom de l'utilisateur
            LogonBean logon = (LogonBean) request.getSession().getAttribute(WConstants.USER_KEY);
            parameters.put("userName", logon.getMatricule());
            // Pour chaque facteur, on rcupre la liste des critres et pratiques associs
            Collection factors = theForm.getFactors().getFactors();
            // Obtention des audits courants
            List auditsDTO = ActionUtils.getCurrentAuditsAsDTO(request);
            ComponentDTO project = new ComponentDTO();
            project.setID(Long.parseLong(theForm.getProjectId()));
            HashMap factorsResults = new HashMap();
            Map practicesResults = new HashMap();
            for (Iterator it = factors.iterator(); it.hasNext();) {
                ProjectFactorForm factor = (ProjectFactorForm) it.next();
                FactorRuleDTO factorRule = getFactorRule(factor.getId());
                ResultListForm criteria = getCriteriaList(factorRule, auditsDTO, project);
                factorsResults.put(new Long(factor.getId()), criteria.getList());
            }
            // Les critres associs aux facteurs
            parameters.put("factorsResults", factorsResults);
            // Les pratiques associes aux critres
            parameters.put("practicesResults", practicesResults.values());
            PDFDataJasperReports pdfData = new PDFDataJasperReports(request.getLocale(), getResources(request),
                    data, "/org/squale/squaleweb/resources/jasperreport/ProjectSummary.jasper", false, parameters);
            PDFFactory.generatePDFToHTTPResponse(pdfData, response, "", PDFEngine.JASPERREPORTS);
        } catch (Exception e) {
            throw new ServletException(e);
        }
        return null;
    }

    /**
     * Exporte la liste des composants par note de pratiques au format XLS
     * 
     * @param mapping le actionMapping
     * @param form le form
     * @param request la request
     * @param response la response
     * @return l'actionForward
     * @throws ServletException exception pouvant etre levee
     */
    public ActionForward exportMarkToExcel(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws ServletException {
        // Le nom de l'utilisateur
        LogonBean logon = (LogonBean) request.getSession().getAttribute(WConstants.USER_KEY);
        try {
            ExcelDataMarkList data = new ExcelDataMarkList(request.getLocale(), getResources(request),
                    (MarkForm) form, logon.getMatricule());
            ExcelFactory.generateExcelToHTTPResponse(data, response, "Marks.xls");
        } catch (Exception e) {
            throw new ServletException(e);
        }
        return null;
    }

    /**
     * Exporte la liste des composants par note de pratiques au format PDF
     * 
     * @param mapping le actionMapping
     * @param form le form
     * @param request la request
     * @param response la response
     * @return l'actionForward
     * @throws ServletException exception pouvant etre levee
     */
    public ActionForward exportMarkToPDF(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws ServletException {
        MarkForm theForm = (MarkForm) form;
        Collection data = theForm.getComponents();
        try {
            HashMap parameters = new HashMap();
            PDFDataJasperReports pdfData = new PDFDataJasperReports(request.getLocale(), getResources(request),
                    data, "/org/squale/squaleweb/resources/jasperreport/metricsResults.jasper", false, parameters);

            // Le nom des mtriques
            parameters.put("treNames", theForm.getTreNames());
            // Le nom de la pratique
            String practiceName = WebMessages.getString(request, theForm.getPracticeName());
            parameters.put("practiceName", practiceName);
            // Le min de l'intervalle
            String minMarkMessage = "";
            if (theForm.getMinMark() != theForm.getMaxMark()) {
                minMarkMessage = "" + theForm.getMinMark();
            } else {
                minMarkMessage = WebMessages.getString(request,
                        "project.results.mark.status_" + theForm.getMarkValue());
            }
            parameters.put("minMarkMessage", minMarkMessage);
            // Le nom de l'utilisateur
            LogonBean logon = (LogonBean) request.getSession().getAttribute(WConstants.USER_KEY);
            parameters.put("userName", logon.getMatricule());
            // Le nom de l'application
            parameters.put("applicationName", theForm.getApplicationName());
            // Le nom du projet
            parameters.put("projectName", theForm.getProjectName());
            // La date de l'audit (ou le nom dans le cas d'un jalon)
            parameters.put("auditDate", theForm.getAuditName());
            // La date de l'audit prcdent (ou le nom dans le cas d'un jalon)
            parameters.put("previousAuditDate", theForm.getPreviousAuditName());
            PDFFactory.generatePDFToHTTPResponse(pdfData, response, "", PDFEngine.JASPERREPORTS);
        } catch (Exception e) {
            throw new ServletException(e);
        }
        return null;
    }

    /**
     * Exporte la liste des transgressions (100 par type au maximum) au format PDF
     * 
     * @param mapping le actionMapping
     * @param form le form
     * @param request la request
     * @param response la response
     * @return l'actionForward
     * @throws ServletException exception pouvant etre levee
     */
    public ActionForward exportTransgressionsToPDF(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response) throws ServletException {
        ProjectSummaryForm theForm = (ProjectSummaryForm) form;
        try {
            // On rcupre les RuleCheckingForm
            Collection rules = ((ResultRulesCheckingForm) theForm.getResults()).getList();
            // Pour chaque rgle, si il y a eu des transgressions, on les remonte et on les stocke
            // pour les donnes PDF
            Collection data = fillTransgressions(rules);

            // Les paramtres
            HashMap parameters = new HashMap();
            // Le nom de la pratique
            parameters.put("practiceName",
                    WebMessages.getString(request, ((ResultRulesCheckingForm) theForm.getResults()).getName()));
            // Note de la pratique
            parameters.put("currentMark", ((ResultRulesCheckingForm) theForm.getResults()).getCurrentMark());
            // Le nom de l'utilisateur
            LogonBean logon = (LogonBean) request.getSession().getAttribute(WConstants.USER_KEY);
            parameters.put("userName", logon.getMatricule());
            // Le nom de l'application
            parameters.put("applicationName", theForm.getApplicationName());
            // Le nom du projet
            parameters.put("projectName", theForm.getProjectName());
            // La date de l'audit
            parameters.put("auditDate", theForm.getAuditName());

            PDFDataJasperReports pdfData = new PDFDataJasperReports(request.getLocale(), getResources(request),
                    data, "/org/squale/squaleweb/resources/jasperreport/transgressions.jasper", false, parameters);
            PDFFactory.generatePDFToHTTPResponse(pdfData, response, "", PDFEngine.JASPERREPORTS);
        } catch (Exception e) {
            throw new ServletException(e);
        }
        return null;
    }

    /**
     * Construit l'ensemble des rgles transgresss avec leurs dtails pour l'export PDF
     * 
     * @param pRulesCheckingForm l'ensemble des rgles
     * @return les rgles transgresses et leurs dtails
     * @throws JrafEnterpriseException si erreur JRAF
     * @throws WTransformerException si erreur de transformation
     */
    private Collection fillTransgressions(Collection pRulesCheckingForm)
            throws JrafEnterpriseException, WTransformerException {
        // Initialisation
        Collection data = new ArrayList();
        Collection details = null;
        RuleCheckingItemsListForm itemsForm = null;
        RuleCheckingPDFForm formForPDF = null;
        IApplicationComponent ac = AccessDelegateHelper.getInstance("Results");
        Object[] paramIn = new Object[2];
        for (Iterator it = pRulesCheckingForm.iterator(); it.hasNext();) {
            RulesCheckingForm current = (RulesCheckingForm) it.next();
            if (current.getTransgressionsNumber() > 0) {
                paramIn[0] = new Long(current.getMeasureID());
                paramIn[1] = new Long(current.getId());
                details = ((Collection) ac.execute("getRuleCheckingItemResults", paramIn));
                itemsForm = (RuleCheckingItemsListForm) WTransformerFactory.objToForm(
                        RuleCheckingItemsListTransformer.class, new Object[] { current.getNameRule(), details });
                formForPDF = new RuleCheckingPDFForm(current.getNameRule(), current.getSeverity(),
                        current.getTransgressionsNumber(), itemsForm);
                data.add(formForPDF);
            }
        }
        return data;
    }

    /**
     * Action addTag ajoute un tag sur un projet donn
     * 
     * @param pMapping le actionMapping
     * @param pForm le form
     * @param pRequest la request
     * @param pResponse la response
     * @return l'actionForward
     * @throws ServletException exception pouvant etre levee
     */
    public ActionForward addTag(ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
            HttpServletResponse pResponse) throws ServletException {
        ActionForward forward = null;
        ActionErrors errors = new ActionErrors();
        IApplicationComponent ac;

        try {
            String tagToAdd = ((ProjectSummaryForm) pForm).getTagSupp();
            TagDTO tagDTO = null;
            if (tagToAdd != null) {
                ac = AccessDelegateHelper.getInstance("TagAdmin");
                Object[] paramIn = { new String[] { tagToAdd } };
                Collection<TagDTO> tags = ((Collection<TagDTO>) ac.execute("getTagsByName", paramIn));
                if (tags != null && tags.size() == 1) {
                    for (TagDTO tagDTOtemp : tags) {
                        tagDTO = tagDTOtemp;
                    }
                }

                if (tagDTO == null) {
                    pRequest.setAttribute("unexistingTag", tagToAdd);
                } else {
                    // the given tag exists in the DB: let's add it to the project
                    ComponentDTO project = (ComponentDTO) pRequest.getSession()
                            .getAttribute(BaseDispatchAction.PROJECT_DTO);

                    // On rajoute le tag sur le formulaire
                    Collection<TagDTO> projectTags = project.getTags();
                    boolean possedeTag = project.possessTag(tagDTO);
                    if (!possedeTag) {
                        projectTags.add(tagDTO);
                        project.setTags(projectTags);
                        ((ProjectSummaryForm) pForm).setTags(projectTags);
                    }

                    // On a pu le rajouter sur le formulaire, on va le rajouter en base
                    if (!possedeTag) {
                        ac = AccessDelegateHelper.getInstance("ProjectAdmin");
                        paramIn = new Object[] { project.getID(), tagDTO };
                        ac.execute("addTag", paramIn);
                    }
                }

                forward = pMapping.findForward("summary");
            }
        } catch (Exception e) {
            // Traitement factoris des exceptions
            handleException(e, errors, pRequest);
        }
        if (!errors.isEmpty()) {
            // Sauvegarde des messages
            saveMessages(pRequest, errors);
            // Routage vers la page d'erreur
            forward = pMapping.findForward("total_failure");
        }
        return forward;
    }

    /**
     * Action removeTag removes a tag from the current project
     * 
     * @param pMapping the actionMapping
     * @param pForm the form
     * @param pRequest the request
     * @param pResponse the response
     * @return the actionForward
     * @throws ServletException exception that can be thrown
     */
    public ActionForward removeTag(ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
            HttpServletResponse pResponse) throws ServletException {
        ActionForward forward = null;
        ActionErrors errors = new ActionErrors();
        IApplicationComponent ac;

        try {
            String tagTodelete = ((ProjectSummaryForm) pForm).getTagDel();
            if (tagTodelete == null || "".equals(tagTodelete)) {
                tagTodelete = pRequest.getParameter("tagToDel");
            }
            long idApplication = Long.parseLong(((ProjectSummaryForm) pForm).getApplicationId());
            TagDTO tagDTOToDelete = null;
            if (tagTodelete != null) {
                ac = AccessDelegateHelper.getInstance("TagAdmin");
                Object[] paramIn = { new String[] { tagTodelete } };
                Collection<TagDTO> tags = ((Collection<TagDTO>) ac.execute("getTagsByName", paramIn));
                if (tags != null && tags.size() == 1) {
                    for (TagDTO tagDTOtemp : tags) {
                        tagDTOToDelete = tagDTOtemp;
                    }
                }
                ComponentDTO project = (ComponentDTO) pRequest.getSession()
                        .getAttribute(BaseDispatchAction.PROJECT_DTO);

                // On retire le tag du formulaire
                Collection<TagDTO> projectTags = project.getTags();
                Collection<TagDTO> newProjectTags = new ArrayList<TagDTO>();
                for (TagDTO tagProject : projectTags) {
                    if (!tagProject.getName().equals(tagDTOToDelete.getName())) {
                        newProjectTags.add(tagProject);
                    }
                }
                project.setTags(newProjectTags);
                ((ProjectSummaryForm) pForm).setTags(newProjectTags);
                // The tag to delete is removed from the form
                ((ProjectSummaryForm) pForm).setTagDel("");
                ((ProjectSummaryForm) pForm).setTagDelAppli("");

                // On a pu le retirer du formulaire, on va le retirer de la base

                ac = AccessDelegateHelper.getInstance("ProjectAdmin");
                paramIn = new Object[] { project.getID(), tagDTOToDelete };
                ac.execute("removeTag", paramIn);
            }
            forward = pMapping.findForward("summary");
        } catch (Exception e) {
            // Traitement factoris des exceptions
            handleException(e, errors, pRequest);
        }
        if (!errors.isEmpty()) {
            // Sauvegarde des messages
            saveMessages(pRequest, errors);
            // Routage vers la page d'erreur
            forward = pMapping.findForward("total_failure");
        }
        return forward;
    }

    /**
     * Action addTagApplication adds a tag to the current application
     * 
     * @param pMapping the actionMapping
     * @param pForm the form
     * @param pRequest the request
     * @param pResponse the response
     * @return the actionForward
     * @throws ServletException exception that can be thrown
     */
    public ActionForward addTagApplication(ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
            HttpServletResponse pResponse) throws ServletException {
        ActionForward forward = null;
        ActionErrors errors = new ActionErrors();
        IApplicationComponent ac;

        try {
            String tagToAdd = ((ProjectSummaryForm) pForm).getTagSupp();
            TagDTO tagDTO = null;
            if (tagToAdd != null) {
                ac = AccessDelegateHelper.getInstance("TagAdmin");
                Object[] paramIn = { new String[] { tagToAdd } };
                Collection<TagDTO> tags = ((Collection<TagDTO>) ac.execute("getTagsByName", paramIn));
                if (tags != null && tags.size() == 1) {
                    for (TagDTO tagDTOtemp : tags) {
                        tagDTO = tagDTOtemp;
                    }
                }

                if (tagDTO == null) {
                    pRequest.setAttribute("unexistingTag", tagToAdd);
                } else {
                    // the given tag exists in the DB: let's add it to the project
                    ComponentDTO application = (ComponentDTO) pRequest.getSession()
                            .getAttribute(BaseDispatchAction.APPLI_DTO);

                    // On rajoute le tag sur le formulaire
                    Collection<TagDTO> applicationTags = application.getTags();
                    boolean possedeTag = application.possessTag(tagDTO);
                    if (!possedeTag) {
                        applicationTags.add(tagDTO);
                        application.setTags(applicationTags);
                        ((ProjectSummaryForm) pForm).setTagsAppli(applicationTags);
                    }

                    // On a pu le rajouter sur le formulaire, on va le rajouter en base
                    if (!possedeTag) {
                        ac = AccessDelegateHelper.getInstance("ApplicationAdmin");
                        paramIn = new Object[] { application.getID(), tagDTO };
                        ac.execute("addTag", paramIn);
                    }

                }
                forward = pMapping.findForward("summary");
            }
        } catch (Exception e) {
            // Traitement factoris des exceptions
            handleException(e, errors, pRequest);
        }
        if (!errors.isEmpty()) {
            // Sauvegarde des messages
            saveErrors(pRequest, errors);
            // Routage vers la page d'erreur
            forward = pMapping.findForward("total_failure");
        }
        return forward;
    }

    /**
     * Action delTag removes a tag from the current application
     * 
     * @param pMapping the actionMapping
     * @param pForm the form
     * @param pRequest the request
     * @param pResponse the response
     * @return the actionForward
     * @throws ServletException exception that can be thrown
     */
    public ActionForward removeTagApplication(ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
            HttpServletResponse pResponse) throws ServletException {
        ActionForward forward = null;
        ActionErrors errors = new ActionErrors();
        IApplicationComponent ac;

        try {
            String tagTodelete = ((ProjectSummaryForm) pForm).getTagDelAppli();
            long idApplication = Long.parseLong(((ProjectSummaryForm) pForm).getApplicationId());
            TagDTO tagDTOToDelete = null;
            if (tagTodelete != null) {
                ac = AccessDelegateHelper.getInstance("TagAdmin");
                Object[] paramIn = { new String[] { tagTodelete } };
                Collection<TagDTO> tags = ((Collection<TagDTO>) ac.execute("getTagsByName", paramIn));
                if (tags != null && tags.size() == 1) {
                    for (TagDTO tagDTOtemp : tags) {
                        tagDTOToDelete = tagDTOtemp;
                    }
                }
                ComponentDTO application = getApplication(pRequest, idApplication);

                // On retire le tag du formulaire
                Collection<TagDTO> applicationTags = application.getTags();

                // The tag has to be present since it was chosen from a combo box containing
                Collection<TagDTO> newApplicationTags = new ArrayList<TagDTO>();
                for (TagDTO tagApplication : applicationTags) {
                    if (!tagApplication.getName().equals(tagDTOToDelete.getName())) {
                        newApplicationTags.add(tagApplication);
                    }
                }
                application.setTags(newApplicationTags);
                ((ProjectSummaryForm) pForm).setTagsAppli(newApplicationTags);
                ((ProjectSummaryForm) pForm).setTagDel("");
                ((ProjectSummaryForm) pForm).setTagDelAppli("");

                // On a pu le retirer du formulaire, on va le retirer de la base

                ac = AccessDelegateHelper.getInstance("ApplicationAdmin");
                paramIn = new Object[] { application.getID(), tagDTOToDelete };
                ac.execute("removeTag", paramIn);
            }
            forward = pMapping.findForward("summary");
        } catch (Exception e) {
            // Traitement factoris des exceptions
            handleException(e, errors, pRequest);
        }
        if (!errors.isEmpty()) {
            // Sauvegarde des messages
            saveMessages(pRequest, errors);
            // Routage vers la page d'erreur
            forward = pMapping.findForward("total_failure");
        }
        return forward;
    }

    /**
     * Mthode that will retrieve an application from the context or from the data base
     * 
     * @param pRequest the HTTP Request
     * @param pIdApplication idApplication in case it has to be retrieved from the database
     * @return the retrieved application
     * @throws JrafEnterpriseException if an exception occurs
     */
    private ComponentDTO getApplication(HttpServletRequest pRequest, long pIdApplication)
            throws JrafEnterpriseException {
        // The application is retrieved from the context
        ComponentDTO application = (ComponentDTO) pRequest.getSession().getAttribute(BaseDispatchAction.APPLI_DTO);

        // if it is not there, it will be retrieved from the database
        if (application == null) {
            ComponentDTO componentTemp = new ComponentDTO();
            componentTemp.setID(pIdApplication);
            IApplicationComponent ac2 = AccessDelegateHelper.getInstance("Component");
            application = (ComponentDTO) ac2.execute("get", new Object[] { componentTemp });
        }
        return application;
    }

    /**
     * Exporte le plan d'action synthtique pour le projet
     * 
     * @param mapping le actionMapping
     * @param form le form
     * @param request la request
     * @param response la response
     * @return l'actionForward
     * @throws ServletException exception pouvant etre levee
     */
    public ActionForward exportRemediationByRisk(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws ServletException {

        List<ComponentCriticalityDTO> compoList;
        ProjectSummaryForm theForm = (ProjectSummaryForm) form;
        String projectId = theForm.getProjectId();
        String auditId = theForm.getCurrentAuditId();
        IApplicationComponent ac;
        try {

            ac = AccessDelegateHelper.getInstance("remediation");
            compoList = (ArrayList<ComponentCriticalityDTO>) ac.execute("remediationByRisk",
                    new Object[] { auditId, projectId });
            //We needs only the fitfty firts components
            final int initialIndex = 0;
            final int lastIndex = 50;
            compoList = compoList.subList(initialIndex, lastIndex);

            HashMap parameters = new HashMap();
            // The current project name
            parameters.put("moduleName", theForm.getProjectName());
            // The current audit date
            parameters.put("auditDate", theForm.getAuditName());
            // The current user name
            LogonBean logon = (LogonBean) request.getSession().getAttribute(WConstants.USER_KEY);
            parameters.put("userName", logon.getMatricule());
            PDFDataJasperReports data = new PDFDataJasperReports(request.getLocale(), getResources(request),
                    compoList, "/org/squale/squaleweb/resources/jasperreport/RemediationByRisk.jasper", false,
                    parameters);
            PDFFactory.generatePDFToHTTPResponse(data, response, "", PDFEngine.JASPERREPORTS);
        } catch (Exception e) {
            throw new ServletException(e);
        }
        return null;
    }

}