uklance / tapestry-stitch

Sample components and concepts in Tapestry 5
MIT License
14 stars 7 forks source link

PDFLink DOM Rendering #3

Closed uklance closed 11 years ago

uklance commented 11 years ago

Currently the component is using the internal RenderQueueImpl class and also HeartBeatImpl. I think it should use PartialMarkupRenderer or PageRenderQueue or maybe MarkupRenderer.

MarkupWriter writer = markupWriterFactory.newMarkupWriter();
String pageName = componentResources.getPageName();
Page page = ...;
RenderCommand renderer = ...;
pageRenderQueue.addPartialRenderer(RenderCommand renderer)
pageRenderQueue.render(writer);
uklance commented 11 years ago

The solution ended up being:

final StringBuilder buffer = new StringBuilder();
String pageName = componentResources.getPageName();
Page page = pageSource.getPage(pageName);
pageRenderQueue.setRenderingPage(page);
pageRenderQueue.addPartialMarkupRendererFilter(new PartialMarkupRendererFilter() {
    public void renderMarkup(MarkupWriter writer, JSONObject reply, PartialMarkupRenderer renderer) {
        Element root = writer.element("partial");
        renderer.renderMarkup(writer, reply);
        writer.end();
        buffer.append(root.getChildMarkup().trim());
    }
});
pageRenderQueue.addPartialRenderer(renderCommand);
MarkupWriter markupWriter = markupWriterFactory.newMarkupWriter(new ContentType("text/xml"));
partialMarkupRenderer.renderMarkup(markupWriter, new JSONObject());
return buffer.toString();

This still uses some internal services but at least there are no Impls.

Internals:

import org.apache.tapestry5.internal.services.PageRenderQueue;
import org.apache.tapestry5.internal.services.PageSource;
import org.apache.tapestry5.internal.structure.Page;