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\\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 rflexion. * * @author m400832 * @version 2.0 */ public class JCompilingConfiguration { /** * Logger. */ private static final Log LOGGER = LogFactory.getLog(JCompilingConfiguration.class); /** * Sparateur UNIX. */ public static final String UNIX_SEPARATOR = "/"; /** * Sparateur Windows. */ public static final String WINDOWS_SEPARATOR = "\\"; /** * Version par dfaut du JDK utiliser. */ private String mJDKDefaultVersion = ""; /** * Rpertoire cible pour stocker les classes compiles. */ private String mDestDir = ""; /** * Sparateur du classpath. */ private String mClasspathSeparator = ""; /** * Mmoire requise pour la compilation. */ private String mRequiredMemory = ""; /** * Rpertoire cible pour copier ou extraire le bundle eclipse. */ private String mEclipseBundleDir = ""; /** * Rpertoire cible pour extraire les libraries exportes 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 utilise opur la rflexion. */ 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 mthode 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 rcupre le noeud racine */ Node root = ConfigUtility.getRootNode(pFile, CompilingMessages.getString("configuration.root")); /* s'il n'est pas nul */ if (null != root) { /* on rcupre 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 rcupre le noeud relatif la configuration gnrale pour la compilation JAVA */ myNode = ConfigUtility.getNodeByTagName(myNode, CompilingMessages.getString("configuration.java.general")); /* rcupration des sparateurs */ getSeparatorsFromXML(myNode); /* rcupration des classpath des APIs Java */ getBootclasspathsFromXML(myNode); /* * cration d'une liste des autres noeuds contenant les infos de config gnrale */ ArrayList nodes = new ArrayList(); /* version par dfaut du JDK */ nodes.add(CompilingMessages.getString("configuration.java.general.default_jdk_version")); /* rpertoire de stockage des classes compiles */ nodes.add(CompilingMessages.getString("configuration.java.general.dest_dir")); /* mmoire requise pour la compilation */ nodes.add(CompilingMessages.getString("configuration.java.general.required_memory")); /* rpertoire contenant le bundle eclipse de l'utilisateur */ nodes.add(CompilingMessages.getString("configuration.java.general.eclipse_bundle_path")); /* rpertoire contenant les librairies exportes dans le cas de la compilation RCP */ nodes.add(CompilingMessages.getString("configuration.java.general.exported_libs_path")); /* rcupration des autres noeuds de la config gnrale */ 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 mthode rcupre les valeurs de fichier de configuration relatives la configuration gnrale de la tche, * et les attribue par rflexion. * * @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; /* itrateur sur les noms de noeuds */ Iterator it = pChildNodeNames.iterator(); /* si l'itrateur n'est pas nul */ if (null != it) { /* tant qu'il a des lments */ 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; } /** * Rcupre 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 rcupre 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 itre */ myNode = myNode.getNextSibling(); } attrMap = null; javaVersion = null; /* erreur rencontre --> exception lancer */ } else { throwException = true; } /* erreur rencontre --> exception lancer */ } else { throwException = true; } myNode = null; /* erreur rencontre */ if (throwException) { /* exception lance */ 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 rcupre 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 itre */ 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 mthode rcupre le valeur des cls ncessaires 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 sparateurs */ 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 rcupre 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 rcupre 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 cls / valeurs -> rflexion. */ mapKeyValue(attrName, attrValue); } /* on itre */ myNode = myNode.getNextSibling(); } attrMap = null; attrName = null; attrValue = null; /* erreur rencontre --> exception lancer */ } else { throwException = true; } /* erreur rencontre --> exception lancer */ } else { throwException = true; } myNode = null; /* erreur rencontre */ if (throwException) { /* exception lance */ throw new Exception(CompilingMessages.getString("exception.xml.node_not_found")); } } /** * Cette mthode assure la rflexion. * * @param pKey cl dans la hashMap. * @param pValue valeur. * @throws Exception exception de rflexion. */ 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 mthode cre une map contenant des cls associes des mthodes de type setter. <br /> * En procdant ainsi, on pourra facilement affecter une valeur une variable par rflexion. * * @throws Exception exception de rflexion. * @see #mapKeyValue(String, String) */ private void createReflectionMap() throws Exception { LOGGER.trace(CompilingMessages.getString("logs.task.entering_method")); /* * tableau contenant la classe du paramtre passer chaque setter. ici, java.lang.String. */ Class[] param = { String.class }; mMap = new HashMap(); /* Version par dfaut du JDK utiliser. */ mMap.put(CompilingMessages.getString("configuration.java.general.default_jdk_version"), this.getClass().getMethod("setJDKDefaultVersion", param)); /* Rpertoire cible pour stocker les classes compiles. */ mMap.put(CompilingMessages.getString("configuration.java.general.dest_dir"), this.getClass().getMethod("setDestDir", param)); /* Mmoire requise pour la compilation. */ mMap.put(CompilingMessages.getString("configuration.java.general.required_memory"), this.getClass().getMethod("setRequiredMemory", param)); /* Sparateur du classpath. */ mMap.put(CompilingMessages.getString("configuration.java.general.separators.separator.name.classpath"), this.getClass().getMethod("setClasspathSeparator", param)); /* Rpertoire cible du bundle eclipse. */ mMap.put(CompilingMessages.getString("configuration.java.general.eclipse_bundle_path"), this.getClass().getMethod("setEclipseBundleDir", param)); /* Rpertoire cible des librairies exportes qu'il faut dzippes 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 dfaut du JDK utiliser. */ public String getJDKDefaultVersion() { return mJDKDefaultVersion; } /** * Setter. * * @param pJDKDefaultVersion Version par dfaut du JDK utiliser. */ public void setJDKDefaultVersion(String pJDKDefaultVersion) { mJDKDefaultVersion = pJDKDefaultVersion; } /** * Getter. * * @return le sparateur du classpath. */ public String getClasspathSeparator() { return mClasspathSeparator; } /** * Setter. * * @param pClasspathSeparator le sparateur du classpath. */ public void setClasspathSeparator(String pClasspathSeparator) { mClasspathSeparator = pClasspathSeparator; } /** * Getter. * * @return le rpertoire cible de stockage des classes compiles. */ public String getDestDir() { return mDestDir; } /** * Setter. * * @param pDestDir le rpertoire cible de stockage des classes compiles. */ public void setDestDir(String pDestDir) { mDestDir = pDestDir; } /** * Getter. * * @return la mmoire requise pour la compilation */ public String getRequiredMemory() { return mRequiredMemory; } /** * Setter. * * @param pRequiredMemory la mmoire requise pour la compilation */ public void setRequiredMemory(String pRequiredMemory) { mRequiredMemory = pRequiredMemory; } /** * @return le rpertoire cible pour copier ou extraire le bundle eclipse. */ public String getEclipseBundleDir() { return mEclipseBundleDir; } /** * @param pEclipseBundleDir le rpertoire cible pour copier ou extraire le bundle eclipse. */ public void setEclipseBundleDir(String pEclipseBundleDir) { mEclipseBundleDir = ConfigUtility.filterStringWithSystemProps(pEclipseBundleDir); } /** * @return le rpertoire des libraries exportes */ public File getExportedLibsDir() { return mExportedLibsDir; } /** * @param pExportedLibsDir le rpertoire des libraries exportes */ 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 entre 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); } }