package fitnesse.responders.templateUtilities;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import org.apache.velocity.context.InternalContextAdapter;
import org.apache.velocity.exception.MethodInvocationException;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.apache.velocity.exception.TemplateInitException;
import org.apache.velocity.runtime.RuntimeServices;
import org.apache.velocity.runtime.directive.Directive;
import org.apache.velocity.runtime.log.Log;
import org.apache.velocity.runtime.parser.node.ASTBlock;
import org.apache.velocity.runtime.parser.node.Node;
import fitnesse.components.TraversalListener;
import fitnesse.components.Traverser;
import fitnesse.responders.search.ResultResponder;
import fitnesse.wiki.WikiPage;
public class TraverseDirective extends Directive implements TraversalListener<Object> {
private Log log;
private InternalContextAdapter context;
private Node node;
private Writer writer;
private Traverser traverser;
@Override
public String getName() {
return "traverse";
}
@Override
public int getType() {
return BLOCK;
}
@Override
public void init(RuntimeServices rs, InternalContextAdapter context, Node node) throws TemplateInitException {
super.init(rs, context, node);
log = rs.getLog();
}
public boolean render(InternalContextAdapter context, Writer writer, Node node)
throws IOException, ResourceNotFoundException, ParseErrorException, MethodInvocationException {
this.context = context;
this.writer = writer;
this.traverser = (Traverser) node.jjtGetChild(0).value(context);
this.node = node.jjtGetChild(1);
traverser.traverse(this);
return true;
}
@Override
public void process(Object page) {
context.put("result", page);
try {
node.render(context, writer);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}