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/>. */ /* * Cr le 26 juil. 05, par M400832. */ package org.squale.squalix.tools.compiling.java.parser.wsad; import java.lang.reflect.Method; import java.util.HashMap; 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; import org.squale.squalix.tools.compiling.java.parser.configuration.JParserConfiguration; /** * Cette classe permet de rcuprer la configuration relative au parser de fichiers de classpath pour les projets WSAD * 5.x. * * @author m400832 * @version 2.1 */ public class JWSADParserConfiguration extends JParserConfiguration { /** * Logger. */ private static final Log LOGGER = LogFactory.getLog(JWSADParserConfiguration.class); /** * Balise classpath. */ private String mClasspathAnchor = ""; /** * Balise classpathentry. */ private String mClasspathentry = ""; /** * Attribut kind. */ private String mKind = ""; /** * Attribut path. */ private String mPath = ""; /** * Attribut exported. */ private String mExported = ""; /** * Valeur "src" pour l'attribut kind. */ private String mSrc = ""; /** * Valeur "lib" pour l'attribut kind. */ private String mLib = ""; /** * Valeur "var" pour l'attribut kind. */ private String mVar = ""; /** * Valeur "con" pour l'attribut kind. */ private String mCon = ""; /** * HashMap utilise pour la rflexion. */ protected HashMap mMap = null; /** indique le type des projets (RSA, WSAD,...) */ protected String projectType; /** * Constructeur. * * @throws Exception exception en cas d'erreur lors de la configuration. */ public JWSADParserConfiguration() throws Exception { super(); 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")); /* si le noeud n'est pas nul */ if (null != root) { /* on rcupre le noeud concernant la compilation JAVA */ Node myNode = ConfigUtility.getNodeByTagName(root, CompilingMessages.getString("configuration.java")); /* si le noeud n'est pas nul */ if (null != myNode) { /* on rcupre le noeud concernant le parsing JAVA */ myNode = ConfigUtility.getNodeByTagName(myNode, CompilingMessages.getString("configuration.java.parsing")); /* si le noeud n'est pas nul */ if (null != myNode) { /* * on rcupre le noeud concernant le parsing pour des projets JAVA dvelopps sous WSAD 4.x et 5.x */ myNode = ConfigUtility.getNodeByTagName(myNode, CompilingMessages.getString("configuration.java.parsing.wsad")); /* * on appelle diffrentes mthodes pour rcuprer les donnes */ getFilenameFromXML(myNode); /* * on rcupre les valeurs de configuration des noms des cls. */ getTagsFromXML(myNode, CompilingMessages.getString("configuration.java.parsing.wsad.keys"), CompilingMessages.getString("configuration.java.parsing.wsad.keys.key"), CompilingMessages.getString("configuration.java.parsing.wsad.keys.key.name"), CompilingMessages.getString("configuration.java.parsing.wsad.keys.key.value")); /* * on rcupre les valeurs de configuration des valeurs des cls. */ getTagsFromXML(myNode, CompilingMessages.getString("configuration.java.parsing.wsad.values"), CompilingMessages.getString("configuration.java.parsing.wsad.values.value"), CompilingMessages.getString("configuration.java.parsing.wsad.values.value.name"), CompilingMessages.getString("configuration.java.parsing.wsad.values.value.value")); } else { /* noeud non trouv */ isNull = true; } } else { /* noeud non trouv */ isNull = true; } /* mnage */ myNode = null; } else { /* noeud non trouv */ isNull = true; } /* si un noeud n'a pas t trouv */ if (isNull) { /* on lance une nouvelle exception */ throw new Exception(CompilingMessages.getString("exception.xml.node_not_found")); } /* mnage */ root = null; } /** * Cette mthode rcupre le nom du fichier de classpath parser. * * @param pNode Noeud XML parser. * @throws Exception exception en cas d'erreur de parsing. */ private void getFilenameFromXML(Node pNode) throws Exception { /* * on rcupre le noeud contenant le nom du fichier contenant le classpath du projet WSAD */ Node myNode = ConfigUtility.getNodeByTagName(pNode, CompilingMessages.getString("configuration.java.parsing.wsad.filename")); /* si le noeud n'est pas nul, et est de type ELEMENT */ if (null != myNode && Node.ELEMENT_NODE == myNode.getNodeType()) { setFilename(myNode.getFirstChild().getNodeValue().trim()); /* sinon, il y a un problme concernant ce noeud */ } else { /* on lance une nouvelle exception */ throw new Exception(CompilingMessages.getString("exception.xml.node_not_found")); } myNode = null; } /** * Cette mthode rcupre le nom des cls ncessaires pour parser le fichier de classpath. * * @param pNode noeud XML parser. * @param pRootAnchor noeud racine. * @param pChildAnchor noeud fils. * @param pChildName attribut "name" du noeud fils. * @param pChildValue attribut "value" du noeud fils. * @throws Exception exception en cas d'erreur lors du parsing. * @see #mapKeyValues(String, String) */ private void getTagsFromXML(final Node pNode, final String pRootAnchor, final String pChildAnchor, final String pChildName, final String pChildValue) throws Exception { LOGGER.trace(CompilingMessages.getString("logs.task.entering_method")); /* on rcupre le noeud racine contenant les cls */ Node myNode = ConfigUtility.getNodeByTagName(pNode, pRootAnchor); boolean throwException = false; /* si le noeud est bien trouv */ if (null != myNode && Node.ELEMENT_NODE == myNode.getNodeType()) { /* on rcupre le premier noeud fils */ myNode = ConfigUtility.getNodeByTagName(myNode, pChildAnchor); if (null != myNode) { /* * on initialise des variables pour la boucle qui va suivre */ NamedNodeMap attrMap = null; String attrValue = null, attrName = null; /* tant qu'il y a des noeuds */ while (null != myNode) { /* s'il est de type ELEMENT */ if (Node.ELEMENT_NODE == myNode.getNodeType()) { /* rcupration des attributs du noeud */ attrMap = myNode.getAttributes(); /* attribut "cl" */ attrName = (attrMap.getNamedItem(pChildName)).getNodeValue().trim(); /* attribut "valeur" */ attrValue = (attrMap.getNamedItem(pChildValue)).getNodeValue().trim(); /* on mappe les cls et les valeurs */ mapKeyValues(attrName, attrValue); } /* on itre sur les noeuds */ myNode = myNode.getNextSibling(); } /* mnage */ attrMap = null; attrName = null; attrValue = null; } else { /* noeud vide */ throwException = true; } } else { /* noeud vide */ throwException = true; } myNode = null; /* une erreur s'est produite : le noeud tait vide */ if (throwException) { /* on lance l'exception en rapport */ throw new Exception(CompilingMessages.getString("exception.xml.node_not_found")); } } /** * Cette mthode permet d'attribuer des attributs de classes des valeurs issues du fichier de configuration xml * <code>compiling- * config.xml</code>. On utilise la rflexion pour faire chuter les complexits cyclomatique, * cyclomatique essentielle, et d'intgration. * * @param pKeyName nom de la cl. * @param pKeyValue valeur de la cl. * @throws Exception exception si le nom de la cl ne fait pas parti des cls pralablement dfinies dans le fichier * de configuration <code>org.squale.squalix.tools.compiling.compiling.properties</code>. * @see #createReflectionMap() */ private void mapKeyValues(String pKeyName, String pKeyValue) throws Exception { LOGGER.trace(CompilingMessages.getString("logs.task.entering_method")); /* * on invoque le setter correspondant la cl pKeyName, en lui passant la valeur pKeyValue */ Object[] obj = { pKeyValue }; ((Method) (mMap.get(pKeyName))).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 #mapKeyValues(String, String) */ protected 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(); /* balise <classpath> */ mMap.put(CompilingMessages.getString("configuration.java.parsing.wsad.keys.key.name.classpath"), this.getClass().getMethod("setClasspathAnchor", param)); /* balise <classpathentry> */ mMap.put(CompilingMessages.getString("configuration.java.parsing.wsad.keys.key.name.classpathentry"), this.getClass().getMethod("setClasspathentry", param)); /* attribut "kind" pour la balise <classpathentry> */ mMap.put(CompilingMessages.getString("configuration.java.parsing.wsad.keys.key.name.kind"), this.getClass().getMethod("setKind", param)); /* attribut "path" pour la balise <classpathentry> */ mMap.put(CompilingMessages.getString("configuration.java.parsing.wsad.keys.key.name.path"), this.getClass().getMethod("setPath", param)); /* attribut "exported" pour la balise <classpathentry> */ mMap.put(CompilingMessages.getString("configuration.java.parsing.wsad.keys.key.name.exported"), this.getClass().getMethod("setExported", param)); /* * valeur "src" possible pour l'attribut "kind" pour la balise <classpathentry> */ mMap.put(CompilingMessages.getString("configuration.java.parsing.wsad.values.value.name.src"), this.getClass().getMethod("setSrc", param)); /* * valeur "lib" possible pour l'attribut "kind" pour la balise <classpathentry> */ mMap.put(CompilingMessages.getString("configuration.java.parsing.wsad.values.value.name.lib"), this.getClass().getMethod("setLib", param)); /* * valeur "var" possible pour l'attribut "kind" pour la balise <classpathentry> */ mMap.put(CompilingMessages.getString("configuration.java.parsing.wsad.values.value.name.var"), this.getClass().getMethod("setVar", param)); /* * valeur "con" possible pour l'attribut "kind" pour la balise <classpathentry> */ mMap.put(CompilingMessages.getString("configuration.java.parsing.wsad.values.value.name.con"), this.getClass().getMethod("setCon", param)); } /** * Getter. * * @return la valeur de la balise classpath. */ public String getClasspathAnchor() { return mClasspathAnchor; } /** * Getter. * * @return la valeur de la balise classpathentry. */ public String getClasspathentry() { return mClasspathentry; } /** * Getter. * * @return la valeur de l'attribut kind. */ public String getKind() { return mKind; } /** * Getter. * * @return la valeur de l'attribut path. */ public String getPath() { return mPath; } /** * Getter. * * @return Valeur "lib" pour l'attribut kind. */ public String getLib() { return mLib; } /** * Getter. * * @return Valeur "src" pour l'attribut kind. */ public String getSrc() { return mSrc; } /** * Getter. * * @return Valeur "var" pour l'attribut kind. */ public String getVar() { return mVar; } /** * @return la valeur "con" pour l'attribut kind. */ public String getCon() { return mCon; } /** * Setter. * * @param pLib Valeur "lib" pour l'attribut kind. */ public void setLib(String pLib) { mLib = pLib; } /** * @param pValue valeur "con" pour l'attribut kind. */ public void setCon(String pValue) { mCon = pValue; } /** * Setter. * * @param pVar Valeur "var" pour l'attribut kind. */ public void setVar(String pVar) { mVar = pVar; } /** * Setter. * * @param pSrc Valeur "src" pour l'attribut kind. */ public void setSrc(String pSrc) { mSrc = pSrc; } /** * Setter. * * @param pClasspathAnchor la valeur de la balise classpath. */ public void setClasspathAnchor(String pClasspathAnchor) { mClasspathAnchor = pClasspathAnchor; } /** * Setter. * * @param pClasspathentry la valeur de la balise classpathentry. */ public void setClasspathentry(String pClasspathentry) { mClasspathentry = pClasspathentry; } /** * Setter. * * @param pKind la valeur de l'attribut kind. */ public void setKind(String pKind) { mKind = pKind; } /** * Setter. * * @param pPath la valeur de l'attribut path. */ public void setPath(String pPath) { mPath = pPath; } /** * @return l'attribut exported */ public String getExported() { return mExported; } /** * @param pExported la valeur de l'attribut exported */ public void setExported(String pExported) { mExported = pExported; } }