/**
* 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.squalecommon.datatransfertobject.transform.result;
import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.squale.squalecommon.datatransfertobject.DTOMessages;
import org.squale.squalecommon.datatransfertobject.result.ResultsDTO;
import org.squale.squalecommon.datatransfertobject.transform.component.ComponentTransform;
import org.squale.squalecommon.enterpriselayer.businessobject.component.AbstractComponentBO;
import org.squale.squalecommon.enterpriselayer.businessobject.result.MeasureBO;
import org.squale.squalecommon.enterpriselayer.businessobject.result.MetricBO;
import org.squale.squalecommon.util.mapping.Mapping;
/**
* @author M400843
*/
public class MeasureTransform
implements Serializable
{
/** logger */
private static final Log LOG = LogFactory.getLog( MeasureTransform.class );
/**
* Retourne une valeur (un attribut) d'un MeasureBO
*
* @param pMeasure la mesure
* @param pKeyTRE la cl� du TRE que l'on d�sire
* @return la valeur (dans un objet) correspondante
*/
private static Object getValue( MeasureBO pMeasure, String pKeyTRE )
{
Object value = null;
// r�cup�ration du getter correspondant au TRE souhait�
Method getter = Mapping.getMetricGetter( pKeyTRE );
if ( ( null != getter ) && ( null != pMeasure ) )
{
try
{
// invocation du getter sur la mesure
value = getter.invoke( pMeasure, null );
}
catch ( IllegalArgumentException e )
{
// Exception ayant lieu si les arguments pass�s sont incorrect,
// ne devrait pas arriver sur un getter
String tab[] = { Long.toString( pMeasure.getId() ), pKeyTRE };
LOG.error( DTOMessages.getString( "transform.measure.IllegalArgumentException.measure_key", tab ), e );
}
catch ( IllegalAccessException e )
{
// ne devrait pas arriver sur un getter
String tab[] = { Long.toString( pMeasure.getId() ), pKeyTRE };
LOG.error( DTOMessages.getString( "transform.measure.IllegalAccessException.measure_key", tab ), e );
}
catch ( InvocationTargetException e )
{
// ne devrait pas arriver sur un getter
String tab[] = { Long.toString( pMeasure.getId() ), pKeyTRE };
LOG.error( DTOMessages.getString( "transform.measure.InvocationTargetException.measure_key", tab ), e );
}
}
return value;
}
/**
* Transforme une mesure en ResultDTO
*
* @param pMeasure la mesure
* @param pKeyTRE la cl� du TRE que l'on d�sire
* @return le r�sultat (ResultDTO) correspondant
*/
public static ResultsDTO bo2dto( MeasureBO pMeasure, String pKeyTRE )
{
ResultsDTO resultDTO;
Object value;
// Dans le cas d'une mesure nulle, par exemple une mesure n'existant pas
// dans un audit pr�c�dent, on renvoie une valeur nulle dans le r�sultat
if ( pMeasure == null )
{
value = null;
}
else
{
value = getValue( pMeasure, pKeyTRE );
}
resultDTO = new ResultsDTO();
List resultList = new ArrayList();
resultList.add( value );
resultDTO.put( null, resultList );
return resultDTO;
}
/**
* R�cup�re la bonne instance de mesure dans la collection de mesures
*
* @param pMeasures une collection de mesures
* @param pTREKey la cl�
* @return une instance de la classe associ� � pTREKey si elle est pr�sente dans pMeasures, <code>null</code>
* sinon
*/
private static MeasureBO getMeasure( Collection pMeasures, String pTREKey )
{
MeasureBO measure = null;
Class measureClass = Mapping.getMetricClass( pTREKey );
Iterator it = pMeasures.iterator();
while ( it.hasNext() && ( null == measure ) )
{
MeasureBO measureToTest = (MeasureBO) it.next();
if ( measureClass.isInstance( measureToTest ) )
{
measure = measureToTest;
}
}
return measure;
}
/**
* Permet d'ajouter un objet en cl� et une liste de mesures � un ResultsDTO
*
* @param pResults ResultsDTO ayant en abscisse les cl�s TRE, si <code>null</code> il est instanci� et la premi�re
* ligne est affect�e
* @param pMeasures resultsDTO auquel il faut ajouter listes
* @param pTREKeys listes des cl�s de mesures
* @param pObject objet cl� de la HashMap de resultsDTO
* @return ResultsDTO � jour
*/
public static ResultsDTO bo2dtoByTRE( ResultsDTO pResults, Collection pMeasures, List pTREKeys, Object pObject )
{
ResultsDTO results = null;
// Cr�ation de la liste de r�sultats
List resultList = new ArrayList();
Iterator it = pTREKeys.iterator();
while ( it.hasNext() )
{
String key = (String) it.next();
MeasureBO measure = getMeasure( pMeasures, key );
resultList.add( getValue( measure, key ) );
}
if ( null == pResults )
{
results = new ResultsDTO();
results.put( null, pTREKeys );
}
else
{
results = pResults;
}
results.put( pObject, resultList );
return results;
}
/**
* Transform measures to map
* key : tre
* value : score for this tre
* @param pMeasures measures
* @param pTREKeys measures keys
* @return map
*/
public static Map bo2dtoForMetric(Collection pMeasures, List pTREKeys) {
Map metricsValues = new HashMap();
Iterator it = pTREKeys.iterator();
while ( it.hasNext() )
{
String key = (String) it.next();
MeasureBO measure = getMeasure( pMeasures, key );
metricsValues.put( key, getValue( measure, key ) );
}
return metricsValues;
}
/**
* Permet d'ajouter un objet en cl� et une liste de mesures � un ResultsDTO
*
* @param pResults ResultsDTO ayant en abscisse les cl�s TRE, si <code>null</code> il est instanci� et la premi�re
* ligne est affect�e
* @param pMeasures resultsDTO auquel il faut ajouter listes
* @param pObject objet cl� de la HashMap de resultsDTO
* @return ResultsDTO � jour
*/
public static ResultsDTO bo2dtoByTRE( ResultsDTO pResults, Collection pMeasures, Object pObject )
{
ResultsDTO results = null;
// Cr�ation de la liste de r�sultats
List resultList = new ArrayList();
List keyList = new ArrayList();
Iterator it = pMeasures.iterator();
// Parcours de chaque mesure
while ( it.hasNext() )
{
MeasureBO measure = (MeasureBO) it.next();
Map metrics = measure.getMetrics();
Iterator keys = metrics.keySet().iterator();
// Parcours de chaque clef de m�trique
// pour les pacer dans le r�sultat
while ( keys.hasNext() )
{
String key = (String) keys.next();
String keyMnemo = Mapping.getMeasureName( measure.getClass() ) + "." + key;
MetricBO metric = (MetricBO) metrics.get( key );
// si le type est "affichable"
if ( metric.isPrintable() )
{
// on le stocke dans la hashmap
keyList.add( keyMnemo );
resultList.add( metric.getValue() );
}
}
}
if ( null == pResults )
{
// Si aucun r�sultat n'�tait disponible, on cree
// un r�sultat vide ne contenant que les clefs de m�trique
results = new ResultsDTO();
results.put( null, keyList );
}
else
{
results = pResults;
}
// Ajout des r�sultats en regard de l'objet
results.put( pObject, resultList );
return results;
}
/**
* Permet d'ajouter un objet en cl� et une liste de mesures � un ResultsDTO
*
* @param pResults ResultsDTO ayant en abscisse les cl�s TRE, si <code>null</code> il est instanci� et la premi�re
* ligne est affect�e
* @param pMeasures liste de mesures
* @param pAbcisse liste des audits ou des comopsants
* @param pTREKey cl� de mesures
* @param pObject objet cl� de la HashMap de resultsDTO
* @return ResultsDTO � jour
*/
public static ResultsDTO bo2dtoByAuditOrComponent( ResultsDTO pResults, List pMeasures, List pAbcisse,
String pTREKey, Object pObject )
{
ResultsDTO results = null;
// Cr�ation de la liste de r�sultats
List resultList = new ArrayList();
Iterator it = pMeasures.iterator();
while ( it.hasNext() )
{
MeasureBO measure = (MeasureBO) it.next();
resultList.add( getValue( measure, pTREKey ) );
}
if ( null == pResults )
{
results = new ResultsDTO();
results.put( null, pAbcisse );
}
else
{
results = pResults;
}
results.put( pObject, resultList );
return results;
}
/**
* @param pResults ResultsDTO ayant en abscisse les cl�s TRE (ou null)
* @param pMeasuresAbcisse Liste contenat des Objet[] {Componsant, Valeur de la measure)
* @param pObject Audit courant (pour stocker le resultats dans le ResultDTO)
* @return ResultsDTO � jour
*/
public static ResultsDTO bo2dtoByAuditOrComponent( ResultsDTO pResults, List pMeasuresAbcisse, Object pObject )
{
ResultsDTO results = null;
// Cr�ation de la liste de r�sultats
List resultList = new ArrayList();
List abscisse = new ArrayList();
Iterator it = pMeasuresAbcisse.iterator();
while ( it.hasNext() )
{
Object[] l = (Object[]) it.next();
Number measure = (Number) l[1];
abscisse.add( ComponentTransform.bo2Dto( (AbstractComponentBO) l[0] ) );
resultList.add( measure );
}
if ( null == pResults )
{
results = new ResultsDTO();
results.put( null, abscisse );
}
else
{
results = pResults;
}
results.put( pObject, resultList );
return results;
}
}