Java tutorial
/** * 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 modle de ce fichier gnr, allez : * Fentre>Prfrences>Java>Gnration 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 prsents (ou a insrer) 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 rcuprer 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 lments reprsentants 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 { // Recupration 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 rcupre 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 supprims 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 termins de ce composant excut 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 supprimes ou appartenant une appli supprime 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 "; // Recupration 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 supprimes 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 passs en paramtre 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 rcuprer un nombre d'audits dfinis partir de l'identifiant du composant. <br /> * Les Audits sont tris du plus rcents 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 remonts * @param pIndexDepart index de dpart * @param pType type d'audits retourn (<code>null</code> pour n'importe quel type) * @param pStatus le statut dsir (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(); // Cration 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 spcifi on l'insre 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 dpart n'est pas spcifi, // on retourne tous les audits concerns result = (List) findWhere(pSession, whereClause.toString()); } return result; } /** * Permet de rcuprer un nombre d'audits excuts (ie. ni supprim, ni en attente d'excution) dfinis partir de * l'identifiant du composant. <br /> * Les Audits sont tris du plus rcents 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 remonts * @param pIndexDepart index de dpart * @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(); // Cration 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 spcifi on l'insre dans la clause whereClause += " AND "; whereClause += getAlias() + ".type = '" + pType + "'"; } // On ne veut que les audits avec des rsultats donc on ne prend pas les audits supprims, // 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 dpart n'est pas spcifi, // on retourne tous les audits concerns result = (List) findWhere(pSession, whereClause); } return result; } /** * Permet de rcuprer l'audit prcdent 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 concerne * @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 slectionner la date de ralisation de l'audit courant // ou sa date historique si celle-ci n'est pas nulle String date = "date"; if (null != pAuditHistoricalDate) { date = "historicalDate"; } // Cration de la clause where : String whereClause = "where "; // choix des audits du composant concern whereClause += pComponentID + " in elements(" + getAlias() + ".components)"; // pour les audits antrieurs 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 spcifi on l'insre dans la clause whereClause += " AND "; whereClause += getAlias() + ".type = '" + pType + "'"; } // seulement les audits russis 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'excutio // 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 rcuprer un nombre d'audits dfinis partir de l'identifiant de l'application. <br /> * Les Audits sont tris du plus rcents 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 remonts * @param pIndexDepart index de dpart * @param pType type d'audits retourn (<code>null</code> pour n'importe quel type) * @param pStatus le statut dsir (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 mthode load Object ret = load(pSession, projectID); return ret; } /** * Recupre les audits dont la date est antrieure la date passe en paramtre * * @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; // Recupration 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 (valide ou non) whereClause += " AND "; whereClause += appAlias + ".id in elements(" + getAlias() + ".components)"; // uniquement pour les applications valides whereClause += " AND NOT "; whereClause += appAlias + ".status = " + ApplicationBO.DELETED; whereClause += " AND "; whereClause += "lower(" + appAlias + ".serveurBO.serveurId) = '" + pSite + "'"; // On doit tri par ordre de dernire date d'accs. // Attention, les applications qui n'ont pas eu d'accs, ne seront pas prises en compte! // On appelle donc une fois en triant par accs, une autre pour les applications sans accs et dans ce // cas on trie par date d'excution. /* * Requte retire 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 dsir (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 { // Recupration 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 rcuprer les audits pour la page d'acceuil de squaleWeb. Rcupre tous les audits qui ne sont pas * supprims en relation avec pComponentId et qui ont t xcut aprs pDate ou qui sont en attente d'excution. * * @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 collects pas ce critre en compte * @return les audits correspondants aux critres * @throws JrafDaoException si erreur */ public List findAfterDateWhereComponent(ISession pSession, long pComponentId, Date pDate, boolean pWithFailedAudits) throws JrafDaoException { // Cration 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 supprims 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 rcuprer les n derniers (par date d'xcution) 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 critre en * compte * @param pNbAudits le nombre max d'audits * @param pExcludedStatus les statuts exclure (peut tre nul) * @return les audits correspondants aux critres * @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); // Cration de la clause where : StringBuffer whereClause = new StringBuffer("where ("); // choix des audits des composants concerns 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 rcupration de l'audit */ public Collection findRotationAudit(ISession pSession) throws JrafDaoException { // Cration de la clause where : String whereClause = "where " + getAlias() + ".name='" + ROTATION_AUDIT_NAME + "'"; Collection result = findWhere(pSession, whereClause); return result; } /** le nombre de semaines prvues 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_###"; /** * Dcale l'audit de rotation des partitions la prochaine date prvue Le dlai prvu entre 2 rotations est de 12 * semaines * * @param pSession la session * @throws JrafDaoException en cas d'chec */ public void reportRotationAudit(ISession pSession) throws JrafDaoException { // Rcupre l'audit de rotation Collection result = findRotationAudit(pSession); if (result != null && result.size() != 0) { // il ne doit y avoir qu'un seul lment Iterator it = result.iterator(); AuditBO rotationAudit = (AuditBO) it.next(); Date currentDate = rotationAudit.getDate(); // ajout le dlai prvu 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 obsoltes au regard de la frquence de purge de l'application. <br /> * Pour les audits de jalon, seuls les audits obsoltes en chec sont pris en compte. <br /> * Pour les audits de suivi, les derniers audits obsoltes ne sont pas pris en compte, pour conservation d'un * historique (selon configuration). <br /> * Les audits supprims, en cours ou programms 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 obsoltes 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 passs en paramtre 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 obsoltes 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; } }