package org.docear.plugin.services.xml; import java.util.ArrayList; import java.util.Collection; import java.util.List; public abstract class Traverser { public enum TraversalMethod { BREADTH_FIRST, DEPTH_FIRST } private final TraversalMethod method; public Traverser(TraversalMethod method) { this.method = method; } abstract public boolean acceptElement(DocearXmlElement element, XmlPath path); public Collection<DocearXmlElement> traverse(DocearXmlElement element) { List<DocearXmlElement> acceptedElements = new ArrayList<DocearXmlElement>(); acceptedElements.addAll(traverse(element, null)); return acceptedElements; } private Collection<DocearXmlElement> traverse(DocearXmlElement element, XmlPath path) { List<DocearXmlElement> acceptedElements = new ArrayList<DocearXmlElement>(); int count = 0; if(this.method.equals(TraversalMethod.BREADTH_FIRST)) { for(DocearXmlElement child : element.getChildren()) { if(acceptElement(child, new XmlPath(path, child.getName()+"["+count+"]"))) { acceptedElements.add(child); } count++; } count = 0; for(DocearXmlElement child : element.getChildren()) { acceptedElements.addAll(traverse(child, new XmlPath(path, child.getName()+"["+count+"]"))); count++; } } else { for(DocearXmlElement child : element.getChildren()) { XmlPath nPath = new XmlPath(path, child.getName()+"["+count+"]"); if(acceptElement(child, nPath)) { acceptedElements.add(child); } acceptedElements.addAll(traverse(child, nPath)); count++; } } return acceptedElements; } }