/** * 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.grid; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.List; 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.helper.AccessDelegateHelper; import org.squale.jraf.spi.accessdelegate.IApplicationComponent; import org.squale.squalecommon.datatransfertobject.component.ComponentDTO; import org.squale.squalecommon.datatransfertobject.rule.PracticeRuleDTO; import org.squale.squaleweb.applicationlayer.action.ActionUtils; import org.squale.squaleweb.applicationlayer.action.accessRights.ReaderAction; import org.squale.squaleweb.applicationlayer.formbean.results.ResultForm; import org.squale.squaleweb.applicationlayer.formbean.results.ResultListForm; import org.squale.squaleweb.applicationlayer.tracker.TrackerStructure; import org.squale.squaleweb.comparator.ResultFormComparator; import org.squale.squaleweb.resources.WebMessages; import org.squale.squaleweb.transformer.ProjectTransformer; import org.squale.welcom.struts.transformer.WTransformerFactory; /** * */ public class PracticesSummaryAction extends ReaderAction { /** * Importation d'un fichier de grille * * @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 meteo( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest, HttpServletResponse pResponse ) { ActionErrors errors = new ActionErrors(); ActionForward forward = pMapping.findForward( "noPracticesDefined" ); ArrayList list = new ArrayList( 0 ); try { // ici la liste des audits est forc�ment != null List auditsDTO = ActionUtils.getCurrentAuditsAsDTO( pRequest ); ComponentDTO projectDTO = (ComponentDTO) WTransformerFactory.formToObj( ProjectTransformer.class, ActionUtils.getCurrentProject( pRequest ) )[0]; // On va r�cup�rer la grille qualit� correspondant au dernier audit IApplicationComponent acResult = AccessDelegateHelper.getInstance( "Results" ); Collection practicesAndMarks = (Collection) acResult.execute( "getAllPractices", new Object[] { auditsDTO.get( 0 ), projectDTO } ); // Audit pr�c�dent si d�fini Collection practicesAndMarksOld = null; if ( auditsDTO.size() > 1 ) { practicesAndMarksOld = (Collection) acResult.execute( "getAllPractices", new Object[] { auditsDTO.get( 1 ), projectDTO } ); } // d�finition et initialisation � null des diff�rents �l�ments // concernant les anciens r�sultats Collection practicesOld = null; Collection marksOld = null; // Si des anciens r�sultats existent, alors on initialise correctement // tous les �l�ments permettant de r�cup�rer ces r�sultats if ( practicesAndMarksOld != null ) { Iterator practicesAndOldMarksIt = practicesAndMarksOld.iterator(); practicesOld = (Collection) practicesAndOldMarksIt.next(); marksOld = (Collection) practicesAndOldMarksIt.next(); } // collection de practiceRuleDto Iterator practicesAndMarksIt = practicesAndMarks.iterator(); Collection practices = (Collection) practicesAndMarksIt.next(); Iterator practicesIt = practices.iterator(); Collection marks = (Collection) practicesAndMarksIt.next(); Iterator marksIt = marks.iterator(); while ( practicesIt.hasNext() && marksIt.hasNext() ) { // La pratique et la note associ�e ont le meme index Float mark = (Float) marksIt.next(); PracticeRuleDTO practice = (PracticeRuleDTO) practicesIt.next(); String practiceName = practice.getName(); ResultForm f = new ResultForm(); // R�cup�re la note pr�c�dente pour cette pratique si elle existe, // sinon on ne mettra rien if ( practicesAndMarksOld != null ) { Float oldMark = getPreviousMark( practicesOld, marksOld, practice.getId() ); if ( oldMark != null ) { f.setPredecessorMark( oldMark.toString() ); // Si il y a une note pr�c�dente alors les audits sont comparables, on l'indique ( (ResultListForm) pForm ).setComparableAudits( true ); } } // Positionne les champs pour cette pratique et pour la note courante if ( mark != null ) { f.setId( "" + practice.getId() ); f.setName( practiceName ); f.setCurrentMark( mark.toString() ); // si on n'a pas pu remplir le champ note pr�c�dente, la tendance sera �gale // cf. TrendTag list.add( f ); } } Collections.sort( list, new ResultFormComparator() ); ( (ResultListForm) pForm ).setList( list ); // On est pass� par un menu donc on r�initialise le traceur // On ajoute le lien de la page pour avoir le lien lors de la s�lection d'une pratique updateHistTracker( WebMessages.getString( pRequest, "practices.meteo" ), "meteo.do?action=meteo", TrackerStructure.TOP_VIEW, pRequest, true ); } catch ( Exception e ) { // Traitement des exceptions handleException( e, errors, pRequest ); forward = pMapping.findForward( "total_failure" ); } if ( !errors.isEmpty() ) { saveMessages( pRequest, errors ); } return forward; } /** * PRECONDITION: les 2 collections ne sont pas null et ont la meme taille, renvoie null sinon * * @param pPractices les pratiques * @param pMarks les notes associ�s aux pratiques * @param pPracticeId l'id de la pratique dont on veut la note * @return la note de l'audit pr�c�dent pour la practice pPractice si elle existe, null sinon */ private Float getPreviousMark( Collection pPractices, Collection pMarks, long pPracticeId ) { Float result = null; // V�rifie que les 2 collections ont bien la meme taille car on incr�mente // les 2 a chaque fois // on ne v�rifie pas le fait qu'elles ne soient pas nulles if ( pPractices.size() == pMarks.size() ) { Iterator practicesIt = pPractices.iterator(); Iterator marksIt = pMarks.iterator(); // Cherche dans l'ensemble des pratiques la pratique pass� en param�tre, // et si elle existe renvoie sa note (peut etre null) while ( result == null && practicesIt.hasNext() ) { PracticeRuleDTO practiceOld = (PracticeRuleDTO) practicesIt.next(); Float previousMark = (Float) marksIt.next(); if ( practiceOld.getId() == pPracticeId ) { result = previousMark; } } } return result; } }