/*
* $Id$
*
* License Agreement.
*
* Rich Faces - Natural Ajax for Java Server Faces (JSF)
*
* Copyright (C) 2007 Exadel, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1 as published by the Free Software Foundation.
*
* This library 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 library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
package org.jboss.test.faces.mock;
import static org.easymock.EasyMock.*;
import java.util.HashMap;
import javax.el.ELContext;
import javax.faces.FactoryFinder;
import javax.faces.application.Application;
import javax.faces.application.ViewHandler;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.render.RenderKit;
import javax.faces.render.ResponseStateManager;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.easymock.EasyMock;
import org.easymock.IMocksControl;
import org.easymock.internal.MocksControl.MockType;
import org.jboss.test.faces.mock.application.MockApplicationFactory;
import org.jboss.test.faces.mock.context.MockExceptionHandlerFactory;
import org.jboss.test.faces.mock.context.MockExternalContextFactory;
import org.jboss.test.faces.mock.context.MockFacesContext;
import org.jboss.test.faces.mock.context.MockFacesContextFactory;
import org.jboss.test.faces.mock.context.MockPartialViewContextFactory;
import org.jboss.test.faces.mock.lifecycle.MockLifecycleFactory;
import org.jboss.test.faces.mock.render.MockRenderKitFactory;
import org.jboss.test.faces.writer.RecordingResponseWriter;
/**
* <p class="changed_added_4_0">
* </p>
*
* @author asmirnov@exadel.com
*
*/
public class MockFacesEnvironment implements FacesMockController.MockObject {
private static ThreadLocal<MockFacesEnvironment> instance = new ThreadLocal<MockFacesEnvironment>();
private final IMocksControl mocksControl;
private FacesContext facesContext;
private boolean withFactories = false;
private ExternalContext externalContext;
private ELContext elContext;
private ServletContext context;
private HttpServletRequest request;
private HttpServletResponse response;
private Application application;
private ViewHandler viewHandler;
private RenderKit renderKit;
private ResponseStateManager responseStateManager;
private String name;
private RecordingResponseWriter responseWriter;
private static boolean jsf2;
static {
try {
Class.forName("javax.faces.component.behavior.Behavior", false, FacesContext.class.getClassLoader());
jsf2 = true;
} catch (Throwable e) {
jsf2 = false;
}
}
// Factory methods
public static MockFacesEnvironment createEnvironment() {
return new MockFacesEnvironment(createControl());
}
public static MockFacesEnvironment createStrictEnvironment() {
return new MockFacesEnvironment(createStrictControl());
}
public static MockFacesEnvironment createNiceEnvironment() {
return new MockFacesEnvironment(createNiceControl());
}
/**
* <p class="changed_added_4_0">
* </p>
*
* @return the instance
*/
public static MockFacesEnvironment getInstance() {
return instance.get();
}
public MockFacesEnvironment(IMocksControl mocksControl, String name) {
this(mocksControl);
this.name = name;
}
MockFacesEnvironment(IMocksControl mocksControl) {
this.mocksControl = mocksControl;
facesContext = createMock(FacesContext.class);
instance.set(this);
}
public <T> T createMock(Class<T> mock) {
return createMock(name, mock);
}
public <T> T createMock(String name, Class<T> mock) {
return FacesMock.createMock(name, mock, mocksControl);
}
/*
* public MockFacesEnvironment _(){ return this; }
*/
public MockFacesEnvironment withExternalContext() {
this.externalContext = createMock(ExternalContext.class);
recordExternalContext();
return this;
}
private void recordExternalContext() {
EasyMock.expect(facesContext.getExternalContext()).andStubReturn(externalContext);
EasyMock.expect(externalContext.getContext()).andStubReturn(null);
EasyMock.expect(externalContext.getApplicationMap()).andStubReturn(new HashMap<String, Object>());
}
/*
* public MockFacesEnvironment _(){ return this; }
*/
public MockFacesEnvironment withELContext() {
this.elContext = createMock(ELContext.class);
recordELContext();
return this;
}
private void recordELContext() {
EasyMock.expect(facesContext.getELContext()).andStubReturn(elContext);
}
public MockFacesEnvironment withServletRequest() {
if (null == externalContext) {
withExternalContext();
}
this.context = mocksControl.createMock(ServletContext.class);
this.request = mocksControl.createMock(HttpServletRequest.class);
this.response = mocksControl.createMock(HttpServletResponse.class);
recordServletRequest();
return this;
}
private void recordServletRequest() {
EasyMock.expect(externalContext.getContext()).andStubReturn(context);
EasyMock.expect(externalContext.getRequest()).andStubReturn(request);
EasyMock.expect(externalContext.getResponse()).andStubReturn(response);
}
public MockFacesEnvironment withFactories() {
FactoryFinder.releaseFactories();
FactoryFinder.setFactory(FactoryFinder.APPLICATION_FACTORY, MockApplicationFactory.class.getName());
FactoryFinder.setFactory(FactoryFinder.FACES_CONTEXT_FACTORY, MockFacesContextFactory.class.getName());
FactoryFinder.setFactory(FactoryFinder.RENDER_KIT_FACTORY, MockRenderKitFactory.class.getName());
FactoryFinder.setFactory(FactoryFinder.LIFECYCLE_FACTORY, MockLifecycleFactory.class.getName());
if (jsf2) {
FactoryFinder.setFactory(FactoryFinder.TAG_HANDLER_DELEGATE_FACTORY, MockType.class.getName());
FactoryFinder.setFactory(FactoryFinder.EXCEPTION_HANDLER_FACTORY, MockExceptionHandlerFactory.class
.getName());
FactoryFinder.setFactory(FactoryFinder.PARTIAL_VIEW_CONTEXT_FACTORY, MockPartialViewContextFactory.class
.getName());
FactoryFinder
.setFactory(FactoryFinder.EXTERNAL_CONTEXT_FACTORY, MockExternalContextFactory.class.getName());
}
withFactories = true;
return this;
}
public MockFacesEnvironment withApplication() {
this.application = createMock(Application.class);
this.viewHandler = createMock(ViewHandler.class);
recordApplication();
return this;
}
private void recordApplication() {
EasyMock.expect(facesContext.getApplication()).andStubReturn(application);
EasyMock.expect(application.getViewHandler()).andStubReturn(viewHandler);
}
public MockFacesEnvironment withRenderKit() {
this.renderKit = createMock(RenderKit.class);
this.responseStateManager = createMock(ResponseStateManager.class);
recordRenderKit();
return this;
}
private void recordRenderKit() {
EasyMock.expect(facesContext.getRenderKit()).andStubReturn(renderKit);
EasyMock.expect(renderKit.getResponseStateManager()).andStubReturn(responseStateManager);
}
public MockFacesEnvironment withReSponseWriter() {
this.responseWriter = new RecordingResponseWriter("UTF-8", "text/html");
recordResponseWrrier();
return this;
}
private void recordResponseWrrier() {
EasyMock.expect(facesContext.getResponseWriter()).andStubReturn(responseWriter);
}
public MockFacesEnvironment replay() {
mocksControl.replay();
MockFacesContext.setCurrentInstance(facesContext);
return this;
}
public MockFacesEnvironment reset() {
mocksControl.reset();
recordEnvironment();
return this;
}
private void recordEnvironment() {
if (null != externalContext) {
recordExternalContext();
}
if (null != elContext) {
recordELContext();
}
if (null != request) {
recordServletRequest();
}
if (null != application) {
recordApplication();
}
if (null != renderKit) {
recordRenderKit();
}
if (null != responseWriter) {
recordResponseWrrier();
}
if (withFactories) {
FactoryFinder.releaseFactories();
withFactories();
}
}
public MockFacesEnvironment resetToStrict() {
mocksControl.resetToStrict();
recordEnvironment();
return this;
}
public MockFacesEnvironment resetToDefault() {
mocksControl.resetToDefault();
recordEnvironment();
return this;
}
public MockFacesEnvironment resetToNice() {
mocksControl.resetToNice();
recordEnvironment();
return this;
}
public void verify() {
mocksControl.verify();
}
public void release() {
facesContext.release();
instance.remove();
if (withFactories) {
FactoryFinder.releaseFactories();
}
}
/**
* <p class="changed_added_4_0">
* </p>
*
* @return the facesContext
*/
public FacesContext getFacesContext() {
return this.facesContext;
}
/**
* <p class="changed_added_4_0">
* </p>
*
* @return the externalContext
*/
public ExternalContext getExternalContext() {
return this.externalContext;
}
/**
* <p class="changed_added_4_0"></p>
* @return the elContext
*/
public ELContext getElContext() {
return this.elContext;
}
/**
* <p class="changed_added_4_0">
* </p>
*
* @return the context
*/
public ServletContext getContext() {
return this.context;
}
/**
* <p class="changed_added_4_0">
* </p>
*
* @return the request
*/
public HttpServletRequest getRequest() {
return this.request;
}
/**
* <p class="changed_added_4_0">
* </p>
*
* @return the response
*/
public HttpServletResponse getResponse() {
return this.response;
}
/**
* <p class="changed_added_4_0">
* </p>
*
* @return the application
*/
public Application getApplication() {
return this.application;
}
/**
* <p class="changed_added_4_0">
* </p>
*
* @return the viewHandler
*/
public ViewHandler getViewHandler() {
return this.viewHandler;
}
/**
* <p class="changed_added_4_0">
* </p>
*
* @return the renderKit
*/
public RenderKit getRenderKit() {
return this.renderKit;
}
/**
* <p class="changed_added_4_0">
* </p>
*
* @return the responseStateManager
*/
public ResponseStateManager getResponseStateManager() {
return this.responseStateManager;
}
/**
* @return the responseWriter
*/
public RecordingResponseWriter getResponseWriter() {
return this.responseWriter;
}
public IMocksControl getControl() {
return mocksControl;
}
}