/*******************************************************************************
 * Copyright (c) 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
 *******************************************************************************/
package org.eclipse.wst.html.core.internal.validate;



import org.eclipse.wst.html.core.HTMLCMProperties;
import org.eclipse.wst.sse.core.IndexedRegion;
import org.eclipse.wst.xml.core.document.IDOMNode;
import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
import org.w3c.dom.Element;

public class HTMLElementAncestorValidator extends PrimeValidator {

	/**
	 * HTMLElementAncestorValidator constructor comment.
	 */
	public HTMLElementAncestorValidator() {
		super();
	}

	/**
	 * Allowing the INodeAdapter to compare itself against the type
	 * allows it to return true in more than one case.
	 */
	public boolean isAdapterForType(Object type) {
		return ((type == HTMLElementAncestorValidator.class) || super.isAdapterForType(type));
	}

	/**
	 * Check exclusion which is defined in only HTML DTD (SGML).
	 */
	public void validate(IndexedRegion node) {
		Element target = (Element) node;
		if (CMUtil.isForeign(target))
			return;
		CMElementDeclaration dec = CMUtil.getDeclaration(target);
		if (dec == null)
			return; // cannot validate.
		if (!CMUtil.isHTML(dec))
			return; // no need to validate
		if (!dec.supports(HTMLCMProperties.PROHIBITED_ANCESTORS))
			return; // cannot validate.
		CMNamedNodeMap prohibited = (CMNamedNodeMap) dec.getProperty(HTMLCMProperties.PROHIBITED_ANCESTORS);
		if (prohibited.getLength() <= 0)
			return; // no prohibited ancestors.

		Element parent = SMUtil.getParentElement(target);
		while (parent != null) {
			CMNode pdec = prohibited.getNamedItem(parent.getNodeName());
			if (pdec != null) { // prohibited element is found in ancestors.
				Segment errorSeg = FMUtil.getSegment((IDOMNode) node, FMUtil.SEG_START_TAG);
				if (errorSeg != null)
					reporter.report(MessageFactory.createMessage(new ErrorInfoImpl(ErrorState.INVALID_CONTENT_ERROR, errorSeg, target)));
				break; // If one prohibited ancestor is found, it's enough.
			}
			parent = SMUtil.getParentElement(parent);
		}
	}
}