package org.springframework.faces.webflow;
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import javax.faces.FactoryFinder;
import javax.faces.application.Application;
import javax.faces.application.ApplicationFactory;
import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;
import javax.faces.context.FacesContextFactory;
import javax.faces.lifecycle.LifecycleFactory;
import javax.faces.render.RenderKitFactory;
import org.apache.myfaces.test.base.AbstractJsfTestCase;
import org.apache.myfaces.test.mock.MockApplicationFactory;
import org.apache.myfaces.test.mock.MockExternalContext;
import org.apache.myfaces.test.mock.MockHttpServletRequest;
import org.apache.myfaces.test.mock.MockHttpServletResponse;
import org.apache.myfaces.test.mock.MockHttpSession;
import org.apache.myfaces.test.mock.MockPartialViewContextFactory;
import org.apache.myfaces.test.mock.MockPrintWriter;
import org.apache.myfaces.test.mock.MockRenderKit;
import org.apache.myfaces.test.mock.MockRenderKitFactory;
import org.apache.myfaces.test.mock.MockResponseWriter;
import org.apache.myfaces.test.mock.MockServletConfig;
import org.apache.myfaces.test.mock.MockServletContext;
import org.apache.myfaces.test.mock.lifecycle.MockLifecycle;
import org.apache.myfaces.test.mock.lifecycle.MockLifecycleFactory;
import org.apache.myfaces.test.mock.visit.MockVisitContextFactory;
/**
* Helper for using the mock JSF environment provided by shale-test inside unit tests that do not extend
* {@link AbstractJsfTestCase}
*
* @author Jeremy Grelle
* @author Phillip Webb
*/
public class JSFMockHelper {
private final JSFMock mock = new JSFMock();
public Application application() {
return this.mock.application();
}
public MockServletConfig config() {
return this.mock.config();
}
public String contentAsString() throws IOException {
return this.mock.contentAsString();
}
public MockExternalContext externalContext() {
return this.mock.externalContext();
}
public FacesContext facesContext() {
return this.mock.facesContext();
}
public FacesContextFactory facesContextFactory() {
return this.mock.facesContextFactory();
}
public MockLifecycle lifecycle() {
return this.mock.lifecycle();
}
public MockLifecycleFactory lifecycleFactory() {
return this.mock.lifecycleFactory();
}
public MockRenderKit renderKit() {
return this.mock.renderKit();
}
public MockHttpServletRequest request() {
return this.mock.request();
}
public MockHttpServletResponse response() {
return this.mock.response();
}
public MockServletContext servletContext() {
return this.mock.servletContext();
}
public MockHttpSession session() {
return this.mock.session();
}
public void setUp() throws Exception {
this.mock.setUp();
}
public void tearDown() throws Exception {
this.mock.tearDown();
}
private static class JSFMock extends AbstractJsfTestCase {
private ClassLoader threadContextClassLoader;
public JSFMock() {
super("JSFMock");
}
FacesContext facesContext;
FacesContextFactory facesContextFactory;
public void setUp() throws Exception {
// Ensure no pre-existing FacesContext ..
if (FacesContext.getCurrentInstance() != null) {
FacesContext.getCurrentInstance().release();
}
// Set up a new thread context class loader
this.threadContextClassLoader = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(
new URLClassLoader(new URL[0], this.getClass().getClassLoader()));
// Set up Servlet API Objects
this.servletContext = new MockServletContext();
this.config = new MockServletConfig(this.servletContext);
this.session = new MockHttpSession();
this.session.setServletContext(this.servletContext);
this.request = new MockHttpServletRequest(this.session);
this.request.setServletContext(this.servletContext);
this.response = new MockHttpServletResponse();
// Set up JSF API Objects
FactoryFinder.setFactory(FactoryFinder.APPLICATION_FACTORY, MockApplicationFactory.class.getName());
FactoryFinder.setFactory(FactoryFinder.FACES_CONTEXT_FACTORY, MockBaseFacesContextFactory.class.getName());
FactoryFinder.setFactory(FactoryFinder.LIFECYCLE_FACTORY, MockLifecycleFactory.class.getName());
FactoryFinder.setFactory(FactoryFinder.RENDER_KIT_FACTORY, MockRenderKitFactory.class.getName());
FactoryFinder.setFactory(FactoryFinder.PARTIAL_VIEW_CONTEXT_FACTORY,
MockPartialViewContextFactory.class.getName());
FactoryFinder.setFactory(FactoryFinder.VISIT_CONTEXT_FACTORY, MockVisitContextFactory.class.getName());
this.lifecycleFactory = (MockLifecycleFactory) FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
this.lifecycle = (MockLifecycle) this.lifecycleFactory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE);
this.facesContextFactory = (FacesContextFactory) FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);
this.facesContext = this.facesContextFactory.getFacesContext(this.servletContext, this.request, this.response, this.lifecycle);
this.externalContext = (MockExternalContext) this.facesContext.getExternalContext();
this.facesContext.setResponseWriter(new MockResponseWriter(this.response.getWriter()));
UIViewRoot root = new UIViewRoot();
root.setViewId("/viewId");
root.setRenderKitId(RenderKitFactory.HTML_BASIC_RENDER_KIT);
this.facesContext.setViewRoot(root);
ApplicationFactory applicationFactory = (ApplicationFactory) FactoryFinder
.getFactory(FactoryFinder.APPLICATION_FACTORY);
this.application = (org.apache.myfaces.test.mock.MockApplication) applicationFactory.getApplication();
RenderKitFactory renderKitFactory = (RenderKitFactory) FactoryFinder
.getFactory(FactoryFinder.RENDER_KIT_FACTORY);
this.renderKit = new MockRenderKit();
renderKitFactory.addRenderKit(RenderKitFactory.HTML_BASIC_RENDER_KIT, this.renderKit);
}
public void tearDown() throws Exception {
this.application = null;
this.config = null;
this.externalContext = null;
if (this.facesContext != null) {
this.facesContext.release();
}
this.facesContext = null;
this.lifecycle = null;
this.lifecycleFactory = null;
this.renderKit = null;
this.request = null;
this.response = null;
this.servletContext = null;
this.session = null;
FactoryFinder.releaseFactories();
Thread.currentThread().setContextClassLoader(this.threadContextClassLoader);
this.threadContextClassLoader = null;
}
public org.apache.myfaces.test.mock.MockApplication application() {
return this.application;
}
public MockServletConfig config() {
return this.config;
}
public String contentAsString() throws IOException {
MockPrintWriter writer = (MockPrintWriter) this.response.getWriter();
return new String(writer.content());
}
public MockExternalContext externalContext() {
return this.externalContext;
}
public FacesContext facesContext() {
return this.facesContext;
}
public FacesContextFactory facesContextFactory() {
return this.facesContextFactory;
}
public MockLifecycle lifecycle() {
return this.lifecycle;
}
public MockLifecycleFactory lifecycleFactory() {
return this.lifecycleFactory;
}
public MockRenderKit renderKit() {
return this.renderKit;
}
public MockHttpServletRequest request() {
return this.request;
}
public MockHttpServletResponse response() {
return this.response;
}
public MockServletContext servletContext() {
return this.servletContext;
}
public MockHttpSession session() {
return this.session;
}
}
}