/**
* 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.rule;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.SortedMap;
import java.util.SortedSet;
import java.util.TreeMap;
import java.util.TreeSet;
import org.squale.jraf.commons.exception.JrafDaoException;
import org.squale.jraf.commons.exception.JrafEnterpriseException;
import org.squale.jraf.helper.PersistenceHelper;
import org.squale.jraf.provider.persistence.hibernate.facade.FacadeHelper;
import org.squale.jraf.spi.persistence.IPersistenceProvider;
import org.squale.jraf.spi.persistence.ISession;
import org.squale.squalecommon.daolayer.component.AuditGridDAOImpl;
import org.squale.squalecommon.daolayer.component.ProjectDAOImpl;
import org.squale.squalecommon.daolayer.rule.QualityGridDAOImpl;
import org.squale.squalecommon.daolayer.rule.QualityRuleDAOImpl;
import org.squale.squalecommon.datatransfertobject.rule.CriteriumRuleDTO;
import org.squale.squalecommon.datatransfertobject.rule.FactorRuleDTO;
import org.squale.squalecommon.datatransfertobject.rule.PracticeRuleDTO;
import org.squale.squalecommon.datatransfertobject.rule.QualityGridConfDTO;
import org.squale.squalecommon.datatransfertobject.rule.QualityGridDTO;
import org.squale.squalecommon.datatransfertobject.rule.QualityRuleDTO;
import org.squale.squalecommon.datatransfertobject.transform.rule.GridMetricsTransform;
import org.squale.squalecommon.datatransfertobject.transform.rule.QualityGridTransform;
import org.squale.squalecommon.datatransfertobject.transform.rule.QualityRuleTransform;
import org.squale.squalecommon.datatransfertobject.transform.rule.RuleMetricsTransform;
import org.squale.squalecommon.enterpriselayer.businessobject.component.ProjectBO;
import org.squale.squalecommon.enterpriselayer.businessobject.rule.CriteriumRuleBO;
import org.squale.squalecommon.enterpriselayer.businessobject.rule.FactorRuleBO;
import org.squale.squalecommon.enterpriselayer.businessobject.rule.PracticeRuleBO;
import org.squale.squalecommon.enterpriselayer.businessobject.rule.QualityGridBO;
import org.squale.squalecommon.enterpriselayer.businessobject.rule.QualityRuleBO;
/**
* Facade pour la grille qualit�
*/
public final class QualityGridFacade
{
/**
* Private constructor
*/
private QualityGridFacade()
{
}
/**
* provider de persistence
*/
private static final IPersistenceProvider PERSISTENTPROVIDER = PersistenceHelper.getPersistenceProvider();
/**
* Obtention des grilles
*
* @param pLastVersions indique si seulement les derni�res versions sont r�cup�r�es
* @return grilles qualit�
* @throws JrafEnterpriseException si erreur
*/
public static Collection getGrids( boolean pLastVersions )
throws JrafEnterpriseException
{
Collection result = new ArrayList(); // retour de la facade
ISession session = null;
try
{
// r�cup�ration d'une session
session = PERSISTENTPROVIDER.getSession();
QualityGridDAOImpl qualityGridDAO = QualityGridDAOImpl.getInstance();
// Obtention de toutes les grilles
Collection grids = qualityGridDAO.findGrids( session, pLastVersions );
Iterator it = grids.iterator();
// transformation de BO en DTO
while ( it.hasNext() )
{
QualityGridDTO userDTO = QualityGridTransform.bo2Dto( (QualityGridBO) it.next() );
result.add( userDTO );
}
}
catch ( JrafDaoException e )
{
FacadeHelper.convertException( e, QualityGridFacade.class.getName() + ".getGrids" );
}
finally
{
FacadeHelper.closeSession( session, QualityGridFacade.class.getName() + ".getGrids" );
}
return result;
}
/**
* Obtention des grilles sans profil ni audit
*
* @return grilles qualit� sans profil ni audit
* @throws JrafEnterpriseException si erreur
*/
public static Collection getUnlinkedGrids()
throws JrafEnterpriseException
{
Collection result = new ArrayList(); // retour de la facade
ISession session = null;
try
{
// r�cup�ration d'une session
session = PERSISTENTPROVIDER.getSession();
QualityGridDAOImpl qualityGridDAO = QualityGridDAOImpl.getInstance();
AuditGridDAOImpl auditGridDAO = AuditGridDAOImpl.getInstance();
// Obtention de toutes les derni�res version des grilles sans profil
Collection grids = qualityGridDAO.findGridsWithoutProfiles( session );
Iterator it = grids.iterator();
// transformation de BO en DTO
QualityGridBO curGrid = null;
while ( it.hasNext() )
{
curGrid = (QualityGridBO) it.next();
// On ajoute le nom de la grille seulement si elle est inutilis�e (sans audits)
if ( !auditGridDAO.isGridUsed( session, new Long( curGrid.getId() ) ) )
{
result.add( QualityGridTransform.bo2DtoLight( curGrid ) );
}
}
}
catch ( JrafDaoException e )
{
FacadeHelper.convertException( e, QualityGridFacade.class.getName() + ".getUnlinkedGrids" );
}
finally
{
FacadeHelper.closeSession( session, QualityGridFacade.class.getName() + ".getUnlinkedGrids" );
}
return result;
}
/**
* Permet de r�cup�rer une grille par son identifiant
*
* @param pGridId l'identifiant
* @return la grille
* @throws JrafEnterpriseException en cas d'�chec
*/
public static QualityGridDTO loadGridById( Long pGridId )
throws JrafEnterpriseException
{
QualityGridDTO result = null;
QualityGridBO bo = null;
ISession session = null;
try
{
// r�cup�ration d'une session
session = PERSISTENTPROVIDER.getSession();
QualityGridDAOImpl qualityGridDAO = QualityGridDAOImpl.getInstance();
if ( pGridId != null )
{
bo = qualityGridDAO.loadById( session, pGridId.longValue() );
}
if ( bo != null )
{
result = QualityGridTransform.bo2Dto( bo );
}
}
catch ( JrafDaoException e )
{
FacadeHelper.convertException( e, QualityGridFacade.class.getName() + ".get" );
}
finally
{
FacadeHelper.closeSession( session, QualityGridFacade.class.getName() + ".get" );
}
return result;
}
/**
* update une grille en base
*
* @param pGrid la grille
* @throws JrafEnterpriseException en cas d'�chec
*/
public static void updateGrid( QualityGridConfDTO pGrid )
throws JrafEnterpriseException
{
ISession session = null;
try
{
// r�cup�ration d'une session
session = PERSISTENTPROVIDER.getSession();
QualityGridDAOImpl qualityGridDAO = QualityGridDAOImpl.getInstance();
QualityGridBO bo = QualityGridTransform.dto2Bo( pGrid );
qualityGridDAO.save( session, bo );
}
catch ( JrafDaoException e )
{
FacadeHelper.convertException( e, QualityGridFacade.class.getName() + ".updateGrid" );
}
finally
{
FacadeHelper.closeSession( session, QualityGridFacade.class.getName() + ".updateGrid" );
}
}
/**
* Obtention d'une grille
*
* @param pQualityGrid grille qualit�
* @return grille correspondante
* @throws JrafEnterpriseException si erreur
*/
public static QualityGridConfDTO get( QualityGridDTO pQualityGrid )
throws JrafEnterpriseException
{
QualityGridConfDTO result = new QualityGridConfDTO();
ISession session = null;
try
{
// r�cup�ration d'une session
session = PERSISTENTPROVIDER.getSession();
QualityGridDAOImpl qualityGridDAO = QualityGridDAOImpl.getInstance();
// Obtention de la grille
QualityGridBO grid = (QualityGridBO) qualityGridDAO.load( session, new Long( pQualityGrid.getId() ) );
QualityGridTransform.bo2Dto( grid, result );
}
catch ( JrafDaoException e )
{
FacadeHelper.convertException( e, QualityGridFacade.class.getName() + ".get" );
}
finally
{
FacadeHelper.closeSession( session, QualityGridFacade.class.getName() + ".get" );
}
return result;
}
/**
* Obtention d'une r�gle qualit�
*
* @param pQualityRule r�gle qualit�
* @param deepTransformation un bool�en indiquant si on veut aussi transformer les formules ou pas.
* @return r�gle qualit�
* @throws JrafEnterpriseException si erreur
*/
public static QualityRuleDTO getQualityRule( QualityRuleDTO pQualityRule, boolean deepTransformation )
throws JrafEnterpriseException
{
QualityRuleDTO result = null;
ISession session = null;
try
{
// r�cup�ration d'une session
session = PERSISTENTPROVIDER.getSession();
QualityRuleDAOImpl factorRuleDAO = QualityRuleDAOImpl.getInstance();
// Obtention de la r�gle qualit�
QualityRuleBO qualityRule = (QualityRuleBO) factorRuleDAO.get( session, new Long( pQualityRule.getId() ) );
result = QualityRuleTransform.bo2Dto( qualityRule, deepTransformation );
}
catch ( JrafDaoException e )
{
FacadeHelper.convertException( e, QualityGridFacade.class.getName() + ".get" );
}
finally
{
FacadeHelper.closeSession( session, QualityGridFacade.class.getName() + ".get" );
}
return result;
}
/**
* Obtention d'une r�gle qualit� et des mesures utilis�es
*
* @param pQualityRule r�gle qualit�
* @param deepTransformation un bool�en indiquant si on veut aussi transformer les formules ou pas.
* @return un tableau � deux entr�es contenant la r�gle qualit� et ses mesures extraites
* @throws JrafEnterpriseException si erreur
*/
public static Object[] getQualityRuleAndUsedTres( QualityRuleDTO pQualityRule, boolean deepTransformation )
throws JrafEnterpriseException
{
Object[] result = new Object[2];
ISession session = null;
try
{
// r�cup�ration d'une session
session = PERSISTENTPROVIDER.getSession();
QualityRuleDAOImpl factorRuleDAO = QualityRuleDAOImpl.getInstance();
// Obtention de la r�gle qualit�
QualityRuleBO qualityRule = (QualityRuleBO) factorRuleDAO.get( session, new Long( pQualityRule.getId() ) );
result[0] = QualityRuleTransform.bo2Dto( qualityRule, deepTransformation );
result[1] = qualityRule.accept( new RuleMetricsTransform( new FormulaMeasureExtractor() ), null );
}
catch ( JrafDaoException e )
{
FacadeHelper.convertException( e, QualityGridFacade.class.getName() + ".get" );
}
finally
{
FacadeHelper.closeSession( session, QualityGridFacade.class.getName() + ".get" );
}
return result;
}
/**
* Destruction de grilles qualit�
*
* @param pGrids grilles
* @return grilles ne pouvant pas �tre supprim�es
* @throws JrafEnterpriseException si erreur
*/
public static Collection<QualityGridDTO> deleteGrids( Collection<QualityGridDTO> pGrids )
throws JrafEnterpriseException
{
ISession session = null;
Collection<QualityGridDTO> usedGrids = new ArrayList<QualityGridDTO>();
try
{
// r�cup�ration d'une session
session = PERSISTENTPROVIDER.getSession();
// Parcours des grilles � d�truire
Iterator<QualityGridDTO> gridsIt = pGrids.iterator();
ArrayList<Long> gridsId = new ArrayList<Long>();
AuditGridDAOImpl auditGridDAO = AuditGridDAOImpl.getInstance();
ProjectDAOImpl projectDAO = ProjectDAOImpl.getInstance();
QualityGridDAOImpl qualityGridDAO = QualityGridDAOImpl.getInstance();
while ( gridsIt.hasNext() )
{
QualityGridDTO gridDTO = (QualityGridDTO) gridsIt.next();
Long gridId = new Long( gridDTO.getId() );
// On v�rifie que la grille n'est pas utilis�e
// au niveau d''un projet ou au niveau d'un audit r�alis�
if ( projectDAO.isGridUsed( session, gridId ) || auditGridDAO.isGridUsed( session, gridId )
|| qualityGridDAO.hasProfile( session, gridId ) )
{
usedGrids.add( gridDTO );
}
else
{
gridsId.add( gridId );
}
}
// Destruction des grilles qui ne sont plus r�f�renc�es
if ( gridsId.size() > 0 )
{
qualityGridDAO.removeGrids( session, gridsId );
}
}
catch ( JrafDaoException e )
{
FacadeHelper.convertException( e, QualityGridFacade.class.getName() + ".deleteGrids" );
}
finally
{
FacadeHelper.closeSession( session, QualityGridFacade.class.getName() + ".deleteGrids" );
}
return usedGrids;
}
/**
* Obtention des m�triques d'une grille Cette m�thode est utilsi�e pour la construction du menu Top
*
* @param pQualityGrid grille qualit�
* @return map donnant pour chaque type de composant les m�triques utilis�es par la grille qualit�, une map vide est
* renvoy�e si la grille n'existe pas
* @throws JrafEnterpriseException si erreur
*/
public static Map getGridMetrics( QualityGridDTO pQualityGrid )
throws JrafEnterpriseException
{
HashMap result = new HashMap();
ISession session = null;
try
{
// r�cup�ration d'une session
session = PERSISTENTPROVIDER.getSession();
QualityGridDAOImpl qualityGridDAO = QualityGridDAOImpl.getInstance();
// Obtention de la grille
QualityGridBO grid = (QualityGridBO) qualityGridDAO.load( session, new Long( pQualityGrid.getId() ) );
if ( grid != null )
{
// Conversion de la map
GridMetricsTransform.bo2dto( grid, result, new FormulaMeasureExtractor() );
}
}
catch ( JrafDaoException e )
{
FacadeHelper.convertException( e, QualityGridFacade.class.getName() + ".get" );
}
finally
{
FacadeHelper.closeSession( session, QualityGridFacade.class.getName() + ".get" );
}
return result;
}
/**
* update une grille en base
*
* @param pGrid la grille
* @param pErrors erreur rencontr�es
* @throws JrafEnterpriseException en cas d'�chec
*/
public static void updateGrid( QualityGridConfDTO pGrid, StringBuffer pErrors )
throws JrafEnterpriseException
{
ISession session = null;
try
{
// r�cup�ration d'une session
session = PERSISTENTPROVIDER.getSession();
QualityGridDAOImpl qualityGridDAO = QualityGridDAOImpl.getInstance();
/* On modifie la grille � partir du DTO */
// On update les facteurs
SortedSet updatedFactors = new TreeSet();
Collection factors = pGrid.getFactors();
for ( Iterator it = factors.iterator(); it.hasNext(); )
{
FactorRuleDTO factorDTO = (FactorRuleDTO) it.next();
updatedFactors.add( updateFactor( session, factorDTO ) );
}
// On charge la grille
QualityGridBO bo = (QualityGridBO) qualityGridDAO.get( session, new Long( pGrid.getId() ) );
// Transformation
bo.setFactors( updatedFactors );
// V�rification de la grille
QualityGridChecker gridChecker = new QualityGridChecker();
gridChecker.checkGrid( bo, pErrors );
}
catch ( JrafDaoException e )
{
FacadeHelper.convertException( e, QualityGridFacade.class.getName() + ".updateGrid" );
}
finally
{
if ( pErrors.length() > 0 && session != null )
{
// On ne met pas � jour
session.rollbackTransaction();
}
else
{
FacadeHelper.closeSession( session, QualityGridFacade.class.getName() + ".updateGrid" );
}
}
}
/**
* update d'un facteur
*
* @param session la session
* @param factorDTO le facteur
* @return le facteur mis � jour
* @throws JrafEnterpriseException en cas d'�chec
* @throws JrafDaoException erreur dao
*/
private static FactorRuleBO updateFactor( ISession session, FactorRuleDTO factorDTO )
throws JrafEnterpriseException, JrafDaoException
{
FactorRuleBO bo = null;
QualityRuleDAOImpl qualityRuleDAO = QualityRuleDAOImpl.getInstance();
// On update les crit�res
SortedMap updatedCriteria = new TreeMap();
Collection criteria = factorDTO.getCriteria().keySet();
for ( Iterator it = criteria.iterator(); it.hasNext(); )
{
CriteriumRuleDTO criteriaDTO = (CriteriumRuleDTO) it.next();
updatedCriteria.put( updateCriterium( session, criteriaDTO ),
(Float) factorDTO.getCriteria().get( criteriaDTO ) );
}
// On charge le facteur
bo = (FactorRuleBO) qualityRuleDAO.get( session, new Long( factorDTO.getId() ) );
/* On modifie le facteur */
bo.setCriteria( updatedCriteria );
return bo;
}
/**
* update d'un crit�re
*
* @param session la session
* @param criteriaDTO le crit�re
* @return le crit�re mis � jour
* @throws JrafEnterpriseException en cas d'�chec
* @throws JrafDaoException erreur dao
*/
private static CriteriumRuleBO updateCriterium( ISession session, CriteriumRuleDTO criteriaDTO )
throws JrafEnterpriseException, JrafDaoException
{
CriteriumRuleBO bo = null;
QualityRuleDAOImpl qualityRuleDAO = QualityRuleDAOImpl.getInstance();
// On charge le crit�re
bo = (CriteriumRuleBO) qualityRuleDAO.get( session, new Long( criteriaDTO.getId() ) );
// On update les pratiques
SortedMap updatedPractices = new TreeMap();
Collection practices = criteriaDTO.getPractices().keySet();
for ( Iterator it = practices.iterator(); it.hasNext(); )
{
PracticeRuleDTO practiceDTO = (PracticeRuleDTO) it.next();
updatedPractices.put( updatePractice( session, practiceDTO ),
(Float) criteriaDTO.getPractices().get( practiceDTO ) );
}
/* On modifie le crit�re � partir du DTO */
bo.setPractices( updatedPractices );
return bo;
}
/**
* update d'une pratique
*
* @param practiceDTO la pratique
* @param session la session
* @return la pratique mise � jour
* @throws JrafEnterpriseException en cas d'�chec
* @throws JrafDaoException erreur dao
*/
private static PracticeRuleBO updatePractice( ISession session, PracticeRuleDTO practiceDTO )
throws JrafEnterpriseException, JrafDaoException
{
// Initialisation
PracticeRuleBO bo = null;
QualityRuleDAOImpl qualityRuleDAO = QualityRuleDAOImpl.getInstance();
// On charge la pratique
bo = (PracticeRuleBO) qualityRuleDAO.get( session, new Long( practiceDTO.getId() ) );
// Transformation
QualityRuleTransform.dto2Bo( bo, practiceDTO );
return bo;
}
/**
* This method return the list of manual practices rules of the grid linked to the project
*
* @param projectId Id of the project
* @return A list of manual practices rules
* @throws JrafEnterpriseException exception happen during the search in the database
*/
public static HashSet<PracticeRuleDTO> loadManualPracticesRulesByProjectId( long projectId )
throws JrafEnterpriseException
{
ISession session = null;
QualityGridDTO dto = null;
HashSet<PracticeRuleDTO> practicesRuleList = new HashSet<PracticeRuleDTO>();
try
{
session = PERSISTENTPROVIDER.getSession();
ProjectDAOImpl projectDAO = ProjectDAOImpl.getInstance();
ProjectBO project = (ProjectBO) projectDAO.get( session, projectId );
Iterator<FactorRuleBO> factorsIt = project.getQualityGrid().getFactors().iterator();
// For each factor
while ( factorsIt.hasNext() )
{
FactorRuleBO factor = factorsIt.next();
Iterator<CriteriumRuleBO> criteriumIt = factor.getCriteria().keySet().iterator();
// For each criterium
while ( criteriumIt.hasNext() )
{
CriteriumRuleBO criterium = criteriumIt.next();
Iterator<PracticeRuleBO> practiceIt = criterium.getPractices().keySet().iterator();
// For each practice
while ( practiceIt.hasNext() )
{
PracticeRuleBO practiceBO = practiceIt.next();
// If the practices is a manual practices
if ( practiceBO.getFormula() == null )
{
PracticeRuleDTO practiceDTO = new PracticeRuleDTO();
// We add the practice to the list
practicesRuleList.add( (PracticeRuleDTO) QualityRuleTransform.bo2Dto( practiceBO, true ) );
}
}
}
}
}
catch ( JrafDaoException e )
{
FacadeHelper.convertException( e, QualityGridFacade.class.getName() + ".loadPracticeByProjectId" );
}
finally
{
FacadeHelper.closeSession( session, QualityGridFacade.class.getName() + ".loadPracticeByProjectId" );
}
return practicesRuleList;
}
/**
* Returns the level of the components that are used for the practice corresponding to the given ID
*
* @param practiceId the id of the practice
* @return the name of the component level, e.g. "method" or "class", as it is specified in the quality model
* @throws JrafEnterpriseException if it is not possible to get the component level
*/
public static String getComponentLevelForPractice( long practiceId )
throws JrafEnterpriseException
{
ISession session = null;
String componentLevel = "";
try
{
session = PERSISTENTPROVIDER.getSession();
QualityRuleDAOImpl qualityRuleDAOImpl = QualityRuleDAOImpl.getInstance();
componentLevel = qualityRuleDAOImpl.getComponentLevelForPractice( session, practiceId );
}
catch ( JrafDaoException e )
{
FacadeHelper.convertException( e, QualityGridFacade.class.getName() + ".getComponentLevelForPractice" );
}
finally
{
FacadeHelper.closeSession( session, QualityGridFacade.class.getName() + ".getComponentLevelForPractice" );
}
return componentLevel;
}
}