/**
* 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/>.
*/
//Source file: D:\\cc_views\\squale_v0_0_act\\squale\\src\\squalix\\src\\org\\squale\\squalix\\tools\\mccabe\\McCabePCFFile.java
package org.squale.squalix.tools.mccabe;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.squale.squalecommon.enterpriselayer.businessobject.component.parameters.ListParameterBO;
import org.squale.squalecommon.enterpriselayer.businessobject.component.parameters.ParametersConstants;
import org.squale.squalix.core.TaskData;
import org.squale.squalix.core.exception.ConfigurationException;
import org.squale.squalix.util.buildpath.BuildProjectPath;
import org.squale.squalix.util.file.FileUtility;
/**
* Cr�e un fichier config.pcf � partir de la configuration de l'application, et le place dans l'espace de travail
* McCabe.
*
* @author m400842
* @version 1.0
*/
public class McCabePCFFile
{
/**
* Chemins des fichiers � auditer
*/
private HashSet mFilesList = new HashSet();
/**
* Framework configuration
*/
private McCabeConfiguration mConfig = null;
/**
* A l'initialisation, contient le dossier du projet dans l'espace local, puis juste avant la g�n�ration du fichier
* pcf, contient le dossier parent commun le plus bas des fichiers � analyser.
*/
private File mRoot = null;
/**
* Fichier PCF
*/
private File mPcfFile = null;
/**
* Nom du projet
*/
private String mProjectName = null;
/**
* Logger
*/
private static final Log LOGGER = LogFactory.getLog( McCabePCFFile.class );
/**
* Constructeur du fichier de configuration d'un projet McCabe
*
* @param pConfig configuration de l'ex�cution
* @param pDatas la liste des param�tres temporaires du projet
* @throws Exception si un probl�me de cr�ation apparait.
* @roseuid 429484FC0089
*/
public McCabePCFFile( final McCabeConfiguration pConfig, final TaskData pDatas )
throws Exception
{
mConfig = pConfig;
if ( !mConfig.getSubWorkspace().exists() )
{
mConfig.getSubWorkspace().mkdirs();
}
// Un nouveau fichier est cr�� dans le workspace d�di� au projet
mPcfFile =
new File( mConfig.getSubWorkspace().getAbsolutePath() + File.separator
+ McCabeMessages.getString( "pcf_name" ) );
LOGGER.debug( McCabeMessages.getString( "logs.debug.building_file" ) + mPcfFile.getAbsolutePath() );
mProjectName = mConfig.getProject().getName();
mRoot = new File( (String) pDatas.getData( TaskData.VIEW_PATH ) );
// On r�cup�re les chemins vers les sources
ListParameterBO sources =
(ListParameterBO) pConfig.getProject().getParameters().getParameters().get( ParametersConstants.SOURCES );
if ( null == sources )
{
throw new ConfigurationException( McCabeMessages.getString( "exception.sources.notset" ) );
}
List srcs = sources.getParameters();
String viewPath = (String) pDatas.getData( TaskData.VIEW_PATH );
// On ajoute les sources pour l'analyse
List absSources = BuildProjectPath.buildProjectPath( viewPath, srcs );
// Obtention des jsps si il y en a
ListParameterBO jspsParam = (ListParameterBO) pConfig.getProject().getParameter( ParametersConstants.JSP );
// On prend en compte les inclusions et exclusions sauf dans le cas du C++
if ( pConfig.getProject().getParameter( ParametersConstants.CPP ) != null )
{
// On ajoute les sources pour l'analyse
addFilesListParam( srcs, viewPath );
}
else
{
ListParameterBO included =
(ListParameterBO) pConfig.getProject().getParameters().getParameters().get(
ParametersConstants.INCLUDED_PATTERNS );
ListParameterBO excluded =
(ListParameterBO) pConfig.getProject().getParameters().getParameters().get(
ParametersConstants.EXCLUDED_PATTERNS );
ListParameterBO excludedDirs =
(ListParameterBO) pConfig.getProject().getParameters().getParameters().get(
ParametersConstants.EXCLUDED_DIRS );
ListParameterBO allExcludedDirs = new ListParameterBO();
if ( null != jspsParam )
{
// On ajoute les jsps � la liste des fichiers sources
List absJsps = BuildProjectPath.buildProjectPath( viewPath, jspsParam.getParameters() );
absSources.addAll( absJsps );
// On ajoute les r�pertoires des jsps exclus de la compilation car il ne faut pas les analyser
ListParameterBO excludedJspDirs =
(ListParameterBO) pConfig.getProject().getParameters().getParameters().get(
ParametersConstants.JSP_EXCLUDED_DIRS );
if ( null != excludedDirs )
{
allExcludedDirs.getParameters().addAll( excludedDirs.getParameters() );
}
if ( null != excludedJspDirs )
{
allExcludedDirs.getParameters().addAll( excludedJspDirs.getParameters() );
}
}
List includedFileNames =
FileUtility.getIncludedFiles( viewPath, absSources, included, excluded, allExcludedDirs,
mConfig.getExtensions() );
setFilesList( pConfig, includedFileNames );
}
}
/**
* Ajoute les fichiers � analyser
*
* @param srcs la liste des sources � ajouter
* @param viewPath le chemin de la vue
*/
private void addFilesListParam( List srcs, String viewPath )
{
List paths = BuildProjectPath.buildProjectPath( viewPath, srcs );
// Parcours de chaque r�pertoire source
for ( int i = 0; i < paths.size(); i++ )
{
setFilesList( new File( (String) paths.get( i ) ) );
}
}
/**
* Cr�e la liste des fichiers � int�grer � l'analyse.
*
* @param pConfig la configuration McCabe
* @param pFiles les fichiers inclus avec les chemins relatifs
*/
private void setFilesList( final McCabeConfiguration pConfig, List pFiles )
{
LOGGER.debug( McCabeMessages.getString( "logs.debug.listing_files" ) + mRoot.getAbsolutePath() );
// Parcours de chaque fichier
Iterator it = pFiles.iterator();
List includes = new ArrayList();
int rootLength = mRoot.getAbsolutePath().length() + File.separator.length();
String filename = null;
while ( it.hasNext() )
{
filename = (String) it.next();
mFilesList.add( filename.substring( rootLength ) );
}
}
/**
* Cr�e la liste des fichiers � int�grer � l'analyse.
*
* @param pDirectory r�pertoire
*/
private void setFilesList( File pDirectory )
{
LOGGER.debug( McCabeMessages.getString( "logs.debug.listing_files" ) + mRoot.getAbsolutePath() );
// D�termine la liste des fichiers � analyser
McCabeFileFilter filter = new McCabeFileFilter( mRoot.getAbsolutePath(), mConfig.getExtensions() );
HashSet fileList = new HashSet();
FileUtility.createRecursiveListOfFiles( pDirectory, filter, fileList );
Iterator it = fileList.iterator();
String filename = null;
int rootLength = mRoot.getAbsolutePath().length() + File.separator.length();
while ( it.hasNext() )
{
filename = (String) it.next();
mFilesList.add( filename.substring( rootLength ) );
}
}
/**
* Cr�e le fichier pcf d'analyse du projet.
*
* @throws Exception si un probleme d'�criture survient.
* @roseuid 42B7CAEB0048
*/
public void build()
throws Exception
{
LOGGER.debug( McCabeMessages.getString( "logs.debug.pcf_creation" ) + mPcfFile.getAbsolutePath() );
BufferedWriter writer = new BufferedWriter( new FileWriter( mPcfFile ) );
// Ecriture de l'en-tete
writer.write( McCabeMessages.getString( "pcf.header.program" ) + mProjectName.replaceAll( " ", "_" ) );
writer.newLine();
writer.write( McCabeMessages.getString( "pcf.header.dir" ) + mRoot.getAbsolutePath() );
writer.newLine();
writer.write( McCabeMessages.getString( "pcf.header.misc1" ) );
writer.newLine();
writer.write( McCabeMessages.getString( "pcf.header.misc2" ) );
writer.newLine();
//R�cup�ration du niveau de m�trique et insertion s'il existe
String lMetrics_level = mConfig.getMetrics_level();
if ( lMetrics_level != null )
{
writer.write( "METRICS_LEVEL " + lMetrics_level );
writer.newLine();
}
// Ecriture de la liste des fichiers avec les param�tres
Iterator it = mFilesList.iterator();
while ( it.hasNext() )
{
writer.write( getLine( (String) it.next() ) );
writer.newLine();
}
writer.flush();
writer.close();
}
/**
* Access method for the mPcfFile property.
*
* @return the current value of the mPcfFile property
* @roseuid 42D3C693004A
*/
public File getPcfFile()
{
return mPcfFile;
}
/**
* Cr�e la ligne param�tr�e pour parser le fichier.
*
* @param pFilename le nom du fichier � ajouter.
* @return la ligne � afficher.
* @roseuid 42D3E25A0316
*/
private String getLine( final String pFilename )
{
StringBuffer sb = new StringBuffer( mConfig.getParser() );
sb.append( " \"" + pFilename + "\" " );
// On ajoute la liste des param�tres
for ( int i = 0; i < mConfig.getParseParameters().length; i++ )
{
sb.append( mConfig.getParseParameters()[i] + " " );
}
return sb.toString();
}
}