org.squale.squalix.tools.compiling.java.JCompilingTask.java Source code

Java tutorial

Introduction

Here is the source code for org.squale.squalix.tools.compiling.java.JCompilingTask.java

Source

/**
 * 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;

/**
 * Tche de compilation JAVA.<br />
 * Compile  partir d'environnements WSAD 5.x et/ou de fichiers XML ANT. Hrite de la classe mre
 * <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;

    /**
     * Sparateur entre rpertoires dans la HashMap de paramtres 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 dfaut.
     */
    public JCompilingTask() {
        mName = "JCompilingTask";
        mCompilErrorMessage = "";
    }

    /**
     * Mthode de lancement de la tche.
     * 
     * @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());
            /* cration des composants */
            buildComponents();
            /* traitement des composants, compilation */
            process();
            /* modification des paramtres de sortie */
            modifyParameters();
            /* affichage des paramtres en mode debug */
            printParameters();
            // positionne les donnes sur la taille du file System
            affectFileSystemSize(mData.getData(TaskData.CLASSES_DIRS), true);

        } catch (Exception e) {
            throw new TaskException(e);
        }
    }

    /**
     * Cette mthode influe sur le <code>ProjectBO</code> en modifiant la <code>HashMap</code> de paramtres.
     * 
     * @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'itrateur possde des lments */
        if (null != it && it.hasNext()) {
            /* initialisation des variables utilises par la boucle */
            JComponent jComp = null;

            /* tant que l'itrateur possde des lments */
            while (it.hasNext()) {
                /* on cre 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 rpertoires
                    classesDirs.addAll(
                            ((EclipseCompilerImpl) jComp.getComponent()).getEclipseCompiler().getOutputDirs());
                    mData.putData(TaskData.CLASSES_DIRS, classesDirs);
                }
            }
        }
    }

    /**
     * Positionne la variable donnant le chemin du rpertoire racine contenant les .class du projet
     * 
     * @param classesDir le chemin du rpertoire contenant les .class Paramtre fourni par les mthodes
     *            create***Components
     */
    private void modifyClassesDirInHashMap(String classesDir) {
        List classesDirs = new ArrayList();
        classesDirs.add(classesDir);
        mData.putData(TaskData.CLASSES_DIRS, classesDirs);
    }

    /**
     * Cette mthode influe sur le <code>ProjectBO</code> en modifiant la <code>HashMap</code> de paramtres, pour
     * le paramtre <code>
     * project.parameter.classpath</code>.
     * 
     * @throws Exception Exception lors de la modification.
     */
    private void modifyClasspathInHashMap() throws Exception {
        // TODO : revoir cette mthode pour viter de faire des instanceof!
        Iterator it = mComponents.iterator();

        /* si l'itrateur possde des lments */
        if (null != it && it.hasNext()) {
            /* initialisation des variables utilises par la boucle */
            JComponent jComp = null;
            StringBuffer buf = new StringBuffer();

            /* tant que l'itrateur possde des lments */
            while (it.hasNext()) {
                /* on cre 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 sparateur de rpertoires, 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 sparateur de rpertoires, 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 sparateur de rpertoires, 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 sparateur de rpertoires, i.e. ";" */
                    buf.append(SEPDIRS);
                }
            }
            jComp = null;

            /*
             * on rcupre la cl de la map de paramtres du projet dont la valeur associe sera le classpath
             */
            String key = TaskData.CLASSPATH;

            String value = (String) mData.getData(key);
            if (value == null) {
                /* sinon on cre une chane vide */
                value = "";
            }

            /* on met au propre le classpath */
            value = generateProperClasspath(value, buf.toString());

            buf = null;

            /*
             * on modifie la hashmap de paramtres du projet en consquence.
             */
            getData().putData(key, value);
        }
        it = null;
    }

    /**
     * Cette mthode influe sur le <code>ProjectBO</code> en modifiant la <code>HashMap</code> de paramtres, 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'itrateur possde des lments */
            if (null != it && it.hasNext()) {

                /* on instancie les variables utilises dans la boucle */
                JWSADProject project = null;
                StringBuffer cp = new StringBuffer();

                /* tant que l'itrateur a des lments */
                while (it.hasNext()) {
                    /* on cre 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 rpertoire contenant les classes compiles
                     */
                    cp.append(project.getDestPath());
                    /* on ajoute un sparateur de rpertoires, i.e. ";" */
                    cp.append(SEPDIRS);
                }

                /* on affecte la valeur retourne */
                value = cp.toString();

                /* on fait le mnage */
                cp = null;
                project = null;
            }
            it = null;
        }
        return value;
    }

    /**
     * Cette mthode influe sur le <code>ProjectBO</code> en modifiant la <code>HashMap</code> de paramtres, 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 rcupre la portion du chemin du projet XML contenu entre le dbut de ladite chane et le dernier "/"
             * rencontr. i.e. on rcupre "/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;
    }

    /**
     * Mthode qui lance l'excution des parseurs et compilateurs.
     * 
     * @throws Exception exception lors de l'excution.
     */
    private void process() throws Exception {
        Iterator it = mComponents.iterator();

        /* si l'itrateur a des lments */
        if (it != null && it.hasNext()) {

            /* tant qu'il en possde */
            while (it.hasNext()) {
                /* on active le composant */
                JComponent comp = (JComponent) (it.next());
                comp.getComponent().execute();
                // On rcupre 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 mthode lance la cration des composants.
     * 
     * @throws Exception exception lors de la cration.
     */
    private void buildComponents() throws Exception {
        // Le projet contient soit une dfinition de projet WSAD
        // soit une dfinition ANT, soit une dfinition 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 mthode cre les composants ncessaires  la compilation des projects de type WSAD.
     * 
     * @param pMap MapParameterBO contenant les informations ncessaires  la cration des composants.
     * @param pProjectsIt l'itrateur 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 utilises par la boucle */
        ListParameterBO exludedDirs = (ListParameterBO) pMap.getParameters().get(ParametersConstants.EXCLUDED_DIRS);
        // On rcupre 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 rcupre 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 paramtres 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 diffrences au niveau de la construction du .classpath
                // On ajoute les informations ncessaires 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 paramtres de la tche
     * @param pJWSADProjectList la liste des projets WSAD
     * @param pIsRSA si les projets sont de type RSA
     * @throws Exception si erreur lors de la cration
     */
    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 cre 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 rcupre les variables et librairies dfinies 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 paramtre dfinissant le chemin vers le bundle eclipse
     * @return le chemin dfinitif et vrifi vers la distribution d'eclipse pour la compilation RCP
     */
    private String getEclipseBundleFile(StringParameterBO bundlePath) {
        // On rcupre la version de distribution d'eclipse  utiliser
        // Si il s'agit d'un rpertoire, on le dzippe 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
                // russir 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 paramtres communs d'un projet wsad ou rsa
     * 
     * @param pParams les paramtres
     * @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 rpertoires exclus
        addExcludedDirs(pProject, (ListParameterBO) pParams.getParameters().get(ParametersConstants.EXCLUDED_DIRS),
                viewPath);
        // On ajoute le paramtre relatif  la RAM ddie qui
        // sera utilise 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 rpertoires  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 rpertoires  exclure
             */
            for (Iterator it = pExcludedDirs.getParameters().iterator(); it.hasNext();) {
                // On vrifie que le rpertoire appartient bien au projet
                String currentEx = (pViewPath + ((StringParameterBO) it.next()).getValue()).replaceAll("//", "/");
                if (currentEx.matches(pProject.getPath() + ".*")) {
                    pProject.addToExcludeDirs(currentEx);
                }
            }
        }

    }

    /**
     * Cette mthode cre un composant XML.
     * 
     * @param pAntMap le MapParameterBO contenant les informations ncessaires  la cration du composant.
     * @throws Exception exception.
     */
    private void createXMLComponent(MapParameterBO pAntMap) throws Exception {

        /* on cre 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 cre le composant */
        JXMLCompilerImpl jxci = new JXMLCompilerImpl(project);
        JComponent jc = new JComponent(jxci);

        /* et on l'ajoute  la liste */
        addToComponents(jc);
    }

    /**
     * Mthode 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 mthode reforme une chemin complet
     * 
     * @param pName : * WSAD = nom du rpertoire contenant le projet / *XML : chemin vers le fichier XML.
     * @return le chemin complt.
     * @throws Exception exception lors du traitement.
     */
    private String makePath(String pName) throws Exception {
        /* on rcupre le view_path depuis la hashmap */
        String sTmp = (String) getData().getData(TaskData.VIEW_PATH);

        /* on cre 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 mthode est utilise par la mthode <code>modifyClasspathInHashMap()</code> afin d'viter les doublons
     * dans la chane de caractres contenant le classpath.
     * 
     * @param pString1 1re chane  tester.
     * @param pString2 2nde chane  tester.
     * @return le rsultat 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 chanes fournies est nulle */
        if (null == str1) {
            /* alors on l'affecte vide */
            str1 = "";
        }
        if (null == str2) {
            /* alors on l'affecte vide */
            str2 = "";
        }

        /*
         * on cre une 1re liste en cassant la 1re chane selon le sparateur de classpath
         */
        ArrayList list1 = new ArrayList(
                (List) Arrays.asList((String[]) (str1.split(mConfiguration.getClasspathSeparator()))));

        /*
         * on cre une 2nde liste en cassant la 2nde chane selon le sparateur 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'extrmit de la 2nde liste */
            while (i < list2.size()) {
                /*
                 * si la premire liste ne contient pas l'lment courant de la seconde
                 */
                if (!list1.contains(list2.get(i))) {
                    /* alors cet lment est ajout  la 1re liste */
                    list1.add(list2.get(i));
                }
                i++;
            }

            i = 0;

            /* tant que l'on a pas atteint l'extrmit de la 1re liste */
            while (i < list1.size()) {
                /* si l'lment courant n'est pas vide */
                if (!"".equals(list1.get(i))) {
                    /* alors il est ajout au buffer */
                    result.append(list1.get(i));
                    /* on ajoute le sparateur de classpath */
                    result.append(mConfiguration.getClasspathSeparator());
                }
                i++;
            }
        }

        /* on fait le mnage */
        list1 = null;
        list2 = null;

        /* si le buffer se rsume  un sparateur 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 mthode affiche des paramtres 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'vnement ANT est redirig vers le log JRAF
     * 
     * @param pEvent vnement 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 mthode
        //  appeler : on pourrait mmoriser dans une map
        // la mthode 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 dfaut on log sur le flux de warning
            LOGGER.warn(message, exception);
            // par dfaut
            manageCompilError(message);
            break;
        }
    }

    /**
     * gre la cration 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 enlve le chemin de la vue qui n'est pas une information ncessaire
            mCompilErrorMessage = mCompilErrorMessage.replaceAll((String) mData.getData(TaskData.VIEW_PATH), "");
            // dtermine 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 enlve le chemin de la vue qui n'est pas une information ncessaire
                mCompilErrorMessage = mCompilErrorMessage.replaceAll((String) mData.getData(TaskData.VIEW_PATH),
                        "");
                // envoie du message niveau warning
                initError(mCompilErrorMessage, ErrorBO.CRITICITY_WARNING);
                // reset
                mCompilErrorMessage = "";
            }
        }
    }
}