/** * 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.export.xml; import java.util.Collection; import java.util.Iterator; import java.util.Set; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Element; import javax.servlet.http.HttpServletRequest; import org.squale.squalecommon.datatransfertobject.component.ComponentDTO; import org.squale.squalecommon.datatransfertobject.export.ActionPlanDTO; import org.squale.squalecommon.datatransfertobject.rule.QualityRuleDTO; import org.squale.squalecommon.datatransfertobject.rulechecking.RuleCheckingItemDTO; import org.squale.squaleweb.resources.WebMessages; /** * XML data pour l'export IDE */ public class IDELinkXMLData extends XMLData { /** Nom racine du fichier XML */ public static final String ROOT_NAME = "squaleLink-config"; /** La date de l'audit */ private String auditDate; /** Le label de l'audit si il s'agit d'un audit de jalon */ private String label; /** Nom de l'application */ private String applicationName; /** Nom du workspace du projet */ private String workspace; /** La collection des ActionPlanDTO */ private Collection actions; /** * @param pRequest la requ�te * @param pAuditDate la date de l'audit * @param pAppliName le nom de l'application * @param pWorkspace le workspace du projet * @param pActions la liste des pratiques � corriger sous forme d'ActionPlanDTO * @throws ParserConfigurationException si erreur */ public IDELinkXMLData( HttpServletRequest pRequest, String pAuditDate, String pAppliName, String pWorkspace, Collection pActions ) throws ParserConfigurationException { super( pRequest ); auditDate = pAuditDate; label = ""; applicationName = pAppliName; workspace = pWorkspace; actions = pActions; } /** * {@inheritDoc} * * @param xmlGenerator * @see org.squale.squaleweb.util.xml.XMLData#fill(org.squale.squaleweb.util.xml.XMLGenerator) */ public void fill() { // On cr�e la racine du document avec l'en-t�te Element root = getDocument().createElement( ROOT_NAME ); root.appendChild( getDocument().createComment( WebMessages.getString( getRequest(), "export.ide.comment" ) ) ); root.setAttribute( "applicationName", applicationName ); root.setAttribute( "workspace", workspace ); root.setAttribute( "auditDate", auditDate ); root.setAttribute( "label", label ); // On ajoute la racine au document getDocument().appendChild( root ); // On cr�e les informations du plan d'action comme noeud de la racine ActionPlanDTO actionPlan; QualityRuleDTO currentRule; for ( Iterator it = actions.iterator(); it.hasNext(); ) { actionPlan = (ActionPlanDTO) it.next(); if ( null != actionPlan.getTransgressions() ) { // il s'agit d'une r�gle de type rulechecking fillWithTransgressions( root, actionPlan ); } else { fillWithPracticeResults( root, actionPlan ); } } } /** * Construit le fichier XML avec une pratique contenant une liste de transgressions de r�gles � corriger * * @param root la racine du fichier XML * @param actionPlan la pratique � corriger */ private void fillWithTransgressions( Element root, ActionPlanDTO actionPlan ) { for ( Iterator it = actionPlan.getTransgressions().iterator(); it.hasNext(); ) { RuleCheckingItemDTO item = (RuleCheckingItemDTO) it.next(); Element transgression = getDocument().createElement( "transgression" ); // La s�v�rit� de la r�gle transgression.setAttribute( "severity", item.getRuleSeverity() ); // Le nom de la r�gle String ruleName = item.getRuleCode(); String ruleNameKey = "metric." + ruleName; String dbMessage = WebMessages.getString( request, ruleNameKey ); // l'intitul� de la r�gle est affich� � la place du nom lorsqu'il existe if ( dbMessage != null ) { ruleName = dbMessage; } transgression.setAttribute( "description", ruleName ); // On d�coupe le nom du fichier du composant dans lequel se trouve le composant concern� // pour modifier les attributs "resource" et "folder" String fileName = ""; String componentName = ""; if ( null != item.getComponent() ) { fileName = item.getComponent().getFileName(); componentName = item.getComponent().getFullName(); } if ( null == fileName || fileName.length() == 0 ) { fileName = item.getComponentFile(); } cutFileName( componentName, fileName, transgression ); // La ligne transgression.setAttribute( "location", "" + item.getLine() ); root.appendChild( transgression ); } } /** * Construit le fichier XML avec une pratique contenant une liste de composants � corriger * * @param root la racine du fichier XML * @param actionPlan la pratique � corriger */ private void fillWithPracticeResults( Element root, ActionPlanDTO actionPlan ) { Set components = actionPlan.getResultsDTO().getResultMap().keySet(); components.remove( null ); for ( Iterator it = components.iterator(); it.hasNext(); ) { ComponentDTO component = (ComponentDTO) it.next(); Element transgression = getDocument().createElement( "transgression" ); // Le nom de la r�gle String ruleName = WebMessages.getString( request, actionPlan.getQualityResultDTO().getRule().getName() ); transgression.setAttribute( "description", ruleName ); // On d�coupe le nom du fichier du composant dans lequel se trouve le composant concern� // pour modifier les attributs "resource" et "folder" cutFileName( component.getFullName(), component.getFileName(), transgression ); // La ligne transgression.setAttribute( "location", component.getStartLine() ); root.appendChild( transgression ); } } /** * D�coupe un nom de fichier en deux �l�ments : le premier est le r�pertoire du fichier par rapport au workspace du * projet et le deuxi�me le nom du fichier * * @param pComponentName le nom du composant * @param pFileName le nom du fichier � d�couper * @param pTransgression le noeud du fichier XML � modifier */ private void cutFileName( String pComponentName, String pFileName, Element pTransgression ) { // On uniformise la rechercher String path = ( null == pFileName ) ? "" : pFileName; // le nom du fichier peut �tre nul path.replaceAll( "\\\\*", "/" ); // Le nom du fichier dans lequel se trouve le composant // Si le fichier n'existe pas, on met le nom du composant String componentName = pComponentName; // Le nom du dossier dans lequel se trouve le fichier par rapport au projet String folder = ""; int index = path.lastIndexOf( "/" ); if ( index > 0 ) { componentName = path.substring( index + 1 ); folder = path.substring( 0, index + 1 ); } pTransgression.setAttribute( "inFolder", folder ); pTransgression.setAttribute( "resource", componentName ); } /** * @return le nom de l'application */ public String getApplicationName() { return applicationName; } /** * @return la date de l'audit */ public String getAuditDate() { return auditDate; } /** * @return le label de l'audit */ public String getLabel() { return label; } /** * @return le workspace du projet */ public String getWorkspace() { return workspace; } /** * @param pLabel la label de l'audit */ public void setLabel( String pLabel ) { label = pLabel; } }