package org.jboss.seam.ui.facelet;
import static org.jboss.seam.ScopeType.APPLICATION;
import javax.faces.FactoryFinder;
import javax.faces.context.FacesContext;
import javax.faces.lifecycle.Lifecycle;
import javax.faces.lifecycle.LifecycleFactory;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.jboss.seam.Component;
import org.jboss.seam.annotations.AutoCreate;
import org.jboss.seam.annotations.Create;
import org.jboss.seam.annotations.Destroy;
import org.jboss.seam.annotations.Install;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.intercept.BypassInterceptors;
import org.jboss.seam.contexts.Contexts;
/**
* A copy of the FacesServlet for use in our Renderer.
*
* Shamelessly adapted from the RI
*
* @author Pete Muir
*
*/
@Name("org.jboss.seam.ui.facelet.facesContextFactory")
@Scope(APPLICATION)
@BypassInterceptors
@Install(dependencies="org.jboss.seam.faces.renderer")
@AutoCreate
public class RendererFacesContextFactory
{
private javax.faces.context.FacesContextFactory facesContextFactory;
private Lifecycle lifecycle;
@Create
public void create()
{
// Acquire our FacesContextFactory instance
facesContextFactory = (javax.faces.context.FacesContextFactory) FactoryFinder.getFactory (FactoryFinder.FACES_CONTEXT_FACTORY);
// Acquire our Lifecycle instance
LifecycleFactory lifecycleFactory = (LifecycleFactory) FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
lifecycle = lifecycleFactory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE);
}
public FacesContext getFacesContext(ServletRequest request, ServletResponse response)
{
return facesContextFactory.getFacesContext(ServletContextManager.instance(), request, response, lifecycle);
}
@Destroy
public void destroy()
{
facesContextFactory = null;
lifecycle = null;
}
public static RendererFacesContextFactory instance()
{
if (!Contexts.isApplicationContextActive())
{
throw new IllegalStateException("Application context is not active");
}
return (RendererFacesContextFactory) Component.getInstance(RendererFacesContextFactory.class, APPLICATION);
}
}