/**
* 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.util.parser;
import java.util.List;
import org.squale.squalecommon.enterpriselayer.businessobject.component.ClassBO;
import org.squale.squalecommon.enterpriselayer.businessobject.component.MethodBO;
import org.squale.squalecommon.enterpriselayer.businessobject.component.PackageBO;
import org.squale.squalecommon.enterpriselayer.businessobject.component.ProjectBO;
/**
* Parse les noms de type Cobol et les remplace par les objets correspondants.
*/
public class CobolParser
{
/**
* Nom du package racine comportant l'ensemble des programmes.
*/
private final String ROOT_PACKAGE = "source";
/**
* Nom donn� par McCabe au module principal d'un programme.
*/
private final String MAINLINE_TOKEN = "mainline";
/**
* S�parateur de programme et module.
*/
private final String PRG_MODULE_SEPARATOR = "`";
/**
* S�parateur de programme et de son module principal.
*/
private final String PRG_MAIN_MODULE_SEPARATOR = "_";
/**
* S�parateur de module et de paragraphe.
*/
private final String MODULE_PARAGRAPH_SEPARATOR = ":";
/**
* Nom du module cr�� dans le cas d'un programme sans module.
*/
private final String MAINPROGRAM_MODULE = "mainprogram";
/** Projet sur lequel est r�alis� l'analyse */
private ProjectBO mProject;
/**
* Retourne le nom du projet sur lequel est r�alis� l'analyse.
*
* @return le nom du projet
*/
public ProjectBO getProject()
{
return mProject;
}
/**
* Constructeur.
*
* @param pProject le projet sur lequel est r�alis� l'analyse
*/
public CobolParser( final ProjectBO pProject )
{
mProject = pProject;
}
/**
* Retourne un objet m�tier module portant le nom indiqu�.
*
* @param pModuleName le nom du module
* @param pFilename le nom du fichier d�finissant le module
* @param pPrgName le nom du programme d�finissant le module
* @return l'objet m�tier module
*/
public MethodBO getModule( final String pModuleName, final String pFilename, final ClassBO pPrgName )
{
MethodBO lMethodBO = new MethodBO( pModuleName );
lMethodBO.setLongFileName( pFilename );
lMethodBO.setParent( pPrgName );
lMethodBO.setProject( mProject );
return lMethodBO;
}
/**
* Retourne un objet m�tier programme portant le nom indiqu�.
*
* @param pPrgName le nom du programme
* @param pFilename le nom du fichier d�finissant le programme
* @return l'objet m�tier programme
*/
public ClassBO getProgram( final String pPrgName, final String pFilename )
{
// cr�ation d'un package racine comportant l'ensemble des programmes
PackageBO lPackageBO = new PackageBO( ROOT_PACKAGE );
lPackageBO.setParent( mProject );
ClassBO lClassBO = new ClassBO( pPrgName );
lClassBO.setParent( lPackageBO );
lClassBO.setFileName( pFilename );
return lClassBO;
}
/**
* Retourne les noms du programme et du module Cobol � partir du nom complet du module tel qu'indiqu� dans le
* rapport McCabe. <br/> Le nom du programme et du module doivent �tre s�par�s par un simple guillemet.
*
* @param pFullModuleName le nom complet du module
* @param pPrgAndModuleNames les noms du programme et du module Cobol retourn�s par cette m�thode si ceux-ci sont
* correctement s�par�s par un simple guillement. Cette liste doit �tre initiallement vide, et elle est
* retourn�e vide si le nom du module n'est pas bien form�.
*/
public void getPrgAndModuleNamesForModule( final String pFullModuleName, final List<String> pPrgAndModuleNames )
{
// initialisation de la liste
pPrgAndModuleNames.clear();
// cas d'un module non principal
int lIndexOfSeparator = pFullModuleName.indexOf( PRG_MODULE_SEPARATOR );
if ( lIndexOfSeparator == -1 )
{
// cas du module principal du programme
if ( pFullModuleName.contains( PRG_MAIN_MODULE_SEPARATOR + MAINLINE_TOKEN ) )
{
lIndexOfSeparator = pFullModuleName.indexOf( PRG_MAIN_MODULE_SEPARATOR );
}
}
// d�composition du nom complet du module
// cas d'un programme et d'un module
if ( lIndexOfSeparator != -1 )
{
// ajout du nom du programme et du module dans la liste
pPrgAndModuleNames.add( pFullModuleName.substring( 0, lIndexOfSeparator ) );
pPrgAndModuleNames.add( pFullModuleName.substring( lIndexOfSeparator + 1 ) );
}
// cas d'un programme sans nom de module
else
{
pPrgAndModuleNames.add( pFullModuleName );
pPrgAndModuleNames.add( MAINPROGRAM_MODULE );
}
}
}