org.squale.squalecommon.daolayer.result.MarkDAOImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.squale.squalecommon.daolayer.result.MarkDAOImpl.java

Source

/**
 * 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.daolayer.result;

import java.util.ArrayList;
import java.util.Collection;
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.spi.persistence.ISession;
import org.squale.squalecommon.daolayer.DAOMessages;
import org.squale.squalecommon.datatransfertobject.result.PracticeEvolutionDTO;
import org.squale.squalecommon.enterpriselayer.businessobject.component.AbstractComponentBO;
import org.squale.squalecommon.enterpriselayer.businessobject.component.ProjectBO;
import org.squale.squalecommon.enterpriselayer.businessobject.result.MarkBO;
import org.squale.squalecommon.enterpriselayer.businessobject.result.PracticeResultBO;

/**
 * @author M400843
 */
public final class MarkDAOImpl extends AbstractDAOImpl {
    /**
     * Instance singleton
     */
    private static MarkDAOImpl instance = null;

    /** log */
    private static Log LOG;

    /** initialisation du singleton */
    static {
        instance = new MarkDAOImpl();
    }

    /**
     * Constructeur prive
     * 
     * @throws JrafDaoException
     */
    private MarkDAOImpl() {
        initialize(MarkBO.class);
        LOG = LogFactory.getLog(MarkDAOImpl.class);
    }

    /**
     * Retourne un singleton du DAO
     * 
     * @return singleton du DAO
     */
    public static MarkDAOImpl getInstance() {
        return instance;
    }

    /**
     * Supprime toutes les notes appartenant  l'application
     * 
     * @param pSession la session
     * @param pProject le projet
     * @throws JrafDaoException si une erreur  lieu
     */
    public void removeWhereProject(ISession pSession, ProjectBO pProject) throws JrafDaoException {
        String whereClause = "where ";
        whereClause += getAlias() + ".practice.project.id = " + pProject.getId();
        // il reste un problme sur la mthode remove where,
        // il faut donc faire un find where puis un remove
        // sur chaque lment de la collection
        List temp = findWhere(pSession, whereClause);
        for (int i = 0; i < temp.size(); i++) {
            remove(pSession, temp.get(i));
        }
    }

    /**
     * Supprime toutes les notes lies au composant
     * 
     * @param pSession la session
     * @param pComponent le composant
     * @throws JrafDaoException si une erreur  lieu
     */
    public void removeWhereComponent(ISession pSession, AbstractComponentBO pComponent) throws JrafDaoException {
        String whereClause = "where ";
        whereClause += getAlias() + ".component.id = " + pComponent.getId();
        removeWhere(pSession, whereClause);
    }

    /**
     * Permet de rcuprer les notes en fonction d'une liste de noms de TREs
     * 
     * @param pSession session Hibernate
     * @param pComponentID identifiant du composant
     * @param pAuditID identifiant de l'audit
     * @param pRuleIds identificateurs des rgles qualit
     * @return liste des valeurs ordonns par raopport a la liste des TREs
     * @throws JrafDaoException exception DAO
     */
    public List findWhere(ISession pSession, Long pComponentID, Long pAuditID, List pRuleIds)
            throws JrafDaoException {
        List marks = new ArrayList();
        Iterator it = pRuleIds.iterator();
        while (it.hasNext()) {
            Long ruleId = (Long) it.next();
            marks.add(load(pSession, pComponentID, pAuditID, ruleId));
        }
        return marks;
    }

    /**
     * Permet de rcuprer une note en fonction d'un audit
     * 
     * @param pSession session Hibernate
     * @param pComponentID identifiant du composant
     * @param pAuditID identifiant de l'audit
     * @param pRuleId id du TRE
     * @return la note associe au type de rsultat, au composant et  l'audit
     * @throws JrafDaoException exception DAO
     */
    public MarkBO load(ISession pSession, Long pComponentID, Long pAuditID, Long pRuleId) throws JrafDaoException {
        String whereClause = "where ";
        whereClause += getAlias() + ".practice.rule.id = " + pRuleId;
        whereClause += " and ";
        whereClause += getAlias() + ".component.id = '" + pComponentID + "'";
        whereClause += " and ";
        whereClause += getAlias() + ".practice.audit.id = '" + pAuditID + "'";

        MarkBO mark = null;
        Collection col = findWhere(pSession, whereClause);
        if (col.size() >= 1) {
            mark = (MarkBO) col.iterator().next();
            if (col.size() > 1) {
                String tab[] = { pAuditID.toString(), pComponentID.toString(), pRuleId.toString() };
                LOG.warn(DAOMessages.getString("mark.many.audit_component_tre", tab));
            }
        }

        return mark;
    }

    /**
     * Permet de rcuprer la liste des notes d'une pratique pour d'un audit donn
     * 
     * @param pSession session Hibernate
     * @param pAuditID identifiant de l'audit
     * @param pRuleId id du TRE
     * @return la liste des notes associes au type de rsultat et  l'audit
     * @throws JrafDaoException exception DAO
     */
    @SuppressWarnings("unchecked")
    public Collection<MarkBO> load(ISession pSession, Long pAuditID, Long pRuleId) throws JrafDaoException {
        String whereClause = "where ";
        whereClause += getAlias() + ".practice.rule.id = " + pRuleId;
        whereClause += " and ";
        whereClause += getAlias() + ".practice.audit.id = '" + pAuditID + "'";

        return (Collection<MarkBO>) findWhere(pSession, whereClause);
    }

    /**
     * Retrouve les notes qui ont pour type pTreClass, pour id d'audit pauditId et pour valeur pValue
     * 
     * @param pSession session Hibernate
     * @param pAuditId identifiant de l'audit
     * @param pProjectId id du projet
     * @param pTreId classe du TRE
     * @param pValue valeur de la note
     * @param pMax Nombre maximum de composants retourn
     * @return les notes associes
     * @throws JrafDaoException exception DAO
     */
    public Collection findWhere(ISession pSession, Long pAuditId, Long pProjectId, Long pTreId, Integer pValue,
            Integer pMax) throws JrafDaoException {
        String whereClause = "where ";
        whereClause += getAlias() + ".practice.rule.id = " + pTreId;
        whereClause += " and ";
        whereClause += getAlias() + ".practice.audit.id = '" + pAuditId + "'";
        whereClause += " and ";
        whereClause += getAlias() + ".practice.project.id = " + pProjectId;
        whereClause += " and ";
        whereClause += whereValueClause(pValue);
        Collection ret = (Collection) findWhereScrollable(pSession, whereClause, pMax.intValue(), 0, false);
        return ret;
    }

    /**
     * Retrouve les notes qui ont pour type pTreClass, pour id d'audit pauditId et pour valeur pValue
     * 
     * @param pSession session Hibernate
     * @param pAuditId identifiant de l'audit
     * @param pProjectId id du projet
     * @param pTreId classe du TRE
     * @param pValueMin valeur min de l'intervalle
     * @param pValueMax valeur max de l'intervalle
     * @param pMax Nombre maximum de composants retourn
     * @return les notes associes
     * @throws JrafDaoException exception DAO
     */
    public Collection findWhereInterval(ISession pSession, Long pAuditId, Long pProjectId, Long pTreId,
            Double pValueMin, Double pValueMax, Integer pMax) throws JrafDaoException {
        String whereClause = "where ";
        whereClause += getAlias() + ".practice.rule.id = " + pTreId;
        whereClause += " and ";
        whereClause += getAlias() + ".practice.audit.id = '" + pAuditId + "'";
        whereClause += " and ";
        whereClause += getAlias() + ".practice.project.id = " + pProjectId;
        whereClause += " and ";
        whereClause += whereValueClause(pValueMin.doubleValue(), pValueMax.doubleValue());
        Collection ret = (Collection) findWhereScrollable(pSession, whereClause, pMax.intValue(), 0, false);
        return ret;
    }

    /**
     * @param pValue la valeur de l'index
     * @return le critre de recher sur la note pour la clause where
     */
    private String whereValueClause(Integer pValue) {
        // Si il n'y a pas de statut associ  l'index, le composant est non not (-->value=-1)
        String result = getAlias() + ".value = " + -1;
        if (pValue.intValue() == PracticeResultBO.REFUSED_MIN) {
            result = getAlias() + ".value >= " + PracticeResultBO.REFUSED_MIN;
            result += " and " + getAlias() + ".value < " + PracticeResultBO.REFUSED_MAX;
        } else if (pValue.intValue() == PracticeResultBO.NEARLY_ACCEPTED_MIN) {
            result = getAlias() + ".value >= " + PracticeResultBO.NEARLY_ACCEPTED_MIN;
            result += " and " + getAlias() + ".value < " + PracticeResultBO.NEARLY_ACCEPTED_MAX;
        } else if (pValue.intValue() == PracticeResultBO.ACCEPTED_MIN) {
            result = getAlias() + ".value >= " + PracticeResultBO.ACCEPTED_MIN;
            result += " and " + getAlias() + ".value < " + PracticeResultBO.ACCEPTED_MAX;
        } else if (pValue.intValue() == PracticeResultBO.EXCELLENT) {
            result = getAlias() + ".value = " + PracticeResultBO.EXCELLENT;
        }
        return result;
    }

    /**
     * @param pValueMin la valeur min de l'intervalle
     * @param pValueMax la valeur max de l'intervalle
     * @return le critre de recherche pour l'intervalle pour la clause where
     */
    private String whereValueClause(double pValueMin, double pValueMax) {
        // Si il n'y a pas de statut associ  l'index, le composant est non not (-->value=-1)
        String result = getAlias() + ".value = " + -1;
        if (pValueMin >= 0) {
            result = getAlias() + ".value >= " + pValueMin;
            // On ne prend la borne suprieure de l'intervalle que si c'est 3
            if (pValueMax != PracticeResultBO.EXCELLENT) {
                result += " AND " + getAlias() + ".value < " + pValueMax;
            } else {
                result += " AND " + getAlias() + ".value <= " + pValueMax;
            }

        }
        return result;
    }

    /**
     * Obtention de toutes les notes sur un composant et un audit
     * 
     * @param pSession session
     * @param pComponentID composant
     * @param pAuditID audit
     * @return notes associes
     * @throws JrafDaoException si erreur
     */
    public Collection findWhere(ISession pSession, Long pComponentID, Long pAuditID) throws JrafDaoException {
        String whereClause = "where ";
        whereClause += getAlias() + ".component.id = '" + pComponentID + "'";
        whereClause += " and ";
        whereClause += getAlias() + ".practice.audit.id = '" + pAuditID + "'";

        MarkBO mark = null;
        Collection col = findWhere(pSession, whereClause);
        if (col.size() >= 1) {
            mark = (MarkBO) col.iterator().next();
            if (col.size() > 1) {
                String tab[] = { pAuditID.toString(), pComponentID.toString(), "" };
                LOG.warn(DAOMessages.getString("mark.many.audit_component_tre", tab));
            }
        }

        return col;
    }

    /**
     * @param pSession session
     * @param pAuditId l'id de l'audit
     * @param pPreviousId l'id de l'audit prcdent
     * @return le nombre de corrections correspondant au nombre de composants qui taient  zro et qui ne le sont plus.
     * @throws JrafDaoException si erreur
     */
    public int findCorrectionsWithProgessions(ISession pSession, Long pAuditId, Long pPreviousId)
            throws JrafDaoException {
        String requete = "select count(m1.id) from MarkBO as m1, MarkBO as m2";
        String whereClause = " where ";
        whereClause += "(m1.practice.audit.id = '" + pPreviousId + "' and m1.value=0)";
        whereClause += " and ";
        whereClause += "(m2.practice.audit.id = '" + pAuditId + "' and m2.value>0)";
        whereClause += " and ";
        whereClause += "m1.component.id=m2.component.id";
        whereClause += " and ";
        whereClause += "m1.practice.rule.id=m2.practice.rule.id";
        LOG.debug("requete : " + requete + whereClause);
        List result = find(pSession, requete + whereClause);
        return ((Integer) result.get(0)).intValue();
    }

    /**
     * @param pSession la session
     * @param pAuditId l'id de l'audit
     * @param pPreviousId l'id de l'audit prcdent
     * @return le nombre de corrections correspondant au nombre de composants qui avaient une note  0 et qui n'existent
     *         plus.
     * @throws JrafDaoException si erreur
     */
    public int findCorrectionsWithSuppressions(ISession pSession, Long pAuditId, Long pPreviousId)
            throws JrafDaoException {
        String requete = "select count(m1.component.id) from MarkBO as m1";
        requete += " where ";
        requete += "(m1.practice.audit.id=" + pPreviousId + " and m1.value=0)";
        requete += " and ";
        requete += "(m1.component.id not in ";
        requete += "(select m2.component.id from MarkBO as m2";
        requete += " where ";
        requete += " m1.practice.rule.id=m2.practice.rule.id ";
        requete += " and ";
        requete += "m2.practice.audit.id=" + pAuditId + "))";
        LOG.debug("requete : " + requete);
        List result = find(pSession, requete);
        return ((Integer) result.get(0)).intValue();
    }

    /**
     * Donne la requte qui donne la liste des notes sur les nouveaux composants. NB : Cette mthode sert aussi 
     * retouver les composants supprims (on inverse les ids des audits)
     * 
     * @param pSession la session
     * @param pAuditId l'audit courant
     * @param pPreviousId l'audit de comparaison
     * @param pProjectId l'id du projet
     * @return la requte
     * @throws JrafDaoException si erreur
     */
    private String getDeletedOrNewComponentsWhereClause(ISession pSession, Long pAuditId, Long pPreviousId,
            Long pProjectId) throws JrafDaoException {
        String whereClause = "where ";
        whereClause += getAlias() + ".practice.project.id = '" + pProjectId + "'";
        whereClause += " and ";
        whereClause += getAlias() + ".practice.audit.id = '" + pPreviousId + "'";
        whereClause += " and " + getAlias() + ".component.id not in ("
                + getComponentIdsWhere(pSession, pProjectId, pAuditId) + ")";
        return whereClause;
    }

    /**
     * @param pSession la session
     * @param pProjectId l'id du projet
     * @param pAuditId l'id de l'audit
     * @return la requte rcuprant les ids des composants du projet d'id <code>pProjectId</code> nots lors de l'audit
     *         d'id <code>pAuditId</code>
     * @throws JrafDaoException si erreur
     */
    private String getComponentIdsWhere(ISession pSession, Long pProjectId, Long pAuditId) throws JrafDaoException {
        String select = "select m.component.id from MarkBO as m where ";
        select += "m.practice.project.id = '" + pProjectId + "'";
        select += " and ";
        select += "m.practice.audit.id = '" + pAuditId + "'";
        return select;
    }

    /**
     * Donne la liste des notes sur les nouveaux composants. NB : Cette mthode sert aussi  retouver les composants
     * supprims (on inverse les ids des audits)
     * 
     * @param pSession la session
     * @param pAuditId l'audit courant
     * @param pPreviousId l'audit de comparaison
     * @param pProjectId l'id du projet
     * @param pFilter le filtre
     * @param pLimit le nombre de rsultats  remonter
     * @return la liste des nouveaux composants entre <code>pAuditId</code> et <code>pPreviousId</code>
     * @throws JrafDaoException si erreur
     */
    public Collection findDeletedComponents(ISession pSession, Long pAuditId, Long pPreviousId, Long pProjectId,
            Object[] pFilter, int pLimit) throws JrafDaoException {
        String whereClause = getDeletedOrNewComponentsWhereClause(pSession, pAuditId, pPreviousId, pProjectId);
        if (null != pFilter[PracticeEvolutionDTO.ONLY_PRACTICES_ID]) {
            String[] practices = (String[]) pFilter[PracticeEvolutionDTO.ONLY_PRACTICES_ID];
            // On rcupre que les notes des pratiques qui sont dans pPractices
            int nbPractices = practices.length;
            if (nbPractices > 0) { // scurit pour le code car aucun intrt si il n'y a pas de pratique.
                whereClause += " and " + getAlias() + ".practice.rule.name in ";
                whereClause += getPracticesInClause(practices);
            }
        }
        if (null != pFilter[PracticeEvolutionDTO.THRESHOLD_ID]) {
            String[] thresholdFilter = (String[]) pFilter[PracticeEvolutionDTO.THRESHOLD_ID];
            // On convertit le seuil en int
            final float maxMark = 3;
            float limit;
            try {
                limit = Float.parseFloat(thresholdFilter[1]);
            } catch (NumberFormatException nfe) {
                // l'utilisateur a donn une mauvais seuil
                // on met la seuil max
                limit = maxMark;
            }
            whereClause += " and ";
            whereClause += getAlias() + ".value " + thresholdFilter[0] + " " + limit;
        }
        // On ordonne par type et nom de composant
        whereClause += " order by  " + getAlias() + ".component.class, " + getAlias() + ".component.name asc";
        LOG.debug(whereClause);
        return (Collection) findWhereScrollable(pSession, whereClause, pLimit, 0, false);
    }

    /**
     * @param pPractices les pratiques
     * @return les pratiques spares par des virgules pour une clause in
     */
    private String getPracticesInClause(String[] pPractices) {
        String inClause = "(";
        int limit = pPractices.length - 1;
        for (int i = 0; i < limit; i++) {
            inClause += "'" + pPractices[i] + "', ";
        }
        inClause += "'" + pPractices[limit] + "')";
        return inClause;
    }

    /**
     * @param pSession la session
     * @param pAuditId l'id de l'audit de rfrence
     * @param pPreviousId l'id de l'audit de comparaison
     * @param pProjectId l'id du projet
     * @param pFilter le filtre
     * @param pLimit le nombre de rsultats  remonter
     * @return une liste de tableau  deux lments de MarkBO reprsentant toutes les notes qui sont diffrentes entre
     *         les deux audits pour un mme composant une mme rgle.
     * @throws JrafDaoException si erreur
     */
    public Collection findChangedComponentWhere(ISession pSession, Long pAuditId, Long pPreviousId, Long pProjectId,
            Object[] pFilter, int pLimit) throws JrafDaoException {
        String query = getEvolutionQuery(pAuditId, pPreviousId, pProjectId);
        query += " and ";
        query += "m1.value != m2.value";
        // On filtre
        if (null != pFilter[PracticeEvolutionDTO.ONLY_UP_OR_DOWN_ID]) {
            if (((String) pFilter[PracticeEvolutionDTO.ONLY_UP_OR_DOWN_ID]).equals(PracticeEvolutionDTO.ONLY_UP)) {
                query += " and ";
                // On rcupre les composants dont la note s'est amliore ou si le composant
                // n'est plus not
                query += "(m1.value > m2.value or (m1.value = " + MarkBO.NOT_NOTED_VALUE + " and m2.value != "
                        + MarkBO.NOT_NOTED_VALUE + "))";

            } else {
                query += " and ";
                // On rcupre les composants dont la note s'est dgrade (si le composant
                // n'est plus not il s'agit d'une amlioration)
                query += "((m1.value < m2.value or m2.value = " + MarkBO.NOT_NOTED_VALUE + ") and m1.value != "
                        + MarkBO.NOT_NOTED_VALUE + ")";

            }
        }
        if (null != pFilter[PracticeEvolutionDTO.ONLY_PRACTICES_ID]) {
            String[] practices = (String[]) pFilter[PracticeEvolutionDTO.ONLY_PRACTICES_ID];
            // On rcupre que les notes des pratiques qui sont dans pPractices
            int nbPractices = practices.length;
            if (nbPractices > 0) { // scurit pour le code car aucun intrt si il n'y a pas de pratique.
                query += " and m1.practice.rule.name in ";
                query += getPracticesInClause(practices);
            }
        }

        // On ordonne par type et nom de composant; on limite le nombre de rsultat
        // On rcupre la bonne string en fonction de la base de donne utilise
        query += " order by  m1.component.class,  m1.component.name asc ";

        LOG.debug(query);
        return (List) findScrollable(pSession, query, pLimit, 0);
    }

    /**
     * @param pAuditId l'id de l'audit de rfrence
     * @param pPreviousId l'id de l'audit de comparaison
     * @param pProjectId l'id du projet
     * @return le dbut de la requte pour trouver les volutions
     */
    private String getEvolutionQuery(Long pAuditId, Long pPreviousId, Long pProjectId) {
        String query = "select m1.component, m1.practice, m1.value, m2.value from MarkBO as m1, MarkBO as m2 ";
        String whereClause = "where ";
        whereClause += "m1.practice.project.id = '" + pProjectId + "'";
        whereClause += " and ";
        whereClause += "m1.practice.audit.id = '" + pAuditId + "'";
        whereClause += " and ";
        whereClause += "m1.component.id = m2.component.id";
        whereClause += " and ";
        whereClause += "m1.practice.rule.id = m2.practice.rule.id";
        whereClause += " and ";
        whereClause += "m2.practice.audit.id = '" + pPreviousId + "'";
        return query + whereClause;
    }

    /**
     * Retrouve les <code>pMax</code> plus mauvaises notes (infrieur  <code>pMark</code>+1)qui ont pour id d'audit
     * <code>pAuditId</code> pour la pratique d'id <code>pPracticeId</code> et dont le composant n'est pas exclu du plan
     * d'action.
     * 
     * @param pSession session Hibernate
     * @param pPracticeId l'id de la pratique
     * @param pMark la note de la pratique
     * @param pMax Nombre maximum de composants retourn
     * @return les notes associes
     * @throws JrafDaoException exception DAO
     */
    public Collection findWorstWhere(ISession pSession, Long pPracticeId, float pMark, Integer pMax)
            throws JrafDaoException {
        String whereClause = getWorstWhereClause(pPracticeId, pMark);
        // On ordonne par note
        whereClause += " order by  " + getAlias() + ".value asc";
        Collection ret = (Collection) findWhereScrollable(pSession, whereClause, pMax.intValue(), 0, false);
        return ret;
    }

    /**
     * Compte les plus mauvaises notes (infrieur  <code>pMark</code>+1)qui ont pour id d'audit <code>pAuditId</code>
     * pour la pratique d'id <code>pPracticeId</code> et dont le composant n'est pas exclu du plan d'action.
     * 
     * @param pSession session Hibernate
     * @param pPracticeId l'id de la pratique
     * @param pMark la note de la pratique
     * @return le nombre des plus mauvais composants pour cette pratique
     * @throws JrafDaoException exception DAO
     */
    public int countWorstWhere(ISession pSession, Long pPracticeId, float pMark) throws JrafDaoException {
        String whereClause = getWorstWhereClause(pPracticeId, pMark);
        return countWhere(pSession, whereClause).intValue();
    }

    /**
     * @param pPracticeId l'id de la pratique
     * @param pMark la note de la pratique
     * @return la clause where pour rcuprer les plus mauvais composants
     */
    private String getWorstWhereClause(Long pPracticeId, float pMark) {
        String whereClause = "where ";
        whereClause += getAlias() + ".practice.id=" + pPracticeId;
        // On ne prend pas en compte les composants non nots
        whereClause += " and ";
        whereClause += getAlias() + ".value!=" + MarkBO.NOT_NOTED_VALUE;
        // ni les composants exclus (0=false, 1=true)
        whereClause += " and ";
        whereClause += getAlias() + ".component.excludedFromActionPlan = 0";
        // Condition sur la note
        whereClause += " and " + getAlias() + ".value < " + pMark + 1;
        return whereClause;
    }

    /**
     * This method is specific for the remediation by critcality feature. This method retrieves all the practices
     * involved in the audit given in argument for the components which belong to the module given in argument and are
     * not "excluded from the action plan". This method return a list of arrays. Each array contains :
     * <ul>
     * <li>0 - The component linked to the practice ({@link AbstractComponentBO})</li>
     * <li>1 - The practice id (Long)</li>
     * <li>2 - The practice name (String)</li>
     * <li>3 - The practice criticality (Integer)</li>
     * <li>4 - The practice mark (Float)</li>
     * </ul>
     * 
     * @param session The hiberntae session
     * @param auditId The audit id
     * @param moduleId The module id
     * @return a list of arrays
     * @throws JrafDaoException exception occurs during the search
     */
    @SuppressWarnings("unchecked")
    public List<Object[]> getByAudit(ISession session, Long auditId, long moduleId) throws JrafDaoException {
        List<Object[]> result = new ArrayList<Object[]>();
        StringBuffer request = new StringBuffer(
                "select component, rule.id, rule.name, rule.criticality, rule.effort, mark.value ");
        request.append("from AbstractComponentBO as component, QualityRuleBO as rule,  MarkBO as mark ");
        request.append("where component = mark.component ");
        request.append("and rule = mark.practice.rule ");
        request.append("and mark.practice.audit.id = ");
        request.append(auditId);
        request.append("and mark.component.project.id = ");
        request.append(moduleId);
        request.append("and component.excludedFromActionPlan = false");
        request.append(" order by mark.component.id");
        result = find(session, request.toString());
        return result;
    }

}