/**
* 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.cpptest;
import java.util.Collection;
import java.util.Iterator;
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.jraf.spi.persistence.ISession;
import org.squale.squalecommon.daolayer.result.MeasureDAOImpl;
import org.squale.squalecommon.daolayer.rulechecking.CppTestRuleSetDAOImpl;
import org.squale.squalecommon.datatransfertobject.rulechecking.CppTestRuleSetDTO;
import org.squale.squalecommon.enterpriselayer.businessobject.component.AuditBO;
import org.squale.squalecommon.enterpriselayer.businessobject.component.ProjectBO;
import org.squale.squalecommon.enterpriselayer.businessobject.result.IntegerMetricBO;
import org.squale.squalecommon.enterpriselayer.businessobject.result.rulechecking.CppTestTransgressionBO;
import org.squale.squalecommon.enterpriselayer.businessobject.result.rulechecking.RuleCheckingTransgressionBO;
import org.squale.squalecommon.enterpriselayer.businessobject.result.rulechecking.RuleCheckingTransgressionItemBO;
import org.squale.squalecommon.enterpriselayer.businessobject.rulechecking.RuleBO;
import org.squale.squalecommon.enterpriselayer.businessobject.rulechecking.cpptest.CppTestRuleSetBO;
/**
* Persistance des r�sultats CppTest
*/
public class CppTestPersistor
{
/**
* Logger
*/
private static final Log LOGGER = LogFactory.getLog( CppTestPersistor.class );
/**
* Sauvegarde des r�sultats
*
* @param pSession session
* @param pProjectBO projet
* @param pAuditBO audit
* @param pResults r�sultats
* @param pRuleSet ruleset
* @throws JrafDaoException si erreur
*/
public void storeResults( ISession pSession, ProjectBO pProjectBO, AuditBO pAuditBO, Map pResults,
CppTestRuleSetDTO pRuleSet )
throws JrafDaoException
{
// On r�cup�re le jeu de r�gles associ� au projet
CppTestRuleSetBO ruleset =
(CppTestRuleSetBO) CppTestRuleSetDAOImpl.getInstance().get( pSession, new Long( pRuleSet.getId() ) );
// Cr�ation de la transgression
CppTestTransgressionBO transgression = new CppTestTransgressionBO();
transgression.setAudit( pAuditBO );
transgression.setComponent( pProjectBO );
transgression.setRuleSet( ruleset );
transgression.setTaskName( "task.cpptest.name" );
// On parcourt les r�gles connues dans le ruleset
Iterator ruleCodes = ruleset.getRules().values().iterator();
while ( ruleCodes.hasNext() )
{
RuleBO rule = (RuleBO) ruleCodes.next();
Collection details = (Collection) pResults.get( rule.getCode() );
int nbOcc = 0;
// Si le parsing n'a pas donn� de r�sultat, on place 0 comme
// nombre de transgression
if ( details != null )
{
nbOcc = details.size();
// On parcourt le d�tail des transgressions
int cpt = RuleCheckingTransgressionBO.MAX_DETAILS;
for ( Iterator detailIt = details.iterator(); detailIt.hasNext() && cpt > 0; cpt-- )
{
RuleCheckingTransgressionItemBO item = (RuleCheckingTransgressionItemBO) detailIt.next();
item.setRule( rule );
transgression.getDetails().add( item );
}
}
// On ajoute une m�trique de type Integer pour chaque r�gle transgress�e
// avec 0 comme valeur par d�faut
IntegerMetricBO metric = new IntegerMetricBO();
metric.setName( rule.getCode() );
metric.setValue( nbOcc );
metric.setMeasure( transgression );
transgression.putMetric( metric );
}
// On parcourt les r�gles non trouv�es dans le ruleset
ruleCodes = pResults.keySet().iterator();
while ( ruleCodes.hasNext() )
{
String ruleCode = (String) ruleCodes.next();
// Chaque r�gle non trouv�e est signal�e comme
// manquante
if ( false == ruleset.getRules().containsKey( ruleCode ) )
{
LOGGER.warn( CppTestMessages.getString( "rule.ignored", ruleCode ) );
}
}
// Sauvegarde des donn�es dans la base
MeasureDAOImpl.getInstance().create( pSession, transgression );
}
}