/** * 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.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; import org.squale.squalecommon.datatransfertobject.result.PracticeEvolutionDTO; import org.squale.squaleweb.applicationlayer.formbean.results.ComponentForm; import org.squale.squaleweb.applicationlayer.formbean.results.ComponentListForm; import org.squale.squaleweb.applicationlayer.formbean.results.EvolutionForm; import org.squale.squaleweb.applicationlayer.formbean.results.ResultForm; import org.squale.squaleweb.applicationlayer.formbean.results.ResultListForm; import org.squale.squaleweb.comparator.RuleNameComparator; import org.squale.welcom.struts.bean.WActionForm; import org.squale.welcom.struts.transformer.WITransformer; import org.squale.welcom.struts.transformer.WTransformerException; import org.squale.welcom.struts.transformer.WTransformerFactory; /** * Transforme Collection PracticeEvolutionDto <-> Map */ public class EvolutionTransformer implements WITransformer { /** * @see org.squale.welcom.struts.transformer.WITransformer#objToForm(java.lang.Object[]) {@inheritDoc} */ public WActionForm objToForm( Object[] pObject ) throws WTransformerException { EvolutionForm form = new EvolutionForm(); objToForm( pObject, form ); return form; } /** * @see org.squale.welcom.struts.transformer.WITransformer#objToForm(java.lang.Object[], * org.squale.welcom.struts.bean.WActionForm) {@inheritDoc} */ public void objToForm( Object[] pObject, WActionForm pForm ) throws WTransformerException { EvolutionForm resultForm = (EvolutionForm) pForm; // On nettoie le seuil si le filtre ne correspond pas if ( !resultForm.getFilters()[PracticeEvolutionDTO.THRESHOLD_ID] ) { resultForm.setThreshold( "" ); } else { // On traduit le caract�re > ou < if ( ">".equals( resultForm.getComparisonSign() ) ) { resultForm.setComparisonSign( ">" ); } else if ( "<".equals( resultForm.getComparisonSign() ) ) { resultForm.setComparisonSign( "<" ); } } // On nettoie les pratiques si le filtre ne correspond pas if ( !resultForm.getFilters()[PracticeEvolutionDTO.ONLY_PRACTICES_ID] ) { resultForm.setPractices( new String[0] ); } // On r�cup�re la collection de PracticeEvolutionDTO Collection dtos = (Collection) pObject[0]; // Cette table aura pour cl� un componentForm et comme valeur // un ResultListForm ou un ResultForm comme cl� et un // ComponentListForm comme valeur selon le tri du form List practiceNames = setResultsMap( resultForm, dtos ); // On r�cup�re la locale pour trier les pratiques par leur nom internationalis� Locale locale = (Locale) pObject[1]; RuleNameComparator comp = new RuleNameComparator( locale ); Collections.sort( practiceNames, comp ); // et on l'affecte au formulaire resultForm.setAvailablePractices( (String[]) practiceNames.toArray( new String[practiceNames.size()] ) ); } /** * Modifie la table des r�sulats de la forme : si <code>sortType</code> = EvolutionForm.COMPONENT_FOR_KEY * <li>cl� : ResultForm (correspondant � la pratique) * <li>value : ComponentListForm sinon * <li>cl� : ComponentForm * <li>value : ResultListForm (correspondant aux pratiques) Ajoute le nom des pratiques dans la liste des pratiques * disponibles * * @param pForm leformulaire � modifier * @param dtos la collection de PracticeEvolutionDTO * @return la liste des noms des pratiques concern�es par une �volution * @throws WTransformerException si erreur */ private List setResultsMap( EvolutionForm pForm, Collection dtos ) throws WTransformerException { Set practiceNames = new HashSet(); Map results = new HashMap(); Object[] paramComponent = new Object[1]; // On parcours la collection for ( Iterator it = dtos.iterator(); it.hasNext(); ) { PracticeEvolutionDTO evolutionDto = (PracticeEvolutionDTO) it.next(); // On transforme le composant en formulaire paramComponent[0] = evolutionDto.getComponent(); ComponentForm compForm = (ComponentForm) WTransformerFactory.objToForm( ComponentTransformer.class, paramComponent ); // On transforme la pratique en formulaire ResultForm practiceForm = (ResultForm) WTransformerFactory.objToForm( ResultTransformer.class, new Object[] { evolutionDto.getPractice() } ); // On stock le nom de la pratique dans le set practiceNames.add( practiceForm.getName() ); practiceForm.setCurrentMark( "" ); practiceForm.setPredecessorMark( "" ); Float currentMark = evolutionDto.getMark(); if ( null != currentMark ) { practiceForm.setCurrentMark( currentMark.toString() ); } Float oldMark = evolutionDto.getPreviousMark(); if ( null != oldMark ) { practiceForm.setPredecessorMark( oldMark.toString() ); } if ( pForm.getSortType().equals( EvolutionForm.COMPONENT_FOR_KEY ) ) { // On veut le ComponentForm en cl� addPractice( results, compForm, practiceForm ); } else { // On veut le ResultForm en cl� addComponent( results, practiceForm, compForm ); } } pForm.setResults( results ); return new ArrayList( practiceNames ); } /** * @param results la table � compl�ter * @param practiceForm la pratique � ajouter * @param compForm le composant servant de cl� */ private void addComponent( Map results, ResultForm practiceForm, ComponentForm compForm ) { // On r�cup�re la liste des composants li�s � la pratique ComponentListForm components = (ComponentListForm) getByName( results, practiceForm.getName() ); // On associe la note de la pratique au composant compForm.getPractices().getList().add( practiceForm ); if ( null != components ) { // On ajoute le composant � la liste des composants de practiceForm components.getList().add( compForm ); } else { // On cr�e la liste ComponentListForm newComponents = new ComponentListForm(); newComponents.getList().add( compForm ); results.put( practiceForm, newComponents ); } } /** * @param results la map des r�sultats * @param practiceName le nom de la pratique � rechercher * @return la valeur correspondant � la pratique ou null si elle n'existe pas dans la map */ private ComponentListForm getByName( Map results, String practiceName ) { ComponentListForm value = null; Set keys = results.keySet(); for ( Iterator it = keys.iterator(); it.hasNext() && value == null; ) { ResultForm key = (ResultForm) it.next(); if ( practiceName.equals( key.getName() ) ) { value = (ComponentListForm) results.get( key ); } } return value; } /** * @param results la table � compl�ter * @param compForm le composant � ajouter * @param practiceForm la pratique servant de cl� */ private void addPractice( Map results, ComponentForm compForm, ResultForm practiceForm ) { // On r�cup�re la liste des r�sultats li�s au composant ResultListForm practices = (ResultListForm) getById( results, compForm.getId() ); if ( null != practices ) { // On ajoute la pratique � la liste des pratiques de compForm practices.getList().add( practiceForm ); } else { // On cr�e la liste ResultListForm newPractices = new ResultListForm(); newPractices.getList().add( practiceForm ); results.put( compForm, newPractices ); } } /** * @param results la map des r�sultats * @param id l'id du composant � rechercher * @return la valeur correspondant � la cl� dont l'id est <code>id</code> */ private ResultListForm getById( Map results, long id ) { ResultListForm value = null; Set keys = results.keySet(); for ( Iterator it = keys.iterator(); it.hasNext() && value == null; ) { ComponentForm key = (ComponentForm) it.next(); if ( id == key.getId() ) { value = (ResultListForm) results.get( key ); } } return value; } /** * @see org.squale.welcom.struts.transformer.WITransformer#formToObj(org.squale.welcom.struts.bean.WActionForm) * {@inheritDoc} */ public Object[] formToObj( WActionForm pForm ) throws WTransformerException { final int maxParams = 3; Object[] args = new Object[maxParams]; formToObj( pForm, args ); return args; } /** * @see org.squale.welcom.struts.transformer.WITransformer#formToObj(org.squale.welcom.struts.bean.WActionForm, * java.lang.Object[]) {@inheritDoc} */ public void formToObj( WActionForm form, Object[] object ) throws WTransformerException { Object[] args = (Object[]) object; EvolutionForm evolutionForm = (EvolutionForm) form; // On construit les arguments du filtre boolean[] filters = evolutionForm.getFilters(); if ( filters[PracticeEvolutionDTO.ONLY_UP_OR_DOWN_ID] ) { args[PracticeEvolutionDTO.ONLY_UP_OR_DOWN_ID] = evolutionForm.getFilterOnlyUpOrDown(); } if ( filters[PracticeEvolutionDTO.ONLY_PRACTICES_ID] ) { args[PracticeEvolutionDTO.ONLY_PRACTICES_ID] = evolutionForm.getPractices(); } if ( filters[PracticeEvolutionDTO.THRESHOLD_ID] ) { String[] argsThreshold = new String[] { evolutionForm.getComparisonSign(), evolutionForm.getThreshold() }; args[PracticeEvolutionDTO.THRESHOLD_ID] = argsThreshold; } } }