blob: aa2f78117bdc796299ec06f7873355d71605e686 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2007 Oracle 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:
* Oracle Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.jsf.validation.internal.appconfig;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.resources.IFile;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
/**
* Visits an app config DOM tree and calls validators based on the
* configured validator tree
*
* @author cbateman
*
*/
public abstract class NodeValidationVisitor
{
private final short _nodeType;
private final String _nodeName;
private final Map _attributeVisitors;
private final Map _elementVisitors;
/**
* Used to indicate no child nodes
*/
protected final static NodeValidationVisitor[] EMPTY_CHILDREN = new NodeValidationVisitor[0];
/**
* @param nodeType
* @param nodeName
*/
public NodeValidationVisitor(short nodeType, String nodeName)
{
_nodeType = nodeType;
_nodeName = nodeName;
_attributeVisitors = new HashMap();
_elementVisitors = new HashMap();
NodeValidationVisitor[] childVisitors = getChildNodeValidators();
for (int i = 0; i < childVisitors.length; i++)
{
final NodeValidationVisitor visitor = childVisitors[i];
switch(visitor.getNodeType())
{
case Node.ATTRIBUTE_NODE:
_attributeVisitors.put(visitor.getNodeName(), visitor);
break;
case Node.ELEMENT_NODE:
_elementVisitors.put(visitor.getNodeName(), visitor);
break;
}
}
}
/**
* @param node
* @param messages
* @param file
*/
public final void validate(Node node, List messages, IFile file)
{
doValidate(node, messages, file);
final NamedNodeMap attributes = node.getAttributes();
for (int i = 0; attributes != null && i < attributes.getLength(); i++)
{
final Node attr = attributes.item(i);
final NodeValidationVisitor visitor =
(NodeValidationVisitor) _attributeVisitors.get(attr.getNodeName());
if (visitor != null)
{
visitor.validate(attr, messages, file);
}
}
for (int i = 0; i < node.getChildNodes().getLength(); i++)
{
final Node child = node.getChildNodes().item(i);
final NodeValidationVisitor visitor =
(NodeValidationVisitor) _elementVisitors.get(child.getNodeName());
if (visitor != null)
{
visitor.validate(child, messages, file);
}
}
}
/**
* Do the validation for this visitor on this node. Add any Message's to
* the messages list
*
* @param node
* @param messages
* @param file
*/
protected abstract void doValidate(Node node, List messages, IFile file);
/**
* @return an array of visitors that validate children of the current node
*/
protected abstract NodeValidationVisitor[] getChildNodeValidators();
/**
* @return the node type for this validator
*/
protected short getNodeType()
{
return _nodeType;
}
/**
* @return the node name for this validator
*/
protected String getNodeName()
{
return _nodeName;
}
}