/** * 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.transformer; import java.util.ArrayList; import java.util.Collection; import java.util.Hashtable; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.TreeMap; import java.util.TreeSet; import java.util.Map.Entry; import org.squale.squalecommon.datatransfertobject.component.AuditGridDTO; import org.squale.squalecommon.datatransfertobject.component.ComponentDTO; import org.squale.squalecommon.datatransfertobject.result.ResultsDTO; import org.squale.squalecommon.datatransfertobject.rule.QualityGridDTO; import org.squale.squaleweb.applicationlayer.formbean.results.FactorsResultListForm; import org.squale.squaleweb.applicationlayer.formbean.results.ProjectFactorsForm; import org.squale.squaleweb.applicationlayer.formbean.results.ResultListForm; import org.squale.welcom.struts.bean.WActionForm; import org.squale.welcom.struts.transformer.WTransformerException; import org.squale.welcom.struts.transformer.WTransformerFactory; /** * Transformation d'une liste de r�sultats en fonction de facteurs */ public class FactorsResultListTransformer extends AbstractListTransformer { /** * @param pObject le tableau de ProjectDTO � transformer en formulaires. * @throws WTransformerException si un pb appara�t. * @return le formulaire associ� */ public WActionForm objToForm( Object[] pObject ) throws WTransformerException { ResultListForm form = new ResultListForm(); objToForm( pObject, form ); return form; } /** * @param pObject le tableau de ProjectDTO � transformer en formulaires. * @param pForm le formulaire � remplir. * @throws WTransformerException si un pb appara�t. */ public void objToForm( Object[] pObject, WActionForm pForm ) throws WTransformerException { Collection applications = (Collection) pObject[0]; Collection results = (Collection) pObject[1]; ResultListForm form = (ResultListForm) pForm; // On fait un parcours de la liste des projets // pour en extraire toutes les grilles Collection grids = extractGrids( results ); // On fait une map par grille existante Hashtable gridsForm = new Hashtable(); Iterator gridsIt = grids.iterator(); while ( gridsIt.hasNext() ) { // Cr�ation du formulaire qui regroupe les r�sultats autour d'une m�me // grille FactorsResultListForm factorsForm = new FactorsResultListForm(); QualityGridDTO grid = (QualityGridDTO) gridsIt.next(); factorsForm.setFactors( grid.getFactors() ); factorsForm.setGridName( grid.getName() ); factorsForm.setGridUpdateDate( grid.getUpdateDate() ); gridsForm.put( grid, factorsForm ); } form.setList( new ArrayList( gridsForm.values() ) ); // On met les tags de l'application sur le formulaire de la liste de r�sultats si on n'a qu'une seule // application if ( applications.size() == 1 ) { for ( Object object : applications ) { if ( object instanceof ComponentDTO ) { form.setTags( ( (ComponentDTO) object ).getTags() ); } } } else { form.setTags( new ArrayList() ); } // On parcourt maintenant chaque r�sultat et en fonction du type de grille // on ajoute des donn�es dans le form correspondant // On parcourt la liste des r�sultats projet par projet Iterator projectResultsIterator = results.iterator(); while ( projectResultsIterator.hasNext() ) { List projectResults = (List) projectResultsIterator.next(); /* * ######################################### Mise en forme des r�sultats */ // Le premier �l�ment de la liste correspond au dernier audit Map latestResults = ( (ResultsDTO) projectResults.get( 0 ) ).getResultMap(); // On supprime la liste des facteurs renvoy�e par la m�thode // avec null comme clef latestResults.remove( null ); // On trie la map pour avoir le m�me ordre dans les r�sultats // des audits. latestResults = new TreeMap( latestResults ); Map preLatestResults = null; // L'�l�ment suivant s'il existe correspond � l'avant dernier // audit et permettra d'obtenir des tendances if ( projectResults.size() > 1 ) { preLatestResults = ( (ResultsDTO) projectResults.get( 1 ) ).getResultMap(); // On supprime la liste des facteurs renvoy�e avec la clef // null preLatestResults.remove( null ); } Iterator auditGridterator = latestResults.entrySet().iterator(); // On parcourt chacun des projets pour mettre // en forme les r�sultats while ( auditGridterator.hasNext() ) { Map.Entry entry = (Entry) auditGridterator.next(); AuditGridDTO auditGrid = (AuditGridDTO) entry.getKey(); ComponentDTO component = auditGrid.getProject(); // Java bean contenant les r�sultats ProjectFactorsForm bean = new ProjectFactorsForm( component ); // On affecte l'id de l'audit courant au form bean.setCurrentAuditId( "" + auditGrid.getAudit().getID() ); bean.setApplicationId( "" + component.getIDParent() ); bean.setApplicationName( TransformerUtils.getApplicationName( component.getIDParent(), applications ) ); // bean.setTags( pTags ) ArrayList params = new ArrayList(); params.add( entry ); // Ajout des tendances � passer en param�tre Map.Entry prevEntry = getPreviousResult( component, preLatestResults ); if ( prevEntry != null ) { params.add( prevEntry ); } // Conversion welcome WTransformerFactory.objToForm( ProjectFactorsTransformer.class, bean, new Object[] { component, params } ); // R�cup�ration de la grille et placement de celle-ci FactorsResultListForm f = (FactorsResultListForm) gridsForm.get( auditGrid.getGrid() ); f.getResults().add( bean ); // si il y a des r�sultats comparable, on l'indique if ( bean.getComparableAudits() ) { // we change attribute only if audits are comparable because an audit is // comparable if at least one project is comparable. form.setComparableAudits( bean.getComparableAudits() ); } } } } /** * Obtention du r�sultat pr�c�dent * * @param pComponent composant * @param pPreviousResults r�sultat pr�c�dent ou null si non pr�sents * @return r�sultat pr�c�dent ou null si non existant */ private Map.Entry getPreviousResult( ComponentDTO pComponent, Map pPreviousResults ) { Map.Entry result = null; if ( pPreviousResults != null ) { Iterator it = pPreviousResults.entrySet().iterator(); // On cherche dans les r�sultats la grille qui correspond au composant while ( it.hasNext() && ( result == null ) ) { Map.Entry prevEntry = (Entry) it.next(); AuditGridDTO prevAuditGrid = (AuditGridDTO) prevEntry.getKey(); if ( prevAuditGrid.getProject().getID() == pComponent.getID() ) { result = prevEntry; } } } return result; } /** * Obtention des grilles qualit� * * @param pResults r�sultats � explorer * @return ensemble des grilles qualit� */ private Collection extractGrids( Collection pResults ) { TreeSet grids = new TreeSet(); // Le TreeSet contiendra la liste des grilles qualit� utilis�es // dans les r�sultats Iterator iterator = pResults.iterator(); // Parcours des r�sultats par application // chaque application contient les r�sultats par projet while ( iterator.hasNext() ) { Iterator results = ( (Collection) iterator.next() ).iterator(); // Parcours des r�sultats par projet et par audit // on se limite au dernier audit : la grille qualit� des audits // pr�cedents est inutile pour le calcul des tendances boolean lastaudit = true; while ( results.hasNext() && lastaudit ) { lastaudit = false; ResultsDTO result = (ResultsDTO) results.next(); Iterator keys = result.getResultMap().keySet().iterator(); // Parcours de chaque projet while ( keys.hasNext() ) { Object key = keys.next(); if ( key instanceof AuditGridDTO ) { AuditGridDTO dto = (AuditGridDTO) key; // Ajout de la grille dans un set ce qui �vite les duplications grids.add( dto.getGrid() ); } } } } return grids; } /** * @param pForm le formulaire � lire. * @param pObject le tableau de ProjectDTO qui r�cup�re les donn�es du formulaire. * @throws WTransformerException si un pb appara�t. */ public void formToObj( WActionForm pForm, Object[] pObject ) throws WTransformerException { } }