/** * 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.ruleschecking; import java.io.InputStream; import org.apache.commons.digester.Digester; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.squale.squalecommon.util.xml.XmlImport; import org.squale.squalix.core.exception.ConfigurationException; /** * Parseur de r�sultat cppTest Checkstyle 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 CheckstyleReportParser extends XmlImport { /** Pr�fixe de nom de fichier */ private String mFilePrefix; /** * Logger */ private static final Log LOGGER = LogFactory.getLog( CheckstyleReportParser.class ); /** * Constructeur * * @param pFilePrefix pr�fixe de nom de fichier */ public CheckstyleReportParser( String pFilePrefix ) { super( LOGGER ); mFilePrefix = pFilePrefix; } /** * Parsing d'un fichier de r�sultat * * @param pStream stream d'une map avec en clef le nom de la r�gle et en valeur un integer qui donne le nombre de * violations * @param pReportHandler handler de rapport * @throws ConfigurationException si erreur */ public void parse( InputStream pStream, ReportHandler pReportHandler ) throws ConfigurationException { StringBuffer errors = new StringBuffer(); Digester digester = preSetupDigester( null, null, errors ); // Traitement du nom de fichier digester.addSetProperties( "checkstyle/file" ); // Traitement des d�tails d'erreur int index = 0; Class[] params = { String.class, String.class, String.class, String.class, String.class }; digester.addCallMethod( "checkstyle/file/error", "setError", params.length, params ); digester.addCallParam( "checkstyle/file/error", index++, "line" ); digester.addCallParam( "checkstyle/file/error", index++, "column" ); digester.addCallParam( "checkstyle/file/error", index++, "severity" ); digester.addCallParam( "checkstyle/file/error", index++, "message" ); digester.addCallParam( "checkstyle/file/error", index++, "source" ); digester.push( new ResultWrapper( pReportHandler ) ); parse( digester, pStream, errors ); if ( errors.length() != 0 ) { // Erreurs rencontr�es pendant le parsing String message = RulesCheckingMessages.getString( "logs.parsing.error", errors.toString() ); LOGGER.error( message ); throw new ConfigurationException( message ); } } /** * Interface de r�sultat */ public class ResultWrapper { /** Handler de rapport */ private ReportHandler mReportHandler; /** Nom du fichier courant */ private String mName; /** * Constructeur * * @param pReportHandler handler de rapport */ ResultWrapper( ReportHandler pReportHandler ) { mReportHandler = pReportHandler; } /** * @param pFileName nom de fichier */ public void setName( String pFileName ) { String newFileName = pFileName; if ( newFileName.startsWith( mFilePrefix ) ) { newFileName = newFileName.substring( mFilePrefix.length() ); } mName = newFileName; } /** * @param pLine ligne * @param pColumn colonne * @param pSeverity nom * @param pMessage valeur * @param pSource source */ public void setError( String pLine, String pColumn, String pSeverity, String pMessage, String pSource ) { String newColumn = pColumn; if (newColumn == null ) { newColumn = "0"; } mReportHandler.processError( mName, pLine, newColumn, pSeverity, pMessage, pSource ); } /** * @return nom du fichier */ public String getName() { return mName; } } }