[jboss-cvs] jboss-seam/ui/src/main/java/org/jboss/seam/ui/facelet ...
Peter Muir
peter at bleepbleep.org.uk
Fri Jun 15 13:07:06 EDT 2007
User: pmuir
Date: 07/06/15 13:07:06
Added: ui/src/main/java/org/jboss/seam/ui/facelet
DecorateHandler.java FaceletsRenderer.java
Log:
Refactor cdk port
Revision Changes Path
1.1 date: 2007/06/15 17:07:06; author: pmuir; state: Exp;jboss-seam/ui/src/main/java/org/jboss/seam/ui/facelet/DecorateHandler.java
Index: DecorateHandler.java
===================================================================
package org.jboss.seam.ui.facelet;
import java.io.IOException;
import javax.el.ELException;
import javax.faces.FacesException;
import javax.faces.component.UIComponent;
import com.sun.facelets.FaceletContext;
import com.sun.facelets.tag.jsf.ComponentConfig;
import com.sun.facelets.tag.jsf.ComponentHandler;
public class DecorateHandler extends ComponentHandler
{
private com.sun.facelets.tag.ui.DecorateHandler delegate;
public DecorateHandler(ComponentConfig config)
{
super(config);
if ( tag.getAttributes().get("template")!=null )
{
delegate = new com.sun.facelets.tag.ui.DecorateHandler(config);
}
}
@Override
protected void applyNextHandler(FaceletContext context, UIComponent component)
throws IOException, FacesException, ELException
{
if ( tag.getAttributes().get("template")!=null )
{
delegate.apply(context, component);
}
else
{
nextHandler.apply(context, component);
}
}
}
1.1 date: 2007/06/15 17:07:06; author: pmuir; state: Exp;jboss-seam/ui/src/main/java/org/jboss/seam/ui/facelet/FaceletsRenderer.java
Index: FaceletsRenderer.java
===================================================================
package org.jboss.seam.ui.facelet;
import java.io.IOException;
import java.io.StringWriter;
import java.net.URL;
import java.util.List;
import javax.faces.component.UIComponent;
import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import org.ajax4jsf.framework.renderer.RendererUtils;
import org.jboss.seam.InterceptionType;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Install;
import org.jboss.seam.annotations.Intercept;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.core.Renderer;
import org.jboss.seam.mock.MockExternalContext;
import org.jboss.seam.mock.MockFacesContext;
import org.jboss.seam.ui.util.RenderererUtils;
import org.jboss.seam.util.Resources;
import com.sun.facelets.Facelet;
import com.sun.facelets.compiler.SAXCompiler;
import com.sun.facelets.impl.DefaultFaceletFactory;
import com.sun.facelets.impl.DefaultResourceResolver;
@Scope(ScopeType.STATELESS)
@Intercept(InterceptionType.NEVER)
@Name("org.jboss.seam.core.renderer")
@Install(value = true, precedence = Install.BUILT_IN, classDependencies = { "com.sun.facelets.Facelet" })
public class FaceletsRenderer extends Renderer
{
private class Context
{
public Context(String viewId)
{
this.viewId = viewId;
}
private String viewId;
private ClassLoader originalClassLoader;
private ResponseWriter originalResponseWriter;
private UIViewRoot originalViewRoot;
private StringWriter writer = new StringWriter();
public Context wrap()
{
// Make sure we are using the correct ClassLoader
originalClassLoader = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
// If a FacesContext isn't available, set one up
if (FacesContext.getCurrentInstance() == null)
{
MockFacesContext mockFacesContext = new MockFacesContext(new MockExternalContext())
.setCurrent();
mockFacesContext.createViewRoot();
}
FacesContext facesContext = FacesContext.getCurrentInstance();
// Wrap the ResponseWriter
originalResponseWriter = facesContext.getResponseWriter();
facesContext.setResponseWriter(facesContext.getRenderKit().createResponseWriter(writer,
null, null));
// Create a new UIViewRoot
originalViewRoot = facesContext.getViewRoot();
UIViewRoot viewRoot = new UIViewRoot();
viewRoot.setRenderKitId(facesContext.getApplication().getViewHandler().calculateRenderKitId(facesContext));
viewRoot.setViewId(viewId);
viewRoot.setLocale(originalViewRoot.getLocale());
facesContext.setViewRoot(viewRoot);
return this;
}
public void unwrap()
{
FacesContext facesContext = FacesContext.getCurrentInstance();
if (originalResponseWriter != null)
{
facesContext.setResponseWriter(originalResponseWriter);
}
if (originalViewRoot != null)
{
facesContext.setViewRoot(originalViewRoot);
}
Thread.currentThread().setContextClassLoader(originalClassLoader);
}
public String getWrittenOutput()
{
return writer.getBuffer().toString();
}
}
@Override
public String render(String viewId)
{
Context context = new Context(viewId);
try
{
context.wrap();
FacesContext facesContext = FacesContext.getCurrentInstance();
renderFacelet(facesContext, faceletForURL(resourceURL(viewId)));
return context.getWrittenOutput();
}
catch (IOException e)
{
throw new RuntimeException(e);
}
finally
{
context.unwrap();
}
}
protected URL resourceURL(String viewId)
{
URL url = Resources.getResource(viewId);
if (url == null)
{
throw new IllegalArgumentException("resource doesn't exist: " + viewId);
}
return url;
}
protected Facelet faceletForURL(URL url) throws IOException
{
return new DefaultFaceletFactory(new SAXCompiler(), new DefaultResourceResolver())
.getFacelet(url);
}
protected void renderFacelet(FacesContext facesContext, Facelet facelet) throws IOException
{
UIViewRoot root = facesContext.getViewRoot();
facelet.apply(facesContext, root);
RenderererUtils.renderChildren(facesContext, root);
}
}
More information about the jboss-cvs-commits
mailing list