/*******************************************************************************
 * Copyright (c) 2001, 2004 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *     Jens Lukowski/Innoopract - initial renaming/restructuring
 *     
 *******************************************************************************/
package org.eclipse.jst.jsp.ui.tests.other;

import java.io.PrintStream;

import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;


public class DebugDocument {

	public static void dump(Document document) {
		if (document == null)
			return;
		System.out.println("Dump of DOM"); //$NON-NLS-1$

		dump(document, System.out);

		//
		System.out.println();
		System.out.println("= = = = = ="); //$NON-NLS-1$
		System.out.println();

	}

	public static void dump(Document document, PrintStream out) {
		Node node = document.getFirstChild();
		while (node != null) {
			dump(node, out);
			node = node.getNextSibling();
		}

	}

	public static void dump(Node topNode) {
		dump(topNode, System.out);
	}

	public static void dump(Node topNode, PrintStream out) {
		if (topNode == null)
			return;
		// print out this node
		//
		printNode(topNode, out);

		// now print out its children
		//NodeList nodes = topNode.getChildNodes();
		//int len = nodes.getLength();
		//for (int i = 0; i < len; i++) {

		//Node node = nodes.item(i);
		//dump(node, out);
		//}
	}

	public static void printNode(Node topNode) {
		printNode(topNode, System.out);

	}

	public static void printNode(Node topNode, PrintStream out) {
		// print out this node
		//
		IStructuredDocumentRegion firstStructuredDocumentRegion = ((IDOMNode) topNode).getFirstStructuredDocumentRegion();
		IStructuredDocumentRegion lastStructuredDocumentRegion = ((IDOMNode) topNode).getLastStructuredDocumentRegion();
		if ((firstStructuredDocumentRegion == null) || (lastStructuredDocumentRegion == null)) {
			// no text to output
		} else {
			int start = firstStructuredDocumentRegion.getStart();
			int end = lastStructuredDocumentRegion.getEnd();

			String outString = topNode.toString();
			outString = org.eclipse.wst.sse.core.utils.StringUtils.escape(outString);
			out.println("[" + start + ", " + end + "]" + outString); //$NON-NLS-3$//$NON-NLS-2$//$NON-NLS-1$
		}
		// now do its children
		NodeList nodes = topNode.getChildNodes();
		int len = nodes.getLength();
		for (int i = 0; i < len; i++) {
			Node childNode = nodes.item(i);
			printNode(childNode, out);
		}

	}

	public DebugDocument() {
		super();
	}

}
