/**************************************************************
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 *************************************************************/



package com.sun.star.xml.security.uno;

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

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.Text;
import org.w3c.dom.ProcessingInstruction;

/* uno classes */
import com.sun.star.xml.sax.XDocumentHandler;
import com.sun.star.xml.sax.XAttributeList;

/*
 * this class is used to collect all received SAX events
 * into a DOM document.
 */
class SAXEventCollector implements XDocumentHandler
{
	/*
	 * the document which keeps received SAX events
	 */
	private Document m_document;

	/*
	 * the current Element to which the next received
	 * SAX event will be added.
	 */
	private Node m_currentElement;

	/*
	 * the TestTool which receives UI feedbacks
	 */
	private TestTool m_testTool;

	/*
	 * whether displays information on console.
	 */
	private boolean m_systemDisplay;

	SAXEventCollector(TestTool testTool)
	{
		this(testTool, false);
	}

	SAXEventCollector(TestTool testTool, boolean sysDis)
	{
		m_systemDisplay = sysDis;
		m_testTool = testTool;

		DocumentBuilderFactory factory =
			DocumentBuilderFactory.newInstance();

		try
		{
			DocumentBuilder builder = factory.newDocumentBuilder();
			m_document = builder.newDocument();

			m_currentElement = m_document;
		}
		catch (ParserConfigurationException pce) {
			pce.printStackTrace();
		}
	}

	protected Document getDocument()
	{
		return m_document;
	}

	protected Node getCurrentElement()
	{
		return m_currentElement;
	}

        /*
         * XDocumentHandler
         */
	public void  startDocument ()
	{
	}

	public void endDocument()
	{
	}

	public void startElement (String str, com.sun.star.xml.sax.XAttributeList xattribs)
	{
		Element newElement = m_document.createElement(str);

		if (xattribs !=null)
		{
			int length = xattribs.getLength();
			for (short i=0; i<length; ++i)
			{
				newElement.setAttribute(
					xattribs.getNameByIndex(i),
					xattribs.getValueByIndex(i));
			}
		}

		if (m_systemDisplay)
		{
			System.out.println("startElement:"+m_currentElement.toString());
		}

		m_currentElement.appendChild(newElement);
		m_currentElement = newElement;

		if (m_testTool != null)
		{
			m_testTool.updatesUIs();
		}
	}

	public void endElement(String str)
	{
		if (m_systemDisplay)
		{
			System.out.println("endElement:"+str+" "+m_currentElement.toString());
		}

        	m_currentElement = m_currentElement.getParentNode();
		if (m_systemDisplay)
		{
			System.out.println("----> "+m_currentElement.toString());
		}

		if (m_testTool != null)
		{
			m_testTool.updatesUIs();
		}
	}

	public void characters(String str)
	{
        	Text newText = m_document.createTextNode(str);
        	m_currentElement.appendChild(newText);
		if (m_testTool != null)
		{
			m_testTool.updatesUIs();
		}
	}

	public void ignorableWhitespace(String str)
	{
	}

	public void processingInstruction(String aTarget, String aData)
	{
		ProcessingInstruction newPI
			= m_document.createProcessingInstruction(aTarget, aData);
		m_currentElement.appendChild(newPI);
		if (m_testTool != null)
		{
			m_testTool.updatesUIs();
		}
	}

	public void setDocumentLocator (com.sun.star.xml.sax.XLocator xLocator )
		throws com.sun.star.xml.sax.SAXException
	{
	}
}
