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.squaleweb.applicationlayer.action.results.application; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.SortedMap; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.ActionError; 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.tag.TagDTO; 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.formbean.LogonBean; import org.squale.squaleweb.applicationlayer.formbean.component.ApplicationForm; import org.squale.squaleweb.applicationlayer.formbean.component.ProjectForm; import org.squale.squaleweb.applicationlayer.formbean.component.ProjectListForm; import org.squale.squaleweb.applicationlayer.formbean.component.SplitAuditsListForm; import org.squale.squaleweb.applicationlayer.formbean.results.ProjectSummaryForm; import org.squale.squaleweb.applicationlayer.formbean.results.ResultListForm; import org.squale.squaleweb.transformer.ApplicationTransformer; import org.squale.squaleweb.transformer.FactorsResultListTransformer; import org.squale.squaleweb.util.SqualeWebConstants; import org.squale.squaleweb.util.graph.GraphMaker; import org.squale.squaleweb.util.graph.KiviatMaker; import org.squale.squaleweb.util.graph.PieChartMaker; 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.transformer.WTransformerException; import org.squale.welcom.struts.transformer.WTransformerFactory; import org.squale.welcom.struts.util.WConstants; import org.squale.welcom.taglib.table.TableUtil; /** * Affichage des rsultats de niveau application Les rsultats disponibles au niveau de l'application sont affichs par * cette action, il s'agit des graphes de kiviat et de piechart ainsi que les facteurs */ public class ApplicationResultsAction extends ReaderAction { /** * Le nom dsignant l'attribut en session pour indiquer si on veut tous les facteurs ou non pour le kiviat. */ private static final String ALL_FACTORS = "allFactors"; /** * Synthse d'une application Si l'application comporte un seul projet, la synthse du projet est alors affiche. * Dans le cas contraire, trois onglets sont prsents : un qui donne la rpartition, l'autre donnant les facteurs * par projet et le dernier donnant le kiviat. * * @param pMapping le mapping. * @param pForm le formulaire lire. * @param pRequest la requte HTTP. * @param pResponse la rponse de la servlet. * @return l'action raliser. */ public ActionForward summary(ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest, HttpServletResponse pResponse) { // Cette action est appele dans plusieurs contextes possibles // Depuis une action struts avec l'id de l'application ou depuis // une page de l'application sans id de l'application (on a alors affaire l'application courante) ActionForward forward; try { // Add an user access for this application addUserAccess(pRequest, ActionUtils.getCurrentApplication(pRequest).getId()); forward = checkApplication(pMapping, pRequest); // Si forward est renseign, l'application contient un seul projet // On redirige donc vers le projet adquat if (null == forward) { // Rcupration des informations concernant les facteurs // Rcupration du paramtre : tous les facteurs ou seuls les facteurs ayant une note ? ResultListForm resultListForm = (ResultListForm) pForm; boolean pAllFactors = resultListForm.isAllFactors(); // On met cette valeur en session pRequest.getSession().setAttribute(ALL_FACTORS, new Boolean(pAllFactors)); ApplicationForm application = ActionUtils.getCurrentApplication(pRequest); // On remet jour les form en session permettant d'accder aux diffrents types d'audits SplitAuditsListForm auditsForm = (SplitAuditsListForm) pRequest.getSession() .getAttribute("splitAuditsListForm"); if (auditsForm != null) { auditsForm.copyValues(application); auditsForm.resetAudits(ActionUtils.getCurrentAuditsAsDTO(pRequest)); pRequest.getSession().setAttribute("splitAuditsListForm", auditsForm); } List auditsDTO = ActionUtils.getCurrentAuditsAsDTO(pRequest); if (auditsDTO != null) { ((ResultListForm) pForm).resetAudits(auditsDTO); } // On efface ce form contenant les erreurs de l'application, car si on passe par ici // Ce form ne peut que contenir les informations pour une autre application pRequest.getSession().removeAttribute("applicationErrorForm"); // Prparation de l'appel la couche mtier IApplicationComponent ac = AccessDelegateHelper.getInstance("Results"); List applications = Arrays .asList(WTransformerFactory.formToObj(ApplicationTransformer.class, application)); Object[] paramIn = { applications, auditsDTO }; // Les rsultats sont retourns dans l'ordre impos par la grille // on maintient cet ordre pour l'affichage List results = (List) ac.execute("getApplicationResults", paramIn); pRequest.getSession().removeAttribute(SqualeWebConstants.RESULTS_KEY); if (null != results && results.size() > 0) { // Transformation des rsultats avant leur affichage par la couche // welcom WTransformerFactory.objToForm(FactorsResultListTransformer.class, (ResultListForm) pForm, new Object[] { applications, results }); } else { // si aucun resultat => liste vide WTransformerFactory.objToForm(FactorsResultListTransformer.class, (ResultListForm) pForm, new Object[] { applications, new ArrayList() }); } // Rcupration des donnes permettant la gnration du Kiviat et du PieChart de l'application if (null != auditsDTO && null != auditsDTO.get(0)) { // Prparation de l'appel la couche mtier ac = AccessDelegateHelper.getInstance("Graph"); Long pCurrentAuditId = new Long(((AuditDTO) auditsDTO.get(0)).getID()); Object[] paramAuditIdKiviat = { pCurrentAuditId, String.valueOf(pAllFactors) }; // Recherche des donnes Kiviat KiviatMaker maker = new KiviatMaker(); Map projectsValues = (Map) ac.execute("getApplicationKiviatGraph", paramAuditIdKiviat); Set keysSet = projectsValues.keySet(); Iterator it = keysSet.iterator(); while (it.hasNext()) { String key = (String) it.next(); maker.addValues(key, (SortedMap) projectsValues.get(key), pRequest); } JFreeChart chartKiviat = maker.getChart(); ChartRenderingInfo infoKiviat = new ChartRenderingInfo(new StandardEntityCollection()); // Initialisation du kiviat String fileNameKiviat = ServletUtilities.saveChartAsPNG(chartKiviat, KiviatMaker.DEFAULT_WIDTH, KiviatMaker.DEFAULT_HEIGHT, infoKiviat, pRequest.getSession()); GraphMaker applicationKiviatChart = new GraphMaker(pRequest, fileNameKiviat, infoKiviat); // Pour l'export en PDF pRequest.getSession().removeAttribute("kiviatChart"); pRequest.getSession().setAttribute("kiviatChart", chartKiviat.createBufferedImage(KiviatMaker.DEFAULT_WIDTH, KiviatMaker.DEFAULT_HEIGHT)); // Recherche des donnes PieChart Object[] paramAuditIdPieChart = { pCurrentAuditId }; JFreeChart pieChart; Object[] maps = (Object[]) ac.execute("getApplicationPieChartGraph", paramAuditIdPieChart); String pPreviousAuditId = null; // on peut ne pas avoir d'audit prcdent if (auditsDTO.size() > 1) { pPreviousAuditId = "" + ((AuditDTO) auditsDTO.get(1)).getID(); } PieChartMaker pieMaker = new PieChartMaker(null, pCurrentAuditId.toString(), pPreviousAuditId); pieMaker.setValues((Map) maps[0]); pieChart = pieMaker.getChart((Map) maps[1], pRequest); ChartRenderingInfo infoPieChart = new ChartRenderingInfo(new StandardEntityCollection()); // Initialisation du pieChart String fileName = ServletUtilities.saveChartAsPNG(pieChart, PieChartMaker.DEFAULT_WIDTH, PieChartMaker.DEFAULT_HEIGHT, infoPieChart, pRequest.getSession()); GraphMaker applicationPieChart = new GraphMaker(pRequest, fileName, infoPieChart); // Met jour les 2 champs du form avec les 2 graphs calculs ((ResultListForm) pForm).setKiviat(applicationKiviatChart); ((ResultListForm) pForm).setPieChart(applicationPieChart); // Met jour le form en session pRequest.getSession().setAttribute("resultListForm", pForm); // Pour l'export en PDF pRequest.getSession().removeAttribute("pieChart"); pRequest.getSession().setAttribute("pieChart", pieChart .createBufferedImage(PieChartMaker.DEFAULT_WIDTH, PieChartMaker.DEFAULT_HEIGHT)); } // Affichage des informations sur la page jsp forward = pMapping.findForward("summary"); } } catch (Exception e) { ActionErrors errors = new ActionErrors(); // Traitement factoris des erreurs handleException(e, errors, pRequest); // Sauvegarde des erreurs saveMessages(pRequest, errors); // Routage vers la page d'erreur forward = pMapping.findForward("total_failure"); } // On est pass par un menu donc on rinitialise le traceur resetTracker(pRequest); // Indique que l'on vient d'une vue synthse et pas d'une vue composant changeWay(pRequest, "false"); return forward; } /** * Selectionne nouveau l'application courante visualiser. * * @param pMapping le mapping. * @param pForm le formulaire lire. * @param pRequest la requte HTTP. * @param pResponse la rponse de la servlet. * @return l'action raliser. */ public ActionForward select(ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest, HttpServletResponse pResponse) { ActionForward forward = null; ActionErrors errors = new ActionErrors(); try { // Add an user access for this application addUserAccess(pRequest, ActionUtils.getCurrentApplication(pRequest).getId()); // On supprime l'attribut en session pRequest.getSession().removeAttribute(ALL_FACTORS); if (null == forward) { forward = pMapping.findForward("summaryAction"); } } catch (Exception e) { // Traitement factoris des exceptions handleException(e, errors, pRequest); } if (!errors.isEmpty()) { // Sauvegarde des messages saveMessages(pRequest, errors); // Routage vers la page d'erreur forward = pMapping.findForward("total_failure"); } // On est pass par un menu donc on rinitialise le traceur resetTracker(pRequest); return forward; } /** * Vrification de l'application Si l'application est invalide ou s'il ne comporte qu'un seul projet, un forward est * renvoy, sinon les projets sont extraits pour la mise jour du menu de gauche. * * @param pMapping le mapping. * @param pRequest la requte HTTP. * @return l'action raliser. * @throws Exception exception. */ private ActionForward checkApplication(ActionMapping pMapping, HttpServletRequest pRequest) throws Exception { ActionForward forward = null; ApplicationForm application = ActionUtils.getCurrentApplication(pRequest); if (null == application) { // l'id n'est pas valide ActionError error = new ActionError("error.invalid_application"); ActionErrors errors = new ActionErrors(); errors.add("application", error); saveErrors(pRequest, errors); forward = pMapping.findForward("failure"); } else { // On rcupre la liste des projets de l'application List projects = ((ProjectListForm) pRequest.getSession().getAttribute(BaseDispatchAction.PROJECTS_KEY)) .getList(); if (null != projects && projects.size() == 1) { // On rcupre l'id du projet et on renvoie vers // l'affichage du projet Long projectId = new Long(((ProjectForm) projects.get(0)).getId()); pRequest.setAttribute("projectId", projectId.toString()); // On ajoute aussi l'id du projet dans les paramtres pour le traceur // TODO FAB : regarder cette ligne dcommente (lien avec le traceur...) // pRequest.getParameterMap().put("projectId", new String[]{projectId.toString()}); forward = pMapping.findForward("project"); } } return forward; } /** * Action exportPDF pour StyleReport ou iText * * @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 exportPDF(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws ServletException { Collection results = TableUtil.getSortedTable(request.getSession(), "resultListForm", "list"); try { HashMap parameters = new HashMap(); PDFDataJasperReports data = new PDFDataJasperReports(request.getLocale(), getResources(request), results, "/org/squale/squaleweb/resources/jasperreport/ApplicationResults.jasper", false, parameters); // Pour rcuprer les paramtres root parameters.put("applicationName", ((ResultListForm) form).getApplicationName()); // La date ou le nom des audits parameters.put("auditDate", ((ResultListForm) form).getAuditName()); parameters.put("previousAuditDate", ((ResultListForm) form).getPreviousAuditName()); // L'image du pieChart parameters.put("pieChart", (java.awt.Image) request.getSession().getAttribute("pieChart")); // Rcupration des donnes sur la volumtrie des projets de l'application // Prparation de l'appel la couche mtier IApplicationComponent ac = AccessDelegateHelper.getInstance("Graph"); Long pCurrentAuditId = new Long(Long.parseLong(((ResultListForm) form).getCurrentAuditId())); Object[] paramAuditId = { pCurrentAuditId }; // Recherche des donnes PieChart JFreeChart pieChart; Object[] maps = (Object[]) ac.execute("getApplicationPieChartGraph", paramAuditId); // On rcupre la volumtrie par grille final int indexVol = 2; PieChartMaker pieMaker = new PieChartMaker(null, null, null); pieMaker.setValues((Map) maps[indexVol]); pieChart = pieMaker.getChart(new HashMap(), request); // L'image du pieChart pour la volumetrie par grille parameters.put("gridPieChart", pieChart.createBufferedImage(PieChartMaker.DEFAULT_WIDTH, PieChartMaker.DEFAULT_HEIGHT)); // L'image du kiviat parameters.put("kiviatChart", (java.awt.Image) request.getSession().getAttribute("kiviatChart")); // Le // nom // de // l'utilisateur LogonBean logon = (LogonBean) request.getSession().getAttribute(WConstants.USER_KEY); parameters.put("userName", logon.getMatricule()); PDFFactory.generatePDFToHTTPResponse(data, response, "", PDFEngine.JASPERREPORTS); } catch (Exception e) { throw new ServletException(e); } return null; } /** * Action addTag adds a tag to the current application * * @param pMapping the actionMapping * @param pForm the form * @param pRequest the request * @param pResponse the response * @return the actionForward * @throws ServletException exception that can be thrown */ public ActionForward addTag(ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest, HttpServletResponse pResponse) throws ServletException { ActionForward forward = null; ActionErrors errors = new ActionErrors(); IApplicationComponent ac; try { String tagToAdd = ((ResultListForm) pForm).getTagSupp(); TagDTO tagDTO = null; if (tagToAdd != null) { ac = AccessDelegateHelper.getInstance("TagAdmin"); Object[] paramIn = { new String[] { tagToAdd } }; Collection<TagDTO> tags = ((Collection<TagDTO>) ac.execute("getTagsByName", paramIn)); if (tags != null && tags.size() == 1) { for (TagDTO tagDTOtemp : tags) { tagDTO = tagDTOtemp; } } if (tagDTO == null) { pRequest.setAttribute("unexistingTag", tagToAdd); } else { // the given tag exists in the DB: let's add it to the project ComponentDTO application = (ComponentDTO) pRequest.getSession() .getAttribute(BaseDispatchAction.APPLI_DTO); // On rajoute le tag sur le formulaire Collection<TagDTO> applicationTags = application.getTags(); boolean possedeTag = application.possessTag(tagDTO); if (!possedeTag) { applicationTags.add(tagDTO); application.setTags(applicationTags); ((ResultListForm) pForm).setTags(applicationTags); } // On a pu le rajouter sur le formulaire, on va le rajouter en base if (!possedeTag) { ac = AccessDelegateHelper.getInstance("ApplicationAdmin"); paramIn = new Object[] { application.getID(), tagDTO }; ac.execute("addTag", paramIn); } } forward = pMapping.findForward("summaryAction"); } } catch (Exception e) { // Traitement factoris des exceptions handleException(e, errors, pRequest); } if (!errors.isEmpty()) { // Sauvegarde des messages saveMessages(pRequest, errors); // Routage vers la page d'erreur forward = pMapping.findForward("total_failure"); } return forward; } /** * Action delTag removes a tag from the current application * * @param pMapping the actionMapping * @param pForm the form * @param pRequest the request * @param pResponse the response * @return the actionForward * @throws ServletException exception that can be thrown */ public ActionForward removeTag(ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest, HttpServletResponse pResponse) throws ServletException { ActionForward forward = null; ActionErrors errors = new ActionErrors(); IApplicationComponent ac; try { String tagTodelete = ((ResultListForm) pForm).getTagDel(); long idApplication = Long.parseLong(((ResultListForm) pForm).getApplicationId()); TagDTO tagDTOToDelete = null; if (tagTodelete != null) { ac = AccessDelegateHelper.getInstance("TagAdmin"); Object[] paramIn = { new String[] { tagTodelete } }; Collection<TagDTO> tags = ((Collection<TagDTO>) ac.execute("getTagsByName", paramIn)); if (tags != null && tags.size() == 1) { for (TagDTO tagDTOtemp : tags) { tagDTOToDelete = tagDTOtemp; } } ComponentDTO application = getApplication(pRequest, idApplication); // On retire le tag du formulaire Collection<TagDTO> applicationTags = application.getTags(); boolean possedeTag = application.possessTag(tagDTOToDelete); if (possedeTag) { Collection<TagDTO> newApplicationTags = new ArrayList<TagDTO>(); for (TagDTO tagApplication : applicationTags) { if (!tagApplication.getName().equals(tagDTOToDelete.getName())) { newApplicationTags.add(tagApplication); } } application.setTags(newApplicationTags); ((ResultListForm) pForm).setTags(newApplicationTags); ((ResultListForm) pForm).setTagDel(""); // On a pu le retirer du formulaire, on va le retirer de la base ac = AccessDelegateHelper.getInstance("ApplicationAdmin"); paramIn = new Object[] { application.getID(), tagDTOToDelete }; ac.execute("removeTag", paramIn); } } forward = pMapping.findForward("summaryAction"); } catch (Exception e) { // Traitement factoris des exceptions handleException(e, errors, pRequest); } if (!errors.isEmpty()) { // Sauvegarde des messages saveMessages(pRequest, errors); // Routage vers la page d'erreur forward = pMapping.findForward("total_failure"); } return forward; } /** * Mthode that will retrieve an application from the context or from the data base * * @param pRequest the HTTP Request * @param pIdApplication idApplication in case it has to be retrieved from the database * @return the retrieved application * @throws JrafEnterpriseException if an exception occurs */ private ComponentDTO getApplication(HttpServletRequest pRequest, long pIdApplication) throws JrafEnterpriseException { // The application is retrieved from the context ComponentDTO application = (ComponentDTO) pRequest.getSession().getAttribute(BaseDispatchAction.APPLI_DTO); // if it is not there, it will be retrieved from the database if (application == null) { ComponentDTO componentTemp = new ComponentDTO(); componentTemp.setID(pIdApplication); IApplicationComponent ac2 = AccessDelegateHelper.getInstance("Component"); application = (ComponentDTO) ac2.execute("get", new Object[] { componentTemp }); } return application; } }