/**
* 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.umlquality;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.squale.squalecommon.enterpriselayer.businessobject.component.AbstractComplexComponentBO;
import org.squale.squalecommon.enterpriselayer.businessobject.component.AbstractComponentBO;
import org.squale.squalecommon.enterpriselayer.businessobject.component.ProjectBO;
import org.squale.squalecommon.enterpriselayer.businessobject.result.umlquality.UMLQualityMetricsBO;
import org.squale.squalecommon.enterpriselayer.businessobject.result.umlquality.UMLQualityModelMetricsBO;
import org.squale.squalecommon.enterpriselayer.businessobject.result.umlquality.UMLQualityPackageMetricsBO;
import org.squale.squalix.util.repository.ComponentRepository;
/**
* Prend en charge de remplacer tous les noms des composants par les objets
*
* @author sportorico
*/
public class UMLQualityBeanAdaptator
{
/**
* Contient la liste des composant complexe
*/
private Map mComplexeComponents = null;
/**
* Projet sur lequel est r�alis�e l'analyse.
*/
private ProjectBO mProject = null;
/**
* Repository
*/
private ComponentRepository mRepository;
/**
* Logger
*/
private static final Log LOGGER = LogFactory.getLog( UMLQualityBeanAdaptator.class );
/**
* Constructeur
*
* @param pProject le projet sur lequel est r�alis�e l'analyse.
* @param pRepository le repository
*/
public UMLQualityBeanAdaptator( final ProjectBO pProject, ComponentRepository pRepository )
{
mProject = pProject;
mRepository = pRepository;
mComplexeComponents = new HashMap();
}
/**
* Adapte le bean des r�sultats des composants UML et le fait persister.<br>
* En utilisant nom du composant r�cup�r� depuis les rapports(resultats)UMLQuality, on cr�e<br>
* la relation avec le composant ad�quat.<br>
*
* @param pComponentResult Ensemble de r�sultats devant �tre modifi�s et persist�s.
* @return true si le resultat a �t� adapt� si non false
* @throws Exception si le composant UML n'a pas �t� instancier
*/
public boolean adaptComponentResult( final UMLQualityMetricsBO pComponentResult )
throws Exception
{
LOGGER.debug( UMLQualityMessages.getString( "logs.debug.adapt_composant" )
+ pComponentResult.getComponentName() );
boolean result = false; // resultat de la methode
String name = null; // nom du composant
String parentName = null; // nom du parent direct
AbstractComponentBO component = null, adaptedComponent; // un composant UML
name = UMLQualityUtility.getName( pComponentResult.getComponentName() );// recupere le nom du composant
// sur lequel les resultats(m�triques)
// a �t� g�n�r�s
if ( name != null )
{// nom non vide
parentName = UMLQualityUtility.getParentName( pComponentResult.getComponentName() );// le nom du parent
// direct
if ( null != parentName )
{// le parent direct n'existe pas
AbstractComplexComponentBO conplexComponentBO =
(AbstractComplexComponentBO) mComplexeComponents.get( parentName );// recherche du parent direct
if ( null != conplexComponentBO )
{// le parent direct existe
/* on instancie un composant */
component =
UMLQualityUtility.newInstance( UMLQualityMessages.getString( "uml.component.package.name" )
+ UMLQualityMessages.getString( "uml.component.prefix.name" )
+ UMLQualityUtility.getUmlComponentName( pComponentResult.getClass().getName() )
+ UMLQualityMessages.getString( "uml.component.sufix.name" ), name );
if ( component instanceof AbstractComplexComponentBO )
{
mComplexeComponents.put( pComponentResult.getComponentName(), component );
}
component.setParent( conplexComponentBO );// �tablie le lien de parent� entre deux composants
adaptedComponent = mRepository.persisteComponent( component );
pComponentResult.setComponent( adaptedComponent );// �tablie le lien entre resutat(metrique) et
// composant
if ( pComponentResult instanceof UMLQualityPackageMetricsBO )
{
// on ne persiste pas les mesures UMLQualityPackage
result = false;
}
else
{
result = true;
}
}
}
else
{
// si c'est le resultat(m�trique)d'un composant UML racine (Model)
if ( pComponentResult instanceof UMLQualityModelMetricsBO )
{
component =
UMLQualityUtility.newInstance( UMLQualityMessages.getString( "uml.component.package.name" )
+ UMLQualityMessages.getString( "uml.component.prefix.name" )
+ UMLQualityUtility.getUmlComponentName( pComponentResult.getClass().getName() )
+ UMLQualityMessages.getString( "uml.component.sufix.name" ), name );
mComplexeComponents.put( pComponentResult.getComponentName(), component );
component.setParent( mProject );// �tablie le lien de parent� entre le composant
// et le sous-projet
adaptedComponent = mRepository.persisteComponent( component );
pComponentResult.setComponent( adaptedComponent );
result = true;
}
}
}
return result;
}
}