001package org.apache.tapestry5.internal.services.ajax;
002
003import org.apache.tapestry5.ClientBodyElement;
004import org.apache.tapestry5.MarkupWriter;
005import org.apache.tapestry5.internal.services.PageRenderQueue;
006import org.apache.tapestry5.ioc.internal.util.InternalUtils;
007import org.apache.tapestry5.ioc.services.TypeCoercer;
008import org.apache.tapestry5.json.JSONObject;
009import org.apache.tapestry5.runtime.RenderCommand;
010import org.apache.tapestry5.services.PartialMarkupRenderer;
011import org.apache.tapestry5.services.PartialMarkupRendererFilter;
012import org.apache.tapestry5.services.ajax.AjaxResponseRenderer;
013import org.apache.tapestry5.services.ajax.JSONCallback;
014import org.apache.tapestry5.services.ajax.JavaScriptCallback;
015import org.apache.tapestry5.services.javascript.JavaScriptSupport;
016
017
018public class AjaxResponseRendererImpl implements AjaxResponseRenderer
019{
020    private final PageRenderQueue queue;
021
022    private final AjaxFormUpdateController ajaxFormUpdateController;
023
024    private final TypeCoercer typeCoercer;
025
026    private final JavaScriptSupport javaScriptSupport;
027
028    public AjaxResponseRendererImpl(PageRenderQueue queue, AjaxFormUpdateController ajaxFormUpdateController, TypeCoercer typeCoercer, JavaScriptSupport javaScriptSupport)
029    {
030        this.queue = queue;
031        this.ajaxFormUpdateController = ajaxFormUpdateController;
032        this.typeCoercer = typeCoercer;
033        this.javaScriptSupport = javaScriptSupport;
034    }
035
036    public AjaxResponseRenderer addRender(String clientId, Object renderer)
037    {
038        assert InternalUtils.isNonBlank(clientId);
039        assert renderer != null;
040
041        RenderCommand command = typeCoercer.coerce(renderer, RenderCommand.class);
042
043        addFilter(new SingleZonePartialRendererFilter(clientId, command, queue, ajaxFormUpdateController));
044
045        return this;
046    }
047
048    public AjaxResponseRenderer addRender(ClientBodyElement zone)
049    {
050        assert zone != null;
051
052        addRender(zone.getClientId(), zone.getBody());
053
054        return this;
055    }
056
057    public AjaxResponseRenderer addCallback(final JavaScriptCallback callback)
058    {
059        assert callback != null;
060
061        addFilter(new PartialMarkupRendererFilter()
062        {
063            public void renderMarkup(MarkupWriter writer, JSONObject reply, PartialMarkupRenderer renderer)
064            {
065                callback.run(javaScriptSupport);
066
067                renderer.renderMarkup(writer, reply);
068            }
069        });
070
071        return this;
072    }
073
074    public AjaxResponseRenderer addCallback(final Runnable callback)
075    {
076        assert callback != null;
077
078        addFilter(new PartialMarkupRendererFilter()
079        {
080            public void renderMarkup(MarkupWriter writer, JSONObject reply, PartialMarkupRenderer renderer)
081            {
082                callback.run();
083
084                renderer.renderMarkup(writer, reply);
085            }
086        });
087
088
089        return this;
090    }
091
092    public AjaxResponseRenderer addFilter(PartialMarkupRendererFilter filter)
093    {
094        assert filter != null;
095
096        queue.addPartialMarkupRendererFilter(filter);
097
098        return this;
099    }
100
101    public AjaxResponseRenderer addCallback(final JSONCallback callback)
102    {
103        assert callback != null;
104
105        addFilter(new PartialMarkupRendererFilter()
106        {
107            public void renderMarkup(MarkupWriter writer, JSONObject reply, PartialMarkupRenderer renderer)
108            {
109                callback.run(reply);
110
111                renderer.renderMarkup(writer, reply);
112            }
113        });
114
115        return this;
116    }
117}