/**
* 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.enterpriselayer.facade.quality;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
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.commons.exception.JrafEnterpriseException;
import org.squale.jraf.commons.exception.JrafPersistenceException;
import org.squale.jraf.helper.PersistenceHelper;
import org.squale.jraf.provider.persistence.hibernate.facade.FacadeHelper;
import org.squale.jraf.spi.enterpriselayer.IFacade;
import org.squale.jraf.spi.persistence.IPersistenceProvider;
import org.squale.jraf.spi.persistence.ISession;
import org.squale.squalecommon.daolayer.component.AbstractComponentDAOImpl;
import org.squale.squalecommon.daolayer.component.AuditGridDAOImpl;
import org.squale.squalecommon.daolayer.result.MarkDAOImpl;
import org.squale.squalecommon.daolayer.result.MeasureDAOImpl;
import org.squale.squalecommon.daolayer.result.PracticeResultDAOImpl;
import org.squale.squalecommon.daolayer.result.QualityResultDAOImpl;
import org.squale.squalecommon.daolayer.result.rulechecking.RuleCheckingTransgressionDAOImpl;
import org.squale.squalecommon.daolayer.result.rulechecking.RuleCheckingTransgressionItemDAOImpl;
import org.squale.squalecommon.daolayer.rule.QualityRuleDAOImpl;
import org.squale.squalecommon.datatransfertobject.component.AuditDTO;
import org.squale.squalecommon.datatransfertobject.component.AuditGridDTO;
import org.squale.squalecommon.datatransfertobject.component.ComponentDTO;
import org.squale.squalecommon.datatransfertobject.export.ActionPlanDTO;
import org.squale.squalecommon.datatransfertobject.remediation.ComponentCriticalityComparator;
import org.squale.squalecommon.datatransfertobject.remediation.ComponentCriticalityDTO;
import org.squale.squalecommon.datatransfertobject.remediation.PracticeCriticalityComparator;
import org.squale.squalecommon.datatransfertobject.remediation.PracticeCriticalityDTO;
import org.squale.squalecommon.datatransfertobject.result.MarkDTO;
import org.squale.squalecommon.datatransfertobject.result.PracticeEvolutionDTO;
import org.squale.squalecommon.datatransfertobject.result.QualityResultDTO;
import org.squale.squalecommon.datatransfertobject.result.ResultsDTO;
import org.squale.squalecommon.datatransfertobject.rule.AbstractFormulaDTO;
import org.squale.squalecommon.datatransfertobject.rule.PracticeRuleDTO;
import org.squale.squalecommon.datatransfertobject.rule.QualityGridDTO;
import org.squale.squalecommon.datatransfertobject.rule.QualityRuleDTO;
import org.squale.squalecommon.datatransfertobject.rulechecking.RuleCheckingDTO;
import org.squale.squalecommon.datatransfertobject.transform.component.AuditGridTransform;
import org.squale.squalecommon.datatransfertobject.transform.component.ComponentTransform;
import org.squale.squalecommon.datatransfertobject.transform.result.MarkTransform;
import org.squale.squalecommon.datatransfertobject.transform.result.PracticeEvolutionTransform;
import org.squale.squalecommon.datatransfertobject.transform.result.QualityResultTransform;
import org.squale.squalecommon.datatransfertobject.transform.result.ResultsTransform;
import org.squale.squalecommon.datatransfertobject.transform.rule.QualityRuleTransform;
import org.squale.squalecommon.datatransfertobject.transform.rulechecking.RuleCheckingItemTransform;
import org.squale.squalecommon.enterpriselayer.businessobject.component.AbstractComplexComponentBO;
import org.squale.squalecommon.enterpriselayer.businessobject.component.AbstractComponentBO;
import org.squale.squalecommon.enterpriselayer.businessobject.component.AuditGridBO;
import org.squale.squalecommon.enterpriselayer.businessobject.component.ProjectBO;
import org.squale.squalecommon.enterpriselayer.businessobject.result.IntegerMetricBO;
import org.squale.squalecommon.enterpriselayer.businessobject.result.MarkBO;
import org.squale.squalecommon.enterpriselayer.businessobject.result.PracticeResultBO;
import org.squale.squalecommon.enterpriselayer.businessobject.result.QualityResultBO;
import org.squale.squalecommon.enterpriselayer.businessobject.result.rulechecking.RuleCheckingTransgressionBO;
import org.squale.squalecommon.enterpriselayer.businessobject.rule.AbstractFormulaBO;
import org.squale.squalecommon.enterpriselayer.businessobject.rule.PracticeRuleBO;
import org.squale.squalecommon.enterpriselayer.businessobject.rule.QualityRuleBO;
import org.squale.squalecommon.enterpriselayer.businessobject.rulechecking.RuleBO;
import org.squale.squalecommon.enterpriselayer.businessobject.rulechecking.RuleSetBO;
import org.squale.squalecommon.enterpriselayer.facade.FacadeMessages;
import org.squale.squalecommon.enterpriselayer.facade.component.ComponentFacade;
import org.squale.squalecommon.enterpriselayer.facade.rule.QualityGridFacade;
import org.squale.squalecommon.util.ConstantRulesChecking;
import org.squale.squalecommon.util.mapping.Mapping;
/**
* By m400841
*/
public final class QualityResultFacade
implements IFacade
{
/** log */
private static Log LOG = LogFactory.getLog( QualityResultFacade.class );
/**
* provider de persistence
*/
private static final IPersistenceProvider PERSISTENTPROVIDER = PersistenceHelper.getPersistenceProvider();
/**
* The ruke prefix
*/
private final static String RULE_PREFIX = "rule.";
/**
* Obtention des r�sultats qualit�
*
* @param pAuditDTOs audits
* @param pProject projet
* @param pRuleDTOs DTOs des r�gles qualit�
* @return r�sultats
* @throws JrafEnterpriseException si erreur
*/
public static ResultsDTO getQResults( Collection pAuditDTOs, ComponentDTO pProject, Collection pRuleDTOs )
throws JrafEnterpriseException
{
// Initialisation
ResultsDTO results = new ResultsDTO(); // retour de la facade
List resultsBO = null; // retour des diff�rentes DAOs
// Initialisation de la session Hibernate
ISession session = null;
// Initialisation des parametres des differentes DAO
Long componentID = new Long( pProject.getID() ); // identifiant de l'audit
try
{
session = PERSISTENTPROVIDER.getSession();
// ajout de la premiere liste dans ResultsDTO
results.put( null, new ArrayList( pRuleDTOs ) );
// Initialisation des DAOs
QualityResultDAOImpl qualityResultDAO = QualityResultDAOImpl.getInstance();
MarkDAOImpl markDAO = MarkDAOImpl.getInstance();
AbstractComponentDAOImpl componentDao = AbstractComponentDAOImpl.getInstance();
// recuperation du composant objet metier pour en connaitre son type
AbstractComplexComponentBO componentBO =
(AbstractComplexComponentBO) componentDao.get( session, componentID );
// Lancement n fois de la methode avec la liste des classes des TREs en parametre
Iterator auditIterator = pAuditDTOs.iterator();
AuditDTO auditTemp = null;
Long auditID = null;
// Conversion des RuleDTO en Id
ArrayList ruleIds = new ArrayList();
Iterator rulesIt = pRuleDTOs.iterator();
while ( rulesIt.hasNext() )
{
QualityRuleDTO ruleDTO = (QualityRuleDTO) rulesIt.next();
ruleIds.add( new Long( ruleDTO.getId() ) );
}
while ( auditIterator.hasNext() && results != null )
{
auditTemp = (AuditDTO) auditIterator.next();
auditID = new Long( auditTemp.getID() );
resultsBO = new ArrayList();
resultsBO.addAll( ResultsTransform.bo2Dto( qualityResultDAO.findWhere( session, componentID, auditID,
ruleIds ) ) );
results.put( auditTemp, resultsBO );
}
}
catch ( JrafDaoException e )
{
results = null;
LOG.error( QualityResultFacade.class.getName() + ".getQResultByTREAndAudit", e );
}
finally
{
FacadeHelper.closeSession( session, QualityResultFacade.class.getName() + ".getQResltsByTREAndAudit" );
}
return results;
}
/**
* Permet de r�cup�rer une valeur pour un type de r�sultat, un composant et un audit donn�
*
* @param pAudit AuditDTO valide renseignant l'identifiant de l'audit
* @param pComponent ComponentDTO valide contenant l'identifiant du composant
* @param pKeyTRE cl� du type �l�mentaire de r�sultat valide
* @return ResultsDTO correspondant � une valeur
* @throws JrafEnterpriseException exception JRAF
* @roseuid 42CBFFB500F7
*/
public static ResultsDTO getQResults( AuditDTO pAudit, ComponentDTO pComponent, Long pKeyTRE )
throws JrafEnterpriseException
{
// initialisation
ResultsDTO results = null; // retour de la facade
Object daoResult = null; // retour de la dao
// parametre de la dao
// Class treClass = CommonMessages.getClass(pKeyTRE); // classe relative a la cl� du TRE
Long componentID = new Long( pComponent.getID() );
Long auditID = new Long( pAudit.getID() );
// Session hibernate et dao des composants
ISession session = null;
AbstractComponentDAOImpl abstractComponentDao = AbstractComponentDAOImpl.getInstance();
try
{
session = PERSISTENTPROVIDER.getSession();
AbstractComponentBO componentBO = (AbstractComponentBO) abstractComponentDao.get( session, componentID );
// Traitement du cas ou le composant est different du projet pour les pratiques
if ( !( componentBO instanceof ProjectBO ) )
{
MarkDAOImpl markDao = MarkDAOImpl.getInstance();
daoResult = markDao.load( session, componentID, auditID, pKeyTRE );
// Traitement des autres cas
}
else
{
QualityResultDAOImpl qualityResultDAO = QualityResultDAOImpl.getInstance();
daoResult = qualityResultDAO.load( session, componentID, auditID, pKeyTRE );
}
// ajout des listes au ResultsDTO
List resultList = new ArrayList();
results = new ResultsDTO();
resultList.add( daoResult );
results.put( null, ResultsTransform.bo2Dto( resultList ) );
}
catch ( JrafDaoException e )
{
results = null;
LOG.error( QualityResultFacade.class.getName() + ".getQResults", e );
}
finally
{
FacadeHelper.closeSession( session, QualityResultFacade.class.getName() + ".getQReslts" );
}
return results;
}
/**
* Permet de r�cup�rer une liste de valeurs pour une liste de types de r�sultat, un type de composant et un audit
* donn� Format de ResultsDTO : 2 lignes : -- null en cl� et liste des cl�s des TREs en valeur -- ComponentDTO en
* cl� et liste des r�sultats associ�es en valeur
*
* @param pAudit AudtDTO renseignant l'ID de l'audit
* @param pComponent ComponentDTO renseignant l'ID du composant
* @return ResultsDTO
* @throws JrafEnterpriseException exception JRAF
* @roseuid 42CBFFB50114
*/
public static ResultsDTO getAllQResults( AuditDTO pAudit, ComponentDTO pComponent )
throws JrafEnterpriseException
{
// Initialisation
ResultsDTO results = null; // retour de la facade
List daoResults = new ArrayList(); // retour des differentes DAOs
// Initialisation de la session Hibernate
ISession session = null;
// Initialisation des parametres de la DAO
Long auditID = new Long( pAudit.getID() ); // identifiant de l'audit
Long componentID = new Long( pComponent.getID() );
// identifiant du composant
List sortedTreKeys = new ArrayList();
try
{
session = PERSISTENTPROVIDER.getSession();
AbstractComponentDAOImpl componentDao = AbstractComponentDAOImpl.getInstance();
AbstractComponentBO componentBO = (AbstractComponentBO) componentDao.get( session, componentID );
// Traitement du cas de composants differents de projet et cles de pratiques
if ( !( componentBO instanceof ProjectBO ) )
{
MarkDAOImpl markDao = MarkDAOImpl.getInstance();
daoResults.addAll( markDao.findWhere( session, componentID, auditID ) );
// Construction des clefs
Iterator it = daoResults.iterator();
while ( it.hasNext() )
{
MarkBO mark = (MarkBO) it.next();
QualityRuleDTO dto = QualityRuleTransform.bo2Dto( mark.getPractice().getRule(), false );
sortedTreKeys.add( dto );
}
}
else
{
// Traitement des autres cas
QualityResultDAOImpl qualityResultDAO = QualityResultDAOImpl.getInstance();
daoResults.addAll( qualityResultDAO.findWhere( session, componentID, auditID ) );
}
// ajout des listes au ResultsDTO
results = new ResultsDTO();
// Traitement des clefs
results.put( null, sortedTreKeys );
List resultsBO = ResultsTransform.bo2Dto( daoResults );
results.put( pComponent, resultsBO );
}
catch ( JrafDaoException e )
{
LOG.error( QualityResultFacade.class.getName() + ".getQResultByTRE", e );
}
finally
{
FacadeHelper.closeSession( session, QualityResultFacade.class.getName() + ".getQResltsByTRE" );
}
return results;
}
/**
* R�cup�re les pratiques li�es � un audit et � un projet
*
* @param pProjectID l'id du projet
* @param pAuditID l'id de l'audit
* @return les pratiques
* @throws JrafEnterpriseException exception JRAF
*/
public static Collection findPracticesWhere( Long pProjectID, Long pAuditID )
throws JrafEnterpriseException
{
// Initialisation de la session Hibernate
ISession session = null;
Collection resultsBO = new ArrayList( 0 );
Collection resultsDto = new ArrayList( 0 );
Collection resultsDtoAll = new ArrayList( 0 );
try
{
session = PERSISTENTPROVIDER.getSession();
QualityResultDAOImpl dao = QualityResultDAOImpl.getInstance();
resultsBO = dao.findPracticesWhere( session, pProjectID, pAuditID );
// Transformation
Iterator it = resultsBO.iterator();
while ( it.hasNext() )
{
QualityRuleBO ruleBo = ( (QualityResultBO) it.next() ).getRule();
QualityRuleDTO ruleDto = QualityRuleTransform.bo2Dto( ruleBo, true );
resultsDto.add( ruleDto );
}
// ajoute les pratiques
resultsDtoAll.add( resultsDto );
// les notes associ�es
resultsDtoAll.add( ResultsTransform.bo2Dto( resultsBO ) );
}
catch ( JrafDaoException e )
{
LOG.error( QualityResultFacade.class.getName() + ".findPracticesWhere", e );
}
finally
{
FacadeHelper.closeSession( session, QualityResultFacade.class.getName() + ".findPracticesWhere" );
}
return resultsDtoAll;
}
/**
* R�cup�re les noms des pratiques li�es � un audit et � un type de composant
*
* @param pProjectID l'id du projet
* @param pAuditID l'id de l'audit
* @return les pratiques
* @throws JrafEnterpriseException exception JRAF
*/
public static Collection findPracticeNameWhere( Long pProjectID, Long pAuditID )
throws JrafEnterpriseException
{
// Initialisation de la session Hibernate
ISession session = null;
Collection resultsBO = new ArrayList( 0 );
Collection names = new ArrayList( 0 );
try
{
session = PERSISTENTPROVIDER.getSession();
QualityResultDAOImpl dao = QualityResultDAOImpl.getInstance();
resultsBO = dao.findPracticesWhere( session, pProjectID, pAuditID );
for ( Iterator it = resultsBO.iterator(); it.hasNext(); )
{
QualityRuleBO ruleBo = ( (QualityResultBO) it.next() ).getRule();
// On transforme directement le nom pour le web afin de pouvoir trier
names.add( "rule." + ruleBo.getName() );
}
}
catch ( JrafDaoException e )
{
LOG.error( QualityResultFacade.class.getName() + ".findPracticeNameWhere", e );
}
finally
{
FacadeHelper.closeSession( session, QualityResultFacade.class.getName() + ".findPracticeNameWhere" );
}
return names;
}
/**
* Permet de r�cup�rer des valeurs pour un type de r�sultat, un type de composant et plusieurs audits donn�s
*
* @param pKeyTRE cl� du type elementaire de resultat
* @param pProject ComponentDTO renseignant l'ID du composant
* @param pAuditDTOs liste des DTOs des audits souhait�s
* @return ResultsDTO
* @throws JrafEnterpriseException exception JRAF
* @roseuid 42CBFFB50133
*/
public static ResultsDTO getQResultsByAudit( List pAuditDTOs, Long pKeyTRE, ComponentDTO pProject )
throws JrafEnterpriseException
{
// Initialisation
ResultsDTO results = null; // retour de la facade
List daoResults = new ArrayList(); // retour de qualityResultDAOImpl
// Initialisation de la session Hibernate
ISession session = null;
// Initialisation des parametres de la DAO
Long componentID = new Long( pProject.getID() );
// identifiant de l'audit
List auditIDs = new ArrayList(); // identifiant du composant
// Recuperation sous forme de liste des identifiants des audits
// On supprime avant les audits qui peuvent �tre nuls car l'audit pr�c�dent peut �tre nul
pAuditDTOs.remove( null );
Iterator auditIterator = pAuditDTOs.iterator();
Long idTemp = null;
while ( auditIterator.hasNext() )
{
// L'audit pr�c�dent peut �tre nul!
AuditDTO currentAudit = (AuditDTO) auditIterator.next();
idTemp = new Long( currentAudit.getID() );
auditIDs.add( idTemp );
}
try
{
session = PERSISTENTPROVIDER.getSession();
AbstractComponentDAOImpl componentDao = AbstractComponentDAOImpl.getInstance();
AbstractComplexComponentBO componentBO =
(AbstractComplexComponentBO) componentDao.get( session, componentID );
QualityResultDAOImpl qualityResultDAO = QualityResultDAOImpl.getInstance();
daoResults.addAll( qualityResultDAO.findWhere( session, componentID, auditIDs, pKeyTRE ) );
// ajout des listes au ResultsDTO
if ( daoResults.size() == auditIDs.size() )
{
results = new ResultsDTO();
results.put( null, pAuditDTOs );
List resultsBO = ResultsTransform.bo2Dto( daoResults );
results.put( pProject, resultsBO );
}
else
{
LOG.error( FacadeMessages.getString( "facade.exception.qualityresultfacade.getbyaudit.listssizedifferent" ) );
}
}
catch ( JrafDaoException e )
{
LOG.error( QualityResultFacade.class.getName() + ".getQResultByAudit", e );
}
finally
{
FacadeHelper.closeSession( session, QualityResultFacade.class.getName() + ".getQResltsByAudit" );
}
return results;
}
/**
* Permet de r�cup�rer des valeurs pour une liste de types de r�sultat, une liste de types de composant et un audit
* donn�s
*
* @param pAudit AuditDTO renseignant l'ID de l'audit
* @param pComponentDTOs liste des DTOs des projets souhait�s
* @return ResultsDTO dans le format suivant -- Cl� : null -- Valeur : { [cl�s de pratiques], [cl�s de resultats
* qualit�s] } -- Cl� : ComponentDTO -- Valeur : liste de r�sultats (n fois)
* @throws JrafEnterpriseException exception JRAF
* @roseuid 42CBFFB50148
*/
public static ResultsDTO getQResultsByFactorAndProject( List pComponentDTOs, AuditDTO pAudit )
throws JrafEnterpriseException
{
// Initialisation
ResultsDTO results = new ResultsDTO(); // retour de la facade
List resultsBO = null; // transformation du retour des diff�rentes DAOs
// Initialisation de la session Hibernate
ISession session = null;
// Initialisation des parametres des differentes DAO
Long auditID = new Long( pAudit.getID() ); // identifiant de l'audit
try
{
// Initialisation de la session Hibernate
session = PERSISTENTPROVIDER.getSession();
// Lancement n fois de la methode avec la liste des des classes des TREs en parametre
Iterator componentIterator = pComponentDTOs.iterator();
ComponentDTO currentComponent = null;
Long componentID = null;
String componentType = null;
// Initialisation des differentes Daos
MarkDAOImpl markDao = MarkDAOImpl.getInstance();
QualityResultDAOImpl qualityResultDao = QualityResultDAOImpl.getInstance();
AbstractComponentDAOImpl componentDao = AbstractComponentDAOImpl.getInstance();
AuditGridDAOImpl auditGridDao = AuditGridDAOImpl.getInstance();
while ( componentIterator.hasNext() && results != null )
{
currentComponent = (ComponentDTO) componentIterator.next();
componentID = new Long( currentComponent.getID() );
componentType = currentComponent.getType();
resultsBO = new ArrayList();
AbstractComplexComponentBO currentComponentBO =
(AbstractComplexComponentBO) componentDao.get( session, componentID );
resultsBO.addAll( ResultsTransform.bo2Dto( qualityResultDao.findWhere( session, componentID, auditID ) ) );
AuditGridDTO auditGrid = getAuditGrid( session, currentComponent, pAudit );
if ( auditGrid != null )
{
// Ajout d'une nouvelle ligne dans le ResultsDTO
results.put( auditGrid, resultsBO );
}
}
}
catch ( JrafDaoException e )
{
results = null;
LOG.error( QualityResultFacade.class.getName() + ".getQResultByTREAndComponent", e );
}
finally
{
FacadeHelper.closeSession( session, QualityResultFacade.class.getName() + ".getQResltsByTREAndComponent" );
}
return results;
}
/**
* Obtention de la grille qualit� correspondant � un audit
*
* @param pProject projet
* @param pAudit audit
* @return grille qualit� rattach�e � l'audit
* @throws JrafEnterpriseException si erreur
*/
public static AuditGridDTO getAuditGrid( ComponentDTO pProject, AuditDTO pAudit )
throws JrafEnterpriseException
{
AuditGridDTO result = null;
// Initialisation de la session Hibernate
ISession session = null;
try
{
// Initialisation de la session Hibernate
session = PERSISTENTPROVIDER.getSession();
result = getAuditGrid( session, pProject, pAudit );
}
catch ( JrafDaoException e )
{
LOG.error( QualityResultFacade.class.getName() + ".getAuditGrid", e );
}
finally
{
FacadeHelper.closeSession( session, QualityResultFacade.class.getName() + ".getAuditGrid" );
}
return result;
}
/**
* Obtention de la grille d'audit pour un projet et un audit La grille correspondante est cherch�e dans la abse de
* donn�es, si elle n'existe pas une grille vierge est renvoy�e
*
* @param pSession session session
* @param pProject projet projet
* @param pAudit audit audit
* @return grille d'audit correspondante, une grille vierge est renvoy�e si la grille n'est pas trouv�e dans la base
* @throws JrafEnterpriseException si erreur
* @throws JrafDaoException si erreur
*/
private static AuditGridDTO getAuditGrid( ISession pSession, ComponentDTO pProject, AuditDTO pAudit )
throws JrafEnterpriseException, JrafDaoException
{
AuditGridDTO result = null;
Long auditID = new Long( pAudit.getID() ); // identifiant de l'audit
AuditGridDAOImpl auditGridDao = AuditGridDAOImpl.getInstance();
AuditGridBO auditGrid = auditGridDao.findWhere( pSession, new Long( pProject.getID() ), auditID );
if ( auditGrid != null )
{
result = AuditGridTransform.bo2dto( auditGrid );
}
else
{
// On cr�� une grille vide
result = new AuditGridDTO();
result.setGrid( new QualityGridDTO() );
result.getGrid().setFactors( new ArrayList() );
result.setProject( pProject );
result.setAudit( pAudit );
}
return result;
}
/**
* Permet de r�cup�rer des valeurs pour une liste de types de r�sultat, un type de composant et une liste d'audits
* donn�s
*
* @dev-squale cr�er la m�me m�thode que pour les projets avec en parametres une collection d'audits et une
* collection de TREs
* @param pProject ComponentDTO renseignant l'ID du composant. Peut �tre <code>null</code> dans le cas de la
* comparaison de projets
* @param pAuditDTOs liste des DTOs des audits souhait�s
* @return ResultsDTO
* @throws JrafEnterpriseException exception JRAF
* @roseuid 42CBFFB5015A
*/
public static ResultsDTO getQResultsByTREAndAudit( List pAuditDTOs, ComponentDTO pProject )
throws JrafEnterpriseException
{
// Initialisation
ResultsDTO results = new ResultsDTO(); // retour de la facade
List resultsBO = null; // retour des diff�rentes DAOs
// Initialisation de la session Hibernate
ISession session = null;
// Initialisation des parametres des differentes DAO
Long componentID = new Long( pProject.getID() ); // identifiant de l'audit
try
{
session = PERSISTENTPROVIDER.getSession();
// Initialisation des DAOs
QualityResultDAOImpl qualityResultDAO = QualityResultDAOImpl.getInstance();
MarkDAOImpl markDAO = MarkDAOImpl.getInstance();
AbstractComponentDAOImpl componentDao = AbstractComponentDAOImpl.getInstance();
AuditGridDAOImpl auditGridDao = AuditGridDAOImpl.getInstance();
// recuperation du composant objet metier pour en connaitre son type
AbstractComplexComponentBO componentBO =
(AbstractComplexComponentBO) componentDao.get( session, componentID );
ComponentDTO projectDTO = new ComponentDTO();
projectDTO.setID( componentBO.getId() );
// Lancement n fois de la methode avec la liste des des classes des TREs en parametre
Iterator auditIterator = pAuditDTOs.iterator();
AuditDTO auditTemp = null;
Long auditID = null;
while ( auditIterator.hasNext() && results != null )
{
auditTemp = (AuditDTO) auditIterator.next();
if ( null != auditTemp )
{
auditID = new Long( auditTemp.getID() );
resultsBO = new ArrayList();
resultsBO.addAll( ResultsTransform.bo2Dto( qualityResultDAO.findWhere( session, componentID,
auditID ) ) );
AuditGridDTO auditGrid = getAuditGrid( session, projectDTO, auditTemp );
results.put( auditGrid, resultsBO );
}
}
}
catch ( JrafDaoException e )
{
results = null;
LOG.error( QualityResultFacade.class.getName() + ".getQResultByTREAndAudit", e );
}
finally
{
FacadeHelper.closeSession( session, QualityResultFacade.class.getName() + ".getQResltsByTREAndAudit" );
}
return results;
}
/**
* Permet de r�cup�rer les notes associ�s a une pratique ainsi que le tableau de r�partition
*
* @param pAudits liste des AuditDTOs
* @param pProject ComponentDTO relatif a un projet
* @param pPratice pratique
* @return ResultsDTO avec les deux Map renseignes
* @throws JrafEnterpriseException exception Jraf
*/
public static ResultsDTO getRepartition( List pAudits, ComponentDTO pProject, PracticeRuleDTO pPratice )
throws JrafEnterpriseException
{
// Initialisation
ISession session = null; // session Hibernate
pAudits.remove( null );
List auditIds = initAuditIds( pAudits ); // liste des identifiants des AuditDTO
Long projectId = new Long( pProject.getID() );
ResultsDTO results = null; // retour de la methode
Map intRepartitionMap = new HashMap(); // Map de la repartition de composants sur une pratique pour des
// intervalles de pas = 1
Map floatRepartitionMap = new HashMap(); // Map de la repartition de composants sur une pratique pour des
// intervalles de pas = 0.1
List practiceBOs = null;
// Initialisation des Daos
QualityResultDAOImpl qualityResultDao = QualityResultDAOImpl.getInstance();
try
{
session = PERSISTENTPROVIDER.getSession();
Long treKey = new Long( pPratice.getId() );
results = getQResultsByAudit( pAudits, treKey, pProject );
// Chargement des pratiques pour recuperer les repartitions
practiceBOs = qualityResultDao.findWhere( session, projectId, auditIds, treKey );
// Mise des valeurs dans la Map repartitionMap
if ( practiceBOs != null )
{
ListIterator practiceIterator = practiceBOs.listIterator();
PracticeResultBO practiceResult = null;
while ( practiceIterator.hasNext() )
{
Object objTemp = practiceIterator.next();
if ( objTemp != null )
{
practiceResult = (PracticeResultBO) objTemp;
intRepartitionMap.put( pAudits.get( practiceIterator.nextIndex() - 1 ),
practiceResult.getIntRepartition() );
floatRepartitionMap.put( pAudits.get( practiceIterator.nextIndex() - 1 ),
practiceResult.getFloatRepartition() );
}
else
{
intRepartitionMap.put( pAudits.get( practiceIterator.nextIndex() - 1 ), objTemp );
floatRepartitionMap.put( pAudits.get( practiceIterator.nextIndex() - 1 ), objTemp );
}
}
}
// affectation de la map au ResultsDTO
if ( results != null )
{
if ( intRepartitionMap.keySet().size() > 0 )
{
results.setIntRepartitionPracticeMap( intRepartitionMap );
}
if ( floatRepartitionMap.keySet().size() > 0 )
{
results.setFloatRepartitionPracticeMap( floatRepartitionMap );
}
}
else
{
results = null;
}
}
catch ( JrafDaoException e )
{
LOG.error( QualityResultFacade.class.getName() + ".getRepartiton", e );
}
finally
{
FacadeHelper.closeSession( session, QualityResultFacade.class.getName() + ".getRepartition" );
}
return results;
}
/**
* Permet de r�cup�rer les notes associ�s a une pratique ainsi que les regles avec le nombre de fois que elle a �t�
* transgress�e
*
* @param pAudits liste des AuditDTOs
* @param pProject ComponentDTO relatif a un projet
* @param pPratice pratique
* @return ResultsDTO avec les deux Map renseignes ResultsMap : <br/>
* -- Cl� : null -- Valeur : Liste d'AuditDTO <br/>
* -- Cl� : ComponentDTO -- Valeurs : notes associ�es aux audits dans le m�me ordre que la liste d'audit de
* type java.lang.Float<br/>
* PracticeMap : n lignes de la forme suivante :<br/>
* -- Cl� : AuditDTO -- Valeur : map de <RuleCheckingDTO,java.lang.Integer>
* @throws JrafEnterpriseException exception Jraf
*/
public static ResultsDTO getRuleChecking( List pAudits, ComponentDTO pProject, PracticeRuleDTO pPratice )
throws JrafEnterpriseException
{
// Initialisation
ISession session = null; // session Hibernate
List auditIds = initAuditIds( pAudits ); // liste des identifiants des AuditDTO
Long projectId = new Long( pProject.getID() );
ResultsDTO results = null; // retour de la methode
Map practiceMap = new HashMap(); // Map du nombre de violation sur une r�gle
Collection measures = null;
RuleCheckingTransgressionBO measure = null;
// Initialisation des Daos
RuleCheckingTransgressionDAOImpl measureDAO = RuleCheckingTransgressionDAOImpl.getInstance();
try
{
session = PERSISTENTPROVIDER.getSession();
Long treKey = new Long( pPratice.getId() );
results = getQResultsByAudit( pAudits, treKey, pProject );
ListIterator auditIdsIterator = auditIds.listIterator();
Long currentID = null;
// On construit la liste des types de mesures li�es � la pratique
// On r�cup�re la pratique en base pour avoir la formule
PracticeRuleBO ruleWithFormula =
(PracticeRuleBO) QualityRuleDAOImpl.getInstance().get( session, new Long( pPratice.getId() ) );
AbstractFormulaBO formula = ruleWithFormula.getFormula();
Collection measuresKind = buildClassesMeasureKind( formula.getMeasureKinds(), formula.getComponentLevel() );
while ( auditIdsIterator.hasNext() )
{
// recuperer les mesures Ruleschecking des diff�rents audits
currentID = (Long) ( auditIdsIterator.next() );
measures = measureDAO.load( session, projectId, currentID );
if ( measures.size() == 0 )
{
LOG.error( QualityResultFacade.class.getName() + ".getRuleChecking"
+ "mesures de rulechecking sont nulles" );
}
// Map contenant tous les r�sultats, cel� permet de
// fusionner des donn�es issues de diff�rents outils
Map allResults = new HashMap();
// On parcours les mesures jusqu'� pouvoir ins�rer les r�gles
// dans la map des pratiques
for ( Iterator it = measures.iterator(); it.hasNext(); )
{
measure = (RuleCheckingTransgressionBO) it.next();
// Si la mesure est prise en compte dans le calcul de la note
// on ajoute les r�sultats associ�s
if ( measuresKind.contains( measure.getClass() ) )
{
Map resultsRulesChecking = makeRulesCheckingDTO( measure, pPratice.getName() );
// On ins�re les r�gles dans la map des pratiques
allResults.putAll( resultsRulesChecking );
}
}
AuditDTO auditDTO = (AuditDTO) pAudits.get( auditIdsIterator.nextIndex() - 1 );
practiceMap.put( auditDTO, allResults );
}
// affectation de la map au ResultsDTO
results.setIntRepartitionPracticeMap( practiceMap );
}
catch ( JrafDaoException e )
{
LOG.error( QualityResultFacade.class.getName() + ".getRuleChecking", e );
}
finally
{
FacadeHelper.closeSession( session, QualityResultFacade.class.getName() + ".getRuleChecking" );
}
return results;
}
/**
* @param pCollection la collection des types de mesures
* @param pComponentLevel le type de composant
* @return les classes correspondantes aux types des mesures
*/
private static Collection buildClassesMeasureKind( Collection pCollection, String pComponentLevel )
{
Collection results = new ArrayList();
for ( Iterator it = pCollection.iterator(); it.hasNext(); )
{
results.add( Mapping.getMeasureClass( (String) it.next() + "." + pComponentLevel ) );
}
return results;
}
/**
* R�cup�re les d�tails d'une transgressions pour une r�gle donn�e.
*
* @param pMeasureID l'id de la mesure
* @param pRuleID l'id de la r�gle
* @return les d�tails de la mesure concernant la r�gle d'id <code>pRuleID</code>
* @throws JrafEnterpriseException si erreur
*/
public static Collection getRuleCheckingItems( Long pMeasureID, Long pRuleID )
throws JrafEnterpriseException
{
// Initialisation
ISession session = null; // session Hibernate
Collection details = new ArrayList();
// Initialisation des Daos
RuleCheckingTransgressionItemDAOImpl itemDAO = RuleCheckingTransgressionItemDAOImpl.getInstance();
try
{
session = PERSISTENTPROVIDER.getSession();
details = itemDAO.findWhereMeasureAndRule( session, pMeasureID, pRuleID );
details = RuleCheckingItemTransform.bo2Dto( details );
}
catch ( JrafDaoException e )
{
LOG.error( QualityResultFacade.class.getName() + ".getRuleCheckingItems", e );
}
finally
{
FacadeHelper.closeSession( session, QualityResultFacade.class.getName() + ".getRuleCheckingItems" );
}
return details;
}
/**
* @param pMeasure mesure rulechecking
* @param pRuleCategory cat�gorie de al r�gle
* @return Map les r�gles et leurs nombre d'occurence
*/
private static Map makeRulesCheckingDTO( RuleCheckingTransgressionBO pMeasure, String pRuleCategory )
{
// TODO adapter le code pour le rendre g�n�rique
// D�clarations
Map eventNumberMap = new HashMap();
boolean status = false;
Object ob = null;
Collection rules = null;
IntegerMetricBO value = null;
RuleBO rule = null;
RuleCheckingDTO ruleCheckingDto = null;
// on recup�re la liste des transgressions(metrics)
// qui correpondent � cette pratique
ob = pMeasure.getRuleSet();
// le ruleSet ne doit pas �tre null sinon il y a une erreur
if ( ob != null )
{
Map rulesMap = ( (RuleSetBO) ob ).getRules();
rules = rulesMap.values();
// On parcours le ruleSet
for ( Iterator itRule = rules.iterator(); itRule.hasNext(); )
{
rule = (RuleBO) itRule.next();
// prendre que les cat�gorie des r�gle concern�es
StringBuffer category = new StringBuffer( "rule." );
category.append( rule.getCategory() );
if ( category.toString().equals( pRuleCategory ) )
{
value = (IntegerMetricBO) pMeasure.getMetrics().get( rule.getCode() );
if ( value != null )
{
// On cr�e le dto
ruleCheckingDto = new RuleCheckingDTO();
ruleCheckingDto.setId( rule.getId() );
ruleCheckingDto.setSeverity( rule.getSeverity() );
ruleCheckingDto.setName( rule.getCode() );
ruleCheckingDto.setMeasureID( pMeasure.getId() );
eventNumberMap.put( ruleCheckingDto, value.getValue() );
}
else
{
status = true;
eventNumberMap = null;
LOG.error( QualityResultFacade.class.getName() + ".makeRulesCheckingDTO"
+ "la metric de la mesure est null" );
}
}
}
}
else
{
LOG.error( QualityResultFacade.class.getName() + ".makeRulesCheckingDTO"
+ "RuleSet de Mesure rulechecking: " + pMeasure.getId() + " est null" );
}
return eventNumberMap;
}
/**
* Permet de recuperer une liste d'identifiants d'AuditDTO a partir des objets
*
* @param pAuditDTOs liste d'AuditDTO
* @return List liste des identifiants des AuditDTOs
*/
private static List initAuditIds( List pAuditDTOs )
{
// Initialisation
List auditIds = new ArrayList(); // retour de la methode
Iterator auditIterator = pAuditDTOs.iterator();
Long currentID = null;
while ( auditIterator.hasNext() )
{
currentID = new Long( ( (AuditDTO) auditIterator.next() ).getID() );
auditIds.add( currentID );
}
return auditIds;
}
/**
* Constructeur vide
*
* @roseuid 42CBFFB50179
*/
private QualityResultFacade()
{
}
/**
* La table retourn�e est de la forme : <br/>
* key : ComponentDTO value : ResultDTO repr�sentant la liste des pratiques qui ont chang�es
*
* @param firstAudit l'audit le plus r�cent
* @param secondAudit l'audit le plus ancien
* @param project le projet
* @param filter le filtre � utiliser
* @param pLimit le nombre max de r�sultats � r�cup�rer
* @throws JrafEnterpriseException si erreur
* @return une table des pratiques qui ont chang�es entre <code>firstAudit</code> et <code>secondAudit</code> pour
* les composants de type <code>componentType</code>
*/
public static Collection getChangedComponents( AuditDTO firstAudit, AuditDTO secondAudit, ComponentDTO project,
Object[] filter, Integer pLimit )
throws JrafEnterpriseException
{
// Initialisation
ISession session = null; // session Hibernate
/* Map results = new HashMap(); // Map des r�sultats */
Collection evolutionDto = new ArrayList();
int cpt = pLimit.intValue();
try
{
session = PERSISTENTPROVIDER.getSession();
// On r�cup�re les composants qui n'existent plus
MarkDAOImpl markDAO = MarkDAOImpl.getInstance();
Long auditId1 = new Long( firstAudit.getID() );
Long auditId2 = new Long( secondAudit.getID() );
Long projectId = new Long( project.getID() );
if ( null == filter[PracticeEvolutionDTO.ONLY_UP_OR_DOWN_ID]
&& null == filter[PracticeEvolutionDTO.THRESHOLD_ID] )
{
// On r�cup�re les changements et on les transforme
// On recherche les composants qui on �t� supprim�s
Collection evolutionBO =
markDAO.findDeletedComponents( session, auditId1, auditId2, projectId, filter, cpt );
evolutionDto = PracticeEvolutionTransform.markCollectionToDto( evolutionBO, false );
cpt -= evolutionDto.size();
if ( cpt > 0 )
{
// On recherche les nouveaux composants
Collection newBO =
markDAO.findDeletedComponents( session, auditId2, auditId1, projectId, filter, cpt );
cpt -= newBO.size();
evolutionDto.addAll( PracticeEvolutionTransform.markCollectionToDto( newBO, true ) );
}
if ( cpt > 0 )
{
// Puis les composants qui ont chang� de note entre les deux audits
Collection changedTab =
markDAO.findChangedComponentWhere( session, auditId1, auditId2, projectId, filter, cpt );
Collection changedDto = PracticeEvolutionTransform.tabCollectionToDto( changedTab );
evolutionDto.addAll( changedDto );
}
}
else
{
evolutionDto = getFilterComponents( session, auditId1, auditId2, projectId, filter, cpt );
}
}
catch ( JrafDaoException e )
{
LOG.error( QualityResultFacade.class.getName() + ".getChangedComponents", e );
}
finally
{
FacadeHelper.closeSession( session, QualityResultFacade.class.getName() + ".getChangedComponents" );
}
return evolutionDto; // results;
}
/**
* @param session la session
* @param auditId1 l'audit le plus r�cent
* @param auditId2 l'audit le plus ancien
* @param projectId le projet
* @param filter le filtre
* @param limit le nombre max de composants � r�cup�rer
* @throws JrafDaoException si erreur
* @return une table des pratiques qui ont chang�es entre <code>firstAudit</code> et <code>secondAudit</code> pour
* les composants de type <code>componentType</code> et filtr�s avec <code>filtre</code>
*/
private static Collection getFilterComponents( ISession session, Long auditId1, Long auditId2, Long projectId,
Object[] filter, int limit )
throws JrafDaoException
{
// On r�cup�re les changements et on les transforme
Collection evolutionDto = new ArrayList();
MarkDAOImpl markDAO = MarkDAOImpl.getInstance();
if ( null != filter[PracticeEvolutionDTO.THRESHOLD_ID] )
{
Collection evolutionBO =
markDAO.findDeletedComponents( session, auditId2, auditId1, projectId, filter, limit );
evolutionDto = PracticeEvolutionTransform.markCollectionToDto( evolutionBO, true );
}
else
{
// Si on ne veut que les composants supprim�s
if ( PracticeEvolutionDTO.DELETED.equals( (String) filter[PracticeEvolutionDTO.ONLY_UP_OR_DOWN_ID] ) )
{
Collection evolutionBO =
markDAO.findDeletedComponents( session, auditId1, auditId2, projectId, filter, limit );
evolutionDto = PracticeEvolutionTransform.markCollectionToDto( evolutionBO, true );
}
else
{
Collection evolutionTab =
markDAO.findChangedComponentWhere( session, auditId1, auditId2, projectId, filter, limit );
evolutionDto = PracticeEvolutionTransform.tabCollectionToDto( evolutionTab );
}
}
return evolutionDto;
}
/**
* R�cup�re les pratiques � corriger pour le plan d'action (sous forme ActionPlanDTO)
*
* @param pAuditId l'id de l'audit
* @param pProjectId l'id du projet
* @param pHasLimit indique si il y a une limite du nombre de corrections � remonter
* @return les pratiques refus�es avec les premiers composants ayant la plus mauvaise note pour cette pratique (ou
* les transgressions)
* @throws JrafEnterpriseException si erreur
*/
public static Collection getWorstPractices( String pAuditId, String pProjectId, boolean pHasLimit )
throws JrafEnterpriseException
{ // Initialisation
// Initialisation
ISession session = null; // session Hibernate
Collection results = new ArrayList(); // le retour, on conserve l'ordre d'insertion des cl�s
MarkDAOImpl markDAO = MarkDAOImpl.getInstance();
RuleCheckingTransgressionItemDAOImpl itemDAO = RuleCheckingTransgressionItemDAOImpl.getInstance();
AuditDTO audit = new AuditDTO();
audit.setID( Long.parseLong( pAuditId ) );
try
{
session = PERSISTENTPROVIDER.getSession();
// On r�cup�re les pratiques refus�es pour ce projet et cet audit
PracticeResultDAOImpl practiceDAO = PracticeResultDAOImpl.getInstance();
Collection worstPractices = practiceDAO.findPracticesForActionPlan( session, pProjectId, pAuditId );
if ( pHasLimit )
{
results = getCorrectionsForActionPlan( session, worstPractices, audit, pProjectId );
}
else
{
results = countCorrectionsForActionPlan( session, worstPractices, audit, pProjectId );
}
}
catch ( JrafDaoException e )
{
LOG.error( QualityResultFacade.class.getName() + ".getWorstPractices", e );
}
finally
{
FacadeHelper.closeSession( session, QualityResultFacade.class.getName() + ".getWorstPractices" );
}
return results;
}
/**
* @param pSession la session
* @param pPractices les pratiques
* @param pAudit l'audit
* @param pProjectId l'id du projet
* @return une liste d'ActionPlanDTO r�pertoriant les pratiques et le nombre de composants ou transgressions �
* corriger
* @throws JrafDaoException si erreur dao
* @throws JrafEnterpriseException si erreur jraf
*/
private static Collection countCorrectionsForActionPlan( ISession pSession, Collection pPractices, AuditDTO pAudit,
String pProjectId )
throws JrafDaoException, JrafEnterpriseException
{
// Initialisation
MarkDAOImpl markDAO = MarkDAOImpl.getInstance();
MeasureDAOImpl measureDAO = MeasureDAOImpl.getInstance();
ActionPlanDTO actionPlan = null;
Collection results = new ArrayList(); // le retour, on conserve l'ordre d'insertion des cl�s
int nbcorrections = 0;
// Pour chaque pratique, on transforme en DTO et on r�cup�re le nombre des composants
// ou transgressions � corriger
for ( Iterator it = pPractices.iterator(); it.hasNext(); )
{
QualityResultBO practiceBO = (QualityResultBO) it.next();
String ruleName = practiceBO.getRule().getName();
// Transformation en DTO
QualityResultDTO practiceDTO = QualityResultTransform.bo2Dto( practiceBO );
PracticeRuleDTO rule = (PracticeRuleDTO) practiceDTO.getRule();
if ( rule.isRuleChecking() )
{
// R�cup�ration des types de mesure trait�s par la formule
AbstractFormulaDTO formula = rule.getFormula();
// Pour chaque type de mesure, on va r�cup�rer le nom de sa classe
String[] measureKinds = new String[formula.getMeasureKinds().size()];
formula.getMeasureKinds().toArray( measureKinds );
for ( int i = 0; i < measureKinds.length; i++ )
{
Class currentClass = Mapping.getMeasureClass( measureKinds[i] + "." + formula.getComponentLevel() );
if ( currentClass.getSuperclass().equals( RuleCheckingTransgressionBO.class ) )
{
RuleCheckingTransgressionBO trans =
(RuleCheckingTransgressionBO) measureDAO.load( pSession,
new Long( Long.parseLong( pProjectId ) ),
new Long( pAudit.getID() ), currentClass );
nbcorrections +=
trans.getTotalInfoNumberForCategory( ruleName )
+ trans.getTotalErrorNumberForCategory( ruleName )
+ trans.getTotalWarningNumberForCategory( ruleName );
}
}
}
else
{
// On r�cup�re les m�triques
Collection treChildren = ComponentFacade.getTREChildren( new Long( rule.getId() ) );
// On r�cup�re les plus mauvais composants pour cette pratiques
nbcorrections =
markDAO.countWorstWhere( pSession, new Long( practiceBO.getId() ), practiceDTO.getMeanMark() );
}
actionPlan = new ActionPlanDTO( practiceDTO, nbcorrections );
results.add( actionPlan );
nbcorrections = 0;
}
return results;
}
/**
* @param pSession la session
* @param pPractices les pratiques
* @param pAudit l'audit
* @param pProjectId l'id du projet
* @return une liste d'ActionPlanDTO r�pertoriant les pratiques et les composants ou transgressions � corriger
* @throws JrafDaoException si erreur dao
* @throws JrafEnterpriseException si erreur jraf
*/
private static Collection getCorrectionsForActionPlan( ISession pSession, Collection pPractices, AuditDTO pAudit,
String pProjectId )
throws JrafDaoException, JrafEnterpriseException
{
// Initialisation
final Integer limit = new Integer( 100 ); // On veut r�cup�rer les 100 plus mauvais composants
// On ne doit r�cup�rer qu'au maximum 100 composants donc on va d�cr�menter nbCorrections
// � chaque fois qu'on r�cup�re des composants ou des transgressions
int nbCorrections = limit.intValue();
MarkDAOImpl markDAO = MarkDAOImpl.getInstance();
RuleCheckingTransgressionItemDAOImpl itemDAO = RuleCheckingTransgressionItemDAOImpl.getInstance();
ActionPlanDTO actionPlan = null;
Collection results = new ArrayList(); // le retour, on conserve l'ordre d'insertion des cl�s
// Pour chaque pratique, on transforme en DTO et on r�cup�re les plus mauvais composants
// ou transgressions jusqu'� 100
for ( Iterator it = pPractices.iterator(); it.hasNext() && nbCorrections > 0; )
{
QualityResultBO practiceBO = (QualityResultBO) it.next();
String ruleName = practiceBO.getRule().getName();
// Transformation en DTO
QualityResultDTO practiceDTO = QualityResultTransform.bo2Dto( practiceBO );
PracticeRuleDTO rule = (PracticeRuleDTO) practiceDTO.getRule();
if ( rule.isRuleChecking() )
{
// R�cup�ration des types de mesure trait�s par la formule
AbstractFormulaDTO formula = rule.getFormula();
// Pour chaque type de mesure, on va r�cup�rer le nom de sa classe
String[] measureKinds = new String[formula.getMeasureKinds().size()];
formula.getMeasureKinds().toArray( measureKinds );
String[] measures = new String[measureKinds.length];
for ( int i = 0; i < measureKinds.length; i++ )
{
Class pTreClass = Mapping.getMeasureClass( measureKinds[i] + "." + formula.getComponentLevel() );
measures[i] = pTreClass.getName();
}
Collection items = new ArrayList();
Collection itemsFound = new ArrayList();
// On tri par s�v�rit�
for ( int i = 0; i < ConstantRulesChecking.SEVERITIES.length && nbCorrections > 0; i++ )
{
itemsFound =
itemDAO.findWhereMeasureClass( pSession, pProjectId, "" + pAudit.getID(), measures,
ConstantRulesChecking.SEVERITIES[i], ruleName,
new Integer( nbCorrections ) );
items.addAll( itemsFound );
nbCorrections -= itemsFound.size();
}
actionPlan = new ActionPlanDTO( practiceDTO, null, RuleCheckingItemTransform.bo2Dto( items ) );
}
else
{
// On r�cup�re les m�triques
Collection treChildren = ComponentFacade.getTREChildren( new Long( rule.getId() ) );
// On r�cup�re les plus mauvais composants pour cette pratiques
Collection marks =
markDAO.findWorstWhere( pSession, new Long( practiceBO.getId() ), practiceDTO.getMeanMark(),
new Integer( nbCorrections ) );
nbCorrections -= marks.size();
// On r�cup�re les r�sultats associ�s � chaque composant
ResultsDTO result =
MeasureFacade.getMeasuresByTREAndComponent( new Long( rule.getId() ), new ArrayList( treChildren ),
new ArrayList( getComponents( pSession, marks ) ),
pAudit );
actionPlan = new ActionPlanDTO( practiceDTO, result, null );
}
results.add( actionPlan );
}
return results;
}
/**
* @param pSession la session hibernate
* @param pMarks les MarkBO
* @return les composants associ�s sous forme DTO
* @throws JrafDaoException si erreur
*/
private static Collection getComponents( ISession pSession, Collection pMarks )
throws JrafDaoException
{
AbstractComponentDAOImpl dao = AbstractComponentDAOImpl.getInstance();
List components = new ArrayList();
if ( pMarks != null )
{
// et recupere le composant correspondant
Iterator markIterator = pMarks.iterator();
ComponentDTO currentComponent = null;
if ( components == null )
{
components = new ArrayList();
}
while ( markIterator.hasNext() )
{
MarkBO mark = (MarkBO) markIterator.next();
// On r�cup�re le v�ritable composant (sans proxy) dans le cas o� on a besoin d'initialiser le nom
// du fichier par exemple pour l'export IDE
AbstractComponentBO component =
(AbstractComponentBO) dao.load( pSession, new Long( mark.getComponent().getId() ) );
currentComponent = ComponentTransform.bo2DtoWithFullName( component );
components.add( currentComponent );
}
}
else
{
LOG.error( FacadeMessages.getString( "facade.exception.componentfacade.get.marknull" ) );
}
return components;
}
/**
* This method get back the last manual mark linked to the project and the practice rule give in argument
*
* @param projectId Id of the project
* @param practiceId Id of the practice rule
* @return a QualityResultDTO which contains the manual mark
* @throws JrafEnterpriseException Exception happened during the process
*/
public static QualityResultDTO findManualQualityResult( long projectId, long practiceId )
throws JrafEnterpriseException
{
ISession session = null;
QualityResultBO manualPraticeResult = null;
QualityResultDTO resultDto = null;
try
{
session = PERSISTENTPROVIDER.getSession();
QualityResultDAOImpl dao = QualityResultDAOImpl.getInstance();
// Search of the last mark for the practice
manualPraticeResult = dao.findLastManualMark( session, projectId, practiceId );
if ( manualPraticeResult != null )
{
// Transform the BO into DTO
resultDto = QualityResultTransform.bo2Dto( manualPraticeResult );
}
}
catch ( JrafDaoException e )
{
FacadeHelper.convertException( e, QualityResultFacade.class.getName() + ".findManualQualityResult" );
}
finally
{
FacadeHelper.closeSession( session, QualityResultFacade.class.getName() + ".findManualQualityResult" );
}
return resultDto;
}
/**
* This method get back the last manual mark linked to the project, the practice rule and the audit given in
* argument
*
* @param projectId ID of the project
* @param practiceId ID of the practice rule
* @param auditId ID of the audit
* @return a QualityResultDTO wich contains the manual mark
* @throws JrafEnterpriseException Exception happened during the process
*/
public static QualityResultDTO findManualQualityResultByAudit( long projectId, long practiceId, long auditId )
throws JrafEnterpriseException
{
ISession session = null;
QualityResultBO manualPracticeResult = null;
QualityResultDTO resultDto = null;
try
{
session = PERSISTENTPROVIDER.getSession();
QualityResultDAOImpl dao = QualityResultDAOImpl.getInstance();
// Search of the last mark for the practice and the audit
manualPracticeResult = dao.findLastManualMarkByAudit( session, projectId, practiceId, auditId );
if ( manualPracticeResult != null )
{
// Transform BO into DTO
resultDto = QualityResultTransform.bo2Dto( manualPracticeResult );
}
}
catch ( JrafDaoException e )
{
FacadeHelper.convertException( e, QualityResultFacade.class.getName() + ".findManualQualityResultByAudit" );
}
finally
{
FacadeHelper.closeSession( session, QualityResultFacade.class.getName() + ".findManualQualityResultByAudit" );
}
return resultDto;
}
/**
* This method record in DB mark for a manual practice
*
* @param resultDto The result to record
* @throws JrafEnterpriseException exception happen during the record
*/
public static void createManualResult( QualityResultDTO resultDto )
throws JrafEnterpriseException
{
ISession session = null;
QualityResultDAOImpl dao = QualityResultDAOImpl.getInstance();
//
try
{
session = PERSISTENTPROVIDER.getSession();
session.beginTransaction();
// Transform the DTO into BO
QualityResultBO resultToSave = QualityResultTransform.simplifyDto2Bo( resultDto );
// Save of the result
dao.create( session, resultToSave );
session.commitTransaction();
}
catch ( JrafPersistenceException e )
{
FacadeHelper.convertException( e, QualityResultFacade.class.getName() + ".createManualResult" );
}
catch ( JrafDaoException e )
{
FacadeHelper.convertException( e, QualityResultFacade.class.getName() + ".createManualResult" );
}
finally
{
FacadeHelper.closeSession( session, QualityResultFacade.class.getName() + ".createManualResult" );
}
}
/**
* This method return the markDTO link to the audit, rule and project give in argument
*
* @param projectId The id of the project
* @param auditId The id of the audit
* @param ruleId the id of the rule
* @return a markDto or NULL if no mark is found
* @throws JrafEnterpriseException Exception happen during the serach
*/
public static MarkDTO getPracticeByAuditRuleProject( long projectId, long auditId, long ruleId )
throws JrafEnterpriseException
{
ISession session = null;
MarkDAOImpl dao = MarkDAOImpl.getInstance();
MarkDTO dto = null;
try
{
session = PERSISTENTPROVIDER.getSession();
// Search of the markBO
MarkBO bo = dao.load( session, projectId, auditId, ruleId );
// Transform the markBO into markDTO
if ( bo != null )
{
dto = MarkTransform.bo2Dto( bo );
}
}
catch ( JrafDaoException e )
{
FacadeHelper.convertException( e, QualityResultFacade.class.getName() + ".updateManualResult" );
}
finally
{
FacadeHelper.closeSession( session, QualityResultFacade.class.getName() + ".updateManualResult" );
}
return dto;
}
/**
* This method return the list of marks link to the given audit and the given rule
*
* @param auditId The id of the audit
* @param ruleId the id of the rule
* @return a list of markDTO
* @throws JrafEnterpriseException Exception happen during the serach
*/
public static Collection<MarkDTO> getPracticeByAuditRule( long auditId, long ruleId )
throws JrafEnterpriseException
{
ISession session = null;
MarkDAOImpl dao = MarkDAOImpl.getInstance();
Collection<MarkDTO> dtoCollection = new ArrayList<MarkDTO>();
try
{
session = PERSISTENTPROVIDER.getSession();
// Search of the markBO
Collection<MarkBO> boCollection = dao.load( session, auditId, ruleId );
// Transform the markBO into markDTO
dtoCollection = (Collection<MarkDTO>) MarkTransform.bo2Dto( boCollection );
}
catch ( JrafDaoException e )
{
FacadeHelper.convertException( e, QualityResultFacade.class.getName() + ".updateManualResult" );
}
finally
{
FacadeHelper.closeSession( session, QualityResultFacade.class.getName() + ".updateManualResult" );
}
return dtoCollection;
}
/**
* Returns raw data that will be used by the Distribution Map to display, for a specific practice, the marks of all
* the components related to this practice, for the given audit and project. <br>
* The raw data that is returned is a list of arrays, each array containing the following data:
* <ul>
* <li>0 - the component ID [long]</li>
* <li>1 - the component name [String]</li>
* <li>2 - the ID of the component's parent [long]</li>
* <li>3 - the name of the component's parent [String]</li>
* <li>4 - the mark of this component for the practice [float]</li>
* </ul>
*
* @param auditId the audit
* @param projectId the project
* @param practiceId the practice
* @return a list of object arrays, each array corresponding to the data of a component related to the practice
* @throws JrafEnterpriseException if the method fails to retrieve the data
*/
public static List<Object[]> getMarkDistribution( long auditId, long projectId, long practiceId )
throws JrafEnterpriseException
{
// Find the component level for this practice
String componentLevel = QualityGridFacade.getComponentLevelForPractice( practiceId );
// And look for the desired data
ISession session = null;
List<Object[]> result = new ArrayList<Object[]>();
try
{
session = PERSISTENTPROVIDER.getSession();
result =
QualityResultDAOImpl.getInstance().findMarkDistribution( session, auditId, projectId, practiceId,
componentLevel );
}
catch ( JrafDaoException e )
{
FacadeHelper.convertException( e, QualityResultFacade.class.getName() + ".getMarkDistribution" );
}
finally
{
FacadeHelper.closeSession( session, QualityResultFacade.class.getName() + ".getMarkDistribution" );
}
return result;
}
/**
* This method retrieves the factor linked to the audit and the application given in argument
*
* @param auditId The audit id
* @param applicationId The application id
* @return The list of factor linked to the current audit
* @throws JrafEnterpriseException Exception occurs during the search of the factors
*/
public static List<QualityResultDTO> getFactor( long auditId, long applicationId )
throws JrafEnterpriseException
{
ISession session = null;
List<QualityResultBO> result = new ArrayList<QualityResultBO>();
List<QualityResultDTO> dataToreturn = new ArrayList<QualityResultDTO>();
try
{
session = PERSISTENTPROVIDER.getSession();
result = QualityResultDAOImpl.getInstance().findFactor( session, applicationId, auditId );
QualityResultDTO resultDto = null;
for ( QualityResultBO qualityResultBO : result )
{
resultDto = QualityResultTransform.bo2Dto( qualityResultBO );
dataToreturn.add( resultDto );
}
}
catch ( JrafDaoException e )
{
FacadeHelper.convertException( e, QualityResultFacade.class.getName() + ".getMarkDistribution" );
}
finally
{
FacadeHelper.closeSession( session, QualityResultFacade.class.getName() + ".getMarkDistribution" );
}
return dataToreturn;
}
/**
* Returns raw data that will be used by the Motion Chart. <br>
*
* @param applicationId the id of the application that must be displayed in the Motion Chart
* @return a MotionChartApplicationData object that can be used to iterate through the data
* @throws JrafEnterpriseException if the method fails to get the data
*/
public static MotionChartApplicationMetricData findMetricsForMotionChart( long applicationId )
throws JrafEnterpriseException
{
ISession session = null;
List<Object[]> result = new ArrayList<Object[]>();
try
{
session = PERSISTENTPROVIDER.getSession();
result = QualityResultDAOImpl.getInstance().findMetricsForMotionChart( session, applicationId );
}
catch ( JrafDaoException e )
{
FacadeHelper.convertException( e, QualityResultFacade.class.getName() + ".findMetricsForMotionChart" );
}
finally
{
FacadeHelper.closeSession( session, QualityResultFacade.class.getName() + ".findMetricsForMotionChart" );
}
return new MotionChartApplicationMetricData( result );
}
/**
* Convenience class to iterate through the results used for the Motion Chart
*/
public static class MotionChartApplicationMetricData
{
private List<Object[]> applicationData;
public MotionChartApplicationMetricData( List<Object[]> data )
{
this.applicationData = data;
}
public Iterator<Object[]> iterator()
{
return applicationData.iterator();
}
public long getProjectId( Object[] currentData )
{
return (Long) currentData[0];
}
public String getProjectName( Object[] currentData )
{
return (String) currentData[1];
}
public long getAuditId( Object[] currentData )
{
return (Long) currentData[2];
}
public Date getAuditDate( Object[] currentData )
{
Date auditHistoricalDate = (Date) currentData[3];
Date auditStartDate = (Date) currentData[4];
Date auditDate = ( auditHistoricalDate == null ) ? auditStartDate : auditHistoricalDate;
return auditDate;
}
public String getMetricName( Object[] currentData )
{
return (String) currentData[5];
}
public int getMetricValue( Object[] currentData )
{
return (Integer) ( (IntegerMetricBO) currentData[6] ).getValue();
}
}
/**
* This method searches for the audit and the module given in argument, all the components involved in the audit and
* for each component its practice. This method return the list of component sorted by their criticality. And each
* component contains the list of its pratice sorted by their criticality
*
* @param session The hibernate session
* @param auditId The id of the audit
* @param moduleId The id of the module
* @return The list of component sorted by there criticality. And each component contains it's list of practice
* sorted by their criticality
* @throws JrafEnterpriseException exception occurs during the process
*/
public static List<ComponentCriticalityDTO> getRemediationByCriticality( ISession session, long auditId,
long moduleId )
throws JrafEnterpriseException
{
List<ComponentCriticalityDTO> compoList = new ArrayList<ComponentCriticalityDTO>();
try
{
MarkDAOImpl dao = MarkDAOImpl.getInstance();
// We retrieve the list of component practice mark linked to the module and the audit
final int componentColumn = 0;
final int ruleIdColumn = 1;
final int ruleNameColumn = 2;
final int ruleCriticalityColumn = 3;
final int ruleEffortColumn = 4;
final int markValueColumn = 5;
List<Object[]> markList = dao.getByAudit( session, auditId, moduleId );
Map<Long, ComponentCriticalityDTO> map = new HashMap<Long, ComponentCriticalityDTO>();
for ( Object[] mark : markList )
{
ComponentCriticalityDTO compo = null;
AbstractComponentBO componentBO = (AbstractComponentBO) mark[componentColumn];
// for each mark we test if the linked component already exist in the map. If yes we retrieve it, else
// we create it.
if ( !map.containsKey( componentBO.getId() ) )
{
compo =
new ComponentCriticalityDTO( componentBO.getId(), componentBO.getName(),
componentBO.getFullName(), componentBO.getType() );
map.put( compo.getId(), compo );
}
else
{
compo = map.get( componentBO.getId() );
}
// We create the new PraticeCriticalityDTO
// In order to retrieve the real name of the rule defined in the message.xml file, we should prefix the
// rule name by : "rule."
PracticeCriticalityDTO practice =
new PracticeCriticalityDTO( (Long) mark[ruleIdColumn], RULE_PREFIX + (String) mark[ruleNameColumn],
(Integer) mark[ruleCriticalityColumn],
(Integer) mark[ruleEffortColumn], (Float) mark[markValueColumn] );
// We compute the criticality of the current practice mark.
practice.computePracticeComponentCriticality();
// We add the PraticeCriticalityDTO the ComponentCriticalityDTO
compo.addPracticeList( practice );
// We add the criticality of the pratice to the criticality of the component
compo.setCriticality( compo.getCriticality() + practice.getPracticeComponentCriticality() );
}
compoList = createList( map );
}
catch ( JrafDaoException e )
{
FacadeHelper.convertException( e, QualityResultFacade.class.getName() + ".getRemediationByCriticity" );
}
finally
{
FacadeHelper.closeSession( session, QualityResultFacade.class.getName() + ".getRemediationByCriticity" );
}
return compoList;
}
/**
* Transform the map values into sorted list
*
* @param map the map values
* @return sorted list
*/
private static List<ComponentCriticalityDTO> createList( Map<Long, ComponentCriticalityDTO> map )
{
List<ComponentCriticalityDTO> compoList = new ArrayList<ComponentCriticalityDTO>();
compoList = new ArrayList<ComponentCriticalityDTO>( map.values() );
// For each ComponentCriticalityDTO, we sort its PracticeCriticality by their criticality
Iterator<ComponentCriticalityDTO> compoIt = compoList.iterator();
while ( compoIt.hasNext() )
{
ComponentCriticalityDTO componentCriticalityDTO = (ComponentCriticalityDTO) compoIt.next();
if ( componentCriticalityDTO.isHasBadMark() )
{
Collections.sort( componentCriticalityDTO.getPracticeList(), new PracticeCriticalityComparator() );
}
else
{
compoIt.remove();
}
}
// We sort the list of ComponentCriticityDTO by their criticality
Collections.sort( compoList, new ComponentCriticalityComparator() );
// write( compoList );
return compoList;
}
/**
* This method retrieve the name of the gris linked to the current audit on the current project
*
* @param pProject The current project
* @param pAudit The current audit for the project
* @return The name of the grid for the audit on the project
* @throws JrafEnterpriseException exception occurs duringthe search
*/
public static String getGridName( ComponentDTO pProject, AuditDTO pAudit )
throws JrafEnterpriseException
{
AuditGridDTO grid = getAuditGrid( pProject, pAudit );
return grid.getGrid().getName();
}
}