package org.skyscreamer.yoga.mapper;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.skyscreamer.yoga.listener.RenderingEvent;
import org.skyscreamer.yoga.listener.RenderingEventType;
import org.skyscreamer.yoga.listener.RenderingListener;
import org.skyscreamer.yoga.model.ListHierarchicalModel;
import org.skyscreamer.yoga.model.MapHierarchicalModel;
import org.skyscreamer.yoga.selector.Selector;
import org.skyscreamer.yoga.selector.SelectorResolver;
import org.skyscreamer.yoga.selector.parser.SelectorParser;
public class YogaRequestContext
{
private final String urlSuffix;
private final SelectorResolver selectorResolver;
private final HttpServletRequest request;
private final HttpServletResponse response;
private final Map<String, Object> properties = new HashMap<String, Object>();
private final Collection<RenderingListener> listeners;
public YogaRequestContext( String urlSuffix, SelectorResolver resolver, HttpServletRequest request,
HttpServletResponse response, RenderingListener... listeners )
{
this( urlSuffix, resolver, request, response, Arrays.asList( listeners ) );
}
public YogaRequestContext( String urlSuffix, SelectorResolver resolver, HttpServletRequest request,
HttpServletResponse response, Collection<RenderingListener> listeners )
{
this.urlSuffix = urlSuffix;
this.selectorResolver = resolver;
this.request = request;
this.response = response;
this.listeners = listeners;
}
public String getUrlSuffix()
{
return urlSuffix;
}
public SelectorParser getSelectorParser()
{
return this.selectorResolver.getSelectorParser();
}
public HttpServletRequest getRequest()
{
return request;
}
public HttpServletResponse getResponse()
{
return response;
}
public void setProperty( String key, Object value )
{
properties.put( key, value );
}
public Object getProperty( String key )
{
return properties.get( key );
}
public <T> void emitEvent( RenderingEvent<T> event ) throws IOException
{
if (listeners == null)
{
return;
}
for (RenderingListener renderingListener : listeners)
{
renderingListener.eventOccurred( event );
}
}
public <T> void emitEvent(MapHierarchicalModel<?> model, T value,
Class<T> type, YogaRequestContext context, Selector selector)
throws IOException
{
emitEvent(new RenderingEvent<T>(RenderingEventType.POJO_CHILD, model,
value, type, context, selector));
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public void emitEvent(ListHierarchicalModel<?> model, Iterable<?> iterable,
YogaRequestContext context, Selector selector) throws IOException
{
emitEvent(new RenderingEvent(RenderingEventType.LIST_CHILD, model,
iterable, iterable.getClass(), context, selector));
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public void emitEvent(MapHierarchicalModel<?> model, Map<?,?> value,
YogaRequestContext context, Selector selector) throws IOException
{
emitEvent(new RenderingEvent(RenderingEventType.MAP_CHILD, model,
value, Map.class, context, selector));
}
public Selector getSelector()
{
return this.selectorResolver.getSelector( request );
}
}