package org.jboss.seam.ui.renderkit;
import java.io.IOException;
import java.io.StringWriter;
import java.util.Calendar;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import org.jboss.seam.log.LogProvider;
import org.jboss.seam.log.Logging;
import org.jboss.seam.ui.component.UICache;
import org.jboss.seam.ui.util.cdk.RendererBase;
public class CacheRendererBase extends RendererBase {
private static final LogProvider log = Logging.getLogProvider(UICache.class);
/**
* last time we logged the failure of the cache
*/
private static Calendar lastLog = null;
@Override
protected Class getComponentClass()
{
return UICache.class;
}
@Override
protected void doEncodeChildren(ResponseWriter writer, FacesContext context, UIComponent component) throws IOException
{
UICache cache = (UICache) component;
if (cache.isEnabled())
{
String key = cache.getKey();
String cachedContent = (String) cache.getCacheProvider().get(cache.getRegion(), key);
if (cachedContent == null)
{
log.debug("rendering from scratch: " + key);
StringWriter stringWriter = new StringWriter();
ResponseWriter cachingResponseWriter = writer.cloneWithWriter(stringWriter);
context.setResponseWriter(cachingResponseWriter);
renderChildren(context, component);
context.setResponseWriter(writer);
String output = stringWriter.getBuffer().toString();
writer.write(output);
cache.getCacheProvider().put(cache.getRegion(), key, output);
}
else
{
log.debug("rendering from cache: " + key);
writer.write(cachedContent);
}
}
else
{
renderChildren(context, component);
}
}
@Override
public boolean getRendersChildren()
{
return true;
}
}