public void execute(Visitor visitor) { // simulated call stack Stack stack = new Stack(); // visit from bottom to top for (int i = 0; i < bindings.size(); i++) { Binding binding = (Binding) bindings.get(i); if (binding.getExecutionMode() == Binding.AFTER) { // put on stack to execute after parent stack.push(binding); continue; } // execute the strategy visitor.visit(binding); } // unwind the call stack while (!stack.isEmpty()) { Binding binding = (Binding) stack.pop(); visitor.visit(binding); } } }
public static void walk( Object object, BindingWalker bindingWalker, XSDFeature component, Visitor visitor, XSDTypeDefinition container, MutablePicoContainer context) { // do not test simple bindings as they are often mismatched and rely on converters if (object instanceof ComplexAttribute) { MismatchedBindingFinder finder = new MismatchedBindingFinder(object); bindingWalker.walk(component, finder, container, context); if (finder.foundMismatchedBinding()) { // if a mismatched binding is found, just visit xs:anyType binding visitor.visit(bindingWalker.getAnyTypeBinding()); return; } } bindingWalker.walk(component, visitor, container, context); } }