/* * Copyright (c) 2002-2014, Mairie de Paris * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright notice * and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice * and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * 3. Neither the name of 'Mairie de Paris' nor 'Lutece' nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * License 1.0 */ package fr.paris.lutece.util.xml; import fr.paris.lutece.portal.service.util.AppPropertiesService; import java.io.StringWriter; import java.util.Map; import java.util.Map.Entry; import java.util.Properties; import javax.xml.transform.Result; import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.TransformerFactoryConfigurationError; import javax.xml.transform.stream.StreamResult; /** * This class provides utils for XML document management. */ public final class XmlUtil { public static final String PROPERTIES_XML_HEADER = "xml.header"; private static final String TAG_BEGIN = "<"; private static final String TAG_CLOSE_BEGIN = "</"; private static final String TAG_END = ">\r\n"; private static final String TAG_CLOSE_END = " />\r\n"; private static final String TAG_SEPARATOR = " "; private static final String TAG_ASSIGNMENT = "="; private static final String TAG_ENCLOSED = "\""; /** * Instantiates a new xml util. */ private XmlUtil( ) { } /** * Gets the header of an XML file * * @return The header */ public static String getXmlHeader( ) { String strXmlHeader = AppPropertiesService.getProperty( PROPERTIES_XML_HEADER ); return strXmlHeader; } /** * This method performs XSL Transformation. <br /> * <b>Deprecated use XmlTransformer.transform</b> * * @param source * The input XML document * @param stylesheet * The XSL stylesheet * @param params * parameters to apply to the XSL Stylesheet * @param outputProperties * properties to use for the xsl transform. Will overload the xsl output definition. * @return The output document transformed * @throws Exception * The exception */ @Deprecated public static String transform( Source source, Source stylesheet, Map<String, String> params, Properties outputProperties ) throws Exception { try { TransformerFactory factory = TransformerFactory.newInstance( ); Transformer transformer = factory.newTransformer( stylesheet ); if ( outputProperties != null ) { transformer.setOutputProperties( outputProperties ); } if ( params != null ) { transformer.clearParameters( ); for ( Entry<String, String> entry : params.entrySet( ) ) { String name = entry.getKey( ); String value = entry.getValue( ); transformer.setParameter( name, value ); } } StringWriter sw = new StringWriter( ); Result result = new StreamResult( sw ); transformer.transform( source, result ); return sw.toString( ); } catch( TransformerConfigurationException e ) { String strMessage = e.getMessage( ); if ( e.getLocationAsString( ) != null ) { strMessage += ( "- location : " + e.getLocationAsString( ) ); } throw new Exception( "Error transforming document XSLT : " + strMessage, e.getCause( ) ); } catch( TransformerFactoryConfigurationError e ) { throw new Exception( "Error transforming document XSLT : " + e.getMessage( ), e ); } catch( TransformerException e ) { String strMessage = e.getMessage( ); if ( e.getLocationAsString( ) != null ) { strMessage += ( "- location : " + e.getLocationAsString( ) ); } throw new Exception( "Error transforming document XSLT : " + strMessage, e.getCause( ) ); } catch( Exception e ) { throw new Exception( "Error transforming document XSLT : " + e.getMessage( ), e ); } } /** * Add an element to an XML document buffer * * @param strXmlBuffer * The XML document buffer * @param strTag * The tag name of the element to add * @param strValue * The value of the element */ public static void addElement( StringBuffer strXmlBuffer, String strTag, String strValue ) { strXmlBuffer.append( TAG_BEGIN ); strXmlBuffer.append( strTag ); strXmlBuffer.append( ">" ); strXmlBuffer.append( strValue ); strXmlBuffer.append( TAG_CLOSE_BEGIN ); strXmlBuffer.append( strTag ); strXmlBuffer.append( TAG_END ); } /** * Add an empty element (< />) to an XML document buffer. * * @param strXmlBuffer * The XML document buffer * @param strTag * The tag name of the element to add * @param attrList * The attributes list */ public static void addEmptyElement( StringBuffer strXmlBuffer, String strTag, Map<?, ?> attrList ) { strXmlBuffer.append( TAG_BEGIN ); strXmlBuffer.append( strTag ); if ( attrList != null ) { for ( Entry<?, ?> entry : attrList.entrySet( ) ) { String code = (String) entry.getKey( ); strXmlBuffer.append( TAG_SEPARATOR + code + TAG_ASSIGNMENT + TAG_ENCLOSED + entry.getValue( ) + TAG_ENCLOSED ); } } strXmlBuffer.append( TAG_CLOSE_END ); } /** * Add an element to an XML document buffer with attributes * * @param strXmlBuffer * The XML document buffer * @param strTag * The tag name of the element to add * @param strValue * The value of the element * @param attrList * the attribute list */ public static void addElement( StringBuffer strXmlBuffer, String strTag, String strValue, Map<?, ?> attrList ) { strXmlBuffer.append( TAG_BEGIN ); strXmlBuffer.append( strTag ); if ( attrList != null ) { for ( Entry<?, ?> entry : attrList.entrySet( ) ) { String code = (String) entry.getKey( ); strXmlBuffer.append( TAG_SEPARATOR + code + TAG_ASSIGNMENT + TAG_ENCLOSED + entry.getValue( ) + TAG_ENCLOSED ); } } strXmlBuffer.append( ">" ); strXmlBuffer.append( strValue ); strXmlBuffer.append( TAG_CLOSE_BEGIN ); strXmlBuffer.append( strTag ); strXmlBuffer.append( TAG_END ); } /** * Add an element to an XML document buffer. * * @param strXmlBuffer * The XML document buffer * @param strTag * The tag name of the element to add * @param nValue * The value of the element */ public static void addElement( StringBuffer strXmlBuffer, String strTag, int nValue ) { addElement( strXmlBuffer, strTag, String.valueOf( nValue ) ); } /** * Add a CDATA type element to XML document buffer. * * @param strXmlBuffer * The XML document buffer * @param strTag * The tag name of the element to add * @param strValue * The value of the element */ public static void addElementHtml( StringBuffer strXmlBuffer, String strTag, String strValue ) { strXmlBuffer.append( TAG_BEGIN ); strXmlBuffer.append( strTag ); strXmlBuffer.append( "><![CDATA[" ); strXmlBuffer.append( strValue ); strXmlBuffer.append( "]]></" ); strXmlBuffer.append( strTag ); strXmlBuffer.append( TAG_END ); } /** * Add a CDATA type element to XML document buffer. * * @param strXmlBuffer * The XML document buffer * @param strTag * The tag name of the element to add * @param strValue * The value of the element * @param attrList * The attributes list */ public static void addElementHtml( StringBuffer strXmlBuffer, String strTag, String strValue, Map<?, ?> attrList ) { strXmlBuffer.append( TAG_BEGIN ); strXmlBuffer.append( strTag ); if ( attrList != null ) { for ( Entry<?, ?> entry : attrList.entrySet( ) ) { String code = (String) entry.getKey( ); strXmlBuffer.append( TAG_SEPARATOR + code + TAG_ASSIGNMENT + TAG_ENCLOSED + entry.getValue( ) + TAG_ENCLOSED ); } } strXmlBuffer.append( "><![CDATA[" ); strXmlBuffer.append( strValue ); strXmlBuffer.append( "]]></" ); strXmlBuffer.append( strTag ); strXmlBuffer.append( TAG_END ); } /** * Add an opening tag for an element in a XML document buffer * * @param strXmlBuffer * The XML document buffer * @param strTag * The tag name of the element to add */ public static void beginElement( StringBuffer strXmlBuffer, String strTag ) { beginElement( strXmlBuffer, strTag, null ); } /** * Add an opening tag for an element in a XML document buffer * * @param strXmlBuffer * The XML document buffer * @param strTag * The tag name of the element to add * @param attrList * The attributes list */ public static void beginElement( StringBuffer strXmlBuffer, String strTag, Map<?, ?> attrList ) { strXmlBuffer.append( TAG_BEGIN ); strXmlBuffer.append( strTag ); if ( attrList != null ) { for ( Entry<?, ?> entry : attrList.entrySet( ) ) { String code = (String) entry.getKey( ); strXmlBuffer.append( TAG_SEPARATOR + code + TAG_ASSIGNMENT + TAG_ENCLOSED + entry.getValue( ) + TAG_ENCLOSED ); } } strXmlBuffer.append( TAG_END ); } /** * Add a closing tag for an element in a XML document buffer * * @param strXmlBuffer * The XML document buffer * @param strTag * The tag name of the element to add */ public static void endElement( StringBuffer strXmlBuffer, String strTag ) { strXmlBuffer.append( TAG_CLOSE_BEGIN ); strXmlBuffer.append( strTag ); strXmlBuffer.append( TAG_END ); } }