/**
* 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\\compiling\\java\\JavaCompilingTask.java
package org.squale.squalix.tools.compiling.java;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.tools.ant.BuildEvent;
import org.apache.tools.ant.BuildListener;
import org.apache.tools.ant.Project;
import org.squale.squalecommon.enterpriselayer.businessobject.component.parameters.ListParameterBO;
import org.squale.squalecommon.enterpriselayer.businessobject.component.parameters.MapParameterBO;
import org.squale.squalecommon.enterpriselayer.businessobject.component.parameters.ParametersConstants;
import org.squale.squalecommon.enterpriselayer.businessobject.component.parameters.StringParameterBO;
import org.squale.squalecommon.enterpriselayer.businessobject.result.ErrorBO;
import org.squale.squalix.core.AbstractTask;
import org.squale.squalix.core.TaskData;
import org.squale.squalix.core.TaskException;
import org.squale.squalix.tools.compiling.CompilingMessages;
import org.squale.squalix.tools.compiling.java.adapter.JComponent;
import org.squale.squalix.tools.compiling.java.beans.JRSAProject;
import org.squale.squalix.tools.compiling.java.beans.JWSADProject;
import org.squale.squalix.tools.compiling.java.beans.JXMLProject;
import org.squale.squalix.tools.compiling.java.compiler.impl.EclipseCompilerImpl;
import org.squale.squalix.tools.compiling.java.compiler.impl.JWSADCompilerImpl;
import org.squale.squalix.tools.compiling.java.compiler.impl.JXMLCompilerImpl;
import org.squale.squalix.tools.compiling.java.configuration.JCompilingConfiguration;
import org.squale.squalix.tools.compiling.java.parser.impl.JRSAParserImpl;
import org.squale.squalix.tools.compiling.java.parser.impl.JWSADParserImpl;
import org.squale.squalix.tools.compiling.java.parser.wsad.JWSADDotProjectParser;
import org.squale.squalix.util.file.FileUtility;
/**
* T�che de compilation JAVA.<br />
* Compile � partir d'environnements WSAD 5.x et/ou de fichiers XML ANT. H�rite de la classe m�re
* <code>CompilingTask</code>.
*
* @author m400832
* @version 1.0
*/
public class JCompilingTask
extends AbstractTask
implements BuildListener
{
/**
* le message associ� � une erreur de compil utilis� pour mettre les messages sous une bonne forme pour le web
*/
private String mCompilErrorMessage;
/**
* Instance de configuration.
*/
private JCompilingConfiguration mConfiguration = null;
/**
* S�parateur entre r�pertoires dans la HashMap de param�tres du <code>ProjectBO</code>.
*/
private static final String SEPDIRS = ";";
/**
* Liste de JComponent.
*/
private ArrayList mComponents = null;
/**
* Logger.
*/
private static final Log LOGGER = LogFactory.getLog( JCompilingTask.class );
/**
* Constructeur par d�faut.
*/
public JCompilingTask()
{
mName = "JCompilingTask";
mCompilErrorMessage = "";
}
/**
* M�thode de lancement de la t�che.
*
* @throws TaskException en cas d'�chec
*/
public void execute()
throws TaskException
{
try
{
mConfiguration = new JCompilingConfiguration();
mComponents = new ArrayList();
LOGGER.trace( CompilingMessages.getString( "java.logs.task.initialized" ) + getProject().getName() );
/* cr�ation des composants */
buildComponents();
/* traitement des composants, compilation */
process();
/* modification des param�tres de sortie */
modifyParameters();
/* affichage des param�tres en mode debug */
printParameters();
// positionne les donn�es sur la taille du file System
affectFileSystemSize( mData.getData( TaskData.CLASSES_DIRS ), true );
}
catch ( Exception e )
{
throw new TaskException( e );
}
}
/**
* Cette m�thode influe sur le <code>ProjectBO</code> en modifiant la <code>HashMap</code> de param�tres.
*
* @throws Exception Exception lors de la modification.
*/
private void modifyParameters()
throws Exception
{
modifyClasspathInHashMap();
modifyClassesDirInHashMap();
}
/**
*
*/
private void modifyClassesDirInHashMap()
{
List classesDirs = new ArrayList();
Iterator it = mComponents.iterator();
/* si l'it�rateur poss�de des �l�ments */
if ( null != it && it.hasNext() )
{
/* initialisation des variables utilis�es par la boucle */
JComponent jComp = null;
/* tant que l'it�rateur poss�de des �l�ments */
while ( it.hasNext() )
{
/* on cr�e un JComponent */
jComp = (JComponent) it.next();
/*
* si le JComponent est de type JWSADParserImpl i.e. projet WSAD ou RSA avec compilation avec le plugin
* Eclipse
*/
if ( jComp.getComponent() instanceof EclipseCompilerImpl )
{
// On ajoute la liste des r�pertoires
classesDirs.addAll( ( (EclipseCompilerImpl) jComp.getComponent() ).getEclipseCompiler().getOutputDirs() );
mData.putData( TaskData.CLASSES_DIRS, classesDirs );
}
}
}
}
/**
* Positionne la variable donnant le chemin du r�pertoire racine contenant les .class du projet
*
* @param classesDir le chemin du r�pertoire contenant les .class Param�tre fourni par les m�thodes
* create***Components
*/
private void modifyClassesDirInHashMap( String classesDir )
{
List classesDirs = new ArrayList();
classesDirs.add( classesDir );
mData.putData( TaskData.CLASSES_DIRS, classesDirs );
}
/**
* Cette m�thode influe sur le <code>ProjectBO</code> en modifiant la <code>HashMap</code> de param�tres, pour
* le param�tre <code>
* project.parameter.classpath</code>.
*
* @throws Exception Exception lors de la modification.
*/
private void modifyClasspathInHashMap()
throws Exception
{
// TODO : revoir cette m�thode pour �viter de faire des instanceof!
Iterator it = mComponents.iterator();
/* si l'it�rateur poss�de des �l�ments */
if ( null != it && it.hasNext() )
{
/* initialisation des variables utilis�es par la boucle */
JComponent jComp = null;
StringBuffer buf = new StringBuffer();
/* tant que l'it�rateur poss�de des �l�ments */
while ( it.hasNext() )
{
/* on cr�e un JComponent */
jComp = (JComponent) it.next();
/*
* si le JComponent est de type JWSADParserImpl i.e. projet WSAD
*/
if ( jComp.getComponent() instanceof JWSADParserImpl )
{
/* alors on modifie le classpath pour McCabe */
buf.append( modifyClasspathInHashMapWSAD( ( (JWSADParserImpl) ( jComp.getComponent() ) ).getProjectList() ) );
/* on ajoute le s�parateur de r�pertoires, i.e. ";" */
buf.append( SEPDIRS );
/*
* si le composant est de type JXMLCompilerImpl i.e. projet ANT
*/
}
else if ( ( jComp.getComponent() ) instanceof JXMLCompilerImpl )
{
/* alors on modifie le classpath pour McCabe */
buf.append( ( ( (JXMLCompilerImpl) ( jComp.getComponent() ) ).getXMLProject() ) );
/* on ajoute le s�parateur de r�pertoires, i.e. ";" */
buf.append( SEPDIRS );
}
else if ( jComp.getComponent() instanceof JRSAParserImpl )
{
/* alors on modifie le classpath pour McCabe */
buf.append( modifyClasspathInHashMapWSAD( ( (JRSAParserImpl) ( jComp.getComponent() ) ).getProjectList() ) );
/* on ajoute le s�parateur de r�pertoires, i.e. ";" */
buf.append( SEPDIRS );
}
else if ( jComp.getComponent() instanceof EclipseCompilerImpl )
{
/* alors on modifie le classpath pour McCabe */
buf.append( ( (EclipseCompilerImpl) ( jComp.getComponent() ) ).getEclipseCompiler().getClasspath() );
/* on ajoute le s�parateur de r�pertoires, i.e. ";" */
buf.append( SEPDIRS );
}
}
jComp = null;
/*
* on r�cup�re la cl� de la map de param�tres du projet dont la valeur associ�e sera le classpath
*/
String key = TaskData.CLASSPATH;
String value = (String) mData.getData( key );
if ( value == null )
{
/* sinon on cr�e une cha�ne vide */
value = "";
}
/* on met au propre le classpath */
value = generateProperClasspath( value, buf.toString() );
buf = null;
/*
* on modifie la hashmap de param�tres du projet en cons�quence.
*/
getData().putData( key, value );
}
it = null;
}
/**
* Cette m�thode influe sur le <code>ProjectBO</code> en modifiant la <code>HashMap</code> de param�tres, pour
* les projets WSAD.
*
* @param pList liste de projets WSAD.
* @throws Exception exception lors du traitement.
* @return String valeur � ajouter � la cl�.
*/
private String modifyClasspathInHashMapWSAD( List pList )
throws Exception
{
String value = null;
/* si la liste de projets fournie n'est pas vide */
if ( null != pList )
{
Iterator it = pList.iterator();
/* si l'it�rateur poss�de des �l�ments */
if ( null != it && it.hasNext() )
{
/* on instancie les variables utilis�es dans la boucle */
JWSADProject project = null;
StringBuffer cp = new StringBuffer();
/* tant que l'it�rateur a des �l�ments */
while ( it.hasNext() )
{
/* on cr�e le bean JWSADProject */
project = (JWSADProject) it.next();
/*
* on ajoute le classpath du bean au buffer NB : pas besoin d'ajouter de SEPDIRS car le classpath
* retourn� se termine toujours par un ";"
*/
cp.append( project.getClasspath() );
/*
* on ajoute au buffer le chemin du r�pertoire contenant les classes compil�es
*/
cp.append( project.getDestPath() );
/* on ajoute un s�parateur de r�pertoires, i.e. ";" */
cp.append( SEPDIRS );
}
/* on affecte la valeur retourn�e */
value = cp.toString();
/* on fait le m�nage */
cp = null;
project = null;
}
it = null;
}
return value;
}
/**
* Cette m�thode influe sur le <code>ProjectBO</code> en modifiant la <code>HashMap</code> de param�tres, pour
* les projets WSAD.
*
* @param pProject JXMLProject.
* @throws Exception exception lors du traitement.
* @return valeur � ajouter � la cl�.
*/
private String modifyClasspathInHashMapXML( JXMLProject pProject )
throws Exception
{
String value = null;
/* si le projet n'est pas nulle */
if ( null != pProject && null != pProject.getPath() )
{
/*
* on r�cup�re la portion du chemin du projet XML contenu entre le d�but de ladite cha�ne et le dernier "/"
* rencontr�. i.e. on r�cup�re "/app/SQUALE" si le chemin est "/app/SQUALE/build.xml".
*/
String path = pProject.getPath();
value = path.substring( 0, path.lastIndexOf( JCompilingConfiguration.UNIX_SEPARATOR ) );
}
return value;
}
/**
* M�thode qui lance l'ex�cution des parseurs et compilateurs.
*
* @throws Exception exception lors de l'ex�cution.
*/
private void process()
throws Exception
{
Iterator it = mComponents.iterator();
/* si l'it�rateur a des �l�ments */
if ( it != null && it.hasNext() )
{
/* tant qu'il en poss�de */
while ( it.hasNext() )
{
/* on active le composant */
JComponent comp = (JComponent) ( it.next() );
comp.getComponent().execute();
// On r�cup�re les �ventuelles erreurs de traitement
for ( Iterator itErr = comp.getComponent().getErrors().iterator(); itErr.hasNext(); )
{
ErrorBO err = (ErrorBO) itErr.next();
initError( err.getInitialMessage(), err.getLevel() );
}
}
}
it = null;
}
/**
* Cette m�thode lance la cr�ation des composants.
*
* @throws Exception exception lors de la cr�ation.
*/
private void buildComponents()
throws Exception
{
// Le projet contient soit une d�finition de projet WSAD
// soit une d�finition ANT, soit une d�finition RSA
ListParameterBO wsadList =
(ListParameterBO) mProject.getParameters().getParameters().get( ParametersConstants.WSAD );
if ( wsadList != null )
{
createWSADOrRSAComponents( mProject.getParameters(), wsadList.getParameters().iterator(), false );
}
else
{
ListParameterBO antList =
(ListParameterBO) mProject.getParameters().getParameters().get( ParametersConstants.ANT );
if ( antList != null )
{
for ( int i = 0; i < antList.getParameters().size(); i++ )
{
createXMLComponent( (MapParameterBO) antList.getParameters().get( i ) );
}
}
else
{
ListParameterBO rsaParams =
(ListParameterBO) mProject.getParameters().getParameters().get( ParametersConstants.RSA );
if ( null != rsaParams )
{
createWSADOrRSAComponents( mProject.getParameters(), rsaParams.getParameters().iterator(), true );
}
else
{
/* en cas d'exception */
throw new Exception( CompilingMessages.getString( "java.exception.task.unsupported_component" ) );
}
}
}
}
/**
* Cette m�thode cr�e les composants n�cessaires � la compilation des projects de type WSAD.
*
* @param pMap MapParameterBO contenant les informations n�cessaires � la cr�ation des composants.
* @param pProjectsIt l'it�rateur sur les projets
* @param pIsRSA si il s'agit d'une liste de projet type RSA
* @throws Exception exception.
*/
private void createWSADOrRSAComponents( MapParameterBO pMap, Iterator pProjectsIt, boolean pIsRSA )
throws Exception
{
/* on initialise les variables utilis�es par la boucle */
ListParameterBO exludedDirs = (ListParameterBO) pMap.getParameters().get( ParametersConstants.EXCLUDED_DIRS );
// On r�cup�re le bundle eclipse
String bundleDir =
getEclipseBundleFile( (StringParameterBO) pMap.getParameters().get( ParametersConstants.BUNDLE_PATH ) );
// La liste des JWSADprojects
List JWSADProjectList = new ArrayList( 0 );
JWSADProject myProject = null;
List projectParamsList = null;
for ( ; pProjectsIt.hasNext(); )
{
myProject = new JWSADProject();
// Ajout du listener
myProject.setListener( this );
// On change le fichier du bundle
myProject.setBundleDir( bundleDir );
/* on affecte les attributs */
String dirName = "";
if ( !pIsRSA )
{
StringParameterBO stringBO = (StringParameterBO) pProjectsIt.next();
dirName = new File(stringBO.getValue()).getPath();
// On r�cup�re le manifest (dans le cas par exemple des plugins RCP)
MapParameterBO projectsParams =
(MapParameterBO) pMap.getParameters().get( ParametersConstants.WSAD_PROJECT_PARAM );
if ( null != projectsParams )
{
MapParameterBO projectParamsMap = (MapParameterBO) projectsParams.getParameters().get( dirName );
if ( null != projectParamsMap )
{
StringParameterBO manifest =
(StringParameterBO) projectParamsMap.getParameters().get( ParametersConstants.MANIFEST_PATH );
myProject.setManifestPath( manifest.getValue() );
}
}
// On modifie les param�tres communs aux projets RSA ou WSAD
setProjectParams( pMap, myProject, dirName );
/* on ajoute le projet � la liste des projets */
JWSADProjectList.add( myProject );
}
else
{
projectParamsList = ( (ListParameterBO) pProjectsIt.next() ).getParameters();
dirName = ( (StringParameterBO) projectParamsList.get( ParametersConstants.WORKSPACE_ID ) ).getValue();
setProjectParams( pMap, myProject, dirName );
// Si le projet est un projet RSA7, on parse avec le parser RSA
// car il y a des petites diff�rences au niveau de la construction du .classpath
// On ajoute les informations n�cessaires au projet pour le parsing RSA
JRSAProject rsaProject = new JRSAProject( myProject );
if ( projectParamsList.size() > ParametersConstants.EAR_NAME_ID )
{
String earName =
( (StringParameterBO) projectParamsList.get( ParametersConstants.EAR_NAME_ID ) ).getValue();
rsaProject.setEARProjectName( earName );
}
if ( projectParamsList.size() > ParametersConstants.MANIFEST_PATH_ID )
{
String manifestPath =
( (StringParameterBO) projectParamsList.get( ParametersConstants.MANIFEST_PATH_ID ) ).getValue();
rsaProject.setManifestPath( manifestPath );
}
JWSADProjectList.add( rsaProject );
}
if ( !myProject.isWSAD() )
{
/* ce n'est pas un projet WSAD */
throw new Exception(
CompilingMessages.getString( "java.exception.task.malformed_wsad_project_in_hashmap" )
+ myProject.getPath() );
}
}
addEclipseOrWSADCompilerToComponents( pMap, JWSADProjectList, pIsRSA );
}
/**
* @param pMap les param�tres de la t�che
* @param pJWSADProjectList la liste des projets WSAD
* @param pIsRSA si les projets sont de type RSA
* @throws Exception si erreur lors de la cr�ation
*/
private void addEclipseOrWSADCompilerToComponents( MapParameterBO pMap, List pJWSADProjectList, boolean pIsRSA )
throws Exception
{
MapParameterBO eclipseMap = (MapParameterBO) pMap.getParameters().get( ParametersConstants.ECLIPSE );
StringParameterBO isEclipse = null;
if ( null != eclipseMap )
{
isEclipse = (StringParameterBO) eclipseMap.getParameters().get( ParametersConstants.ECLIPSE_COMPILATION );
}
if ( null != isEclipse && isEclipse.getValue().equals( "false" ) )
{
// On va parser les .classpath puis compiler avec javac
/*
* on cr�e les composants : pour compiler les projets WSAD, il faut d'abord parser les fichiers ".classpath"
* puis compiler. D'o� le recours � deux composants
*/
JComponent j1 = new JComponent( new JWSADParserImpl( pJWSADProjectList ) );
if ( pIsRSA )
{
j1 = new JComponent( new JRSAParserImpl( pJWSADProjectList ) );
}
JWSADCompilerImpl jcawi = new JWSADCompilerImpl( pJWSADProjectList );
JComponent j2 = new JComponent( jcawi );
addToComponents( j1 );
addToComponents( j2 );
}
else
{
// On compile avec le plugin eclipse
// On r�cup�re les variables et librairies d�finies par l'utilisateur
EclipseCompilerImpl eclipseCompiler =
new EclipseCompilerImpl( pJWSADProjectList, (String) mData.getData( TaskData.VIEW_PATH ), eclipseMap );
JComponent component = new JComponent( eclipseCompiler );
addToComponents( component );
}
}
/**
* @param bundlePath le param�tre d�finissant le chemin vers le bundle eclipse
* @return le chemin d�finitif et v�rifi� vers la distribution d'eclipse pour la compilation RCP
*/
private String getEclipseBundleFile( StringParameterBO bundlePath )
{
// On r�cup�re la version de distribution d'eclipse � utiliser
// Si il s'agit d'un r�pertoire, on le d�zippe sinon on utilise le chemin tel quel
String bundleDir = "";
if ( null != bundlePath )
{
try
{
File bundleFile =
FileUtility.getAbsoluteFile( (String) mData.getData( TaskData.VIEW_PATH ),
new File( bundlePath.getValue() ) );
// On passe le fichie en readonly
bundleFile.setReadOnly();
if ( bundleFile.isDirectory() )
{
bundleDir = bundleFile.getAbsolutePath();
}
else
{
// On extrait l'archive
FileUtility.copyOrExtractInto( bundleFile, new File( mConfiguration.getEclipseBundleDir() ) );
// on affecte le chemin donn� dans la configuration
bundleDir = mConfiguration.getEclipseBundleDir();
}
}
catch ( Exception e )
{
// On va juste lancer un warning en affichant l'erreur car la compilation peut-�tre
// r�ussir sans le bundle
String exceptionMsg = ( e.getMessage() == null ) ? e.getMessage() : e.toString();
String message =
CompilingMessages.getString( "java.warning.eclipse_bundle_not_correct", new String[] {
bundlePath.getValue(), exceptionMsg } );
LOGGER.warn( message );
initError( message );
}
}
return bundleDir;
}
/**
* Modifie les param�tres communs d'un projet wsad ou rsa
*
* @param pParams les param�tres
* @param pProject le projet
* @param pDirName le chemin du workspace
*/
private void setProjectParams( MapParameterBO pParams, JWSADProject pProject, String pDirName )
{
// Ajout du listener
pProject.setListener( this );
/* on affecte les attributs */
pProject.setName( ( new JWSADDotProjectParser( ( (String) mData.getData( TaskData.VIEW_PATH ) ) + pDirName ) ).retrieveName() );
pProject.setJavaVersion( ( (StringParameterBO) pParams.getParameters().get( ParametersConstants.DIALECT ) ).getValue() );
String viewPath = (String) mData.getData( TaskData.VIEW_PATH ) + File.separator;
String destDir = viewPath.replaceAll( "//", "/" );
pProject.setPath( ( destDir + pDirName + "/" ).replaceAll( "//", "/" ) );
destDir += mConfiguration.getDestDir();
pProject.setDestPath( destDir );
this.modifyClassesDirInHashMap( destDir );
// Prise en compte des r�pertoires exclus
addExcludedDirs( pProject, (ListParameterBO) pParams.getParameters().get( ParametersConstants.EXCLUDED_DIRS ),
viewPath );
// On ajoute le param�tre relatif � la RAM d�di�e qui
// sera utilis�e lors de la compilation du projet
pProject.setRequiredMemory( mConfiguration.getRequiredMemory() );
// Le classpath de l'API java a utiliser
pProject.setBootClasspath( mConfiguration.getBootclasspath( pProject.getJavaVersion() ) );
}
/**
* @param pProject le projet
* @param pExcludedDirs les r�pertoires � exclure
* @param pViewPath le chemin de la vue
*/
private void addExcludedDirs( JWSADProject pProject, ListParameterBO pExcludedDirs, String pViewPath )
{
if ( null != pExcludedDirs )
{
/*
* on ajoute au projet la liste des r�pertoires � exclure
*/
for ( Iterator it = pExcludedDirs.getParameters().iterator(); it.hasNext(); )
{
// On v�rifie que le r�pertoire appartient bien au projet
String currentEx = ( pViewPath + ( (StringParameterBO) it.next() ).getValue() ).replaceAll( "//", "/" );
if ( currentEx.matches( pProject.getPath() + ".*" ) )
{
pProject.addToExcludeDirs( currentEx );
}
}
}
}
/**
* Cette m�thode cr�e un composant XML.
*
* @param pAntMap le MapParameterBO contenant les informations n�cessaires � la cr�ation du composant.
* @throws Exception exception.
*/
private void createXMLComponent( MapParameterBO pAntMap )
throws Exception
{
/* on cr�e un bean project XML */
JXMLProject project = new JXMLProject();
StringParameterBO buildFile =
(StringParameterBO) pAntMap.getParameters().get( ParametersConstants.ANT_BUILD_FILE );
StringParameterBO antTarget = (StringParameterBO) pAntMap.getParameters().get( ParametersConstants.ANT_TARGET );
if ( buildFile == null )
{
/* on lance une exception en rapport */
throw new Exception( CompilingMessages.getString( "java.exception.task.malformed_xml_project_in_hashmap" ) );
}
project.setPath( makePath( buildFile.getValue() ) );
if ( antTarget != null )
{
String targ = antTarget.getValue();
project.setTarget( targ );
}
// Ajout du listener
project.setListener( this );
/* on cr�e le composant */
JXMLCompilerImpl jxci = new JXMLCompilerImpl( project );
JComponent jc = new JComponent( jxci );
/* et on l'ajoute � la liste */
addToComponents( jc );
}
/**
* M�thode d'ajout d'un <code>JComponent</code> � la liste <code>mComponents</code>.
*
* @param pComponent <code>JComponent</code> � ajouter.
*/
private void addToComponents( JComponent pComponent )
{
mComponents.add( pComponent );
}
/**
* Cette m�thode reforme une chemin complet
*
* @param pName : * WSAD = nom du r�pertoire contenant le projet / *XML : chemin vers le fichier XML.
* @return le chemin compl�t�.
* @throws Exception exception lors du traitement.
*/
private String makePath( String pName )
throws Exception
{
/* on r�cup�re le view_path depuis la hashmap */
String sTmp = (String) getData().getData( TaskData.VIEW_PATH );
/* on cr�e le buffer */
StringBuffer value = new StringBuffer( sTmp );
/* si il manque le "/" */
if ( !sTmp.endsWith( "/" ) && !pName.startsWith( "/" ) )
{
/* alors on l'ajoute */
value.append( JCompilingConfiguration.UNIX_SEPARATOR );
}
/* on ajoute le pName */
value.append( pName );
/* si le source_path ne se termine pas par un "/" */
if ( !pName.endsWith( "/" ) )
{
/* alors on l'ajoute */
value.append( JCompilingConfiguration.UNIX_SEPARATOR );
}
return value.toString();
}
/**
* Cette m�thode est utilis�e par la m�thode <code>modifyClasspathInHashMap()</code> afin d'�viter les doublons
* dans la cha�ne de caract�res contenant le classpath.
*
* @param pString1 1�re cha�ne � tester.
* @param pString2 2nde cha�ne � tester.
* @return le r�sultat du test.
* @throws Exception exception lors du traitement.
* @see #modifyClasspathInHashMap()
*/
private String generateProperClasspath( String pString1, String pString2 )
throws Exception
{
/* CODE HISTORIQUE : � modifier en utilisant un HashSet */
StringBuffer result = new StringBuffer();
String str1 = pString1;
String str2 = pString2;
/* si l'une et / ou l'autre des cha�nes fournies est nulle */
if ( null == str1 )
{
/* alors on l'affecte vide */
str1 = "";
}
if ( null == str2 )
{
/* alors on l'affecte vide */
str2 = "";
}
/*
* on cr�e une 1�re liste en cassant la 1�re cha�ne selon le s�parateur de classpath
*/
ArrayList list1 =
new ArrayList( (List) Arrays.asList( (String[]) ( str1.split( mConfiguration.getClasspathSeparator() ) ) ) );
/*
* on cr�e une 2nde liste en cassant la 2nde cha�ne selon le s�parateur de classpath
*/
ArrayList list2 =
new ArrayList( (List) Arrays.asList( (String[]) ( str2.split( mConfiguration.getClasspathSeparator() ) ) ) );
/* si aucune des listes n'est vide */
if ( null != list1 && null != list2 )
{
int i = 0;
/* tant que l'on a pas atteint l'extr�mit� de la 2nde liste */
while ( i < list2.size() )
{
/*
* si la premi�re liste ne contient pas l'�l�ment courant de la seconde
*/
if ( !list1.contains( list2.get( i ) ) )
{
/* alors cet �l�ment est ajout� � la 1�re liste */
list1.add( list2.get( i ) );
}
i++;
}
i = 0;
/* tant que l'on a pas atteint l'extr�mit� de la 1�re liste */
while ( i < list1.size() )
{
/* si l'�l�ment courant n'est pas vide */
if ( !"".equals( list1.get( i ) ) )
{
/* alors il est ajout� au buffer */
result.append( list1.get( i ) );
/* on ajoute le s�parateur de classpath */
result.append( mConfiguration.getClasspathSeparator() );
}
i++;
}
}
/* on fait le m�nage */
list1 = null;
list2 = null;
/* si le buffer se r�sume � un s�parateur de classpath */
if ( mConfiguration.getClasspathSeparator().equals( result.toString() ) )
{
/* alors on instance un nouveau buffer vierge */
result = new StringBuffer();
}
/* on retourne le buffer */
return result.toString();
}
/**
* Cette m�thode affiche des param�tres en mode DEBUG uniquement.
*/
private void printParameters()
{
LOGGER.debug( "Project: " + mProject.getName() );
LOGGER.debug( "ClassPath:" + (String) ( getData().getData( TaskData.CLASSPATH ) ) );
}
/**
* (non-Javadoc)
*
* @see org.apache.tools.ant.BuildListener#buildStarted(org.apache.tools.ant.BuildEvent)
*/
public void buildStarted( BuildEvent pEvent )
{
log( pEvent );
}
/**
* (non-Javadoc)
*
* @see org.apache.tools.ant.BuildListener#buildFinished(org.apache.tools.ant.BuildEvent)
*/
public void buildFinished( BuildEvent pEvent )
{
log( pEvent );
}
/**
* (non-Javadoc)
*
* @see org.apache.tools.ant.BuildListener#targetStarted(org.apache.tools.ant.BuildEvent)
*/
public void targetStarted( BuildEvent pEvent )
{
log( pEvent );
}
/**
* (non-Javadoc)
*
* @see org.apache.tools.ant.BuildListener#targetFinished(org.apache.tools.ant.BuildEvent)
*/
public void targetFinished( BuildEvent pEvent )
{
log( pEvent );
}
/**
* (non-Javadoc)
*
* @see org.apache.tools.ant.BuildListener#taskStarted(org.apache.tools.ant.BuildEvent)
*/
public void taskStarted( BuildEvent pEvent )
{
log( pEvent );
}
/**
* (non-Javadoc)
*
* @see org.apache.tools.ant.BuildListener#taskFinished(org.apache.tools.ant.BuildEvent)
*/
public void taskFinished( BuildEvent pEvent )
{
log( pEvent );
}
/**
* (non-Javadoc)
*
* @see org.apache.tools.ant.BuildListener#messageLogged(org.apache.tools.ant.BuildEvent)
*/
public void messageLogged( BuildEvent pEvent )
{
log( pEvent );
}
/**
* Log JRAF L'�v�nement ANT est redirig� vers le log JRAF
*
* @param pEvent �v�nement ANT
*/
private void log( BuildEvent pEvent )
{
// On adapte les logs en fonction de la gravit� du log initial
String message = pEvent.getMessage();
Throwable exception = pEvent.getException();
// Utilisation d'un switch car on ne peut pas
// se passer du mapping entre en entier et une m�thode
// � appeler : on pourrait m�moriser dans une map
// la m�thode et l'entier mais cel� est un peu lourd
switch ( pEvent.getPriority() )
{
case Project.MSG_ERR:
LOGGER.error( message, exception );
break;
case Project.MSG_WARN:
LOGGER.warn( message, exception );
manageCompilError( message );
break;
case Project.MSG_INFO:
LOGGER.info( message, exception );
break;
case Project.MSG_VERBOSE:
LOGGER.trace( message, exception );
break;
case Project.MSG_DEBUG:
LOGGER.debug( message, exception );
break;
default:
// Par d�faut on log sur le flux de warning
LOGGER.warn( message, exception );
// par d�faut
manageCompilError( message );
break;
}
}
/**
* g�re la cr�ation des erreurs de compilation
*
* @param pMessage le message d'erreur
*/
private void manageCompilError( String pMessage )
{
// petit filtrage
if ( pMessage.indexOf( "see the compiler error output" ) == -1 )
{
// rajoute "\n" pour formater l'affichage de la jsp
mCompilErrorMessage += pMessage + "\n";
}
// on ne stocke que les erreurs de compil,pas les infos
if ( pMessage.indexOf( "^" ) != -1 )
{
// on enl�ve le chemin de la vue qui n'est pas une information n�cessaire
mCompilErrorMessage = mCompilErrorMessage.replaceAll( (String) mData.getData( TaskData.VIEW_PATH ), "" );
// d�termine le niveau de criticit�
if ( mCompilErrorMessage.toLowerCase().indexOf( "warning" ) == -1 )
{
initError( mCompilErrorMessage, ErrorBO.CRITICITY_FATAL );
}
else
{
initError( mCompilErrorMessage, ErrorBO.CRITICITY_WARNING );
}
// reset
mCompilErrorMessage = "";
}
else
{ // pb de classpath sur les chargements de jar
if ( pMessage.indexOf( ".jar" ) != -1 )
{
// on enl�ve le chemin de la vue qui n'est pas une information n�cessaire
mCompilErrorMessage = mCompilErrorMessage.replaceAll( (String) mData.getData( TaskData.VIEW_PATH ), "" );
// envoie du message niveau warning
initError( mCompilErrorMessage, ErrorBO.CRITICITY_WARNING );
// reset
mCompilErrorMessage = "";
}
}
}
}