/** * 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.squaleweb.applicationlayer.action.results; import java.io.IOException; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.Map; import java.util.StringTokenizer; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.ActionErrors; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.jfree.chart.ChartRenderingInfo; import org.jfree.chart.JFreeChart; import org.jfree.chart.entity.StandardEntityCollection; import org.jfree.chart.servlet.ServletUtilities; import org.squale.jraf.commons.exception.JrafEnterpriseException; import org.squale.jraf.helper.AccessDelegateHelper; import org.squale.jraf.spi.accessdelegate.IApplicationComponent; import org.squale.squalecommon.datatransfertobject.component.ComponentDTO; import org.squale.squalecommon.datatransfertobject.result.QualityResultDTO; import org.squale.squalecommon.datatransfertobject.rule.PracticeRuleDTO; import org.squale.squalecommon.datatransfertobject.rule.QualityRuleDTO; import org.squale.squaleweb.applicationlayer.action.accessRights.ReaderAction; import org.squale.squaleweb.applicationlayer.formbean.results.ComponentForm; import org.squale.squaleweb.applicationlayer.formbean.results.ParamReviewCommentsForm; import org.squale.squaleweb.applicationlayer.formbean.results.ParamReviewForm; import org.squale.squaleweb.applicationlayer.tracker.TrackerStructure; import org.squale.squaleweb.resources.WebMessages; import org.squale.squaleweb.transformer.ComponentTransformer; import org.squale.squaleweb.transformer.ParamReviewCommentsTransform; import org.squale.squaleweb.transformer.ParamReviewTransformer; import org.squale.squaleweb.util.SqualeWebConstants; import org.squale.squaleweb.util.graph.GraphMaker; import org.squale.squaleweb.util.graph.HistoMaker; import org.squale.welcom.struts.bean.WActionForm; import org.squale.welcom.struts.transformer.WTransformerException; import org.squale.welcom.struts.transformer.WTransformerFactory; /** * Affichage de l'historique Cette action permet l'affichage de l'historique de m�triques ou de r�gles qualit� (facteur, * crit�re ou pratique) */ public class ReviewAction extends ReaderAction { /** * R�cup�re la liste des TREs correspondant au composant s�lectionn� * * @param pMapping le mapping. * @param pForm le formulaire � lire. * @param pRequest la requ�te HTTP. * @param pResponse la r�ponse de la servlet. * @return l'action � r�aliser. */ public ActionForward review( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest, HttpServletResponse pResponse ) { ActionForward forward = null; ActionErrors errors = new ActionErrors(); try { forward = pMapping.findForward( "review" ); String tre; String ruleId; boolean isManualMark=false; // D�termination du type de param�tre boolean isMetric = ( pRequest.getParameter( "kind" ) == null ) || ( pRequest.getParameter( "kind" ).equals( "metric" ) ); if ( isMetric ) { tre = pRequest.getParameter( "which" ); ruleId = ""; } else { // R�cup�ration du v�ritable nom de la r�gle IApplicationComponent ac = AccessDelegateHelper.getInstance( "QualityGrid" ); QualityRuleDTO dto = new QualityRuleDTO(); ruleId = pRequest.getParameter( "which" ); dto.setId( Integer.valueOf( ruleId ).longValue() ); dto = (QualityRuleDTO) ac.execute( "getQualityRule", new Object[] { dto, new Boolean( false ) } ); tre = dto.getName(); if ( dto instanceof PracticeRuleDTO ) { //If the practice is a manual practice if(((PracticeRuleDTO)dto).getFormulaType()==null) { isManualMark=true; forward = pMapping.findForward( "reviewManualMark" ); } } } // si un composant est pr�cis�, on le prend sinon on prend le projet String componentId = pRequest.getParameter( "component" ); if ( componentId == null ) { componentId = pRequest.getParameter( "projectId" ); } WTransformerFactory.objToForm( ParamReviewTransformer.class, (WActionForm) pForm, new Object[] { tre, ruleId, componentId,isManualMark } ); IApplicationComponent ac = AccessDelegateHelper.getInstance( "Component" ); ComponentDTO dto = new ComponentDTO(); dto.setID( new Long( componentId ).longValue() ); Object[] paramIn = { dto }; dto = (ComponentDTO) ac.execute( "get", paramIn ); Object obj[] = { dto }; ComponentForm cForm = (ComponentForm) WTransformerFactory.objToForm( ComponentTransformer.class, obj ); ( (ParamReviewForm) pForm ).setComponentName( cForm.getName() ); ( (ParamReviewForm) pForm ).setComponentType( cForm.getType() ); // Met � jour les champs graph et comments du form setParamsInForm( pForm, pRequest ); } catch ( Exception e ) { // Factorisation du traitement des erreurs handleException( e, errors, pRequest ); } if ( !errors.isEmpty() ) { // Sauvegarde des message et transfert vers la page d'erreur saveErrors( pRequest, errors ); forward = pMapping.findForward( "failure" ); } // Mise en place du traceur historique String displayName = WebMessages.getString( pRequest.getLocale(), "tracker.mark.history" ); // Dans le cas ou on arrive depuis la vue composant // il ne faut pas faire un updateTracker car ce n'est pas le TrackerHist // qui est affich� mais le Tracker des composants. // Par cons�quent, il faut cr��r un nouveau form dont le seul champ � remplir est le nom, // car ce sera le dernier �l�ment et ne sera donc pas cliquable. if ( pRequest.getSession().getAttribute( SqualeWebConstants.TRACKER_BOOL ).equals( "true" ) ) { // nouveau form dont on ne fait que remplir le nom ComponentForm form = new ComponentForm(); form.setName( displayName ); // remet � jour le Tracker des composants updateTrackerComponent( form.getId(), form.getName(), pRequest ); } else { updateHistTracker( displayName, "", TrackerStructure.UNDEFINED, pRequest, false ); // Le lien est vide car // c'est action // terminale } return forward; } /** * R�cup�re la liste des TREs correspondant au composant s�lectionn� * * @param pMapping le mapping. * @param pForm le formulaire � lire. * @param pRequest la requ�te HTTP. * @param pResponse la r�ponse de la servlet. * @return l'action � r�aliser. */ public ActionForward changeDays( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest, HttpServletResponse pResponse ) { ActionErrors errors = new ActionErrors(); ParamReviewForm currentForm = (ParamReviewForm)pForm; ActionForward forward =null; // If we work on manual practice if (currentForm.isManualMark()) { forward = pMapping.findForward( "reviewManualMark" ); } else { forward = pMapping.findForward( "review" ); } // Met � jour les champs graph et comments du form try { setParamsInForm( pForm, pRequest ); } catch ( Exception e ) { // Factorisation du traitement des erreurs handleException( e, errors, pRequest ); forward = pMapping.findForward( "total_failure" ); } // traceur non n�cessaire ici return forward; } /** * * @param pForm le formulaire * @param pRequest la requ�te * @return les param�tres */ private Object[] getParams( ActionForm pForm, HttpServletRequest pRequest ) { ActionErrors errors = new ActionErrors(); Object[] paramIn = null; ParamReviewForm currentForm = (ParamReviewForm)pForm; int index = 0; int nbDays = currentForm.getNbDays(); String tre = currentForm.getTre(); String ruleId =currentForm.getRuleId(); String componentId = currentForm.getComponentId(); ComponentDTO comp = new ComponentDTO(); comp.setID( Long.decode( componentId ).longValue() ); Date date = null; // Conversion en une date if ( nbDays> 0 ) { GregorianCalendar gc = new GregorianCalendar(); gc.add( Calendar.DATE, -nbDays ); date = gc.getTime(); } String treLabel = WebMessages.getString( pRequest, tre ); if ( ruleId.length() > 0 ) { paramIn = new Object[] { comp, tre, treLabel, date, Long.decode( ruleId ) }; } else { paramIn = new Object[] { comp, tre, treLabel, date, null }; } return paramIn; } /** * Construit un graph et le recopie dans le outputStream si le formulaire a �t� valid� * * @param pForm le formulaire � lire. * @param pRequest la requ�te HTTP. * @param pComp le ComponentDTO * @param pResult le r�sultat de l'appel � la couche m�tier "Graph" * @return l'action � r�aliser. * @throws JrafEnterpriseException en cas de probl�me de r�cup�ration des donn�s * @throws IOException en cas de probl�mes de cr�ation du graph */ private GraphMaker getGraph( ActionForm pForm, HttpServletRequest pRequest, ComponentDTO pComp, Object[] pResult ) throws JrafEnterpriseException, IOException { // Initialisation GraphMaker histoChart = null; // Obtention de la couche m�tier IApplicationComponent ac = AccessDelegateHelper.getInstance( "Component" ); // R�cup�ration du componentDTO Object[] paramIn2 = new Object[] { pComp }; ComponentDTO componentDTO = (ComponentDTO) ac.execute( "get", paramIn2 ); // S'applique uniquement dans le cas d'une m�thode // on enl�ve tout ce qui concerne les param�tres de la m�thode // pour faciliter l'affichage String componentName = componentDTO.getName(); StringTokenizer st = new StringTokenizer( componentName, "(" ); if ( st.hasMoreTokens() ) { componentDTO.setName( st.nextToken() ); } // On n'affiche le graphe que si on a des r�sultats if(((ParamReviewForm)pForm).isManualMark()) { histoChart = manualMarkGraph( pRequest, pResult ); } else { histoChart = componentGraph( pRequest, pResult ); } // Met � jour l'attribut graph dans le form ( (ParamReviewForm) pForm ).setReviewGraph( histoChart ); pRequest.getSession().removeAttribute( SqualeWebConstants.VALIDATED ); return histoChart; } /** * Create the GraphMaker * * @param pRequest The http request * @param result The list of results to display * @return an object GraphMaker * @throws IOException exception happen */ private GraphMaker componentGraph(HttpServletRequest pRequest,Object[] result) throws IOException { GraphMaker histoChart = null; if ( ( (Map) result[1] ).size() > 0 ) { HistoMaker histoMaker = new HistoMaker(); //Add the curve for the list of result histoMaker.addCurve( (String) result[0], (Map) result[1] ); JFreeChart chartKiviat = histoMaker.getChart(); ChartRenderingInfo infoHisto = new ChartRenderingInfo( new StandardEntityCollection() ); // Sauvegarde du graphe historique au format png dans un espace temporaire String fileNameHisto = ServletUtilities.saveChartAsPNG( chartKiviat, HistoMaker.DEFAULT_WIDTH, HistoMaker.DEFAULT_HEIGHT, infoHisto, pRequest.getSession() ); histoChart = new GraphMaker( pRequest, fileNameHisto, infoHisto ); } return histoChart; } /** * Create the GraphMaker for a manual practice * * @param pRequest The http request * @param result The list of results to display * @return an object GraphMaker * @throws IOException exception happen */ private GraphMaker manualMarkGraph(HttpServletRequest pRequest,Object[] result) throws IOException { GraphMaker histoChart = null; if ( ( (Map) result[1] ).size() > 0 || ((Map) result[3]).size()>0) { HistoMaker histoMaker = new HistoMaker(); //Add the curve for the historic of mark histoMaker.addCurve( (String) result[0], (Map) result[1] ); //Add the curve for the validity period histoMaker.addCurve(WebMessages.getString( pRequest, "reviewManualMark.validity" ), (Map) result[3] ); JFreeChart chartKiviat = histoMaker.getChart(true); ChartRenderingInfo infoHisto = new ChartRenderingInfo( new StandardEntityCollection() ); // save the graph as png in a temporary space String fileNameHisto = ServletUtilities.saveChartAsPNG( chartKiviat, HistoMaker.DEFAULT_WIDTH, HistoMaker.DEFAULT_HEIGHT, infoHisto, pRequest.getSession() ); histoChart = new GraphMaker( pRequest, fileNameHisto, infoHisto ); } return histoChart; } /*** * Cette m�thode sert d'interm�diaire pour lancer la construction * du graph (getGraph) et la r�cup�ration des commentaires * de la note manuelle, ces m�thodes partageant les m�mes donn�es * * @param pForm le formulaire � lire. * @param pRequest la requ�te HTTP. * @throws JrafEnterpriseException en cas de probl�me de r�cup�ration des donn�s * @throws IOException IOException en cas de probl�mes de cr�ation du graph */ private void setParamsInForm( ActionForm pForm, HttpServletRequest pRequest ) throws JrafEnterpriseException, IOException { //obtenir les params n�cessaires pour lancer getGraph and setComments Object[] paramIn = getParams( pForm, pRequest ); // Obtention de la couche m�tier IApplicationComponent ac2 = AccessDelegateHelper.getInstance( "Graph" ); // Appel de la couche m�tier Object[] result = (Object[]) ac2.execute( "getHistoricGraph", paramIn ); // R�cup�ration du componentDTO pour getGraph ComponentDTO comp = (ComponentDTO) paramIn[0]; //lancement de getGraph getGraph( pForm, pRequest, comp, result ); //lancement de setCommentsInForm � partir de la liste de QualityResultDTO //si la liste a bien �t� envoy�e ArrayList<QualityResultDTO> listeManualMark = new ArrayList<QualityResultDTO>(); if ( result.length > 4 ) { listeManualMark = (ArrayList<QualityResultDTO>) result[4]; setCommentsInForm( listeManualMark, pForm ); } } /*** * M�thode ajoutant l'historique des commentaires des notes manuelles * au formulaire * * @param pManualMarkList la liste des commentaires */ private void setCommentsInForm( ArrayList<QualityResultDTO> pManualMarkList, ActionForm pForm ) { ArrayList<ParamReviewCommentsForm> commentsFormList = new ArrayList<ParamReviewCommentsForm>(); //on pr�pare les formbean commentaire ParamReviewCommentsForm commentsForm; //on compose l'historique � afficher for ( QualityResultDTO dto : pManualMarkList ) { commentsForm = new ParamReviewCommentsForm(); // Transform the bo into form try { WTransformerFactory.objToForm( ParamReviewCommentsTransform.class, commentsForm, new Object[] { dto } ); } catch ( WTransformerException e ) { // TODO Auto-generated catch block e.printStackTrace(); } commentsFormList.add( commentsForm ); } //on ajoute la liste au formbean courant ( (ParamReviewForm) pForm).setCommentsList( commentsFormList ); } }