/** * 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 13 sept. 05 * * Pour changer le mod�le de ce fichier g�n�r�, allez � : * Fen�tre>Pr�f�rences>Java>G�n�ration de code>Code et commentaires */ package org.squale.squaleweb.applicationlayer.action.results.project; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import javax.servlet.ServletException; 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.AuditDTO; import org.squale.squalecommon.datatransfertobject.component.ComponentDTO; import org.squale.squalecommon.datatransfertobject.result.ResultsDTO; import org.squale.squaleweb.applicationlayer.action.ActionUtils; import org.squale.squaleweb.applicationlayer.action.accessRights.BaseDispatchAction; import org.squale.squaleweb.applicationlayer.action.accessRights.ReaderAction; import org.squale.squaleweb.applicationlayer.action.export.xls.ExcelDataComponentsResultsList; import org.squale.squaleweb.applicationlayer.action.export.xls.ExcelDataTopList; import org.squale.squaleweb.applicationlayer.formbean.LogonBean; import org.squale.squaleweb.applicationlayer.formbean.RootForm; import org.squale.squaleweb.applicationlayer.formbean.results.ComponentForm; import org.squale.squaleweb.applicationlayer.formbean.results.ComponentResultListForm; import org.squale.squaleweb.applicationlayer.formbean.results.TopListForm; import org.squale.squaleweb.applicationlayer.tracker.TrackerStructure; import org.squale.squaleweb.resources.WebMessages; import org.squale.squaleweb.transformer.ComponentResultListTransformer; import org.squale.squaleweb.util.SqualeWebConstants; import org.squale.squaleweb.util.graph.BubbleMaker; import org.squale.squaleweb.util.graph.GraphMaker; import org.squale.welcom.outils.excel.ExcelFactory; import org.squale.welcom.outils.excel.ExcelGenerateurException; import org.squale.welcom.outils.pdf.PDFDataJasperReports; import org.squale.welcom.outils.pdf.PDFEngine; import org.squale.welcom.outils.pdf.PDFFactory; import org.squale.welcom.struts.bean.WActionForm; import org.squale.welcom.struts.transformer.WTransformerException; import org.squale.welcom.struts.transformer.WTransformerFactory; import org.squale.welcom.struts.util.WConstants; /** * @author M400841 Pour changer le mod�le de ce commentaire de type g�n�r�, allez � : * Fen�tre>Pr�f�rences>Java>G�n�ration de code>Code et commentaires */ public class TopAction extends ReaderAction { /** Keyword for tres keys attribute */ public static final String TRE_KEYS_KEYWORD = "treKeys"; /** Keyword for tre values attribute */ public static final String TRE_VALUES_KEYWORD = "treValues"; /** * Selectionne un nouveau projet courant � visualiser. * * @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 display( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest, HttpServletResponse pResponse ) { ActionForward forward = null; ActionErrors errors = new ActionErrors(); try { TopListForm topListForm = (TopListForm) pForm; // recupere le "type" de top String ComponentType = getNonCustomizedComponentType(pRequest); //On place le langage dans la requ�te pour les pages suivantes pRequest.setAttribute(SqualeWebConstants.LANGUAGE, pRequest.getParameter(SqualeWebConstants.LANGUAGE)); topListForm.setComponentType(ComponentType); topListForm.setTre( pRequest.getParameter( "tre" ) ); // et calcule les resultats getResults( pRequest, topListForm ); } catch ( Exception e ) { handleException( e, errors, pRequest ); } if ( !errors.isEmpty() ) { saveMessages( pRequest, errors ); forward = pMapping.findForward( "total_failure" ); } else { forward = pMapping.findForward( "success" ); } // Mise en place du traceur historique String name = WebMessages.getString( pRequest.getLocale(), pRequest.getParameter( "tre" ) ); String way = pRequest.getParameter( "componenttype" ); // On r�cup�re la cl� pour le traceur en fonction du type du composant if ( null != way ) { // code d�fensif //int index = way.lastIndexOf( "." ); int index = getNonCustomizedComponentType(pRequest).lastIndexOf("."); if ( index > 0 ) { String tracker = way.substring( index, way.length() ); name = WebMessages.getString( pRequest.getLocale(), "tracker.top" + tracker ) + name; } } updateHistTracker( name, "top.do?" + pRequest.getQueryString(), TrackerStructure.TOP_VIEW, pRequest, true ); // Indique que l'on vient d'une vue top et pas d'une vue composant changeWay( pRequest, "false" ); // Pour pouvoir ajouter le composant � la fin du traceur needToReset( pRequest, "true" ); return forward; } private String getNonCustomizedComponentType (HttpServletRequest pRequest) { String ComponentType = pRequest.getParameter( "componenttype" ); String language = pRequest.getParameter(SqualeWebConstants.LANGUAGE); // modifie suivant le langage if ( ComponentType.endsWith(language) ) { Integer end = ComponentType.length() - (1 + language.length() ); ComponentType=ComponentType.substring(0, end); } return ComponentType; } /** * Redirige vers une jsp affichant le scatterplott * * @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 displayBubble( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest, HttpServletResponse pResponse ) { ActionForward forward = null; ActionErrors errors = new ActionErrors(); try { JFreeChart chartBubble = getBubbleChart( pRequest ); ChartRenderingInfo infoBubble = new ChartRenderingInfo( new StandardEntityCollection() ); // Sauvegarde de l'image du BubbleChart au format png dans le form String fileNameBubble = ServletUtilities.saveChartAsPNG( chartBubble, BubbleMaker.DEFAULT_WIDTH, BubbleMaker.DEFAULT_HEIGHT, infoBubble, pRequest.getSession() ); GraphMaker projectBubbleGraphMaker = new GraphMaker( pRequest, fileNameBubble, infoBubble ); pRequest.setAttribute( SqualeWebConstants.BUBBLE_GRAPH_MAKER, projectBubbleGraphMaker ); } catch ( Exception e ) { handleException( e, errors, pRequest ); } if ( !errors.isEmpty() ) { saveMessages( pRequest, errors ); forward = pMapping.findForward( "total_failure" ); } else { forward = pMapping.findForward( "displayBubble" ); } return forward; } /** * @param pRequest la requ�te * @return le graphe du scatterplot * @throws JrafEnterpriseException si erreur */ public JFreeChart getBubbleChart( HttpServletRequest pRequest ) throws JrafEnterpriseException { ComponentDTO projectDTO = (ComponentDTO) pRequest.getSession().getAttribute( BaseDispatchAction.PROJECT_DTO ); AuditDTO currentAudit = (AuditDTO) pRequest.getSession().getAttribute( BaseDispatchAction.CURRENT_AUDIT_DTO ); AuditDTO previousAudit = (AuditDTO) pRequest.getSession().getAttribute( BaseDispatchAction.PREVIOUS_AUDIT_DTO ); // Code d�fensif pour �viter un null pointer, // le projectId est le currentAuditId ne peuvent pas etre nul (erreur), // le previousAuditId peut etre null et est g�r�e ult�rieurement Long projectId = new Long( projectDTO.getID() ); if ( projectId == null ) { projectId = new Long( -1 ); } Long currentAuditId = new Long( currentAudit.getID() ); if ( currentAuditId == null ) { currentAuditId = new Long( -1 ); } Long previousAuditId = new Long( -1 ); if ( null != previousAudit ) { previousAuditId = new Long( previousAudit.getID() ); } // Gestion en cache du scatterplott pour �viter de le recalculer si c'est le meme que celui en session BubbleMaker bubbleMaker = (BubbleMaker) pRequest.getSession().getAttribute( SqualeWebConstants.BUBBLE_GRAPH ); // le chart est �galement stock� en session, en parall�le avec le bubble Maker JFreeChart chartBubble = (JFreeChart) pRequest.getSession().getAttribute( SqualeWebConstants.BUBBLE_CHART ); // Si celui qui est en session n'est pas le meme, on le recalcule if ( bubbleMaker == null || !projectId.toString().equals( bubbleMaker.getProjectId() ) || !currentAuditId.toString().equals( bubbleMaker.getCurrentAuditId() ) || !previousAuditId.toString().equals( bubbleMaker.getPreviousAuditId() ) ) { Object[] paramsBubble = { projectId, currentAuditId }; // Pr�paration de l'appel � la couche m�tier IApplicationComponent ac = AccessDelegateHelper.getInstance( "Graph" ); Object[] inputParams = (Object[]) ac.execute( "getProjectBubbleGraph", paramsBubble ); if ( null != inputParams ) { // index pour �viter les magic numbers int indexInParam = 0; // Construction du graphe en passant la requ�te, la position de l'axe des abscisses et la position // de l'axe des ordonn�es bubbleMaker = new BubbleMaker( pRequest.getLocale(), (Long) inputParams[indexInParam++], (Long) inputParams[indexInParam++] ); bubbleMaker.addSerie( (String) inputParams[indexInParam++], (double[]) inputParams[indexInParam++], (double[]) inputParams[indexInParam++], (double[]) inputParams[indexInParam++] ); chartBubble = bubbleMaker.getChart( projectId.toString(), currentAuditId.toString(), previousAuditId.toString(), (double[]) inputParams[indexInParam++], (double[]) inputParams[indexInParam++], (double[]) inputParams[indexInParam++], (String[]) inputParams[indexInParam] ); } else { // On enregistre en session le bubble par d�faut bubbleMaker = new BubbleMaker( pRequest.getLocale(), new Long( 0 ), new Long( 0 ) ); chartBubble = bubbleMaker.getChart( projectId.toString(), currentAuditId.toString(), previousAuditId.toString(), new double[0], new double[0], new double[0], new String[0] ); } // On met en session pRequest.getSession().setAttribute( SqualeWebConstants.BUBBLE_GRAPH, bubbleMaker ); pRequest.getSession().setAttribute( SqualeWebConstants.BUBBLE_CHART, chartBubble ); } return chartBubble; } /** * Redirige vers une jsp affichant le scatterplott * * @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 displayComponents( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest, HttpServletResponse pResponse ) { ActionForward forward = null; ActionErrors errors = new ActionErrors(); try { // if request is not build correctly forward = pMapping.findForward( "total_failure" ); // retrieve tres and values in request String tres = pRequest.getParameter( TRE_KEYS_KEYWORD ); String values = pRequest.getParameter( TRE_VALUES_KEYWORD ); if ( null != tres && tres.length() > 0 && null != values && values.length() > 0 ) { String[] treKeys = tres.split( "," ); String[] treValues = values.split( "," ); IApplicationComponent ac = AccessDelegateHelper.getInstance( "Results" ); Object[] paramIn = { new Long( ( (RootForm) pForm ).getProjectId() ), new Long(( (RootForm) pForm ).getCurrentAuditId()), treKeys, treValues, new Integer( WebMessages.getString( pRequest.getLocale(), "component.max" ) ) }; // Number of components is limited List result = (List) ac.execute( "getComponentsWhereTres", paramIn ); WTransformerFactory.objToForm( ComponentResultListTransformer.class, (WActionForm)pForm, new Object[]{result, treKeys, treValues} ); forward = pMapping.findForward( "success" ); } } catch ( NumberFormatException nfe ) { // error in request handleException( nfe, errors, pRequest ); } catch ( JrafEnterpriseException jee ) { handleException( jee, errors, pRequest ); } catch ( WTransformerException wte ) { handleException( wte, errors, pRequest ); } if ( !errors.isEmpty() ) { saveMessages( pRequest, errors ); forward = pMapping.findForward( "total_failure" ); } return forward; } /** * Permet de r�cup�rer les r�sultats pour les tops * * @param pRequest requete HTTP * @param pTopListForm TopListForm formulaire a lire * @throws Exception exception */ private void getResults( final HttpServletRequest pRequest, final TopListForm pTopListForm ) throws Exception { IApplicationComponent ac = AccessDelegateHelper.getInstance( "Results" ); // recupere l'audit courant List auditDTOs = ActionUtils.getCurrentAuditsAsDTO( pRequest ); AuditDTO audit = null; if ( auditDTOs != null ) { audit = (AuditDTO) ( auditDTOs.get( 0 ) ); } // et le projet courant ComponentDTO project = (ComponentDTO) pRequest.getSession().getAttribute( BaseDispatchAction.PROJECT_DTO ); // appelle getTopResults de squaleCommon Object[] paramIn = { project, pTopListForm.getComponentType(), audit, pTopListForm.getTre(), new Integer( WebMessages.getString( pRequest.getLocale(), "component.max" ) ) }; // Limitation du nombre de r�sultats ResultsDTO result = (ResultsDTO) ac.execute( "getTopResults", paramIn ); ArrayList components = new ArrayList(); // et met les resultats en formes pour la jsp (Bean) if ( result != null ) { List componentDtoList = (List) result.getResultMap().get( null ); result.getResultMap().remove( null ); AuditDTO nextKey = (AuditDTO) result.getResultMap().keySet().iterator().next(); List valuesList = (List) result.getResultMap().get( nextKey ); // Conversion des ComponentDTO en Form ComponentDTO dto = null; ComponentForm form = null; // Parcours de chacun des composants for ( int i = 0; i < componentDtoList.size(); i++ ) { dto = (ComponentDTO) componentDtoList.get( i ); form = new ComponentForm(); form.setId( dto.getID() ); form.setName( dto.getName() ); form.setFullName( dto.getFullName() ); if ( valuesList.get( i ) == null ) { // Placement d'une cha�ne par d�faut form.getMetrics().add( 0, WebMessages.getString( pRequest.getLocale(), "result.cant_display" ) ); } else { form.getMetrics().add( 0, valuesList.get( i ) + "" ); } components.add( form ); } } pTopListForm.setComponentListForm( components ); } /** * Export components list to XLS format * * @param mapping mapping * @param form bean * @param request http request * @param response response * @return null (change http response header) * @throws ServletException if error */ public ActionForward exportComponentsToExcel( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response ) throws ServletException { // user name LogonBean logon = (LogonBean) request.getSession().getAttribute( WConstants.USER_KEY ); try { // we have to get full name of components ExcelDataComponentsResultsList data = new ExcelDataComponentsResultsList( request.getLocale(), getResources( request ), (ComponentResultListForm) form, logon.getMatricule() ); ExcelFactory.generateExcelToHTTPResponse( data, response, "SQUALE_components.xls" ); } catch(ExcelGenerateurException ege) { throw new ServletException( ege ); } return null; } /** * Exporte la liste des tops au format XLS * * @param mapping le actionMapping * @param form le form * @param request la request * @param response la response * @return l'actionForward * @throws ServletException exception pouvant etre levee */ public ActionForward exportToExcel( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response ) throws ServletException { // Le nom de l'utilisateur LogonBean logon = (LogonBean) request.getSession().getAttribute( WConstants.USER_KEY ); try { // Il faut r�cup�rer les noms complets des composants ExcelDataTopList data = new ExcelDataTopList( request.getLocale(), getResources( request ), (TopListForm) form, logon.getMatricule() ); ExcelFactory.generateExcelToHTTPResponse( data, response, "TopResults.xls" ); } catch ( Exception e ) { throw new ServletException( e ); } return null; } /** * Exporte les tops au format PDF * * @param mapping le actionMapping * @param form le form * @param request la request * @param response la response * @return l'actionForward * @throws ServletException exception pouvant etre levee */ public ActionForward exportToPDF( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response ) throws ServletException { TopListForm theForm = (TopListForm) form; Collection data = theForm.getComponentListForm(); try { HashMap parameters = new HashMap(); PDFDataJasperReports pdfData = new PDFDataJasperReports( request.getLocale(), getResources( request ), data, "/org/squale/squaleweb/resources/jasperreport/tops.jasper", false, parameters ); // Le nom de la m�trique parameters.put( "tre", WebMessages.getString( request, theForm.getTre() ) ); // Le type de composant parameters.put( "type", WebMessages.getString( request, theForm.getComponentType() ) ); // Le nom de l'utilisateur LogonBean logon = (LogonBean) request.getSession().getAttribute( WConstants.USER_KEY ); parameters.put( "userName", logon.getMatricule() ); // Le nom de l'application parameters.put( "applicationName", theForm.getApplicationName() ); // Le nom du projet parameters.put( "projectName", theForm.getProjectName() ); // La date de l'audit parameters.put( "auditDate", theForm.getAuditName() ); // La date de l'audit pr�c�dent parameters.put( "previousAuditDate", theForm.getPreviousAuditName() ); PDFFactory.generatePDFToHTTPResponse( pdfData, response, "", PDFEngine.JASPERREPORTS ); } catch ( Exception e ) { throw new ServletException( e ); } return null; } }