/*
 * $Id: VKCXMLUtils.java,v 1.5 2004/11/10 15:02:47 koppy Exp $
 *
 * Copyright (c) Siemens AG 2008 
 *           (c) Universität Paderborn 2008 
 * Licensed under EUPL 1.1. 
 *
 * $Log: VKCXMLUtils.java,v $
 * Revision 1.5  2004/11/10 15:02:47  koppy
 * Projektweite Überarbeitung von Error-Logs, Stacktraces,..
 *
 * Revision 1.4  2004/06/24 23:33:32  marbobo
 * Quellcode maintenance
 *
 * Revision 1.3  2004/03/13 19:15:10  marbobo
 * Unbenutze lokale Variablen projektweit entsorgt
 *
 * Revision 1.2  2003/12/24 10:11:59  bigmac
 * Projektweite Import-Optimierung
 *
 * Revision 1.1  2003/06/23 23:21:11  marbobo
 * vom alten vkc wieder reingestellt
 *
 * Revision 1.3  2001/08/02 13:58:02  bigmac
 * Compilerfehler unter jdk1.4 behoben
 *
 * Revision 1.2  2001/07/30 12:08:36  bigmac
 * xmlEnocde() ueberarbeitet und isValidXmlString() eingefuegt
 *
 */

package vkc.util;

import java.io.ByteArrayInputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.xml.sax.SAXParseException;

import vkc.misc.VKCLogManager;

/**
 * Klasse stellt Hilfsmethoden für die Verarbeitung und
 * Konvertierung von XML- bzw. nicht-XML Strings bereit
 * <p>
 * @author bigmac
 * @version 1.0
 */

public class VKCXMLUtils
{
	private static DocumentBuilderFactory builderFactory = null;
	private static DocumentBuilder  documentBuilder = null;

	static
	{
	try
	{
		builderFactory = DocumentBuilderFactory.newInstance();
		builderFactory.setValidating( false );
		documentBuilder = builderFactory.newDocumentBuilder();
	}
	catch(Exception ex)
	{
	    VKCLogManager.errorLog(VKCXMLUtils.class, "", ex.getMessage(), ex);
	}
	}

	/**
	 * Konvertiert XML Sonderzeichen in einem String in XML-konforme Zeichenketten.
	 * <p>
	 * @author bigmac
	 * @param s - beliebiger String
	 * @return xml-konformer String
	 */

	public static String xmlEncode(String s)
	{
	if (s==null || s.length()==0)
		return ("");

	int length = s.length();

	StringBuffer sb = new StringBuffer( length );
	char c;

	for ( int i=0; i<length ; i++)
	{
		c = s.charAt(i);

		if ( c=='&' ) {
		sb.append("&amp;");
		continue;
		}
	    
		if ( c=='>' ) {
		sb.append("&gt;");
		continue;
		}

		if ( c=='<' ) {
		sb.append("&lt;");
		continue;
		}

		if ( c=='\'' ) {
		sb.append("&apos;");
		continue;
		}

		if ( c=='\"' ) {
		sb.append("&quot;");
		continue;
		}

		sb.append(c);
	}
	return ( sb.toString() );
	}

	/**
	 * Konvertiert XML Sonderzeichen in einem StringBuffer in XML-konforme Zeichenketten.
	 * <p>
	 * @author bigmac
	 * @param s - StringBuffer
	 * @return StringBuffer aus xml-konformen Zeichen
	 */

	public static StringBuffer xmlEncode(StringBuffer s)
	{
	if (s==null)
		return ( null);

	int length = s.length();

	StringBuffer sb = new StringBuffer( length );
	char c;

	for ( int i=0; i<length ; i++)
	{
		c = s.charAt(i);

		if ( c=='&' ) {
		sb.append("&amp;");
		continue;
		}
	    
		if ( c=='>' ) {
		sb.append("&gt;");
		continue;
		}

		if ( c=='<' ) {
		sb.append("&lt;");
		continue;
		}

		if ( c=='\'' ) {
		sb.append("&apos;");
		continue;
		}

		if ( c=='\"' ) {
		sb.append("&quot;");
		continue;
		}

		sb.append(c);
	}
	return ( sb );
	}

	/**
	 * Gegenstück zu xmlEncode()
	 * <p>
	 * @author bigmac
	 */
    
	public static String xmlDecode(String input)
	{
		try
		{
			if (input == null)
				return "";

			if (input.indexOf("&amp;") >= 0)
				input = VKCStringUtils.replaceToken(input, "&amp;", "&");

			if (input.indexOf("&gt;") >= 0)
				input = VKCStringUtils.replaceToken(input, "&gt;", ">");

			if (input.indexOf("&lt;") >= 0)
				input = VKCStringUtils.replaceToken(input, "&lt;", "<");

			if (input.indexOf("&apos;") >= 0)
				input = VKCStringUtils.replaceToken(input, "&apos;", "\'");

			if (input.indexOf("&quot;") >= 0)
				input = VKCStringUtils.replaceToken(input, "&quot;", "\"");

			return(input);
		}
		catch (Exception e)
		{
			VKCLogManager.errorLog(VKCXMLUtils.class, "", e.getMessage(), e);
			return("");
		}
	}

	/**
	 * Überprüft, ob ein String nur XML-konforme Zeichen enthält.
	 * <p>
	 * @author bigmac
	 * @param s - der zu testende String
	 * @return true, falls der String XML-konform ist. false, sonst.
	 */

	public static boolean isValidXmlString(String s) throws SAXParseException
	{
	try
	{
		ByteArrayInputStream byteIS = new ByteArrayInputStream( s.getBytes("ISO-8859-1") );
		documentBuilder.parse( byteIS );
		byteIS.close();
	}
	catch(SAXParseException se)
	{
		throw se;
	}
	catch(Exception ex)
	{
	    VKCLogManager.errorLog(VKCXMLUtils.class, "", ex.getMessage(), ex);
		return(false);
	}
	return(true);
	}
    
	/**
	 * Überprüft, ob ein StringBuffer nur XML-konforme Zeichen enthält.
	 * <p>
	 * @author bigmac
	 * @param sb - der zu testende StringBuffer
	 * @return true, falls der StringBuffer XML-konform ist. false, sonst.
	 */

	public static boolean isValidXmlStringBuffer(StringBuffer sb) throws SAXParseException
	{
	try
	{
		ByteArrayInputStream byteIS = new ByteArrayInputStream( sb.toString().getBytes("ISO-8859-1") );
		documentBuilder.parse( byteIS );
		byteIS.close();
	}
	catch(SAXParseException se)
	{
		throw se;
	}
	catch(Exception ex)
	{
	    VKCLogManager.errorLog(VKCXMLUtils.class, "", ex.getMessage(), ex);
		return(false);
	}
	return(true);
	}
}