[jboss-cvs] jboss-seam/src/ui/org/jboss/seam/ui/facelet ...
Peter Muir
peter at bleepbleep.org.uk
Thu Mar 22 11:20:07 EDT 2007
User: pmuir
Date: 07/03/22 11:20:07
Modified: src/ui/org/jboss/seam/ui/facelet FaceletsRenderer.java
Log:
Tidy up and JBSEAM-1093
Revision Changes Path
1.12 +119 -82 jboss-seam/src/ui/org/jboss/seam/ui/facelet/FaceletsRenderer.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: FaceletsRenderer.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/src/ui/org/jboss/seam/ui/facelet/FaceletsRenderer.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -b -r1.11 -r1.12
--- FaceletsRenderer.java 2 Mar 2007 15:05:08 -0000 1.11
+++ FaceletsRenderer.java 22 Mar 2007 15:20:07 -0000 1.12
@@ -2,7 +2,6 @@
import java.io.IOException;
import java.io.StringWriter;
-import java.io.Writer;
import java.net.URL;
import javax.faces.component.UIViewRoot;
@@ -29,41 +28,89 @@
@Scope(ScopeType.STATELESS)
@Intercept(InterceptionType.NEVER)
@Name("org.jboss.seam.core.renderer")
- at Install(value=true,precedence=Install.BUILT_IN,
- classDependencies={"com.sun.facelets.Facelet"})
+ at Install(value = true, precedence = Install.BUILT_IN, classDependencies = { "com.sun.facelets.Facelet" })
public class FaceletsRenderer extends Renderer
{
- @Override
- public String render(String viewId)
+ private class Context
{
- // JBSEAM-950
- ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ 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 mockFacesContext = new MockFacesContext(new MockExternalContext())
+ .setCurrent();
mockFacesContext.createViewRoot();
}
+
FacesContext facesContext = FacesContext.getCurrentInstance();
- ResponseWriter originalWriter = facesContext.getResponseWriter();
+ // 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
{
- StringWriter stringWriter = new StringWriter();
- wrapResponseWriter(facesContext, stringWriter);
-
+ context.wrap();
+ FacesContext facesContext = FacesContext.getCurrentInstance();
renderFacelet(facesContext, faceletForURL(resourceURL(viewId)));
-
- return stringWriter.getBuffer().toString();
+ return context.getWrittenOutput();
}
catch (IOException e)
{
@@ -71,14 +118,9 @@
}
finally
{
- if (originalWriter != null)
- {
- facesContext.setResponseWriter(originalWriter);
+ context.unwrap();
}
- Thread.currentThread().setContextClassLoader(classLoader);
}
- }
-
protected URL resourceURL(String viewId)
{
@@ -93,28 +135,23 @@
return url;
}
- protected Facelet faceletForURL(URL url)
- throws IOException
+ protected Facelet faceletForURL(URL url) throws IOException
{
- return new DefaultFaceletFactory(new SAXCompiler(),
- new DefaultResourceResolver()).getFacelet(url);
+ return new DefaultFaceletFactory(new SAXCompiler(), new DefaultResourceResolver())
+ .getFacelet(url);
}
- protected void wrapResponseWriter(FacesContext facesContext, Writer writer)
- {
- ResponseWriter responseWriter =
- facesContext.getRenderKit().createResponseWriter(writer, null, null);
-
- facesContext.setResponseWriter(responseWriter);
- }
- protected void renderFacelet(FacesContext facesContext, Facelet facelet)
- throws IOException
+ protected void renderFacelet(FacesContext facesContext, Facelet facelet) throws IOException
{
UIViewRoot root = facesContext.getViewRoot();
facelet.apply(facesContext, root);
JSF.renderChildren(facesContext, root);
}
+
+
+
+
}
More information about the jboss-cvs-commits
mailing list