blob: b4c26b456124273fa2275dc06c031850c92f9527 [file] [log] [blame]
/*******************************************************************************
* 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.validate;
import org.eclipse.wst.common.contentmodel.CMElementDeclaration;
import org.eclipse.wst.common.contentmodel.CMNamedNodeMap;
import org.eclipse.wst.common.contentmodel.CMNode;
import org.eclipse.wst.html.core.HTMLCMProperties;
import org.eclipse.wst.sse.core.IndexedRegion;
import org.eclipse.wst.xml.core.document.XMLNode;
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((XMLNode) 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);
}
}
}