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/>. */ package org.squale.squalecommon.enterpriselayer.facade.quality; import java.text.DateFormat; import java.text.NumberFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jfree.chart.JFreeChart; import org.squale.jraf.commons.exception.JrafDaoException; import org.squale.jraf.commons.exception.JrafEnterpriseException; import org.squale.jraf.commons.exception.JrafPersistenceException; import org.squale.jraf.helper.PersistenceHelper; import org.squale.jraf.provider.persistence.hibernate.facade.FacadeHelper; import org.squale.jraf.spi.enterpriselayer.IFacade; import org.squale.jraf.spi.persistence.IPersistenceProvider; import org.squale.jraf.spi.persistence.ISession; import org.squale.squalecommon.daolayer.component.AbstractComponentDAOImpl; import org.squale.squalecommon.daolayer.component.ApplicationDAOImpl; import org.squale.squalecommon.daolayer.component.AuditDAOImpl; import org.squale.squalecommon.daolayer.component.AuditDisplayConfDAOImpl; import org.squale.squalecommon.daolayer.component.AuditGridDAOImpl; import org.squale.squalecommon.daolayer.component.ProjectDAOImpl; import org.squale.squalecommon.daolayer.result.MarkDAOImpl; import org.squale.squalecommon.daolayer.result.MeasureDAOImpl; import org.squale.squalecommon.daolayer.result.MetricDAOImpl; import org.squale.squalecommon.daolayer.result.QualityResultDAOImpl; import org.squale.squalecommon.daolayer.rule.PracticeRuleAPDAOImpl; import org.squale.squalecommon.datatransfertobject.component.AuditDTO; import org.squale.squalecommon.datatransfertobject.component.ComponentDTO; import org.squale.squalecommon.datatransfertobject.result.QualityResultDTO; import org.squale.squalecommon.datatransfertobject.result.ResultsDTO; import org.squale.squalecommon.datatransfertobject.transform.component.AuditTransform; import org.squale.squalecommon.datatransfertobject.transform.component.ComponentTransform; import org.squale.squalecommon.datatransfertobject.transform.result.MeasureTransform; import org.squale.squalecommon.datatransfertobject.transform.result.QualityResultTransform; import org.squale.squalecommon.enterpriselayer.businessobject.component.AbstractComponentBO; import org.squale.squalecommon.enterpriselayer.businessobject.component.ApplicationBO; import org.squale.squalecommon.enterpriselayer.businessobject.component.AuditBO; import org.squale.squalecommon.enterpriselayer.businessobject.component.AuditDisplayConfBO; import org.squale.squalecommon.enterpriselayer.businessobject.component.AuditGridBO; import org.squale.squalecommon.enterpriselayer.businessobject.component.ProjectBO; import org.squale.squalecommon.enterpriselayer.businessobject.config.web.BubbleConfBO; import org.squale.squalecommon.enterpriselayer.businessobject.config.web.DisplayConfConstants; import org.squale.squalecommon.enterpriselayer.businessobject.config.web.VolumetryConfBO; import org.squale.squalecommon.enterpriselayer.businessobject.result.FactorResultBO; import org.squale.squalecommon.enterpriselayer.businessobject.result.IntegerMetricBO; import org.squale.squalecommon.enterpriselayer.businessobject.result.MarkBO; import org.squale.squalecommon.enterpriselayer.businessobject.result.MeasureBO; import org.squale.squalecommon.enterpriselayer.businessobject.result.PracticeResultBO; import org.squale.squalecommon.enterpriselayer.businessobject.rule.PracticeRuleBO; import org.squale.squalecommon.util.TimeUtil; import org.squale.squalecommon.util.manualmark.TimeLimitationParser; import org.squale.squalecommon.util.mapping.Mapping; /** * The facade for the result information shown in the web portal */ public final class MeasureFacade implements IFacade { /** * Cle de tre relatif a l'historique */ private static final String HISTORIC_TYPE = "tre.graph.histo"; /** log */ private static Log LOG = LogFactory.getLog(MeasureFacade.class); /** * provider de persistence */ private static final IPersistenceProvider PERSISTENTPROVIDER = PersistenceHelper.getPersistenceProvider(); /** * Permet de rcuprer une valeur pour un type de rsultat, un composant et un audit donn Format de ResultsDTO : 1 * ligne : -- null en cl et liste contenant le resultat en valeur * * @param pAudit AuditDTO contenant l'ID de l'audit * @param pComponent ComponentDTO contenant l'ID du composant * @param pKeyTRE Cl du type lmentaire de rsultat * @return ResultsDTO correspondant une valeur * @throws JrafEnterpriseException exception JRAF * @roseuid 42CBFFB4016D */ public static ResultsDTO getMeasures(AuditDTO pAudit, ComponentDTO pComponent, String pKeyTRE) throws JrafEnterpriseException { ResultsDTO results = null; MeasureDAOImpl measureDAO = MeasureDAOImpl.getInstance(); ISession session = null; try { session = PERSISTENTPROVIDER.getSession(); Long idComponent = new Long(pComponent.getID()); Long idAudit = new Long(pAudit.getID()); MeasureBO measure = measureDAO.load(session, idComponent, idAudit, Mapping.getMetricClass(pKeyTRE)); results = MeasureTransform.bo2dto(measure, pKeyTRE); } catch (JrafDaoException e) { FacadeHelper.convertException(e, MeasureFacade.class.getName() + ".getMeasures"); } finally { FacadeHelper.closeSession(session, MeasureFacade.class.getName() + ".getMeasures"); } return results; } /** * Permet de rcuprer une liste de valeurs pour une liste de types de rsultat, un type de composant et un audit * donn Format de ResultsDTO : 2 lignes : -- null en cl et liste des cls des TREs en valeur -- ComponentDTO en * cl et liste des rsultats associes en valeur * * @param pAudit AuditDTO contenant l'ID de l'audit * @param pComponent ComponentDTO contenant l'ID du composant * @return ResultsDTO * @throws JrafEnterpriseException exception JRAF * @roseuid 42CBFFB40181 */ public static ResultsDTO getAllMeasures(AuditDTO pAudit, ComponentDTO pComponent) throws JrafEnterpriseException { // Dclaration du ResultsDTO retourner ResultsDTO results = null; Collection trClasses = null; MeasureDAOImpl measureDAO = MeasureDAOImpl.getInstance(); // Session Hibernate ISession session = null; try { // Rcupration d'une session session = PERSISTENTPROVIDER.getSession(); // Rcupration des id de l'audit et du composant Long idComponent = new Long(pComponent.getID()); Long idAudit = new Long(pAudit.getID()); // Rcupration des mesures souhaites Collection measures = measureDAO.findWhere(session, idComponent, idAudit); // transformation de la liste de mesures en ResultsDTO results = MeasureTransform.bo2dtoByTRE(null, measures, pComponent); // Pour la 3.0, on conserve les mesures mcCabe concernant le nombre de mthodes et de classes sur un projet // On supprime (ATTENTION : seulement de l'affichage) donc les donnes RSM quivalentes pour ne pas faire // doublon // Toutefois on garde le stockage des donnes en base // On rcupre les index des cls pour pouvoir supprimer les valeurs aussi int indexClasses = ((List) (results.getResultMap().get(null))).indexOf("rsm.project.numberOfClasses"); int indexMeth = ((List) (results.getResultMap().get(null))).indexOf("rsm.project.numberOfMethods"); // Supprime les cls ((List) (results.getResultMap().get(null))).remove("rsm.project.numberOfClasses"); ((List) (results.getResultMap().get(null))).remove("rsm.project.numberOfMethods"); // Supprime les valeurs // On supprime d'abord le plus grand index pour viter les dcalages if (indexClasses != -1) { if (indexMeth != -1) { if (indexClasses > indexMeth) { ((List) (results.getResultMap().get(pComponent))).remove(indexClasses); ((List) (results.getResultMap().get(pComponent))).remove(indexMeth); } else { ((List) (results.getResultMap().get(pComponent))).remove(indexMeth); ((List) (results.getResultMap().get(pComponent))).remove(indexClasses); } } else { ((List) (results.getResultMap().get(pComponent))).remove(indexClasses); } } else { if (indexMeth != -1) { ((List) (results.getResultMap().get(pComponent))).remove(indexMeth); } } } catch (JrafDaoException e) { FacadeHelper.convertException(e, MeasureFacade.class.getName() + ".getMeasuresByTRE"); } finally { FacadeHelper.closeSession(session, MeasureFacade.class.getName() + ".getMeasuresByTRE"); } return results; } /** * Permet de rcuprer une liste des "tops" composant / measure pour un audit et un tre donns Format de ResultsDTO * : 2 lignes : -- null en cl et liste des ComponentDTOs -- AuditDTO en cl et liste des rsultats associes en * valeur * * @param pProject projet * @param pComponentType Type de composant (Method ou Class) * @param pAudit Audit * @param pTre Tre retrouver et tri * @param pMax nombre maxi de resultat retoun * @return ResultsDTO tri * @throws JrafEnterpriseException exception JRAF */ public static ResultsDTO getTop(ComponentDTO pProject, String pComponentType, AuditDTO pAudit, String pTre, Integer pMax) throws JrafEnterpriseException { ResultsDTO results = null; MeasureDAOImpl measureDAO = MeasureDAOImpl.getInstance(); // Session Hibernate ISession session = null; try { session = PERSISTENTPROVIDER.getSession(); List component_measures = (List) measureDAO.findTop(session, pProject.getID(), Mapping.getComponentClass(pComponentType), pAudit.getID(), pTre, pMax); if (component_measures.size() > 0) { // Transformation de la liste de mesures en ResultDTO results = MeasureTransform.bo2dtoByAuditOrComponent(null, component_measures, pAudit); } } catch (JrafDaoException e) { FacadeHelper.convertException(e, MeasureFacade.class.getName() + ".getMeasuresByTRE"); } finally { FacadeHelper.closeSession(session, MeasureFacade.class.getName() + ".getMeasuresByTRE"); } return results; } /** * Retrieves components which have a precise score for some tres * * @param pProjectId project id * @param pAuditId Audit id * @param pTreKeys keys of tres to find * @param pTreValues value of tres * @param pMax number of components max to return * @return list of components * @throws JrafEnterpriseException if error */ public static List<ComponentDTO> getComponentsWhereTres(Long pProjectId, Long pAuditId, String[] pTreKeys, String[] pTreValues, Integer pMax) throws JrafEnterpriseException { List<ComponentDTO> components = new ArrayList<ComponentDTO>(); AbstractComponentDAOImpl dao = AbstractComponentDAOImpl.getInstance(); // Hibernate session ISession session = null; try { session = PERSISTENTPROVIDER.getSession(); List<AbstractComponentBO> componentsBO = dao.findWhereTres(session, pProjectId, pAuditId, pTreKeys, pTreValues, pMax); // bo -> dto for (int i = 0; i < componentsBO.size(); i++) { components.add(ComponentTransform.bo2Dto(componentsBO.get(i))); } } catch (JrafDaoException e) { FacadeHelper.convertException(e, MeasureFacade.class.getName() + ".getComponentsWhereTres"); } finally { FacadeHelper.closeSession(session, MeasureFacade.class.getName() + ".getComponentsWhereTres"); } return components; } /** * Permet de rcuprer des valeurs pour une liste de types de rsultat, une liste de types de composant et un audit * donns Format de ResultsDTO : 2 lignes : -- null en cl et liste des cls de TREs en valeur -- ComponentDTO en * cl et liste des rsultats associes en valeur ( n fois ) * * @param pAudit AuditDTO contenant l'ID de l'audit * @param pTreKey l'id du tre correspondant la pratique * @param pTREKeys liste des IDs des types de rsultats souhaits * @param pComponents liste de ComponentDTO souhaits * @return ResultsDTO * @throws JrafEnterpriseException exception JRAF * @roseuid 42CBFFB401C0 */ public static ResultsDTO getMeasuresByTREAndComponent(Long pTreKey, List pTREKeys, List pComponents, AuditDTO pAudit) throws JrafEnterpriseException { ResultsDTO results = null; Collection trClasses = null; MeasureDAOImpl measureDAO = MeasureDAOImpl.getInstance(); // Session Hibernate ISession session = null; try { // rcupration d'une session session = PERSISTENTPROVIDER.getSession(); // Rcupration de la collection de classes de TREs trClasses = getTREClasses(pTREKeys); if (trClasses.size() > 0) { // initialisation du ResultsDTO et ajout des cls results = new ResultsDTO(); results.put(null, pTREKeys); Iterator itComp = pComponents.iterator(); while (itComp.hasNext()) { // Pour chaque composant : ComponentDTO component = (ComponentDTO) itComp.next(); Long idComponent = new Long(component.getID()); Long idAudit = new Long(pAudit.getID()); // Rcupration des mesures souhaites Collection measures = measureDAO.findWhere(session, idComponent, idAudit, trClasses); if (measures.size() > 0) { // ajout au Rsult DTO des mesures souhaites results = MeasureTransform.bo2dtoByTRE(results, measures, pTREKeys, component); // On rcupre aussi la note de la pratique associe chaque composant // que l'on place en dbut de liste MarkBO mark = MarkDAOImpl.getInstance().load(session, new Long(component.getID()), new Long(pAudit.getID()), pTreKey); ((List) results.getResultMap().get(component)).add(0, new Float(mark.getValue())); } } } } catch (JrafDaoException e) { LOG.error(MeasureFacade.class.getName() + ".getMeasuresByTREAndComponent", e); } finally { FacadeHelper.closeSession(session, MeasureFacade.class.getName() + ".getMeasuresByTREAndComponent"); } return results; } /** * Rcupre les classes de TRE partir de la liste de TREs * * @param pTREKeys liste de cls de TREs * @return une collection de classe de TRE */ public static Collection getTREClasses(List pTREKeys) { Set trClasses = new HashSet(); Iterator it = pTREKeys.iterator(); while (it.hasNext()) { // pour chaque cl de type de rsultat String treKey = (String) it.next(); // on ajoute la classe correspondante la liste de classe de TRE trClasses.add(Mapping.getMetricClass(treKey)); } return trClasses; } /** * Constructeur vide * * @roseuid 42CBFFB40203 */ private MeasureFacade() { } /** * Creation d'une mesure de type Kiviat pour une application * * @param pAuditId Id de l'audit * @param pAllFactors tous les facteurs (= "true") ou seulement ceux ayant une note ? * @throws JrafEnterpriseException en cas de pb Hibernate * @return les donnes ncessaires la conception du Kiviat via une Applet soit : Map dont la cl contient les * projets et la valeur contient une map (facteurs, notes) */ public static Map getApplicationKiviat(Long pAuditId, String pAllFactors) throws JrafEnterpriseException { MeasureDAOImpl measureDAO = MeasureDAOImpl.getInstance(); // Session Hibernate ISession session = null; Map result = new HashMap(); try { // rcupration d'une session session = PERSISTENTPROVIDER.getSession(); ApplicationBO application = (ApplicationBO) ApplicationDAOImpl.getInstance().loadByAuditId(session, pAuditId); Iterator itp = application.getChildren().iterator(); ArrayList nullValuesList = new ArrayList(); while (itp.hasNext()) { // On ajoute les notes de chaque projets sur le kiviat ProjectBO project = (ProjectBO) itp.next(); SortedMap values = new TreeMap(); Long idProject = new Long(project.getId()); // recupere les facteurs du projet Collection factorResults = QualityResultDAOImpl.getInstance().findWhere(session, idProject, pAuditId); // et cree le map nom => note correspondant Iterator itf = factorResults.iterator(); while (itf.hasNext()) { FactorResultBO factor = (FactorResultBO) itf.next(); // le -1 est trait directement par le kiviatMaker Float value = new Float(factor.getMeanMark()); // le nom internationalis est gr dans le kiviatMaker String name = factor.getRule().getName(); values.put(name, value); if (factor.getMeanMark() < 0) { nullValuesList.add(name); } } // affichage seulement des facteurs qui ont des valeurs final int FACTORS_MIN = 3; values = deleteFactors(values, nullValuesList, pAllFactors, FACTORS_MIN); // et on envoie les valeurs result.put(project.getName(), values); } } catch (Exception e) { FacadeHelper.convertException(e, MeasureFacade.class.getName() + ".getMeasures"); } finally { FacadeHelper.closeSession(session, MeasureFacade.class.getName() + ".getMeasures"); } return result; } /** * Creation d'une mesure de type Kiviat pour un projet * * @param pProjectId Id du projet * @param pAuditId Id de l'audit * @param pAllFactors tous les facteurs (= "true") ou seulement ceux ayant une note ? * @throws JrafEnterpriseException en cas de pb Hibernate * @return tableau d'objets : la map des donnes + le boolen pour affichage de la case cocher tous les facteurs */ public static Object[] getProjectKiviat(Long pProjectId, Long pAuditId, String pAllFactors) throws JrafEnterpriseException { Map result = new HashMap(); JFreeChart projectKiviat = null; MeasureDAOImpl measureDAO = MeasureDAOImpl.getInstance(); // Session Hibernate ISession session = null; // Boolen conditonnanant l'affichage de la case cocher "tous les facteurs" dans la page Jsp boolean displayCheckBoxFactors = true; try { // rcupration d'une session session = PERSISTENTPROVIDER.getSession(); // On ajoute les notes de chaque projets sur le kiviat ProjectBO project = (ProjectBO) ProjectDAOImpl.getInstance().load(session, pProjectId); SortedMap values = new TreeMap(); // recupere les facteurs du projet Collection factorResults = QualityResultDAOImpl.getInstance().findWhere(session, pProjectId, pAuditId); // et cree le map nom => note correspondant Iterator it = factorResults.iterator(); ArrayList nullValuesList = new ArrayList(); while (it.hasNext()) { FactorResultBO factor = (FactorResultBO) it.next(); // le -1 est trait directement par le kiviatMaker Float value = new Float(factor.getMeanMark()); // ajoute la note dans le titre // TODO prendre le vritable nom du facteur String name = factor.getRule().getName(); if (value.floatValue() >= 0) { // avec 1 seul chiffre aprs la virgule NumberFormat nf = NumberFormat.getInstance(); nf.setMinimumFractionDigits(1); nf.setMaximumFractionDigits(1); name = name + " (" + nf.format(value) + ")"; } else { // Mmorisation temporaire des facteurs pour lesquels les notes sont nulles : sera utile si l'option // "Tous les facteurs" est coche pour afficher uniquement les facteurs ayant une note. nullValuesList.add(name); } values.put(name, value); } final int FACTORS_MIN = 3; if (nullValuesList.size() <= 0 || values.size() <= FACTORS_MIN) { displayCheckBoxFactors = false; } // Seulement les facteurs ayant une note ? ==> suppression des facteurs ayant une note nulle. // Mais trois facteurs doivent au moins s'afficher (nuls ou pas !) values = deleteFactors(values, nullValuesList, pAllFactors, FACTORS_MIN); // recupre le nom de l'audit String name = null; AuditBO audit = (AuditBO) AuditDAOImpl.getInstance().load(session, pAuditId); if (audit.getType().compareTo(AuditBO.MILESTONE) == 0) { name = audit.getName(); } if (null == name) { DateFormat df = DateFormat.getDateInstance(DateFormat.LONG); name = df.format(audit.getDate()); } result.put(name, values); } catch (Exception e) { FacadeHelper.convertException(e, MeasureFacade.class.getName() + ".getMeasures"); } finally { FacadeHelper.closeSession(session, MeasureFacade.class.getName() + ".getMeasures"); } Object[] kiviatObject = { result, new Boolean(displayCheckBoxFactors) }; return kiviatObject; } /** * Affichage des facteurs du Kiviat : tous les facteurs ou seulement ceux ayant une note * * @param pValues les donnes afficher : facteur + note * @param pNullValuesList la liste des facteurs dont la note est nulle * @param pAllFactors tous les facteurs (="true") ou seulement les facteurs ayant une note * @param pFactorsMin nombre de facteurs minimal que l'on doit afficher sur le Kiviat * @return values les donnes rellement afficher : facteur + note */ private static SortedMap deleteFactors(SortedMap pValues, ArrayList pNullValuesList, String pAllFactors, int pFactorsMin) { SortedMap values = new TreeMap(); // Seulement les facteurs ayant une note ? ==> suppression des facteurs ayant une note nulle. // Mais trois facteurs doivent au moins s'afficher (nuls ou pas !) if (pValues.size() > pFactorsMin && !pAllFactors.equals("true")) { // Nombre de suppressions possible int nbTotalDeletions = pValues.size() - pFactorsMin; // Nombre de suppressions effectu int nbCurrentDeletions = 0; // Parcours de la liste des facteurs avec une note nulle, pour les supprimer de l'affichage Iterator itList = pNullValuesList.iterator(); while (itList.hasNext() && nbCurrentDeletions < nbTotalDeletions) { String keyListe = (String) itList.next(); pValues.remove(keyListe); nbCurrentDeletions += 1; } } values.putAll(pValues); return values; } /** * Creation d'une mesure de type Bubble pour un projet * * @param pProjectId Id du projet * @param pAuditId Id de l'audit * @throws JrafEnterpriseException en cas de pb Hibernate * @return chart Scatterplot de l'Audit * @throws JrafEnterpriseException si pb Hibernate */ public static Object[] getProjectBubble(Long pProjectId, Long pAuditId) throws JrafEnterpriseException { // Rcupration des valeurs int i = 0; Collection measures = new ArrayList(0); MeasureDAOImpl measureDAO = MeasureDAOImpl.getInstance(); // Session Hibernate ISession session = null; Object[] result = null; try { // rcupration d'une session session = PERSISTENTPROVIDER.getSession(); // On rcupre la configuration du scatterplot pour ce projet et cet audit AuditDisplayConfBO auditConf = AuditDisplayConfDAOImpl.getInstance().findConfigurationWhere(session, pProjectId, pAuditId, "bubble"); if (null != auditConf) { BubbleConfBO bubble = (BubbleConfBO) auditConf.getDisplayConf(); String[] tre = { bubble.getXTre(), bubble.getYTre() }; // rcupration des mesures distinctes rattaches l'audit et au projet measures = MeasureDAOImpl.getInstance().findDistinct(session, pProjectId.longValue(), pAuditId.longValue(), tre); // recuperation des 2 tableaux evgs, vgs contenant les mesures double[] xMeasures = new double[measures.size()]; double[] yMeasures = new double[measures.size()]; double[] total = new double[measures.size()]; Iterator it = measures.iterator(); // Constantes pour la rcuprations des valeurs dans le tableau des rsultats remonts de la base final int VG_ID = 0; final int EVG_ID = 1; final int TOTAL_ID = 2; while (it.hasNext()) { Object[] res = (Object[]) it.next(); // on ajoute ses valeurs Integer vg = (Integer) res[VG_ID]; yMeasures[i] = vg.doubleValue(); Integer evg = (Integer) res[EVG_ID]; xMeasures[i] = evg.doubleValue(); Integer tt = (Integer) res[TOTAL_ID]; total[i] = tt.doubleValue(); i++; } // Positions des axes Long horizontal = new Long(bubble.getHorizontalAxisPos()); Long vertical = new Long(bubble.getVerticalAxisPos()); // construction des paramtres de la srie String displayedXTre = bubble.getXTre().substring(bubble.getXTre().lastIndexOf(".") + 1); String displayedYTre = bubble.getYTre().substring(bubble.getYTre().lastIndexOf(".") + 1); String measuresKinds = "(" + displayedXTre + "," + displayedYTre + ",total)"; result = new Object[] { horizontal, vertical, measuresKinds, yMeasures, xMeasures, total, yMeasures, xMeasures, total, tre }; } } catch (Exception e) { FacadeHelper.convertException(e, MeasureFacade.class.getName() + ".getMeasures"); } finally { FacadeHelper.closeSession(session, MeasureFacade.class.getName() + ".getMeasures"); } return result; } /** * Creation du Piechart d'une application * * @param pAuditId id de l'audit * @throws JrafEnterpriseException si pb Hibernate * @return les donnes ncessaires la conception du PieChart via une Applet soit : Map dont la cl contient les * projets et la valeur le nombre de lignes du projet */ public static Object[] getApplicationPieChart(Long pAuditId) throws JrafEnterpriseException { // Rcupration des v(g) et des ev(g) Collection measures; MeasureDAOImpl measureDAO = MeasureDAOImpl.getInstance(); MetricDAOImpl metricDAO = MetricDAOImpl.getInstance(); AuditDisplayConfDAOImpl auditConfDao = AuditDisplayConfDAOImpl.getInstance(); // Session Hibernate ISession session = null; Object[] result = new Object[2]; try { // rcupration d'une session session = PERSISTENTPROVIDER.getSession(); ApplicationBO application = (ApplicationBO) ApplicationDAOImpl.getInstance().loadByAuditId(session, pAuditId); // On retrouve les ids de tous les projets de l'application : Set projects = new HashSet(); Iterator itChildren = application.getChildren().iterator(); // Pour chaque enfant du projet : while (itChildren.hasNext()) { // Une application ne contient que des projets ProjectBO projectBO = (ProjectBO) itChildren.next(); // On ajoute le projet seulement si celui-ci a t audit // (cas par exemple d'une dsactivation) if (projectBO.containsAuditById(pAuditId.longValue())) { projects.add(projectBO); } } // rcupration du nombre de ligne de code de chaque projet Map volum = new HashMap(); Map url = new HashMap(); // volumtrie par grille (ne sert que pour l'export PDF) Map volumByGrid = new HashMap(); Iterator itProjects = projects.iterator(); int i = 0; while (itProjects.hasNext()) { int accLines = 0; Long nbLignes = new Long(0); ProjectBO project = (ProjectBO) itProjects.next(); Long idProject = new Long(project.getId()); // Rcupration des mesures correspondant l'audit et // au projet concern l'aide de la configuration de la volumtrie pour une application AuditDisplayConfBO auditConf = (AuditDisplayConfBO) auditConfDao.findConfigurationWhere(session, idProject, pAuditId, DisplayConfConstants.VOLUMETRY_SUBCLASS, DisplayConfConstants.VOLUMETRY_APPLICATION_TYPE); if (null != auditConf) { VolumetryConfBO volumConf = (VolumetryConfBO) auditConf.getDisplayConf(); // On ajoute les volumtries trouves en fonction des tres for (Iterator it = volumConf.getTres().iterator(); it.hasNext();) { IntegerMetricBO metric = metricDAO.findIntegerMetricWhere(session, idProject.longValue(), pAuditId.longValue(), (String) it.next()); if (null != metric) { accLines += ((Integer) metric.getValue()).intValue(); } } nbLignes = new Long(accLines); // On ajoute la valeur au nb de ligne pour la grille du projet setApplicationVolumetryByGrid(session, idProject, pAuditId, volumByGrid, nbLignes); } // si il n'y a pas de configuration, c'est qu'il y a un problme en base // Placement du nombre de lignes en regard du nom de projet si le nombre de lignes // et > 0 if (0 < nbLignes.longValue()) { volum.put(project.getName(), nbLignes); url.put(project.getName(), idProject); } i++; } result = new Object[] { volum, url, volumByGrid }; } catch (Exception e) { FacadeHelper.convertException(e, MeasureFacade.class.getName() + ".getMeasures"); } finally { FacadeHelper.closeSession(session, MeasureFacade.class.getName() + ".getMeasures"); } return result; } /** * Ajoute le nombre de lignes d'un projet pour une grille donne * * @param session la session * @param idProject l'id du projet * @param pAuditId l'id de l'audit * @param volumByGrid la map du nombre de lignes par grille * @param nbLines le nombre de ligne ajouter pour la grille * @throws JrafDaoException si erreur */ private static void setApplicationVolumetryByGrid(ISession session, Long idProject, Long pAuditId, Map volumByGrid, Long nbLines) throws JrafDaoException { // Rcupration des grilles AuditGridDAOImpl auditGridDao = AuditGridDAOImpl.getInstance(); // On rcupre la grille associe au projet pour cet audit AuditGridBO auditGrid = auditGridDao.findWhere(session, idProject, pAuditId); // on ajoute la valeur au nb de ligne pour la grille du projet Long nbLinesforGrid = (Long) volumByGrid.get(auditGrid.getGrid().getName()); // Si on a dj eu un projet associ cette grille, on fait la somme des lignes if (null != nbLinesforGrid) { volumByGrid.put(auditGrid.getGrid().getName(), new Long(nbLinesforGrid.longValue() + nbLines.longValue())); } else { volumByGrid.put(auditGrid.getGrid().getName(), nbLines); } } /** * Rcupre les valeurs permettant d'avoir l'historique relatif a des cles de tre et un composant * * @param pComponent un composant * @param pTreLabel label de tre * @param pTreKey cles de tre concerne par l'historique * @param pAuditDate date a partir de laquelle on souhaite recuperer tous les audits * @param pRuleId id de la rgle qualit ou null s'il s'agit d'une mesure * @return La map correspondant aux points * @throws JrafEnterpriseException exception Jraf */ public static Map getHistoricResults(ComponentDTO pComponent, String pTreKey, String pTreLabel, Date pAuditDate, Long pRuleId) throws JrafEnterpriseException { // Session Hibernate ISession session = null; // Initialisation des differentes Daos AuditDAOImpl auditDao = AuditDAOImpl.getInstance(); List currentAudits = null; // liste des audits relatifs au composant Map values = null; try { session = PERSISTENTPROVIDER.getSession(); // recuperation des audits relatifs a un composant tris par date relle currentAudits = auditDao.findAfter(session, pComponent.getID(), pAuditDate); // Initialisation de la Map values = new HashMap(); Iterator auditIterator = currentAudits.iterator(); AuditBO currentAuditBO = null; // AuditBO courant Long currentAuditId = null; AuditDTO currentAudit = null; // audit parcouru ResultsDTO currentResults = null; // ResultsDTO courant recupere while (auditIterator.hasNext()) { // recuperation de l'audit parcouru currentAuditBO = (AuditBO) auditIterator.next(); currentAuditId = new Long(currentAuditBO.getId()); // recuperation de l'application associe a l'audit ApplicationBO currentApplication = (ApplicationBO) ApplicationDAOImpl.getInstance() .loadByAuditId(session, currentAuditId); currentAudit = AuditTransform.bo2Dto(currentAuditBO, currentApplication.getId()); if (pRuleId == null) { currentResults = MeasureFacade.getMeasures(currentAudit, pComponent, pTreKey); } else { currentResults = QualityResultFacade.getQResults(currentAudit, pComponent, pRuleId); } // recuperation de la valeur associee du ResultsDTO Object objectValue = ((ArrayList) currentResults.getResultMap().get(null)).get(0); // On ajoute la valeur la table (en fonction du type de l'objet) addHistoricValues(values, currentAudit.getRealDate(), objectValue); } } catch (JrafDaoException e) { FacadeHelper.convertException(e, MeasureFacade.class.getName() + ".getHistoricResults"); } finally { FacadeHelper.closeSession(session, MeasureFacade.class.getName() + ".getHistoricResults"); } return values; } /** * Ajoute une entre la table des valeurs du graphe historique * * @param values la table des valeurs * @param key la cl * @param value la valeur */ private static void addHistoricValues(Map values, Date key, Object value) { if (value != null) { // Petit test faire sur le type de la note // Dans le cas ou c'est un boolen, on met alors 1 si le boolen // est true, 0 sinon // Dans le cas d'une note, on met la valeur // Initialisation 0 par dfaut Number numberToAdd = new Integer("0"); if (value instanceof Boolean) { // boolen valant "true" if (((Boolean) value).booleanValue()) { numberToAdd = new Integer("1"); } // else boolen valant false, rien faire car valeur par dfaut } else if (value.toString().matches("[0-9]+(\\.[0-9]+)?")) { // Rcupre directement le nombre numberToAdd = (Number) value; } if (numberToAdd.intValue() != -1) { values.put(key, numberToAdd); } } } /** * Permet de dessiner l'historique relatif a des cles de tre et un composant * * @param pComponent un composant * @param pTreLabel label de tre * @param pTreKey cles de tre concerne par l'historique * @param pAuditDate date a partir de laquelle on souhaite recuperer tous les audits * @param pRuleId id de la rgle qualit ou null s'il s'agit d'une mesure * @return GraphDTO * @throws JrafEnterpriseException exception Jraf */ public static Object[] getHistoricGraph(ComponentDTO pComponent, String pTreKey, String pTreLabel, Date pAuditDate, Long pRuleId) throws JrafEnterpriseException { ISession session = null; PracticeRuleBO ruleBO = null; Object[] result = null; try { session = PERSISTENTPROVIDER.getSession(); // if pRuleId is not null, let's try to find the rule if (pRuleId != null) { // Recovery of the rule ruleBO = (PracticeRuleBO) PracticeRuleAPDAOImpl.getInstance().get(session, pRuleId); } // If it's a manual practice if (ruleBO != null && ruleBO.getFormula() == null) { String timeLimitation = ruleBO.getTimeLimitation(); Object[] objectReturn = MeasureFacade.getHistoricManualMark(pComponent, pAuditDate, pRuleId, timeLimitation); result = new Object[] { pTreLabel, objectReturn[0], HISTORIC_TYPE, objectReturn[1], objectReturn[2] }; } // If it's not a manual practice else { Map values = MeasureFacade.getHistoricResults(pComponent, pTreKey, pTreLabel, pAuditDate, pRuleId); result = new Object[] { pTreLabel, values, HISTORIC_TYPE, new HashMap<Date, Float>() }; } } catch (JrafPersistenceException e) { FacadeHelper.convertException(e, MeasureFacade.class.getName() + ".getHistoricGraph"); } catch (JrafDaoException e) { FacadeHelper.convertException(e, MeasureFacade.class.getName() + ".getHistoricGraph"); } finally { FacadeHelper.closeSession(session, MeasureFacade.class.getName() + ".getHistoricGraph"); } return result; } /** * Retourne les mesures associes la volumtrie d'un projet d'aprs sa configuration en base pour un audit donn * sous la forme de ResultsDTO : ResultsDTO.getResultMap.get(null) --> les noms des tres * ResultsDTO.getResultMap.get(pProject) --> les valeurs associes * * @param pAuditId l'id de l'audit * @param pProject le projet * @return l'ensemble des mesures de la volumtrie du projet * @throws JrafEnterpriseException si erreur */ public static ResultsDTO getProjectVolumetry(Long pAuditId, ComponentDTO pProject) throws JrafEnterpriseException { // Dclaration du ResultsDTO retourner ResultsDTO results = new ResultsDTO(); MetricDAOImpl metricDAO = MetricDAOImpl.getInstance(); // Session Hibernate ISession session = null; try { // Rcupration d'une session session = PERSISTENTPROVIDER.getSession(); // Rcupration de la configuration de la volumtrie pour ce projet et cet audit AuditDisplayConfBO auditConf = AuditDisplayConfDAOImpl.getInstance().findConfigurationWhere(session, new Long(pProject.getID()), pAuditId, DisplayConfConstants.VOLUMETRY_SUBCLASS, DisplayConfConstants.VOLUMETRY_PROJECT_TYPE); if (null != auditConf) { VolumetryConfBO volumConf = (VolumetryConfBO) auditConf.getDisplayConf(); // Pour chaque nom de tre, on rcupre la valeur de la mtrique associe // et on construit ainsi les rsultats retourner List tres = new ArrayList(); List values = new ArrayList(); for (Iterator it = volumConf.getTres().iterator(); it.hasNext();) { String treName = (String) it.next(); IntegerMetricBO metric = metricDAO.findIntegerMetricWhere(session, pProject.getID(), pAuditId.longValue(), treName); if (null != metric) { // On ajoute la liste des rsultats tres.add(treName); values.add(metric.getValue()); } } results.getResultMap().put(null, tres); results.getResultMap().put(pProject, values); } // Sinon il y a un problme en base } catch (JrafDaoException e) { FacadeHelper.convertException(e, MeasureFacade.class.getName() + ".getMeasuresByTRE"); } finally { FacadeHelper.closeSession(session, MeasureFacade.class.getName() + ".getMeasuresByTRE"); } return results; } /** * Recover the list of information needed to fill the historic of a manual practice The first object return * represent the historic of all the mark inserted for the manual practice. The second object represent the validity * of the last mark inserted * * @param component Component on which we do the search * @param auditDate The limit date for the search * @param ruleId The id of the rule on which we do the historic * @param timeLimitation This String represents the duration of validity of a mark for the manual practice * @return objects * @throws JrafEnterpriseException exception happen during the search */ public static Object[] getHistoricManualMark(ComponentDTO component, Date auditDate, Long ruleId, String timeLimitation) throws JrafEnterpriseException { ISession session = null; Map values = new HashMap<Date, Float>(); Map extension = new HashMap<Date, Float>(); //List used to display manual mark comments history ArrayList<QualityResultDTO> listForComments = new ArrayList<QualityResultDTO>(); try { session = PERSISTENTPROVIDER.getSession(); QualityResultDAOImpl dao = QualityResultDAOImpl.getInstance(); Calendar todayCal = TimeUtil.calDateOnly(); PracticeResultBO lastResult = dao.findLastManualMark(session, component.getID(), ruleId); if (lastResult != null) { Calendar endValidity = TimeLimitationParser.endValidityDate(timeLimitation, lastResult.getCreationDate()); if (endValidity.getTime().compareTo(auditDate) > 0) { ArrayList<PracticeResultBO> resultList = (ArrayList<PracticeResultBO>) dao .findManualMarkSince(session, component.getID(), ruleId, auditDate); if (resultList != null) { for (PracticeResultBO practice : resultList) { values.put(practice.getCreationDate(), practice.getMeanMark()); QualityResultDTO manualMarkForCommentsHistory = QualityResultTransform.bo2Dto(practice); listForComments.add(manualMarkForCommentsHistory); } if (lastResult.getCreationDate().compareTo(todayCal.getTime()) < 0) { extension = MeasureFacade.fillExtensionMap(lastResult.getCreationDate(), lastResult.getMeanMark(), todayCal, endValidity); } } else { extension = MeasureFacade.fillExtensionMap(auditDate, lastResult.getMeanMark(), todayCal, endValidity); } } } } catch (JrafPersistenceException e) { FacadeHelper.convertException(e, MeasureFacade.class.getName() + ".getHistoricManualMark"); } catch (JrafDaoException e) { FacadeHelper.convertException(e, MeasureFacade.class.getName() + ".getHistoricManualMark"); } finally { FacadeHelper.closeSession(session, MeasureFacade.class.getName() + ".getHistoricManualMark"); } return new Object[] { values, extension, listForComments }; } /** * When we create the historic for a manual practice, this method permit to fill part of the historic corresponding * to the validity of the last mark * * @param beginDate Date of creation of the mark * @param mark The mark * @param todayCal Calendar set on today * @param endValidity Date of end of validity of the mark * @return a map which contains information to display for the historic */ private static Map fillExtensionMap(Date beginDate, float mark, Calendar todayCal, Calendar endValidity) { Map extension = new HashMap<Date, Float>(); extension.put(beginDate, mark); if (endValidity.after(todayCal)) { extension.put(todayCal.getTime(), mark); } else { extension.put(endValidity.getTime(), mark); } return extension; } }