/*******************************************************************************
 * Copyright (c) 2006, 2016 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
 *******************************************************************************/
package org.eclipse.help.internal.dynamic;

import org.eclipse.help.IContentExtension;
import org.eclipse.help.internal.Anchor;
import org.eclipse.help.internal.UAElement;
import org.eclipse.help.internal.UAElementFactory;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

/*
 * The handler responsible for processing content extensions (contributions
 * into anchors and element replacements).
 */
public class ExtensionHandler extends ProcessorHandler {

	private static final String ATTRIBUTE_ID = "id"; //$NON-NLS-1$

	private ExtensionResolver resolver;
	private DocumentReader reader;
	private String locale;

	/*
	 * This handler must know the locale since it's pulling content
	 * in from other documents.
	 */
	public ExtensionHandler(DocumentReader reader, String locale) {
		this.reader = reader;
		this.locale = locale;
	}

	@Override
	public short handle(UAElement element, String path) {
		if (element instanceof Anchor) {
			return handleExtension(element, path, IContentExtension.CONTRIBUTION);
		}
		if (element.getAttribute(ATTRIBUTE_ID) != null) {
			return handleExtension(element, path, IContentExtension.REPLACEMENT);
		}
		return UNHANDLED;
	}

	/*
	 * Handle the given extension-related node. It is either an anchor
	 * or an element with an id that could potentially be replaced.
	 */
	private short handleExtension(UAElement uaElement, String path, int type) {
		String id = uaElement.getAttribute(ATTRIBUTE_ID);
		if (id != null && id.length() > 0) {
			if (resolver == null) {
				resolver = new ExtensionResolver(getProcessor(), reader, locale);
			}
			// get the nodes to insert/replace with
			Node[] nodes = resolver.resolveExtension(path + '#' + id, type);
			if (nodes != null && nodes.length > 0) {
				Element domElement = uaElement.getElement();
				UAElement parent = uaElement.getParentElement();
				for (int i=0;i<nodes.length;++i) {
					if (nodes[i].getNodeType() == Node.ELEMENT_NODE) {
						// ensure elements are typed
						parent.insertBefore(UAElementFactory.newElement((Element)nodes[i]), uaElement);
					}
					else {
						// text nodes are not typed
						Node node = domElement.getOwnerDocument().importNode(nodes[i], true);
						parent.getElement().insertBefore(node, domElement);
					}
				}
				parent.removeChild(uaElement);
				return HANDLED_SKIP;
			}
		}
		// always remove anchors, even invalid ones
		if (type == IContentExtension.CONTRIBUTION) {
			uaElement.getParentElement().removeChild(uaElement);
			return HANDLED_SKIP;
		}
		// it was an element with id, but no replacements
		return UNHANDLED;
	}
}
