/** * 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.tag; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.TreeMap; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; 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.squale.jraf.commons.exception.JrafEnterpriseException; import org.squale.jraf.helper.AccessDelegateHelper; import org.squale.jraf.spi.accessdelegate.IApplicationComponent; import org.squale.squalecommon.daolayer.tag.TagDAOImpl; import org.squale.squalecommon.datatransfertobject.component.AuditDTO; import org.squale.squalecommon.datatransfertobject.component.ComponentDTO; import org.squale.squalecommon.datatransfertobject.result.ResultsDTO; import org.squale.squalecommon.datatransfertobject.tag.TagDTO; import org.squale.squalecommon.enterpriselayer.businessobject.component.AuditBO; import org.squale.squaleweb.applicationlayer.action.ActionUtils; import org.squale.squaleweb.applicationlayer.action.accessRights.DefaultAction; import org.squale.squaleweb.applicationlayer.formbean.component.ApplicationListForm; import org.squale.squaleweb.applicationlayer.formbean.component.ProjectListForm; import org.squale.squaleweb.applicationlayer.formbean.component.SplitAuditsListForm; import org.squale.squaleweb.applicationlayer.formbean.results.ProjectSummaryForm; import org.squale.squaleweb.comparator.AuditGridComparator; import org.squale.squaleweb.transformer.ApplicationListTransformer; import org.squale.squaleweb.transformer.FactorsResultListTransformer; import org.squale.squaleweb.transformer.ProjectSummaryTransformer; import org.squale.squaleweb.transformer.stats.FactorsStatsTransformer; import org.squale.welcom.struts.bean.WActionForm; import org.squale.welcom.struts.transformer.WTransformerException; import org.squale.welcom.struts.transformer.WTransformerFactory; /** * Affichage de la liste des applications Cette action permet d'extraire la liste des applications disponibles pour * l'utilisateur courant et de les restituer sous une forme synth�tique */ public class AllTaggedProjectsAction extends DefaultAction { /** * Le nom d�signant l'attribut en session pour indiquer si on veut tous les facteurs ou non pour le kiviat. */ private static final String ALL_FACTORS = "allFactors"; /** * Affichage de la liste des applications non publiques * * @param pMapping le mapping. * @param pForm le formulaire � lire. * @param pRequest la requ�te HTTP. * @param pResponse la r�ponse de la servlet. * @return l'action � r�aliser. */ public ActionForward listSameTagProjects( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest, HttpServletResponse pResponse ) { ActionForward forward; try { // R�cup�ration du tag en session voulu String tagId = (String) pRequest.getParameter( "tag" ); Object[] paramIn = new Object[] { Long.parseLong( tagId )}; IApplicationComponent ac = AccessDelegateHelper.getInstance( "TagAdmin" ); // R�cup�ration des tags pour chacun des applications concern�es TagDTO tag = ( (TagDTO) ac.execute( "getTag", paramIn ) ); pRequest.setAttribute( "tagName", tag.getName() ); paramIn[0] = new TagDTO[] { tag }; IApplicationComponent ac2 = AccessDelegateHelper.getInstance( "Component" ); List projects = ( (List) ac2.execute( "getTaggedProjects", paramIn ) ); forward = execute( pMapping, pForm, projects, pRequest ); } catch ( Exception e ) { ActionErrors errors = new ActionErrors(); // Traitement factoris� des erreurs handleException( e, errors, pRequest ); saveMessages( pRequest, errors ); forward = pMapping.findForward( "failure" ); } // On est pass� par un menu donc on r�initialise le traceur // resetTracker( pRequest ); return ( forward ); } /** * @param pMapping le mapping * @param pForm le formulaire * @param pProjects les applications * @return le forward * @throws WTransformerException si erreur * @throws JrafEnterpriseException si erreur */ private ActionForward execute( ActionMapping pMapping, ActionForm pForm, List pProjects, HttpServletRequest pRequest ) throws WTransformerException, JrafEnterpriseException, Exception { ActionForward forward; List projectList = new ArrayList(); if ( pProjects.isEmpty() ) { // S'il n'y a pas d'applications, on redirige vers une page d�di�e forward = pMapping.findForward( "empty" ); } else { List results = new LinkedList(); // R�cup�ration des r�sultats � partir de l'Application Component IApplicationComponent ac = AccessDelegateHelper.getInstance( "Results" ); List projectResults = new ArrayList(); for ( Object object : pProjects ) { // Object[] paramIn = { null, project }; // // R�cup�ration des r�sultats pour chacun des applications concern�es // projectResults.add( (ResultsDTO) ac.execute( "getProjectResults", paramIn ) ); // } ComponentDTO project = (ComponentDTO) object; ProjectSummaryForm projectSummaryForm = new ProjectSummaryForm(); projectSummaryForm.setProjectName( project.getName() ); projectSummaryForm.setProjectId( "" + project.getID() ); List auditsList = initAudit( pRequest, project ); boolean result = auditsList.size() > 0; if ( result ) { // ************************************************************************************************** // R�cup�ration des facteurs // ************************************************************************************************** Collection factors = getFactorsList( auditsList, project ); // auditsDTO // ************************************************************************************************** // R�cup�ration de la volumetrie // ************************************************************************************************** Long currentAuditId = new Long( ( (AuditDTO) auditsList.get( 0 ) ).getID() ); projectSummaryForm.setCurrentAuditId( "" + currentAuditId ); Long previousAuditId; if ( auditsList.size() > 1 ) { previousAuditId = new Long( ( (AuditDTO) auditsList.get( 1 ) ).getID() ); } else { previousAuditId = null; } projectSummaryForm.setPreviousAuditId( "" + ( previousAuditId == null ? "" : previousAuditId ) ); Object[] paramIn = { currentAuditId, project }; IApplicationComponent ac2 = AccessDelegateHelper.getInstance( "Results" ); ResultsDTO resultDTO = ( (ResultsDTO) ac2.execute( "getProjectVolumetry", paramIn ) ); Map volumetries = resultDTO.getResultMap(); Object[] paramIn2 = { currentAuditId, new Long( project.getID() ) }; Boolean haveErrors = ( (Boolean) ac2.execute( "getHaveErrors", paramIn2 ) ); ac2 = AccessDelegateHelper.getInstance( "Component" ); Boolean canBeExportedToIDE = ( (Boolean) ac2.execute( "canBeExportedToIDE", new Object[] { new Long( project.getID() ) } ) ); // Conversion du formulaire Object[] params = { project, factors, volumetries, haveErrors, canBeExportedToIDE }; WTransformerFactory.objToForm( ProjectSummaryTransformer.class, projectSummaryForm, params ); } projectList.add( projectSummaryForm ); } ( (ProjectListForm) pForm ).setList( projectList ); forward = pMapping.findForward( "list" ); } return forward; } /** * Permet de r�cup�rer 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(); // r�cup�re 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; } /** * Retourne les notes des facteurs du projet sur la liste d'audit donn�e. * * @param pAuditsList la liste d'audits. * @param pProject le projet. * @return le formulaire contenant la liste des facteurs. * @throws Exception si un probl�me appara�t. */ private Collection getFactorsList( final List pAuditsList, final ComponentDTO pProject ) throws Exception { IApplicationComponent ac = AccessDelegateHelper.getInstance( "Results" ); Object[] paramIn = { pAuditsList, pProject }; // Les r�sultats sont retourn�s dans l'ordre impos� par la grille qualit� // on maintient cet ordre pour l'affichage ResultsDTO resultDTO = ( (ResultsDTO) ac.execute( "getProjectResults", paramIn ) ); // On r�cup�re la liste des collections de r�sultats 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; } }