/** * 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\\JavaCompilingConfiguration.java package org.squale.squalix.tools.compiling.java.configuration; import java.io.File; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.squale.squalix.configurationmanager.ConfigUtility; import org.squale.squalix.tools.compiling.CompilingMessages; /** * Classe de configuration pour la compilation des projets JAVA.<br /> * La version 2.0 introduit le recours � la r�flexion. * * @author m400832 * @version 2.0 */ public class JCompilingConfiguration { /** * Logger. */ private static final Log LOGGER = LogFactory.getLog( JCompilingConfiguration.class ); /** * S�parateur UNIX. */ public static final String UNIX_SEPARATOR = "/"; /** * S�parateur Windows. */ public static final String WINDOWS_SEPARATOR = "\\"; /** * Version par d�faut du JDK � utiliser. */ private String mJDKDefaultVersion = ""; /** * R�pertoire cible pour stocker les classes compil�es. */ private String mDestDir = ""; /** * S�parateur du classpath. */ private String mClasspathSeparator = ""; /** * M�moire requise pour la compilation. */ private String mRequiredMemory = ""; /** * R�pertoire cible pour copier ou extraire le bundle eclipse. */ private String mEclipseBundleDir = ""; /** * R�pertoire cible pour extraire les libraries export�es dans le cas de la compilation RCP. */ private File mExportedLibsDir = new File( "" ); /** * Lib to add to the javac bootclasspath option depend on dialect. 1.3 -> pathtoJreLib1_3 1.4 -> pathToJreLib1_4 1.5 -> * pathToJreLib1_5 */ private HashMap mBootclasspaths = new HashMap(); /** * HashMap utilis�e opur la r�flexion. */ private HashMap mMap; /** * Constructeur. * * @throws Exception exception lors de la configuration. * @see #createReflectionMap() * @see #getConfigurationFromXML(String) */ public JCompilingConfiguration() throws Exception { createReflectionMap(); getConfigurationFromXML( CompilingMessages.getString( "configuration.file" ) ); } /** * Cette m�thode lance le parsing du fichier de configuration XML. * * @param pFile chemin du fichier de configuration � parser. * @throws Exception exception en cas d'erreur de parsing. */ private void getConfigurationFromXML( final String pFile ) throws Exception { LOGGER.trace( CompilingMessages.getString( "logs.task.entering_method" ) ); boolean isNull = false; /* on r�cup�re le noeud racine */ Node root = ConfigUtility.getRootNode( pFile, CompilingMessages.getString( "configuration.root" ) ); /* s'il n'est pas nul */ if ( null != root ) { /* on r�cup�re le noeud relatif la compilation JAVA */ Node myNode = ConfigUtility.getNodeByTagName( root, CompilingMessages.getString( "configuration.java" ) ); /* s'il n'est pas nul */ if ( null != myNode ) { /* * on r�cup�re le noeud relatif � la configuration g�n�rale pour la compilation JAVA */ myNode = ConfigUtility.getNodeByTagName( myNode, CompilingMessages.getString( "configuration.java.general" ) ); /* r�cup�ration des s�parateurs */ getSeparatorsFromXML( myNode ); /* r�cup�ration des classpath des APIs Java */ getBootclasspathsFromXML( myNode ); /* * cr�ation d'une liste des autres noeuds contenant les infos de config g�n�rale */ ArrayList nodes = new ArrayList(); /* version par d�faut du JDK */ nodes.add( CompilingMessages.getString( "configuration.java.general.default_jdk_version" ) ); /* r�pertoire de stockage des classes compil�es */ nodes.add( CompilingMessages.getString( "configuration.java.general.dest_dir" ) ); /* m�moire requise pour la compilation */ nodes.add( CompilingMessages.getString( "configuration.java.general.required_memory" ) ); /* r�pertoire contenant le bundle eclipse de l'utilisateur */ nodes.add( CompilingMessages.getString( "configuration.java.general.eclipse_bundle_path" ) ); /* r�pertoire contenant les librairies export�es dans le cas de la compilation RCP */ nodes.add( CompilingMessages.getString( "configuration.java.general.exported_libs_path" ) ); /* r�cup�ration des autres noeuds de la config g�n�rale */ getGeneralFromXML( myNode, nodes ); } else { /* noeud rencontr� nul / n'existe pas */ isNull = true; } myNode = null; } else { /* noeud rencontr� nul / n'existe pas */ isNull = true; } /* si le noeud rencontr� est nul / n'existe pas */ if ( isNull ) { /* on lance l'exception en rapport */ throw new Exception( CompilingMessages.getString( "exception.xml.node_not_found" ) ); } root = null; } /** * Cette m�thode r�cup�re les valeurs de fichier de configuration relatives � la configuration g�n�rale de la t�che, * et les attribue par r�flexion. * * @param pNode noeud racine. * @param pChildNodeNames noeud fils � parcourir. * @throws Exception exception lors du traitement. */ private void getGeneralFromXML( final Node pNode, final ArrayList pChildNodeNames ) throws Exception { LOGGER.trace( CompilingMessages.getString( "logs.task.entering_method" ) ); /* * instanciation des variables pour la boucle qui va suivre. */ Node myNode; String pChildNodeName; /* it�rateur sur les noms de noeuds */ Iterator it = pChildNodeNames.iterator(); /* si l'it�rateur n'est pas nul */ if ( null != it ) { /* tant qu'il a des �l�ments */ while ( it.hasNext() ) { /* nom du noeud fils courant */ pChildNodeName = (String) it.next(); /* noeud enfant */ myNode = ConfigUtility.getNodeByTagName( pNode, pChildNodeName ); /* si le noeud contient une valeur */ if ( null != myNode && Node.ELEMENT_NODE == myNode.getNodeType() ) { mapKeyValue( pChildNodeName, myNode.getFirstChild().getNodeValue().trim() ); /* sinon */ } else { /* on lance l'exception en rapport */ throw new Exception( CompilingMessages.getString( "exception.xml.node_not_found" ) ); } } } myNode = null; } /** * R�cup�re les classpaths vers les APIs Java * * @param pNode le noeud * @throws Exception si erreur */ private void getBootclasspathsFromXML( final Node pNode ) throws Exception { /* noeud racine contenant les classpaths */ Node myNode = ConfigUtility.getNodeByTagName( pNode, CompilingMessages.getString( "configuration.java.general.bootclasspaths" ) ); boolean throwException = false; // not null and element type if ( null != myNode && Node.ELEMENT_NODE == myNode.getNodeType() ) { // We get the first child node myNode = ConfigUtility.getNodeByTagName( myNode, CompilingMessages.getString( "configuration.java.general.bootclasspaths.bootclasspath" ) ); // If node exists if ( null != myNode ) { NamedNodeMap attrMap = null; String javaVersion = null; /* tant qu'il y a des noeuds */ while ( null != myNode ) { if ( Node.ELEMENT_NODE == myNode.getNodeType() ) { /* on r�cup�re les attributs du noeud */ attrMap = myNode.getAttributes(); /* attribut "version" */ javaVersion = ( attrMap.getNamedItem( CompilingMessages.getString( "configuration.java.general.bootclasspaths.bootclasspath.version" ) ) ).getNodeValue().trim(); // We will get all children nodes getBootClasspathLibsFromXML( myNode, javaVersion ); } /* on it�re */ myNode = myNode.getNextSibling(); } attrMap = null; javaVersion = null; /* erreur rencontr�e --> exception � lancer */ } else { throwException = true; } /* erreur rencontr�e --> exception � lancer */ } else { throwException = true; } myNode = null; /* erreur rencontr�e */ if ( throwException ) { /* exception lanc�e */ throw new Exception( CompilingMessages.getString( "exception.xml.node_not_found" ) ); } } /** * Add bootclasspath lib to the bootclasspath map with javaVersion key * * @param pNode root node containing all lib tag definitions * @param javaVersion java dialect * @throws Exception if error */ private void getBootClasspathLibsFromXML( Node pNode, String javaVersion ) throws Exception { boolean throwException = false; Node node = pNode; // not null and element type if ( null != node && Node.ELEMENT_NODE == node.getNodeType() ) { // We get the first child node node = ConfigUtility.getNodeByTagName( node, CompilingMessages.getString( "configuration.java.general.bootclasspaths.bootclasspath.lib" ) ); // If node exists if ( null != node ) { NamedNodeMap attrMap = null; String attrPath = null; /* While there are nodes */ while ( null != node ) { if ( Node.ELEMENT_NODE == node.getNodeType() ) { /* on r�cup�re les attributs du noeud */ attrMap = node.getAttributes(); /* "path" attribute */ attrPath = ( attrMap.getNamedItem( CompilingMessages.getString( "configuration.java.general.bootclasspaths.bootclasspath.lib.path" ) ) ).getNodeValue().trim(); // We invoke add method ( (Method) ( mMap.get( CompilingMessages.getString( "configuration.java.general.bootclasspaths.bootclasspath" ) ) ) ).invoke( this, new String[] { javaVersion, attrPath } ); } /* on it�re */ node = node.getNextSibling(); } attrMap = null; attrPath = null; /* have error --> launch exception */ } else { throwException = true; } /* have erreor --> launch exception */ } else { throwException = true; } node = null; /* have error */ if ( throwException ) { /* launched exception */ throw new Exception( CompilingMessages.getString( "exception.xml.node_not_found" ) ); } } /** * Cette m�thode r�cup�re le valeur des cl�s n�cessaires pour parser le fichier de classpath. * * @param pNode noeud XML � parser. * @throws Exception exception en cas d'erreur lors du parsing. * @see #mapKeyValue(String, String) */ private void getSeparatorsFromXML( final Node pNode ) throws Exception { LOGGER.trace( CompilingMessages.getString( "logs.task.entering_method" ) ); /* noeud racine contenant les s�parateurs */ Node myNode = ConfigUtility.getNodeByTagName( pNode, CompilingMessages.getString( "configuration.java.general.separators" ) ); boolean throwException = false; /* noeud non nul et de type ELEMENT */ if ( null != myNode && Node.ELEMENT_NODE == myNode.getNodeType() ) { /* on r�cup�re le 1er noeud fils */ myNode = ConfigUtility.getNodeByTagName( myNode, CompilingMessages.getString( "configuration.java.general.separators.separator" ) ); /* si ce noeud existe */ if ( null != myNode ) { NamedNodeMap attrMap = null; String attrValue = null, attrName = null; /* tant qu'il y a des noeuds */ while ( null != myNode ) { if ( Node.ELEMENT_NODE == myNode.getNodeType() ) { /* on r�cup�re les attributs du noeud */ attrMap = myNode.getAttributes(); /* attribut "cl�" */ attrName = ( attrMap.getNamedItem( CompilingMessages.getString( "configuration.java.general.separators.separator.name" ) ) ).getNodeValue().trim(); /* attribut "valeur" */ attrValue = ( attrMap.getNamedItem( CompilingMessages.getString( "configuration.java.general.separators.separator.value" ) ) ).getNodeValue().trim(); /* on mappe les cl�s / valeurs -> r�flexion. */ mapKeyValue( attrName, attrValue ); } /* on it�re */ myNode = myNode.getNextSibling(); } attrMap = null; attrName = null; attrValue = null; /* erreur rencontr�e --> exception � lancer */ } else { throwException = true; } /* erreur rencontr�e --> exception � lancer */ } else { throwException = true; } myNode = null; /* erreur rencontr�e */ if ( throwException ) { /* exception lanc�e */ throw new Exception( CompilingMessages.getString( "exception.xml.node_not_found" ) ); } } /** * Cette m�thode assure la r�flexion. * * @param pKey cl� dans la hashMap. * @param pValue valeur. * @throws Exception exception de r�flexion. */ private void mapKeyValue( final String pKey, final String pValue ) throws Exception { /* * on invoque le setter correspondant � la cl� attrName, en lui passant la valeur attrValue */ Object[] obj = { pValue }; ( (Method) ( mMap.get( pKey ) ) ).invoke( this, obj ); } /** * Cette m�thode cr�e une map contenant des cl�s associ�es � des m�thodes de type setter. <br /> * En proc�dant ainsi, on pourra facilement affecter une valeur � une variable par r�flexion. * * @throws Exception exception de r�flexion. * @see #mapKeyValue(String, String) */ private void createReflectionMap() throws Exception { LOGGER.trace( CompilingMessages.getString( "logs.task.entering_method" ) ); /* * tableau contenant la classe du param�tre � passer � chaque setter. ici, java.lang.String. */ Class[] param = { String.class }; mMap = new HashMap(); /* Version par d�faut du JDK � utiliser. */ mMap.put( CompilingMessages.getString( "configuration.java.general.default_jdk_version" ), this.getClass().getMethod( "setJDKDefaultVersion", param ) ); /* R�pertoire cible pour stocker les classes compil�es. */ mMap.put( CompilingMessages.getString( "configuration.java.general.dest_dir" ), this.getClass().getMethod( "setDestDir", param ) ); /* M�moire requise pour la compilation. */ mMap.put( CompilingMessages.getString( "configuration.java.general.required_memory" ), this.getClass().getMethod( "setRequiredMemory", param ) ); /* S�parateur du classpath. */ mMap.put( CompilingMessages.getString( "configuration.java.general.separators.separator.name.classpath" ), this.getClass().getMethod( "setClasspathSeparator", param ) ); /* R�pertoire cible du bundle eclipse. */ mMap.put( CompilingMessages.getString( "configuration.java.general.eclipse_bundle_path" ), this.getClass().getMethod( "setEclipseBundleDir", param ) ); /* R�pertoire cible des librairies export�es qu'il faut d�zipp�es pour la compilation RCP. */ mMap.put( CompilingMessages.getString( "configuration.java.general.exported_libs_path" ), this.getClass().getMethod( "setExportedLibsDir", param ) ); /* Les chemins vers les classpath des APIs java */ mMap.put( CompilingMessages.getString( "configuration.java.general.bootclasspaths.bootclasspath" ), this.getClass().getMethod( "addBootclasspath", new Class[] { String.class, String.class } ) ); } /** * Getter. * * @return Version par d�faut du JDK � utiliser. */ public String getJDKDefaultVersion() { return mJDKDefaultVersion; } /** * Setter. * * @param pJDKDefaultVersion Version par d�faut du JDK � utiliser. */ public void setJDKDefaultVersion( String pJDKDefaultVersion ) { mJDKDefaultVersion = pJDKDefaultVersion; } /** * Getter. * * @return le s�parateur du classpath. */ public String getClasspathSeparator() { return mClasspathSeparator; } /** * Setter. * * @param pClasspathSeparator le s�parateur du classpath. */ public void setClasspathSeparator( String pClasspathSeparator ) { mClasspathSeparator = pClasspathSeparator; } /** * Getter. * * @return le r�pertoire cible de stockage des classes compil�es. */ public String getDestDir() { return mDestDir; } /** * Setter. * * @param pDestDir le r�pertoire cible de stockage des classes compil�es. */ public void setDestDir( String pDestDir ) { mDestDir = pDestDir; } /** * Getter. * * @return la m�moire requise pour la compilation */ public String getRequiredMemory() { return mRequiredMemory; } /** * Setter. * * @param pRequiredMemory la m�moire requise pour la compilation */ public void setRequiredMemory( String pRequiredMemory ) { mRequiredMemory = pRequiredMemory; } /** * @return le r�pertoire cible pour copier ou extraire le bundle eclipse. */ public String getEclipseBundleDir() { return mEclipseBundleDir; } /** * @param pEclipseBundleDir le r�pertoire cible pour copier ou extraire le bundle eclipse. */ public void setEclipseBundleDir( String pEclipseBundleDir ) { mEclipseBundleDir = ConfigUtility.filterStringWithSystemProps( pEclipseBundleDir ); } /** * @return le r�pertoire des libraries export�es */ public File getExportedLibsDir() { return mExportedLibsDir; } /** * @param pExportedLibsDir le r�pertoire des libraries export�es */ public void setExportedLibsDir( String pExportedLibsDir ) { mExportedLibsDir = new File( ConfigUtility.filterStringWithSystemProps( pExportedLibsDir ) ); } /** * @param pDialect la version java sous la forme 1.4, 1.3,... * @return les chemins vers les libs jre de l'api java de la version java pDialect */ public List getBootclasspath( String pDialect ) { return (List) mBootclasspaths.get( pDialect ); } /** * Ajoute une entr�e pour l'option -booclasspath de javac * * @param pDialect le dialect java qui sert de cl� * @param pPath le chemin vers une librairie de l'API sun de version pDialect */ public void addBootclasspath( String pDialect, String pPath ) { ArrayList libs = (ArrayList) mBootclasspaths.get( pDialect ); if ( libs == null ) { libs = new ArrayList(); } libs.add( ConfigUtility.filterStringWithSystemProps( pPath ) ); mBootclasspaths.put( pDialect, libs ); } }