/*
* JBoss, Home of Professional Open Source
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
package org.jboss.seam.wiki.core.ui;
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;
import org.jboss.seam.wiki.core.cache.PageFragmentCache;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import java.io.IOException;
import java.io.StringWriter;
/**
* Implementation of <tt><s:cache></tt> renderer based on EHCache.
*
* @author Christian Bauer
*/
public class WikiPageFragmentCacheRenderer extends RendererBase {
private static final LogProvider log = Logging.getLogProvider(UICache.class);
@Override
protected Class getComponentClass() {
return UICache.class;
}
@Override
public boolean getRendersChildren() {
return true;
}
@Override
protected void doEncodeChildren(ResponseWriter writer, FacesContext context, UIComponent component) throws IOException {
UICache cache = (UICache) component;
if (cache.isEnabled()) {
String region = cache.getRegion();
if (region == null) {
throw new RuntimeException("required region attribute missing on <s:cache>");
}
String key = cache.getKey();
if (key == null) {
throw new RuntimeException("required key attribute missing on <s:cache>");
}
log.debug("attempting to obtain from cache region '" + region +"' using key: " + key);
String cachedContent = PageFragmentCache.instance().get(region, 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);
log.debug("caching rendered content in region '" + region +"' using key: " + key);
PageFragmentCache.instance().put(region, key, output);
} else {
log.debug("rendering from cache: " + key);
writer.write(cachedContent);
}
} else {
log.debug("cached rendering is disabled for: " + cache.getKey());
renderChildren(context, component);
}
log.debug("rendering (including all children) complete");
}
}