/************************************************************************
 *
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
 * 
 * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
 * 
 * Use is subject to license terms.
 * 
 * Licensed 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. You can also
 * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
 * 
 * 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 org.odftoolkit.odfdom.pkg.rdfa;

import javax.xml.stream.XMLEventFactory;
import javax.xml.stream.XMLOutputFactory;

import org.odftoolkit.odfdom.dom.element.text.TextBookmarkStartElement;
import org.w3c.dom.Node;

/**
 * A RDFa parser for DOM
 * 
 */
public class DOMRDFaParser extends RDFaParser {

	public static DOMRDFaParser createInstance(JenaSink sink) {
		sink.getExtractor().setForSAX(false);
		return new DOMRDFaParser(sink, XMLOutputFactory.newInstance(),
				XMLEventFactory.newInstance(), sink.getExtractor());
	}

	public DOMRDFaParser(JenaSink sink, XMLOutputFactory outputFactory,
			XMLEventFactory eventFactory, URIExtractor extractor) {
		super(sink, outputFactory, eventFactory, extractor);

	}

	/**
	 * Parse the RDFa in-content metadata of the node.
	 * 
	 * @param node
	 */
	public void parse(Node node) {
		process(node);
	}

	private void process(Node node) {

		switch (node.getNodeType()) {
		case Node.ELEMENT_NODE:
			if (!(node instanceof TextBookmarkStartElement)) {
				sink.setContextNode(node);
			}
			// Start element
			beginRDFaElement(node.getNamespaceURI(), node.getLocalName(),
					node.getNodeName(), new DOMAttributes(node.getAttributes()));
			// Recurse to child
//			if (node.hasChildNodes() == true) {
//				process(node.getFirstChild());
//			}
			if (node.hasChildNodes() == true) {
				Node n = node.getFirstChild();
				process(n);
				while (n.getNextSibling()!=null){
					process(n.getNextSibling());
					n= n.getNextSibling();
				}
			}

			// End element
			endRDFaElement(node.getNamespaceURI(), node.getLocalName(),
					node.getNodeName());
			break;
		case Node.CDATA_SECTION_NODE:
		case Node.TEXT_NODE:
			// Text or CDATA
			writeCharacters(node.getNodeValue());
			break;
		}

	}
}
