    001    package org.apache.tapestry5.internal.services.ajax;
    002
    003    import org.apache.tapestry5.ClientBodyElement;
    004    import org.apache.tapestry5.MarkupWriter;
    005    import org.apache.tapestry5.internal.services.PageRenderQueue;
    006    import org.apache.tapestry5.ioc.internal.util.InternalUtils;
    007    import org.apache.tapestry5.ioc.services.TypeCoercer;
    008    import org.apache.tapestry5.json.JSONObject;
    009    import org.apache.tapestry5.runtime.RenderCommand;
    010    import org.apache.tapestry5.services.PartialMarkupRenderer;
    011    import org.apache.tapestry5.services.PartialMarkupRendererFilter;
    012    import org.apache.tapestry5.services.ajax.AjaxResponseRenderer;
    013    import org.apache.tapestry5.services.ajax.JSONCallback;
    014    import org.apache.tapestry5.services.ajax.JavaScriptCallback;
    015    import org.apache.tapestry5.services.javascript.JavaScriptSupport;
    016
    017
    018    public 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    }