[jboss-cvs] jboss-seam/seam-ui-cdk/jboss-seam-ui/src/main/java/org/jboss/seam/ui/facelet ...
Peter Muir
peter at bleepbleep.org.uk
Tue May 8 10:07:25 EDT 2007
User: pmuir
Date: 07/05/08 10:07:25
Added: seam-ui-cdk/jboss-seam-ui/src/main/java/org/jboss/seam/ui/facelet
FaceletsRenderer.java SeamFaceletViewHandler.java
Log:
Updates for CDK port
Revision Changes Path
1.1 date: 2007/05/08 14:07:25; author: pmuir; state: Exp;jboss-seam/seam-ui-cdk/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.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.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);
renderChildren(facesContext, root);
}
private static void renderChildren(FacesContext facesContext, UIComponent component)
throws IOException
{
List children = component.getChildren();
for (int j = 0, size = component.getChildCount(); j < size; j++)
{
UIComponent child = (UIComponent) children.get(j);
renderChild(facesContext, child);
}
}
private static void renderChild(FacesContext facesContext, UIComponent child) throws IOException
{
if (child.isRendered())
{
child.encodeBegin(facesContext);
if (child.getRendersChildren())
{
child.encodeChildren(facesContext);
}
else
{
renderChildren(facesContext, child);
}
child.encodeEnd(facesContext);
}
}
}
1.1 date: 2007/05/08 14:07:25; author: pmuir; state: Exp;jboss-seam/seam-ui-cdk/jboss-seam-ui/src/main/java/org/jboss/seam/ui/facelet/SeamFaceletViewHandler.java
Index: SeamFaceletViewHandler.java
===================================================================
/*
* JBoss, Home of Professional Open Source
* Copyright 2006, JBoss Inc., and individual contributors as indicated
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.seam.ui.facelet;
import javax.faces.application.ViewHandler;
import com.sun.facelets.FaceletViewHandler;
import com.sun.facelets.compiler.Compiler;
/**
* This class just extends the FaceletViewHandler to set the ExpressionFactory
* to the Seam version.
*
* @author Stan Silvert
*/
public class SeamFaceletViewHandler
extends FaceletViewHandler
{
private static final String SEAM_EXPRESSION_FACTORY = "org.jboss.el.ExpressionFactoryImpl";
public SeamFaceletViewHandler(ViewHandler parent)
{
super(parent);
}
@Override
protected Compiler createCompiler()
{
Compiler compiler = super.createCompiler();
compiler.setFeature(Compiler.EXPRESSION_FACTORY, SEAM_EXPRESSION_FACTORY);
return compiler;
}
}
More information about the jboss-cvs-commits
mailing list