[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