net.sf.ehcache.config.generator.model.AbstractDepthFirstVisitor Maven / Gradle / Ivy
/**
* Copyright 2003-2010 Terracotta, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.sf.ehcache.config.generator.model;
import java.util.List;
/**
*
* Implementation of {@link NodeElementVisitor} that does a depth-first traversal of the element. Depth first means the visit starts at the
* element and goes deeper and deeper in each child element until there are no children and then backtracks, doing the same thing for each
* children in each child element.
* This class is an abstract class and provides empty methods that sub-classes can override as needed. The visit methods in this class are
* called in this order for each element visited by this visitor:
*
* - {@link #startElement(NodeElement)}
* - {@link #startAttributes(NodeElement)}
* - {@link #visitAttributes(NodeElement, List)}
* - {@link #endAttributes(NodeElement)}
* - {@link #visitElement(NodeElement)}
* - {@link #startChildren(NodeElement)}
* - same sequence for each child element
* - {@link #endChildren(NodeElement)}
* - {@link #endElement(NodeElement)}
*
*
* @author Abhishek Sanoujam
*
*/
public abstract class AbstractDepthFirstVisitor implements NodeElementVisitor {
/**
* {@inheritDoc}
*/
public void visit(NodeElement element) {
if (element == null) {
throw new NullPointerException("element cannot be null");
}
doDfs(element);
}
private void doDfs(NodeElement element) {
startElement(element);
startAttributes(element);
visitAttributes(element, element.getAttributes());
endAttributes(element);
visitElement(element);
startChildren(element);
for (NodeElement child : element.getChildElements()) {
doDfs(child);
}
endChildren(element);
endElement(element);
}
/**
* Starts visiting an element. Override as needed
*
* @param element
* the element
*/
protected void startElement(NodeElement element) {
// override if needed
}
/**
* Starts visiting the attributes of the element. Override as needed
*
* @param element
* the element
*/
protected void startAttributes(NodeElement element) {
// override if needed
}
/**
* Visits the attributes of the element. Override as needed
*
* @param element
* the element
* @param attributes
* the attributes
*/
protected void visitAttributes(NodeElement element, List attributes) {
// override if needed
}
/**
* Finish visiting attributes of the element. Override as needed
*
* @param element
* the element
*/
protected void endAttributes(NodeElement element) {
// override if needed
}
/**
* Visits the element. Override as needed
*
* @param element
* the element
*/
protected void visitElement(NodeElement element) {
// override if needed
}
/**
* Starts visiting children of the element. Override as needed
*
* @param element
* the element
*/
protected void startChildren(NodeElement element) {
// override if needed
}
/**
* Finish visiting children of the element. Override as needed
*
* @param element
* the element
*/
protected void endChildren(NodeElement element) {
// override if needed
}
/**
* Finish visiting the element. Override as needed
*
* @param element
* the element
*/
protected void endElement(NodeElement element) {
// override if needed
}
}