/**
* 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.core;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.squale.jraf.bootstrap.initializer.Initializer;
import org.squale.jraf.commons.exception.JrafDaoException;
import org.squale.jraf.commons.exception.JrafPersistenceException;
import org.squale.jraf.helper.PersistenceHelper;
import org.squale.jraf.spi.persistence.ISession;
import org.squale.squalecommon.daolayer.component.ApplicationDAOImpl;
import org.squale.squalecommon.daolayer.component.AuditDAOImpl;
import org.squale.squalecommon.daolayer.result.MarkDAOImpl;
import org.squale.squalecommon.daolayer.result.MeasureDAOImpl;
import org.squale.squalecommon.daolayer.result.rulechecking.RuleCheckingTransgressionDAOImpl;
import org.squale.squalecommon.enterpriselayer.businessobject.component.ApplicationBO;
import org.squale.squalecommon.enterpriselayer.businessobject.component.AuditBO;
import org.squale.squalecommon.enterpriselayer.businessobject.result.roi.RoiMetricsBO;
/**
* Calcule tous les ROI pour les audits termin�s (Pour ex�cuter le main sous unix mettre son nom dans le manifest.mf
* dans Main-Class)
*/
public class RoiMain
{
/**
* Logger
*/
private static Log mLOGGER = null;
/**
* Sauvegarde le roi calcul� en base
*
* @param pSession la session
* @param pValue le nombre de correction
* @param pApplication l'application courante
* @param pAudit l'audit courant
* @throws JrafDaoException si erreur
*/
private static void createROI( ISession pSession, int pValue, ApplicationBO pApplication, AuditBO pAudit )
throws JrafDaoException
{
RoiMetricsBO roi = new RoiMetricsBO();
roi.setNbCorrections( pValue );
roi.setComponent( pApplication );
roi.setAudit( pAudit );
// Initialisation du DAO
MeasureDAOImpl roiDAO = MeasureDAOImpl.getInstance();
roiDAO.create( pSession, roi );
}
/**
* Calcule le nombre de corrections pour l'audit courant pour le ROI
*
* @param pSession la session
* @param pPreviousAudit l'audit pr�c�dent
* @param pCurrentAudit l'audit courant
* @param pLogger le logger
* @return le nombre de corrections faites entre les deux audits
* @throws JrafDaoException si erreur
*/
public static int calculateNbCorrection( ISession pSession, AuditBO pPreviousAudit, AuditBO pCurrentAudit,
Log pLogger )
throws JrafDaoException
{
int nbProgressions = 0;
int nbSuppressions = 0;
int transgressionDiff = 0;
// En cas d'appel depuis une m�thode ext�rieur
if ( mLOGGER == null )
{
mLOGGER = pLogger;
}
/* On r�cup�re le nombre de corrections faites entre les deux audits */
Long auditId = new Long( pCurrentAudit.getId() );
Long previousAuditId = new Long( pPreviousAudit.getId() );
MarkDAOImpl markDao = MarkDAOImpl.getInstance();
// Les composants qui sont pass�s de z�ro � 1, 2 ou 3
nbProgressions = markDao.findCorrectionsWithProgessions( pSession, auditId, previousAuditId );
mLOGGER.info( "Nombre de progressions = " + nbProgressions );
// Les composants qui �taient � z�ro et qui n'existent plus
nbSuppressions = markDao.findCorrectionsWithSuppressions( pSession, auditId, previousAuditId );
mLOGGER.info( "Nombre de suppressions = " + nbSuppressions );
// La progression du nombre de transgressions de niveau erreur et warning
RuleCheckingTransgressionDAOImpl ruleDao = RuleCheckingTransgressionDAOImpl.getInstance();
int nbTransgressions = ruleDao.findNbErrorAndWarning( pSession, auditId );
int nbPreviousTransgressions = ruleDao.findNbErrorAndWarning( pSession, previousAuditId );
transgressionDiff = nbPreviousTransgressions - nbTransgressions;
mLOGGER.info( "Nombre de transgressions = " + transgressionDiff );
if ( transgressionDiff <= 0 )
{
transgressionDiff = 0;
}
return nbProgressions + nbSuppressions + transgressionDiff;
}
/**
* Calcul de tous les roi
*
* @param pArgs arguments de lancement.
* @throws JrafPersistenceException si erreur
*/
public static void main( String pArgs[] )
throws JrafPersistenceException
{
// lancement de l�initialisation JRAF
String rootPath = pArgs[0];
String configFile = "/config/providers-config.xml";
Initializer init = new Initializer( rootPath, configFile );
init.initialize();
// Maintenant que le socle JRAF est initialis�, on peut cr�er un logger
mLOGGER = LogFactory.getLog( RoiMain.class );
ISession session = null;
try
{
session = PersistenceHelper.getPersistenceProvider().getSession();
// Instanciation des DAO
AuditDAOImpl auditDAO = AuditDAOImpl.getInstance();
ApplicationDAOImpl appliDAO = ApplicationDAOImpl.getInstance();
MeasureDAOImpl measureDAO = MeasureDAOImpl.getInstance();
// On r�cup�re tous les audits termin�s
List audits = auditDAO.findWhereStatus( session, AuditBO.TERMINATED );
// Pour chaque audit, on r�cup�re son pr�c�dent et on calcule le nombre de corrections
AuditBO currentAudit;
ApplicationBO currentApplication;
AuditBO previousAudit;
Long auditId;
for ( int i = 0; i < audits.size(); i++ )
{
currentAudit = (AuditBO) audits.get( i );
auditId = new Long( currentAudit.getId() );
// On charge l'application associ�e
currentApplication = appliDAO.loadByAuditId( session, auditId );
// Si il n'y a pas de mesure de ROI d�j� calcul�e pour cette application
if ( null == measureDAO.load( session, new Long( currentApplication.getId() ), auditId,
RoiMetricsBO.class ) )
{
// On r�cup�re l'audit pr�c�dent
previousAudit =
auditDAO.findPreviousAudit( session, currentAudit.getId(), currentAudit.getHistoricalDate(),
currentApplication.getId(), null );
if ( null != previousAudit )
{
// On calcule le nombre de corrections r�alis� entre les deux audits
int nbCorrections = calculateNbCorrection( session, previousAudit, currentAudit, null );
mLOGGER.info( "nbCorrections = " + nbCorrections + " pour l'application \""
+ currentApplication.getName() + "\" de l'audit n� " + previousAudit.getId()
+ " � l'audit n� " + currentAudit.getId() );
// Cr�ation de la mesure
createROI( session, nbCorrections, currentApplication, currentAudit );
}
}
}
}
catch ( Exception e )
{
e.printStackTrace();
}
finally
{
if ( null != session )
{
session.closeSession();
}
}
}
}