package org.jboss.seam.wiki.core.ui; import com.sun.facelets.FaceletViewHandler; import com.sun.facelets.util.DevTools; import javax.el.ELException; import javax.faces.FacesException; import javax.faces.application.ViewHandler; import javax.faces.context.ExternalContext; import javax.faces.context.FacesContext; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.Writer; /** * @author Christian Bauer */ public class WikiFaceletViewHandler extends FaceletViewHandler { protected boolean developmentMode; // Private in superclass, hurray! public WikiFaceletViewHandler(ViewHandler viewHandler) { super(viewHandler); } @Override protected void initialize(FacesContext context) { super.initialize(context); ExternalContext external = context.getExternalContext(); String param = external.getInitParameter(PARAM_DEVELOPMENT); this.developmentMode = "true".equals(param); } @Override protected void handleRenderException(FacesContext context, Exception e) throws IOException, ELException, FacesException { Object resp = context.getExternalContext().getResponse(); /* This is what we don't like: log and rethrow! Makes Facelets nasty in production use... // always log if (log.isLoggable(Level.SEVERE)) { UIViewRoot root = context.getViewRoot(); StringBuffer sb = new StringBuffer(64); sb.append("Error Rendering View"); if (root != null) { sb.append('['); sb.append(root.getViewId()); sb.append(']'); } log.log(Level.SEVERE, sb.toString(), e); } */ // handle dev response if (this.developmentMode && !context.getResponseComplete() && resp instanceof HttpServletResponse) { HttpServletResponse httpResp = (HttpServletResponse) resp; httpResp.reset(); httpResp.setContentType("text/html; charset=UTF-8"); Writer w = httpResp.getWriter(); DevTools.debugHtml(w, context, e); w.flush(); context.responseComplete(); } else if (e instanceof RuntimeException) { throw (RuntimeException) e; } else if (e instanceof IOException) { throw (IOException) e; } else { throw new FacesException(e.getMessage(), e); } } }