/**
* 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.squalix.tools.rsm;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.squale.jraf.commons.exception.JrafDaoException;
import org.squale.squalecommon.enterpriselayer.businessobject.component.ClassBO;
import org.squale.squalecommon.enterpriselayer.businessobject.component.MethodBO;
import org.squale.squalecommon.enterpriselayer.businessobject.result.rsm.RSMClassMetricsBO;
import org.squale.squalecommon.enterpriselayer.businessobject.result.rsm.RSMMethodMetricsBO;
import org.squale.squalix.util.parser.LanguageParser;
import org.squale.squalix.util.repository.ComponentRepository;
/**
* Est en charge de remplacer tous les noms des m�thodes par les objets correspondant.<br>
* Ceci permet d'utiliser les relations propos�es par la base de donn�es.<br>
*/
public class RSMAdaptator
{
/**
* Parser
*/
private LanguageParser mLanguageParser;
/**
* Repository
*/
private ComponentRepository mRepository;
/**
* Map permettant de r�f�rencer les diff�rentes m�thodes Set dans le cas de polymorphisme pour etre sur de r�cup�rer
* la bonne m�thode
*/
private Map mMethodsMap;
/**
* Logger
*/
private static final Log LOGGER = LogFactory.getLog( RSMAdaptator.class );
/**
* Constructeur
*
* @param pParser le parser
* @param pRepository le repository
*/
public RSMAdaptator( LanguageParser pParser, ComponentRepository pRepository )
{
mLanguageParser = pParser;
mRepository = pRepository;
mMethodsMap = new HashMap();
}
/**
* Adapte le bean des r�sultats des m�thodes et le fait persister.<br>
* En utilisant nom du composant r�cup�r� depuis le rapport RSM, on cr�e la relation avec le composant ad�quat.
*
* @param pMethodResult Ensemble de r�sultats de la m�thode devant �tre modifi�s et persist�s.
* @return true si on a pu correctement rattacher l'objet et le faire persister
* @throws JrafDaoException si erreur
*/
public boolean adaptMethodResult( final RSMMethodMetricsBO pMethodResult )
throws JrafDaoException
{
LOGGER.debug( RSMMessages.getString( "logs.debug.adapt_method" ) + pMethodResult.getComponentName() );
boolean isPersisted = false;
// Recherche de la m�thode associ�e
// RSM oblige a faire un traitement sans utiliser le language parser car il ne remonte pas les param�tres de la
// m�thode
String methodName = null;
int index = pMethodResult.getComponentName().lastIndexOf( ":" );
if ( index == -1 )
{
index = pMethodResult.getComponentName().lastIndexOf( "." );
}
if ( index != -1 )
{
methodName =
pMethodResult.getComponentName().substring( index + 1, pMethodResult.getComponentName().length() );
}
if ( null != methodName )
{
Collection methods =
mRepository.getSimilarMethods( methodName, pMethodResult.getFileName(),
pMethodResult.getAudit().getId() );
// Probl�me avec le polymorphisme RSM:
// Si aucune m�thode n'est remont�e, c'est une erreur du au fait qu'aucun autre outil n'a �t� pass� avant
// pour cr�er ces m�thodes
// Si plusieurs m�thode sont remont�es, on ne sauvegarde pas les r�sultats sur cette m�thode
// Si un seul r�sultat est remont�, on l'affecte et on fait persister
if ( methods.size() == 1 )
{
MethodBO methodBo = (MethodBO) methods.iterator().next();
pMethodResult.setComponent( methodBo );
mRepository.persisteComponent( methodBo );
isPersisted = true;
}
}
return isPersisted;
}
/**
* Adapte le bean des r�sultats des classes et le fait persister.
*
* @param pClassResult Ensemble des r�sultats de la classe devant �tre modifi�s et persist�s.
* @throws JrafDaoException si erreur
*/
public void adaptClassResult( final RSMClassMetricsBO pClassResult )
throws JrafDaoException
{
LOGGER.debug( RSMMessages.getString( "logs.debug.adapt_class" ) + pClassResult.getComponentName() );
ClassBO classBO = mLanguageParser.getClass( pClassResult.getComponentName() );
if ( null != classBO )
{
ClassBO persistentClassBO = (ClassBO) mRepository.persisteComponent( classBO );
pClassResult.setComponent( persistentClassBO );
}
}
}