Skip to content

Instantly share code, notes, and snippets.

@dmitrygusev
Created April 7, 2013 17:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dmitrygusev/5331488 to your computer and use it in GitHub Desktop.
Save dmitrygusev/5331488 to your computer and use it in GitHub Desktop.
EventResponseRenderer
public interface EventResponseRenderer
{
String render(RenderEvent renderEvent);
}
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import org.apache.tapestry5.SymbolConstants;
import org.apache.tapestry5.internal.EmptyEventContext;
import org.apache.tapestry5.internal.services.RequestImpl;
import org.apache.tapestry5.internal.services.ResponseImpl;
import org.apache.tapestry5.internal.services.TapestrySessionFactory;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.ioc.annotations.Symbol;
import org.apache.tapestry5.services.Ajax;
import org.apache.tapestry5.services.ComponentEventRequestHandler;
import org.apache.tapestry5.services.ComponentEventRequestParameters;
import org.apache.tapestry5.services.RequestGlobals;
public class EventResponseRendererImpl implements EventResponseRenderer
{
@Ajax
@Inject private ComponentEventRequestHandler ajaxHandler;
@Inject private RequestGlobals requestGlobals;
@Symbol(SymbolConstants.CHARSET)
@Inject private String applicationCharset;
@Inject private TapestrySessionFactory sessionFactory;
@Override
public String render(RenderEvent renderEvent)
{
ByteArrayOutputStream out = new ByteArrayOutputStream();
final PrintWriter printWriter = new PrintWriter(out);
requestGlobals.storeRequestResponse(
new RequestImpl(requestGlobals.getHTTPServletRequest(), applicationCharset, sessionFactory),
new ResponseImpl(requestGlobals.getHTTPServletRequest(),
requestGlobals.getHTTPServletResponse())
{
@Override
public PrintWriter getPrintWriter(String contentType)
throws IOException
{
return printWriter;
}
});
try
{
ComponentEventRequestParameters parameters = new ComponentEventRequestParameters(
renderEvent.getPageName(),
renderEvent.getPageName(),
renderEvent.getNestedComponentId(),
RenderEvent.RENDER_EVENT_TYPE,
new EmptyEventContext(),
new RenderEventContext(renderEvent.getEventArgs()));
ajaxHandler.handle(parameters);
return new String(out.toByteArray(), applicationCharset);
}
catch (IOException e)
{
throw new RuntimeException(e);
}
}
}
public class RenderEvent
{
public static final String RENDER_EVENT_TYPE = "Render";
private String pageName;
private String nestedComponentId;
private Object[] eventArgs;
public RenderEvent(String pageName, String nestedComponentId, Object... eventArgs)
{
this.pageName = pageName;
this.nestedComponentId = nestedComponentId;
this.eventArgs = eventArgs;
}
public String getPageName()
{
return pageName;
}
public String getNestedComponentId()
{
return nestedComponentId;
}
public Object[] getEventArgs()
{
return eventArgs;
}
}
import org.apache.tapestry5.EventContext;
public class RenderEventContext implements EventContext
{
private Object[] args;
public RenderEventContext(Object... args)
{
this.args = args != null ? args : new Object[0];
}
@Override
public int getCount()
{
return args.length;
}
@SuppressWarnings("unchecked")
@Override
public <T> T get(Class<T> desiredType, int index)
{
if (!desiredType.isAssignableFrom(args[index].getClass()))
{
throw new IllegalArgumentException("Argument at index "
+ index + " expected to be of class "
+ desiredType.getName() + ", but was "
+ args[index].getClass());
}
return (T) args[index];
}
@Override
public String[] toStrings()
{
// Not used
return null;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment