/** * 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.squalix.tools.cpptest; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import org.apache.commons.digester.Digester; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.squale.squalecommon.enterpriselayer.businessobject.result.rulechecking.RuleCheckingTransgressionItemBO; import org.squale.squalecommon.util.xml.XmlImport; import org.squale.squalix.core.exception.ConfigurationException; /** * Parseur de r�sultat cppTest CppTest g�n�re ses r�sultats sous la forme de fichier XML, cette classe permet de lire le * contenu d'un tel fichier. Le fichier de rapport est organis� en deux sections : la premi�re donne la liste des * r�gles, la seconde la liste des violations rencontr�es */ public class ReportParser extends XmlImport { /** Pr�fixe de fichier */ private String mFilePrefix; /** * Logger */ private static final Log LOGGER = LogFactory.getLog( ReportParser.class ); /** * Constructeur */ public ReportParser() { super( LOGGER ); } /** * Parsing d'un fichier de r�sultat * * @param pStream stream * @param pFilePrefix pr�fixe de fichier * @return collection de r�sultats sous la forme d'une map avec en clef le nom de la r�gle et en valeur une * collection qui donne le d�tail de chaque violation sous la forme d'une String * @throws ConfigurationException si erreur */ public Map parse( InputStream pStream, String pFilePrefix ) throws ConfigurationException { Map result = null; mFilePrefix = pFilePrefix; StringBuffer errors = new StringBuffer(); Digester digester = preSetupDigester( null, null, errors ); // Traitement de la liste des r�gles digester.addCallMethod( "Log/Group/Property", "setRule", 1, new Class[] { String.class } ); digester.addCallParam( "Log/Group/Property", 0, "name" ); // Traitement du script de compilation digester.addCallMethod( "Log/Group/Test/Message/Property", "setMessage", 2, new Class[] { String.class, String.class } ); digester.addCallParam( "Log/Group/Test/Message/Property", 0, "name" ); digester.addCallParam( "Log/Group/Test/Message/Property", 1, "value" ); digester.addCallMethod( "Log/Group/Test", "addItem", 1, new Class[] { String.class } ); digester.addCallParam( "Log/Group/Test", 0, "status" ); result = new HashMap(); digester.push( new ResultWrapper( result ) ); parse( digester, pStream, errors ); if ( errors.length() != 0 ) { // Erreurs rencontr�es pendant le parsing throw new ConfigurationException( CppTestMessages.getString( "error.report.parsing", errors ) ); } return result; } /** * Interface de r�sultat */ class ResultWrapper { /** RuleId */ private String mRuleId; /** File */ private String mFile; /** Line */ private String mLine; /** Description */ private String mDescription; /** R�sultat */ private Map mResult; /** * Constructeur * * @param pResult r�sultat */ ResultWrapper( Map pResult ) { mResult = pResult; } /** * @param pName nom */ public void setRule( String pName ) { final String rulePrefix = "Rule:"; if ( pName.startsWith( rulePrefix ) ) { String rule = pName.substring( rulePrefix.length() ); mResult.put( rule, new ArrayList() ); } } /** * Modification des attributs en fonction de <code>pName</code> et formatage de la valeur si besoin * * @param pName nom * @param pValue valeur */ public void setMessage( String pName, String pValue ) { if ( pName.equals( "rule_id" ) ) { // l'id de la r�gle mRuleId = pValue; } else if ( pName.equals( "file" ) ) { // le fichier concern� if ( pValue.startsWith( mFilePrefix ) ) { // On ne prend pas le pr�fixe du fichier qui n'appartient pas � l'utilisateur mFile = pValue.substring( mFilePrefix.length() ); }else{ mFile = pValue; } } else if ( pName.equals( "line" ) ) { // Affectation du num�ro de ligne mLine = pValue; } else if ( pName.equals( "description" ) ) { // description de la transgression mDescription = pValue; } } /** * Ajout d'un message * * @param pStatus status de la v�rification */ public void addMessage( String pStatus ) { // On compose le message � ajouter if ( pStatus.equals( "failure" ) ) { ArrayList list = (ArrayList) mResult.get( mRuleId ); list.add( CppTestMessages.getString( "transgression.detail", new Object[] { mFile, mLine, mDescription } ) ); } } /** * Ajout d'un item * * @param pStatus status de la v�rification */ public void addItem( String pStatus ) { // On cr�e l'item � ajouter if ( pStatus.equals( "failure" ) ) { ArrayList list = (ArrayList) mResult.get( mRuleId ); RuleCheckingTransgressionItemBO item = new RuleCheckingTransgressionItemBO(); item.setComponentFile( mFile ); item.setLine( Integer.parseInt( mLine ) ); item.setMessage( CppTestMessages.getString( "transgression.detail", new Object[] { RuleCheckingTransgressionItemBO.PATH_KEY, RuleCheckingTransgressionItemBO.LINE_KEY, mDescription } ) ); list.add( item ); } } } }