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 }