/**
 * Copyright 2010 JBoss Inc
 *
 * 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
 *
 * 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.eclipse.webdav.internal.kernel;

import java.util.Enumeration;
import org.eclipse.webdav.dom.QualifiedName;
import org.eclipse.webdav.internal.kernel.utils.Assert;
import org.w3c.dom.*;

public class ElementHelper implements WebDAVConstants {

	// This W3C Document is the factory for Nodes
	// produced by this class.
	protected Document nodeFactory;

	protected final static String DAV_PREFIX = "D"; //$NON-NLS-1$
	protected final static String NS_SEPARATOR = ":"; //$NON-NLS-1$
	protected final static String DAV_NS_ATTRIB = "xmlns" + NS_SEPARATOR + DAV_PREFIX; //$NON-NLS-1$

	public ElementHelper() {
		super();
		IDocumentFactory factory = new DocumentFactory();
		this.nodeFactory = factory.newDocument();
	}

	public String extractText(Element element) {
		NodeList childNodes = element.getChildNodes();
		Assert.isTrue(childNodes.getLength() == 1, Policy.bind("error.requireElementWithSingleChild")); //$NON-NLS-1$
		Node child = childNodes.item(0);
		Assert.isTrue(child instanceof Text, Policy.bind("error.extractFromElementWithoutText")); //$NON-NLS-1$
		return ((Text) child).getData();
	}

	public Element newDAVElement(QualifiedName name) {
		Assert.isTrue(name.getQualifier().equals(DAV_URI), Policy.bind("error.davElementsNeedQualifier")); //$NON-NLS-1$
		Element element = nodeFactory.createElement(DAV_PREFIX + NS_SEPARATOR + name.getLocalName());
		element.setAttribute(DAV_NS_ATTRIB, DAV_URI);
		return element;
	}

	/**
	 * Answer a DOM <code>Element</code> that represents a set of <code>String</code>.
	 * <p>
	 * The set is represented by a single <code>Element</code> whose name is
	 * given as the <code>setName</code> argument.  Each member of the set is
	 * a child <code>Element</code> named <code>memberName</code> that has
	 * text taken from the <code>memberEnum</code> an <code>Enumeration</code>
	 * of <code>String</code>.
	 */
	public Element newDAVElementSet(QualifiedName setName, QualifiedName memberName, Enumeration memberEnum) {
		Element setElement = newDAVElement(setName);
		while (memberEnum.hasMoreElements()) {
			String member = (String) memberEnum.nextElement();
			Element memberElement = newDAVTextElement(memberName, member);
			setElement.appendChild(memberElement);
		}
		return setElement;
	}

	public Element newDAVProperty(QualifiedName name, String value) {
		Element element = newDAVElement(name);
		element.appendChild(nodeFactory.createTextNode(value));
		return element;
	}

	public Element newDAVProperty(QualifiedName name, Element value) {
		Element element = newDAVElement(name);
		element.appendChild(value);
		return element;
	}

	public Element newDAVTextElement(QualifiedName name, String value) {
		Element element = newDAVElement(name);
		element.appendChild(nodeFactory.createTextNode(value));
		return element;
	}

	public Element newTextElement(String name, String value) {
		Element element = nodeFactory.createElement(name);
		element.appendChild(nodeFactory.createTextNode(value));
		return element;
	}
}
