Java tutorial
/** * 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 = ""; } } } }