/** * 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\\configurationmanager\\ConfigUtility.java package org.squale.squalix.configurationmanager; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.squale.squalix.messages.Messages; /** * Cette classe fournit des m�thodes "utilitaires" utilisables par les t�ches pour manipuler des fichiers XML de * configuration de mani�re standard. * * @author m400842 (by rose) * @version 1.0 */ public final class ConfigUtility { /** * Logger */ private static final Log LOGGER = LogFactory.getLog( ConfigUtility.class ); /** * Default private constructor */ private ConfigUtility() { } /** * This method parses the given String to replace any "${...}"-like variable by the corresponding system property. * If no property is found, then the variable is left as is. * * @param originalString the string to filter * @return the filtered String */ public static String filterStringWithSystemProps( String originalString ) { String result = originalString; // Defines a "${...}"-like variable Pattern pattern = Pattern.compile( "\\$\\{(\\w||\\.)*\\}" ); Matcher matcher = pattern.matcher( result ); // try to find occurrences int searchIndex = 0; while ( matcher.find( searchIndex ) ) { String propVar = matcher.group(); // retrieve the name of the variable String propName = matcher.group().substring( 2, propVar.length() - 1 ); // and try to retrieve its value String propValue = System.getProperty( propName ); if ( propValue != null ) { // need to quote the string to prevent "\" to be removed result = matcher.replaceFirst( Matcher.quoteReplacement( propValue ) ); searchIndex = matcher.start() + propValue.length(); } else { // do nothing but increase the search index searchIndex = matcher.end(); } // keep on analyzing the string for other matches matcher = pattern.matcher( result ); } return result; } /** * Retourne l'�l�ment racine du document XML de configuration. * * @param pFile Fichier de configuration * @param pName Nom de la racine. * @return Le noeud racine. * @throws Exception si un probl�me appara�t. * @roseuid 42C925800210 */ public static Node getRootNode( final String pFile, final String pName ) throws Exception { LOGGER.debug( Messages.getString( "log.configuration.getRootNode" ) ); DocumentBuilderFactory dbc = DocumentBuilderFactory.newInstance(); Node root = null; DocumentBuilder db = dbc.newDocumentBuilder(); // On va utiliser de pr�f�rence un InputStream issu du classpath, InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream( pFile ); if ( null == is ) { // mais si celui-ci n'exista pas, alors on le r�cup�re du fichier pass� en param�tre is = new FileInputStream( pFile ); } Document doc = db.parse( is ); NodeList nl = doc.getChildNodes(); // A partir de la liste des noeuds enfants du document, on va rechercher // celui qui poss�de le nom attendu Node node = null; for ( int i = 0; i < nl.getLength() && null == root; i++ ) { node = nl.item( i ); if ( node.getNodeType() == Node.ELEMENT_NODE && node.getNodeName().equalsIgnoreCase( pName ) ) { // Le noeud doit �tre un �l�ment, et son nom doit correspondre � celui recherch� root = node; } } return root; } /** * Filtre une liste de noeuds DOM, en ne gardant que les noeuds du type pass� en param�tre. Le type est celui * d�finit par la classe <code>Node</code>. * * @param pList liste de noeud � filtrer. * @param pType type des �l�ments � garder. * @return la liste filtr�e. * @roseuid 42C92580021F */ public static Collection filterList( NodeList pList, short pType ) { LOGGER.debug( Messages.getString( "log.configuration.filterList" ) ); Collection coll = new ArrayList(); Node node = null; for ( int i = 0; i < pList.getLength(); i++ ) { node = pList.item( i ); if ( node.getNodeType() == pType ) { coll.add( node ); } } return coll; } /** * V�rifie que le fichier sp�cifi� existe et est lisible. * * @param pFile le fichier � v�rifier. * @return la validit� du fichier. * @roseuid 42C9258001E1 */ public static boolean checkFile( String pFile ) { LOGGER.debug( Messages.getString( "log.configuration.checkFile" ) + pFile ); File f = new File( pFile ); return ( f.exists() && f.isFile() && f.canRead() ); } /** * Retourne un �l�ment directement enfant avec le nom d�sir�, ou null si celui-ci n'existe pas.<br /> Si plusieurs * �l�ments enfants portent le m�me nom, seul le premier est renvoy�. * * @param pParent Le noeud parent. * @param pName Le nom de l'�l�ment recherch�, insensible � la casse. * @return l'�l�ment trouv� ou null si non trouv�. * @roseuid 42C92580024E */ public static Node getNodeByTagName( Node pParent, String pName ) { LOGGER.debug( Messages.getString( "log.configuration.getNodeByTagName" ) ); Collection coll = filterList( pParent.getChildNodes(), Node.ELEMENT_NODE ); Iterator it = coll.iterator(); Node node = null; Node result; while ( it.hasNext() && null == node ) { result = (Node) it.next(); if ( result.getNodeName().equalsIgnoreCase( pName ) ) { node = result; } } return node; } /** * Retourne la valeur de l'attribut pName de l'�l�ment pParent, ou null s'il n'est pas trouv� ou si le parent n'est * pas un �l�ment valide. * * @param pParent El�ment parent de l'attribut. * @param pName Nom de l'attribut, insensible � la casse. * @return la valeur de l'attribut * @roseuid 42C92580028D */ public static String getAttributeValueByName( Node pParent, String pName ) { LOGGER.debug( Messages.getString( "log.configuration.getAttributeValueByName" ) ); String value = null; if ( pParent.getNodeType() == Node.ELEMENT_NODE ) { Node node = pParent.getAttributes().getNamedItem( pName ); if ( null != node ) { value = node.getNodeValue(); } } return value; } }