[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