/** * 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/>. */ /* * Cr�� le 8 juil. 05 * * Pour changer le mod�le de ce fichier g�n�r�, allez � : * Fen�tre>Pr�f�rences>Java>G�n�ration de code>Code et commentaires */ package org.squale.squalecommon.daolayer.component; import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; import java.util.Date; import java.util.GregorianCalendar; import java.util.Iterator; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.squale.jraf.commons.exception.JrafDaoException; import org.squale.jraf.provider.persistence.hibernate.AbstractDAOImpl; import org.squale.jraf.provider.persistence.hibernate.SessionImpl; import org.squale.jraf.spi.persistence.ISession; import org.squale.squalecommon.daolayer.DAOUtils; import org.squale.squalecommon.enterpriselayer.businessobject.component.ApplicationBO; import org.squale.squalecommon.enterpriselayer.businessobject.component.AuditBO; import org.squale.squalecommon.util.database.DatabaseTypeFactory; /** * Cette classe est responsable de toutes les manipulations d'audits pr�sents (ou a ins�rer) en base * * @author M400843 */ public final class AuditDAOImpl extends AbstractDAOImpl { /** * Instance singleton */ private static AuditDAOImpl instance = null; /** log */ private static Log LOG; /** initialisation du singleton */ static { instance = new AuditDAOImpl(); } /** * Constructeur prive * * @throws JrafDaoException */ private AuditDAOImpl() { initialize( AuditBO.class ); if ( null == LOG ) { LOG = LogFactory.getLog( AuditDAOImpl.class ); } } /** * Retourne un singleton du DAO * * @return singleton du DAO */ public static AuditDAOImpl getInstance() { return instance; } /** * Permet de supprimer logiquement un audit * * @param pSession session Hibernate * @param pAudit objet � supprimer * @throws JrafDaoException exception DAO */ public void remove( ISession pSession, AuditBO pAudit ) throws JrafDaoException { /* * Cette suppresion n'est que logique, il faudra ensuite : Supprimer MarkBO --> PracticeResultBO --> AuditBO * Supprimer QualityResultBO --> AuditBO Supprimer MeasureBO --> AuditBO Supprimer ErrorBO --> AuditBO Supprimer * AuditBO */ pAudit.setStatus( AuditBO.DELETED ); save( pSession, pAudit ); } /** * Permet de r�cup�rer le dernier audit d'une application � partir de son identifiant * * @param pSession session Hibernate * @param pIDApplication Identifiant de l'application * @param pType le type de l'audit (<code>null</code> pour n'importe quel type) * @param pStatus le statut de l'audit (valeur correspondant � "ALL_STATUS" pour n'importe quel status) * @return AuditBO objet metier d'audit * @throws JrafDaoException exception DAO */ public AuditBO getLastAuditByApplication( ISession pSession, long pIDApplication, String pType, int pStatus ) throws JrafDaoException { Integer nbLigne = new Integer( 1 ); Integer indexDepart = new Integer( 0 ); AuditBO audit = null; List list = findWhereComponent( pSession, pIDApplication, nbLigne, indexDepart, pType, pStatus ); if ( null != list ) { if ( list.size() > 0 ) { audit = (AuditBO) list.get( 0 ); } } return audit; } /** * @param pSession la session * @param pComponentClass le type des composants * @param pType le type des audits * @param pStatus le status des audits * @return une liste de tableau d'objets � 3 �l�ments repr�sentants les derniers audits des composants de type * <pComponentType</code> de type <code>pType</code> dont le status est <code>pStatus</code> Le tableau est * de la forme {auditApplicationId, auditApplicationName, auditBO} * @throws JrafDaoException si erreur */ public List findAllLastAudits( ISession pSession, Class pComponentClass, String pType, int pStatus ) throws JrafDaoException { // Recup�ration du nom de classe et de l'alias pour le composant int index = pComponentClass.getName().lastIndexOf( "." ); String compClassName = pComponentClass.getName().substring( index + 1 ); // Le nom court de la classe du DAO index = getBusinessClass().getName().lastIndexOf( "." ); String className = getBusinessClass().getName().substring( index + 1 ); StringBuffer subQuery = new StringBuffer( "select max(a2.date) from " ); subQuery.append( className ); subQuery.append( " as a2 where c.id in elements(a2.components)" ); StringBuffer query = new StringBuffer( "select c.id, c.name, " ); query.append( getAlias() ); // Si le composant est de type application , on r�cup�re aussi le nom du serveur if ( pComponentClass.equals( ApplicationBO.class ) ) { query.append( ", c.serveurBO.name" ); } query.append( " from " ); query.append( compClassName ); query.append( " as c, " ); query.append( className ); query.append( " as " ); query.append( getAlias() ); query.append( " where c.id in elements( " ); query.append( getAlias() ); query.append( ".components)" ); if ( pType != AuditBO.ALL_TYPES ) { query.append( " and " ); query.append( getAlias() ); query.append( ".type='" ); query.append( pType ); query.append( "'" ); } if ( pStatus != AuditBO.ALL_STATUS ) { query.append( " and " ); query.append( getAlias() ); query.append( ".status=" ); query.append( pStatus ); subQuery.append( " and " ); subQuery.append( "a2.status=" ); subQuery.append( pStatus ); } else { // On ne prend pas en compte les audits supprim�s query.append( " and " ); query.append( getAlias() ); query.append( ".status !=" ); query.append( AuditBO.DELETED ); subQuery.append( " and " ); subQuery.append( "a2.status !=" ); subQuery.append( AuditBO.DELETED ); } query.append( " and " ); query.append( getAlias() ); query.append( ".date = (" ); query.append( subQuery ); query.append( ")" ); return find( pSession, query.toString() ); } /** * Retourne tous les audits termin�s de ce composant ex�cut� � partir de pDate * * @param pSession la session hibernate * @param pIdComponent l'id du composant * @param pDate la date * @return une liste d'audits * @throws JrafDaoException si une erreur � lieu */ public List findAfter( ISession pSession, long pIdComponent, Date pDate ) throws JrafDaoException { String whereClause = "where "; whereClause += pIdComponent + " in elements(" + getAlias() + ".components)"; whereClause += " AND "; whereClause += getAlias() + ".status = " + AuditBO.TERMINATED; whereClause += " AND ("; whereClause += getAlias() + ".date > " + DAOUtils.makeQueryDate( pDate ); whereClause += " OR "; whereClause += getAlias() + ".historicalDate > " + DAOUtils.makeQueryDate( pDate ) + ")"; whereClause += " order by coalesce(" + getAlias() + ".historicalDate," + getAlias() + ".date) desc"; return (List) findWhere( pSession, whereClause ); } /** * Retourne tous les audits supprim�es ou appartenant � une appli supprim�e et donc l'application n'a pas d'audit en * cours * * @param pSession la session hibernate * @param pSite le site de l'application * @param pForbiddenApplis les ids des applications � ne pas prendre en compte * @return une liste d'audits * @throws JrafDaoException si une erreur � lieu */ public List findDeleted( ISession pSession, long pSite, Collection pForbiddenApplis ) throws JrafDaoException { String whereClause = " where "; // Recup�ration du nom de classe et de l'alias pour l' application int index = ApplicationBO.class.getName().lastIndexOf( "." ); String classApplicationName = ApplicationBO.class.getName().substring( index + 1 ); String appAlias = classApplicationName.toLowerCase(); index = getBusinessClass().getName().lastIndexOf( "." ); String className = getBusinessClass().getName().substring( index + 1 ); String requete = "select distinct " + getAlias() // uniquement les audits + " from " + classApplicationName + " as " + appAlias // avec jointure sur les Applications (site) + ", " + className + " as " + getAlias() + " "; // pour les Applications du site uniquement whereClause += "(" + getAlias() + ".status = " + AuditBO.DELETED; // ou pour les applications supprim�es whereClause += " OR "; whereClause += appAlias + ".status = " + ApplicationBO.DELETED + ")"; whereClause += " AND "; whereClause += appAlias + " in elements(" + getAlias() + ".components)"; if ( pForbiddenApplis.size() > 0 ) { // qui ne sont pas dans la liste des ids pass�s en param�tre Iterator itForbidden = pForbiddenApplis.iterator(); whereClause += " AND "; whereClause += appAlias + " not in (" + ( (Long) itForbidden.next() ).longValue(); while ( itForbidden.hasNext() ) { whereClause += ", " + ( (Long) itForbidden.next() ).longValue(); } whereClause += ")"; } whereClause += " AND "; whereClause += "lower(" + appAlias + ".serveurBO.serveurId) = '" + pSite + "'"; LOG.debug( "requete = " + requete + whereClause ); List result = find( pSession, requete + whereClause ); LOG.debug( "Found " + result.size() + " audit()s to delete." ); return result; } /** * Permet de r�cup�rer un nombre d'audits d�finis � partir de l'identifiant du composant. <br /> * Les Audits sont tri�s du plus r�cents au plus anciens * * @param pSession session Hibernate * @param pIDComponent identifiant du composant * @param pNbLignes nombre d'audits, si <code>null</code> topus les audits seront remont�s * @param pIndexDepart index de d�part * @param pType type d'audits retourn� (<code>null</code> pour n'importe quel type) * @param pStatus le statut d�sir� (valeur correspondant � <b>ALL_STATUS</b> pour n'importe quel status) * @return Collection de AuditDTO * @throws JrafDaoException exception DAO */ public List findWhereComponent( ISession pSession, long pIDComponent, Integer pNbLignes, Integer pIndexDepart, String pType, int pStatus ) throws JrafDaoException { // Initialisation List result = new ArrayList(); // Cr�ation de la clause where : StringBuffer whereClause = new StringBuffer(" where "); // choix des audits du composant concern� whereClause.append( pIDComponent ); whereClause.append( " in elements( " ); whereClause.append( getAlias() ); whereClause.append( ".components )" ); if ( null != pType && pType != AuditBO.ALL_TYPES ) { // si un type d'audit a �t� sp�cifi� on l'ins�re dans la clause whereClause.append( " AND " ); whereClause.append( getAlias() ); whereClause.append( ".type = '" ); whereClause.append( pType ); whereClause.append( "'" ); } if ( pStatus == AuditBO.ALL_STATUS ) { // on passe ici pour la page d'accueil // on affiche tous les audits dans la page d'accueil sauf ceux � effacer whereClause.append( " AND " ); whereClause.append( getAlias() ); whereClause.append( ".status <> " ); whereClause.append( AuditBO.DELETED ); } else { // ici c'est pour les autres cas whereClause.append( " AND " ); whereClause.append( getAlias() ); whereClause.append( ".status = " ); whereClause.append( pStatus ); } // tri par date (date historique prioritaire) whereClause.append( " order by coalesce( " ); whereClause.append( getAlias() ); whereClause.append( ".historicalDate, " ); whereClause.append( getAlias() ); whereClause.append( ".date) desc" ); LOG.debug( "whereClause = " + whereClause ); int start = 0; int nbLines = 0; // if ( pNbLignes != null ) { nbLines = pNbLignes.intValue(); if ( pIndexDepart != null ) { start = pIndexDepart.intValue(); } result = (List) findWhereScrollable( pSession, whereClause.toString(), nbLines, start, false ); } else { // si le nombre de ligne ou l'index de d�part n'est pas sp�cifi�, // on retourne tous les audits concern�s result = (List) findWhere( pSession, whereClause.toString() ); } return result; } /** * Permet de r�cup�rer un nombre d'audits ex�cut�s (ie. ni supprim�, ni en attente d'ex�cution) d�finis � partir de * l'identifiant du composant. <br /> * Les Audits sont tri�s du plus r�cents au plus anciens * * @param pSession session Hibernate * @param pIDComponent identifiant du composant * @param pNbLignes nombre d'audits, si <code>null</code> topus les audits seront remont�s * @param pIndexDepart index de d�part * @param pType type d'audits retourn� (<code>null</code> pour n'importe quel type) * @return Collection de AuditDTO * @throws JrafDaoException exception DAO */ public List findExecutedWhereComponent( ISession pSession, long pIDComponent, Integer pNbLignes, Integer pIndexDepart, String pType ) throws JrafDaoException { // Initialisation List result = new ArrayList(); // Cr�ation de la clause where : String whereClause = "where "; // choix des audits du composant concern� whereClause += pIDComponent + " in elements(" + getAlias() + ".components)"; if ( null != pType && pType != AuditBO.ALL_TYPES ) { // si un type d'audit a �t� sp�cifi� on l'ins�re dans la clause whereClause += " AND "; whereClause += getAlias() + ".type = '" + pType + "'"; } // On ne veut que les audits avec des r�sultats donc on ne prend pas les audits supprim�s, // en attente ou en cours whereClause += " AND " + getAlias() + ".status <> " + AuditBO.DELETED; whereClause += " AND " + getAlias() + ".status <> " + AuditBO.NOT_ATTEMPTED; whereClause += " AND " + getAlias() + ".status <> " + AuditBO.RUNNING; // tri par date (date historique prioritaire) whereClause += " order by coalesce(" + getAlias() + ".historicalDate, " + getAlias() + ".date) desc"; LOG.info( "whereClause = " + whereClause ); int start = 0; int nbLines = 0; // if ( pNbLignes != null ) { nbLines = pNbLignes.intValue(); if ( pIndexDepart != null ) { start = pIndexDepart.intValue(); } result = (List) findWhereScrollable( pSession, whereClause, nbLines, start, false ); } else { // si le nombre de ligne ou l'index de d�part n'est pas sp�cifi�, // on retourne tous les audits concern�s result = (List) findWhere( pSession, whereClause ); } return result; } /** * Permet de r�cup�rer l'audit pr�c�dent termin� * * @param pSession session Hibernate * @param pAuditID ID de l'audit * @param pAuditHistoricalDate la date historique de l'audit * @param pComponentID ID de l'applie concern�e * @param pType type d'audits retourn� (<code>null</code> pour n'importe quel type) * @return AuditBO si retrouver (null sinon) * @throws JrafDaoException exception DAO */ public AuditBO findPreviousAudit( ISession pSession, long pAuditID, Date pAuditHistoricalDate, long pComponentID, String pType ) throws JrafDaoException { AuditBO result = null; // On va s�lectionner la date de r�alisation de l'audit courant // ou sa date historique si celle-ci n'est pas nulle String date = "date"; if ( null != pAuditHistoricalDate ) { date = "historicalDate"; } // Cr�ation de la clause where : String whereClause = "where "; // choix des audits du composant concern� whereClause += pComponentID + " in elements(" + getAlias() + ".components)"; // pour les audits ant�rieurs whereClause += " and ("; whereClause += "(" + getAlias() + ".date < (select " + date + " from AuditBO where id=" + pAuditID + ")"; // en prenant en compte la date historique des audits de jalon whereClause += " and " + getAlias() + ".historicalDate is null)"; whereClause += " or ("; whereClause += getAlias() + ".historicalDate is not null"; whereClause += " and " + getAlias() + ".historicalDate < (select " + date + " from AuditBO where id=" + pAuditID + ")"; whereClause += ")"; whereClause += ")"; if ( null != pType ) { // si un type d'audit a �t� sp�cifi� on l'ins�re dans la clause whereClause += " AND "; whereClause += getAlias() + ".type = '" + pType + "'"; } // seulement les audits r�ussis whereClause += " and " + getAlias() + ".status = " + AuditBO.TERMINATED; // tri par date (date historique prioritaire) // on utilise la fonction nvl d'oracle pour prendre en compte la date d'ex�cutio // quand la date historique est nulle whereClause += " order by coalesce(" + getAlias() + ".historicalDate, " + getAlias() + ".date) desc"; LOG.debug( "whereClause = " + whereClause ); List r = (List) findWhereScrollable( pSession, whereClause, 1, 0, false ); // ne recupere que le 1er audit if ( r.size() > 0 ) { result = (AuditBO) r.get( 0 ); } return result; } /** * Permet de r�cup�rer un nombre d'audits d�finis � partir de l'identifiant de l'application. <br /> * Les Audits sont tri�s du plus r�cents au plus anciens * * @param pSession session Hibernate * @param pIDApplication identifiant de l'application * @param pNbLignes nombre d'audits, si <code>null</code> tous les audits seront remont�s * @param pIndexDepart index de d�part * @param pType type d'audits retourn� (<code>null</code> pour n'importe quel type) * @param pStatus le statut d�sir� (valeur correspondant � <b>ALL_STATUS</b> pour n'importe quel status) * @return Collection de AuditDTO * @throws JrafDaoException exception DAO * @deprecated utiliser {@link #findWhereComponent(ISession, long, Integer, Integer, String, int)} */ public List findWhereApplication( ISession pSession, long pIDApplication, Integer pNbLignes, Integer pIndexDepart, String pType, int pStatus ) throws JrafDaoException { return findWhereComponent( pSession, pIDApplication, pNbLignes, pIndexDepart, pType, pStatus ); } /** * Charger un audit � partir de son identifiant sous forme de type simple * * @param pSession session Hibernate * @param pID sous forme de type simple * @return Object AuditBO * @throws JrafDaoException exception DAO */ public Object load( ISession pSession, long pID ) throws JrafDaoException { // Initialisation de la variable temporaire Long projectID = new Long( pID ); // Appel � la m�thode load Object ret = load( pSession, projectID ); return ret; } /** * Recup�re les audits dont la date est ant�rieure � la date pass�e en param�tre * * @param pSession la session * @param pSite le site de l'application * @param pStatus le status de l'audit * @param pDate la date * @return une collection d'audit * @throws JrafDaoException exception DAO */ public Collection findBeforeBySiteAndStatus( ISession pSession, long pSite, int pStatus, Date pDate ) throws JrafDaoException { String whereClause = "where "; Collection result = null; // Recup�ration du nom de classe et de l'alias pour le Application int index = ApplicationBO.class.getName().lastIndexOf( "." ); String classApplicationName = ApplicationBO.class.getName().substring( index + 1 ); String appAlias = classApplicationName.toLowerCase(); index = getBusinessClass().getName().lastIndexOf( "." ); String className = getBusinessClass().getName().substring( index + 1 ); // Fabrication de la requete (clauses select et from) String requete = "select " + getAlias() // uniquement les audits + " from " + classApplicationName + " as " + appAlias // avec jointure sur les Applications (site) + ", " + className + " as " + getAlias() + " "; whereClause += "(" + getAlias() + ".date < " + DAOUtils.makeQueryDate( pDate ) + " or " + getAlias() + ".date is null )"; // si on ne doit recuperer que certains status de l'audit if ( pStatus != AuditBO.ALL_STATUS ) { whereClause += " AND "; whereClause += getAlias() + ".status = " + "'" + pStatus + "'"; } // pour les Applications du site uniquement (valid�e ou non) whereClause += " AND "; whereClause += appAlias + ".id in elements(" + getAlias() + ".components)"; // uniquement pour les applications valid�es whereClause += " AND NOT "; whereClause += appAlias + ".status = " + ApplicationBO.DELETED; whereClause += " AND "; whereClause += "lower(" + appAlias + ".serveurBO.serveurId) = '" + pSite + "'"; // On doit tri� par ordre de derni�re date d'acc�s. // Attention, les applications qui n'ont pas eu d'acc�s, ne seront pas prises en compte! // On appelle donc une fois en triant par acc�s, une autre pour les applications sans acc�s et dans ce // cas on trie par date d'ex�cution. /* * Requ�te retir�e suite � bug String orderClause = " order by " + appAlias + ".userAccesses[minindex(" + * appAlias + ".userAccesses)].date desc"; LOG.debug( "requete = " + requete + whereClause + orderClause ); * result = find( pSession, requete + whereClause + orderClause ); orderClause = " and size(" + appAlias + * ".userAccesses)=0 order by " + getAlias() + ".date"; LOG.debug( "requete = " + requete + whereClause + * orderClause ); result.addAll( find( pSession, requete + whereClause + orderClause ) ); */ LOG.info( "requete = " + requete + whereClause ); result = find( pSession, requete + whereClause ); LOG.debug( "Found " + result.size() + " audit(s) to launch now." ); return result; } /** * Permet de compter le nombre d'audit d'un type sur une application donn� * * @param pSession session Hibernate * @param pApplicationBO objet metier Application * @param pType type d'audits retourn� (<code>null</code> pour n'importe quel type) * @param pStatus le statut d�sir� (valeur correspondant � <b>ALL_STATUS</b> pour n'importe quel status) * @return int nombre d'audits d'un type * @throws JrafDaoException exception DAO */ public int countWhereType( ISession pSession, ApplicationBO pApplicationBO, String pType, int pStatus ) throws JrafDaoException { String whereClause = "where "; whereClause += pApplicationBO.getId() + " in elements(" + getAlias() + ".components)"; if ( null != pType ) { whereClause += " AND "; whereClause += getAlias() + ".type = '" + pType + "'"; } if ( pStatus != AuditBO.ALL_STATUS ) { whereClause += " AND "; whereClause += getAlias() + ".status = " + pStatus; } int ret = countWhere( pSession, whereClause ).intValue(); return ret; } /** * @param pSession la session * @param pApplicationId l'id de l'application de l'audit * @return l'audit de jalon programm� pour l'application * @throws JrafDaoException si erreur */ public AuditBO findMilestoneAudit( ISession pSession, long pApplicationId ) throws JrafDaoException { AuditBO result = null; String whereClause = "where "; whereClause += pApplicationId + " in elements(" + getAlias() + ".components)"; whereClause += " and "; whereClause += getAlias() + ".type='" + AuditBO.MILESTONE + "'"; whereClause += " and "; whereClause += getAlias() + ".status=" + AuditBO.NOT_ATTEMPTED; List found = findWhere( pSession, whereClause ); if ( found.size() > 0 ) { // Il ne doit y avoir qu'un audit de jalon programm� result = (AuditBO) found.get( 0 ); } return result; } /** * Supprime l'audit d'id <code>pId</code> * * @param pSession la session * @param pId l'id de l'audit * @throws JrafDaoException si erreur */ public void removeWhereId( ISession pSession, long pId ) throws JrafDaoException { String whereClause = "where "; whereClause += getAlias() + ".id=" + pId; removeWhere( pSession, whereClause ); } /** * @param pSession la session * @param pStatus le satus de l'audit * @return les audits dont le status est <code>pStatus</code> * @throws JrafDaoException si erreur */ public List findWhereStatus( ISession pSession, int pStatus ) throws JrafDaoException { String whereClause = " where "; whereClause += getAlias() + ".status=" + pStatus; whereClause += " order by " + getAlias() + ".date"; List audits = findWhere( pSession, whereClause ); return audits; } /** * @param pSession la session * @param pType le type des audits * @param pStatus le satus des audits * @return les audits dont le status est <code>pStatus</code> de type <code>pType</code> * @throws JrafDaoException si erreur */ public List findWhereStatusAndType( ISession pSession, String pType, int pStatus ) throws JrafDaoException { List audits = new ArrayList( 0 ); if ( AuditBO.ALL_TYPES.equals( pType ) ) { audits = findWhereStatus( pSession, pStatus ); } else { String whereClause = " where "; whereClause += getAlias() + ".status=" + pStatus; whereClause += " and "; whereClause += getAlias() + ".type='" + pType + "'"; whereClause += " order by " + getAlias() + ".date"; audits = findWhere( pSession, whereClause ); } return audits; } /** * @param pSession la session * @param pSiteId l'id du site de l'application * @param pAuditStatus le satus des audits * @return les audits dont le status est <code>pStatus</code> de type <code>pType</code> * @throws JrafDaoException si erreur */ public int countWhereStatusAndSite( ISession pSession, long pSiteId, int pAuditStatus ) throws JrafDaoException { // Recup�ration du nom de classe et de l'alias pour le Application int index = ApplicationBO.class.getName().lastIndexOf( "." ); String classApplicationName = ApplicationBO.class.getName().substring( index + 1 ); String appAlias = classApplicationName.toLowerCase(); index = getBusinessClass().getName().lastIndexOf( "." ); String className = getBusinessClass().getName().substring( index + 1 ); // Fabrication de la requete (clauses select et from) String selectClause = "select " + getAlias() // uniquement les audits + " from " + classApplicationName + " as " + appAlias // avec jointure sur les Applications (site) + ", " + className + " as " + getAlias() + " "; String whereClause = " where "; // si on ne doit recuperer que certains status de l'audit if ( pAuditStatus != AuditBO.ALL_STATUS ) { whereClause += getAlias() + ".status = " + "'" + pAuditStatus + "' AND "; } // pour les Applications du site uniquement whereClause += appAlias + ".id in elements(" + getAlias() + ".components)"; whereClause += " AND "; whereClause += appAlias + ".serveurBO.serveurId='" + pSiteId + "'"; return find( pSession, selectClause + whereClause ).size(); } /** * Permet de r�cup�rer les audits pour la page d'acceuil de squaleWeb. R�cup�re tous les audits qui ne sont pas * supprim�s en relation avec pComponentId et qui ont �t� �x�cut� apr�s pDate ou qui sont en attente d'ex�cution. * * @param pSession la session * @param pComponentId l'id du composant * @param pDate la date � partir de laquelle les audits doivent �tre pris, nulle si on ne prend * @param pWithFailedAudits indique si les audits en �chec doivent �galement �tre collect�s pas ce crit�re en compte * @return les audits correspondants aux crit�res * @throws JrafDaoException si erreur */ public List findAfterDateWhereComponent( ISession pSession, long pComponentId, Date pDate, boolean pWithFailedAudits ) throws JrafDaoException { // Cr�ation de la clause where : String whereClause = "where "; // choix des audits du composant concern� whereClause += pComponentId + " in elements(" + getAlias() + ".components)"; // On ne prend pas les audits supprim�s whereClause += " and " + getAlias() + ".status <> " + AuditBO.DELETED; // collection des audits en �chec if ( pWithFailedAudits ) { whereClause += " and " + getAlias() + ".status <> " + AuditBO.FAILED; } if ( null != pDate ) { whereClause += " and "; whereClause += "(" + getAlias() + ".date > " + DAOUtils.makeQueryDate( pDate ) + " or " + getAlias() + ".date is null )"; } List result = (List) findWhere( pSession, whereClause ); return result; } /** * Permet de r�cup�rer les n derniers (par date d'�x�cution) audits dont le statut n'est pas exclu * * @param pSession la session * @param pComponentsId l'id des composants (PRE-CONDITION : la liste doit �tre > 1) * @param pDate la date � partir de laquelle les audits doivent �tre pris, nulle si on ne prend pas ce crit�re en * compte * @param pNbAudits le nombre max d'audits * @param pExcludedStatus les statuts � exclure (peut �tre nul) * @return les audits correspondants aux crit�res * @throws JrafDaoException si erreur */ public List findAfterDateWhereComponents( ISession pSession, List pComponentsId, Date pDate, Integer[] pExcludedStatus, Integer pNbAudits ) throws JrafDaoException { // Initialisation de la valeur de retour List result = new ArrayList( 0 ); // Cr�ation de la clause where : StringBuffer whereClause = new StringBuffer( "where (" ); // choix des audits des composants concern�s for ( int i = 0; i < pComponentsId.size() - 1; i++ ) { whereClause.append( pComponentsId.get( i ) ); whereClause.append( " in elements(" ); whereClause.append( getAlias() ); whereClause.append( ".components) or " ); } // Le dernier sans le "or" whereClause.append( pComponentsId.get( pComponentsId.size() - 1 ) ); whereClause.append( " in elements(" ); whereClause.append( getAlias() ); whereClause.append( ".components)" ); whereClause.append( ")" ); // On ne prend pas les audits dont le statut est dans pStatus if ( null != pExcludedStatus ) { for ( int i = 0; i < pExcludedStatus.length; i++ ) { whereClause.append( " and " ); whereClause.append( getAlias() ); whereClause.append( ".status <> " ); whereClause.append( pExcludedStatus[i] ); } } // A partir de pDate si pDate n'est pas nulle if ( null != pDate ) { whereClause.append( " and " ); whereClause.append( getAlias() ); whereClause.append( ".date > " ); whereClause.append( DAOUtils.makeQueryDate( pDate ) ); } // Tri par date whereClause.append( " order by " ); whereClause.append( getAlias() ); whereClause.append( ".date desc" ); if ( null == pNbAudits ) { result = (List) findWhere( pSession, whereClause.toString() ); } else { result = (List) findWhereScrollable( pSession, whereClause.toString(), pNbAudits.intValue(), 0, false ); } return result; } /** * @param pSession la session hibernate * @return l'audit de rotation * @throws JrafDaoException en cas d'�chec de r�cup�ration de l'audit */ public Collection findRotationAudit( ISession pSession ) throws JrafDaoException { // Cr�ation de la clause where : String whereClause = "where " + getAlias() + ".name='" + ROTATION_AUDIT_NAME + "'"; Collection result = findWhere( pSession, whereClause ); return result; } /** le nombre de semaines pr�vues entre 2 rotations */ public final static int ROTATION_DELAY_IN_WEEKS = 12; /** le nom donn� � l'audit de rotation */ public final static String ROTATION_AUDIT_NAME = "###_ROTATION_###"; /** * D�cale l'audit de rotation des partitions � la prochaine date pr�vue Le d�lai pr�vu entre 2 rotations est de 12 * semaines * * @param pSession la session * @throws JrafDaoException en cas d'�chec */ public void reportRotationAudit( ISession pSession ) throws JrafDaoException { // R�cup�re l'audit de rotation Collection result = findRotationAudit( pSession ); if ( result != null && result.size() != 0 ) { // il ne doit y avoir qu'un seul �l�ment Iterator it = result.iterator(); AuditBO rotationAudit = (AuditBO) it.next(); Date currentDate = rotationAudit.getDate(); // ajout le d�lai pr�vu GregorianCalendar currentCal = new GregorianCalendar(); currentCal.setTime( currentDate ); currentCal.add( Calendar.WEEK_OF_YEAR, ROTATION_DELAY_IN_WEEKS ); rotationAudit.setDate( currentCal.getTime() ); // et mise � jour en base save( pSession, rotationAudit ); } } /** * Recherche les audits obsol�tes au regard de la fr�quence de purge de l'application. <br /> * Pour les audits de jalon, seuls les audits obsol�tes en �chec sont pris en compte. <br /> * Pour les audits de suivi, les derniers audits obsol�tes ne sont pas pris en compte, pour conservation d'un * historique (selon configuration). <br /> * Les audits supprim�s, en cours ou programm�s ne sont pas pris en compte. * * @param pSession session de persistence. * @param pSiteId id du serveur du batch. * @param pForbiddenApplis les ids des applications � ne pas prendre en compte * @return la collection d'audits obsol�tes � supprimer. * @throws JrafDaoException si exception de persistence. */ public List findObsoleteAuditsToDelete( ISession pSession, long pSiteId, Collection pForbiddenApplis ) throws JrafDaoException { int index = ApplicationBO.class.getName().lastIndexOf( "." ); String lApplicationClassName = ApplicationBO.class.getName().substring( index + 1 ); String lApplicationAlias = lApplicationClassName.toLowerCase(); index = getBusinessClass().getName().lastIndexOf( "." ); String lClassName = getBusinessClass().getName().substring( index + 1 ); // partie select String selectClause = "select " + getAlias() + ", " + lApplicationAlias + " from " + lClassName + " as " + getAlias() + ", " + lApplicationClassName + " as " + lApplicationAlias; // clause where StringBuffer whereClause = new StringBuffer( " where " ); // selection des composants de type ApplicationBO whereClause.append( lApplicationAlias + ".id in elements(" + getAlias() + ".components)" ); if ( pForbiddenApplis.size() > 0 ) { // qui ne sont pas dans la liste des ids pass�s en param�tre Iterator itForbidden = pForbiddenApplis.iterator(); whereClause.append( " AND " ); whereClause.append( lApplicationAlias + " not in (" + ( (Long) itForbidden.next() ).longValue() ); while ( itForbidden.hasNext() ) { whereClause.append( ", " + ( (Long) itForbidden.next() ).longValue() ); } whereClause.append( ")" ); } // selection du serveur whereClause.append( " and " + lApplicationAlias + ".serveurBO.serveurId = '" + pSiteId + "'" ); // selection des audits obsol�tes whereClause.append( " and " ); whereClause.append( DatabaseTypeFactory.getInstance().dateAddDay( getAlias() + ".realBeginningDate", lApplicationAlias + ".resultsStorageOptions" ) ); // selection suivant le type d'audit whereClause.append( " and ((" ); whereClause.append( getAlias() + ".type = '" + AuditBO.MILESTONE + "'" ); whereClause.append( " and " + getAlias() + ".status = '" + AuditBO.FAILED + "'" ); whereClause.append( ") or (" ); whereClause.append( getAlias() + ".type = '" + AuditBO.NORMAL + "'" ); whereClause.append( " and " + getAlias() + ".status in " ); whereClause.append( "('" + AuditBO.FAILED + "', '" + AuditBO.PARTIAL + "', '" + AuditBO.TERMINATED + "')" ); whereClause.append( "))" ); // clause order String orderClause = " order by " + getAlias() + ".realBeginningDate desc"; SessionImpl sessionHibernate = (SessionImpl) pSession; return find( pSession, selectClause + whereClause.toString() + orderClause ); } /** * Recover the id of all successful audit (milestone or follow up) for the application given in argument and ordered by decreasing date * * @param session The hibernate session * @param applicationId The id of the application for which we search the audit * @return The id list of successful audit for the application * @throws JrafDaoException Error happened during the request in the db */ public List<AuditBO> succesfullAudit( ISession session, Long applicationId ) throws JrafDaoException { long auditId = -1; StringBuffer whereClause = new StringBuffer( " where " ); // The audit should be associate to our application whereClause.append( applicationId ); whereClause.append( " in elements( " ); whereClause.append( getAlias() ); whereClause.append( ".components )" ); // The audit should be successful whereClause.append( " and " ); whereClause.append( getAlias() ); whereClause.append( ".status = " ); whereClause.append( AuditBO.TERMINATED ); // The result should be ordered whereClause.append( " order by coalesce( " ); whereClause.append( getAlias() ); whereClause.append( ".historicalDate, " ); whereClause.append( getAlias() ); whereClause.append( ".date) desc" ); LOG.debug( whereClause.toString() ); List<AuditBO> result = (List<AuditBO>) findWhere( session, whereClause.toString() ); return result; } }