org.squale.squalix.tools.compiling.java.configuration.JCompilingConfiguration.java Source code

Java tutorial

Introduction

Here is the source code for org.squale.squalix.tools.compiling.java.configuration.JCompilingConfiguration.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\\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);
    }

}