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>(); traverse(element, null, acceptedElements); return acceptedElements; } private void traverse(DocearXmlElement element, XmlPath path, Collection<DocearXmlElement> acceptedElements) { 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()) { traverse(child, new XmlPath(path, child.getName()+"["+count+"]"), acceptedElements); count++; } } else { for(DocearXmlElement child : element.getChildren()) { XmlPath nPath = new XmlPath(path, child.getName()+"["+count+"]"); if(acceptElement(child, nPath)) { acceptedElements.add(child); } traverse(child, nPath, acceptedElements); count++; } } } }