/******************************************************************************* * Copyright (c) 2004, 2005 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.internal.provisional.HTMLCMProperties; import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion; 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.eclipse.wst.xml.core.internal.provisional.document.IDOMNode; 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(new ErrorInfoImpl(ErrorState.INVALID_CONTENT_ERROR, errorSeg, target)); break; // If one prohibited ancestor is found, it's enough. } parent = SMUtil.getParentElement(parent); } } }