You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lu...@apache.org on 2014/01/25 23:54:34 UTC
svn commit: r1561418 [2/3] - in /myfaces/core/trunk: ./ impl-test/
impl-test/src/ impl-test/src/main/ impl-test/src/main/java/ impl/
impl/src/test/java/org/apache/myfaces/application/contracts/
impl/src/test/java/org/apache/myfaces/application/flow/ im...
Modified: myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/mc/test/core/AbstractMyFacesRequestTestCase.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/mc/test/core/AbstractMyFacesRequestTestCase.java?rev=1561418&r1=1561417&r2=1561418&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/mc/test/core/AbstractMyFacesRequestTestCase.java (original)
+++ myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/mc/test/core/AbstractMyFacesRequestTestCase.java Sat Jan 25 22:54:34 2014
@@ -21,15 +21,14 @@ package org.apache.myfaces.mc.test.core;
import java.io.IOException;
import javax.faces.application.Application;
-import javax.faces.component.UICommand;
-import javax.faces.component.UIComponent;
-import javax.faces.component.UIInput;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
+import javax.servlet.ServletRequestEvent;
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.MockHttpSessionProxy;
/**
* <p>Abstract JUnit test case base class, with method to setup/teardown a request.
@@ -41,6 +40,7 @@ import org.apache.myfaces.test.mock.Mock
*
*/
public abstract class AbstractMyFacesRequestTestCase extends AbstractMyFacesTestCase
+ implements ServletMockContainer
{
@Override
@@ -53,8 +53,9 @@ public abstract class AbstractMyFacesReq
@Override
public void tearDown() throws Exception
{
- tearDownRequest();
+ endRequest();
session = null;
+ lastSession = null;
if (client != null)
{
client.setTestCase(null);
@@ -63,12 +64,12 @@ public abstract class AbstractMyFacesReq
super.tearDown();
}
- protected void setupRequest() throws Exception
+ protected void setupRequest()
{
setupRequest(null);
}
- protected void setupRequest(String pathInfo) throws Exception
+ protected void setupRequest(String pathInfo)
{
if (pathInfo == null)
{
@@ -87,32 +88,95 @@ public abstract class AbstractMyFacesReq
}
}
}
-
- protected void setupRequest(String pathInfo, String query) throws Exception
+
+ protected void setupRequest(String pathInfo, String query)
{
- session = (session == null) ? new MockHttpSession() : session;
- session.setServletContext(servletContext);
- request = new MockHttpServletRequest(session);
+ if (request != null)
+ {
+ //tear down previous request
+ endRequest();
+ }
+ request = lastSession == null ?
+ new MockHttpServletRequest() : new MockHttpServletRequest(lastSession);
request.setServletContext(servletContext);
+ requestInitializedCalled = false;
+ if (session == null)
+ {
+ session = new MockHttpSessionProxy(servletContext, request);
+ }
+ else
+ {
+ session.setRequest(request);
+ }
+ session.setServletContext(servletContext);
response = new MockHttpServletResponse();
//TODO check if this is correct
request.setPathElements(getContextPath(), getServletPath(), pathInfo, query);
- facesContext = facesContextFactory.getFacesContext(servletContext, request, response, lifecycle);
+ facesContext = facesContextFactory.getFacesContext(
+ servletContext, request, response, lifecycle);
externalContext = facesContext.getExternalContext();
application = facesContext.getApplication();
if (client != null)
{
client.apply(request);
+ client.reset(facesContext);
+ }
+ else
+ {
+ client = createClient();
}
- //Reset client
- client = createClient();
}
protected MockMyFacesClient createClient()
{
return new MockMyFacesClient(facesContext, this);
}
+
+ /**
+ * This method call startViewRequest(viewId) and doRequestInitialized()
+ */
+ public final void startViewRequest(String viewId)
+ {
+ setupRequest(viewId);
+ doRequestInitialized();
+ }
+
+ /**
+ * This method call startViewRequest(null) and doRequestInitialized()
+ */
+ public final void startRequest()
+ {
+ startViewRequest(null);
+ doRequestInitialized();
+ }
+
+ public void doRequestInitialized()
+ {
+ if (!requestInitializedCalled)
+ {
+ webContainer.requestInitialized(new ServletRequestEvent(servletContext, request));
+ requestInitializedCalled = true;
+ }
+ }
+
+ /**
+ * This method call doRequestDestroyed() and then tearDownRequest().
+ */
+ public final void endRequest()
+ {
+ doRequestDestroyed();
+ tearDownRequest();
+ }
+
+ public void doRequestDestroyed()
+ {
+ if (request != null)
+ {
+ lastSession = (MockHttpSession) request.getSession(false);
+ webContainer.requestDestroyed(new ServletRequestEvent(servletContext, request));
+ }
+ }
protected void tearDownRequest()
{
@@ -139,97 +203,116 @@ public abstract class AbstractMyFacesReq
return "/faces";
}
- protected void processLifecycleExecute() throws Exception
+ public void processLifecycleExecute()
{
processLifecycleExecute(facesContext);
}
+
+ public void processLifecycleRender()
+ {
+ processLifecycleRender(facesContext);
+ }
- protected void processLifecycleExecuteAndRender() throws Exception
+ public void processLifecycleExecuteAndRender()
{
processLifecycleExecute();
- processRender();
+ renderResponse();
}
- protected void processRestoreViewPhase() throws Exception
+ public void restoreView()
{
- processRestoreViewPhase(facesContext);
+ restoreView(facesContext);
}
- protected void processApplyRequestValuesPhase() throws Exception
+ public void applyRequestValues()
{
- processApplyRequestValuesPhase(facesContext);
+ applyRequestValues(facesContext);
}
- protected void processValidationsPhase() throws Exception
+ public void processValidations()
{
- processValidationsPhase(facesContext);
+ processValidations(facesContext);
}
- protected void processUpdateModelPhase() throws Exception
+ public void updateModelValues()
{
- processUpdateModelPhase(facesContext);
+ updateModelValues(facesContext);
}
-
- protected void processInvokeApplicationPhase() throws Exception
+
+ public void invokeApplication()
{
- processInvokeApplicationPhase(facesContext);
+ invokeApplication(facesContext);
}
- protected void processRender() throws Exception
+ public void renderResponse()
{
- processRender(facesContext);
+ renderResponse(facesContext);
}
- protected void processRemainingExecutePhases() throws Exception
+ public void processRemainingExecutePhases()
{
processRemainingExecutePhases(facesContext);
}
- protected void processRemainingPhases() throws Exception
+ public void processRemainingPhases()
{
processRemainingPhases(facesContext);
}
- protected String getRenderedContent() throws IOException
+ public void executeBeforeRender()
{
- return getRenderedContent(facesContext);
+ executeBeforeRender(facesContext);
}
- protected void inputText(UIComponent input, String text)
+ public void executeViewHandlerRender()
{
- client.inputText((UIInput)input, text);
+ executeViewHandlerRender(facesContext);
+ }
+
+ public void executeBuildViewCycle()
+ {
+ executeBuildViewCycle(facesContext);
}
- /**
- * Simulate a submit, processing the remaining phases and setting up the new request.
- * It delegates to client.submit, where the necessary data is gathered to be applied
- * later on client.apply method.
- *
- * @param component
- * @throws Exception
- */
- protected void submit(UIComponent component) throws Exception
+ public void executeAfterRender()
{
- client.submit(component);
- /*
- processRemainingPhases();
- client.submit((UICommand)component);
- String viewId = facesContext.getViewRoot().getViewId();
- tearDownRequest();
- setupRequest(viewId);
- */
+ executeAfterRender(facesContext);
+ }
+
+ public String getRenderedContent() throws IOException
+ {
+ return getRenderedContent(facesContext);
}
protected MockMyFacesClient client = null;
// Servlet objects
protected MockHttpServletRequest request = null;
+ protected boolean requestInitializedCalled = false;
protected MockHttpServletResponse response = null;
- protected MockHttpSession session = null;
+ protected MockHttpSessionProxy session = null;
+ protected MockHttpSession lastSession = null;
protected Application application = null;
protected ExternalContext externalContext = null;
protected FacesContext facesContext = null;
+ @Override
+ public MockHttpServletRequest getRequest()
+ {
+ return request;
+ }
+
+ @Override
+ public MockHttpServletResponse getResponse()
+ {
+ return response;
+ }
+
+ @Override
+ public FacesContext getFacesContext()
+ {
+ return facesContext;
+ }
}
Modified: myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/mc/test/core/AbstractMyFacesTestCase.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/mc/test/core/AbstractMyFacesTestCase.java?rev=1561418&r1=1561417&r2=1561418&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/mc/test/core/AbstractMyFacesTestCase.java (original)
+++ myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/mc/test/core/AbstractMyFacesTestCase.java Sat Jan 25 22:54:34 2014
@@ -23,11 +23,14 @@ import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URI;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -75,9 +78,11 @@ import org.apache.myfaces.test.el.MockEx
import org.apache.myfaces.test.mock.MockPrintWriter;
import org.apache.myfaces.test.mock.MockServletConfig;
import org.apache.myfaces.test.mock.MockServletContext;
+import org.apache.myfaces.test.mock.MockWebContainer;
import org.apache.myfaces.webapp.AbstractFacesInitializer;
import org.apache.myfaces.webapp.StartupServletContextListener;
import org.junit.After;
+import org.junit.AfterClass;
import org.junit.Before;
import org.xml.sax.SAXException;
@@ -144,6 +149,12 @@ public abstract class AbstractMyFacesTes
.setContextClassLoader(
new URLClassLoader(new URL[0], this.getClass()
.getClassLoader()));
+
+ jsfConfiguration = sharedConfiguration.get(this.getClass().getName());
+ if (jsfConfiguration == null)
+ {
+ jsfConfiguration = new SharedFacesConfiguration();
+ }
// Set up Servlet API Objects
setUpServletObjects();
@@ -153,7 +164,11 @@ public abstract class AbstractMyFacesTes
setUpServletListeners();
+ webContainer.contextInitialized(new ServletContextEvent(servletContext));
+
setUpFacesServlet();
+
+ sharedConfiguration.put(this.getClass().getName(), jsfConfiguration);
}
/**
@@ -171,6 +186,8 @@ public abstract class AbstractMyFacesTes
servletContext = new MockServletContext();
servletConfig = new MockServletConfig(servletContext);
servletContext.setDocumentRoot(getWebappContextURI());
+ webContainer = new MockWebContainer();
+ servletContext.setWebContainer(webContainer);
setUpWebConfigParams();
}
@@ -281,6 +298,11 @@ public abstract class AbstractMyFacesTes
return new MyFacesMockFacesConfigurationProvider(this);
}
+ protected AbstractFacesInitializer createFacesInitializer()
+ {
+ return new JUnitFacesInitializer(this);
+ }
+
protected void setUpMyFaces() throws Exception
{
if (facesConfigurationProvider == null)
@@ -291,28 +313,18 @@ public abstract class AbstractMyFacesTes
DefaultFacesConfigurationProviderFactory.FACES_CONFIGURATION_PROVIDER_INSTANCE_KEY,
facesConfigurationProvider);
listener = new StartupServletContextListener();
- listener.setFacesInitializer(new AbstractFacesInitializer()
- {
-
- @Override
- protected void initContainerIntegration(ServletContext servletContext,
- ExternalContext externalContext)
- {
- ExpressionFactory expressionFactory = createExpressionFactory();
-
- RuntimeConfig runtimeConfig = buildConfiguration(servletContext, externalContext, expressionFactory);
- }
- });
- listener.contextInitialized(new ServletContextEvent(servletContext));
+ listener.setFacesInitializer(createFacesInitializer());
+ webContainer.subscribeListener(listener);
+ //listener.contextInitialized(new ServletContextEvent(servletContext));
}
- protected void tearDownMyFaces() throws Exception
+ protected void tearDownMyFaces()
{
//Don't tear down FacesConfigurationProvider, because that is shared by all tests.
//This helps to reduce the time each test takes
//facesConfigurationProvider = null
- listener.contextDestroyed(new ServletContextEvent(servletContext));
+ //listener.contextDestroyed(new ServletContextEvent(servletContext));
}
protected void setUpFacesServlet() throws Exception
@@ -343,6 +355,8 @@ public abstract class AbstractMyFacesTes
{
tearDownServlets();
+ webContainer.contextDestroyed(new ServletContextEvent(servletContext));
+
tearDownServletListeners();
listener = null;
@@ -356,6 +370,13 @@ public abstract class AbstractMyFacesTes
threadContextClassLoader = null;
}
+ @AfterClass
+ public static void tearDownClass()
+ {
+ standardFacesConfig = null;
+ sharedConfiguration.clear();
+ }
+
private String getLifecycleId()
{
// 1. check for Servlet's init-param
@@ -372,7 +393,7 @@ public abstract class AbstractMyFacesTes
*
* @param facesContext
*/
- protected void processLifecycleExecute(FacesContext facesContext)
+ public void processLifecycleExecute(FacesContext facesContext)
{
lifecycle.attachWindow(facesContext);
lifecycle.execute(facesContext);
@@ -385,7 +406,7 @@ public abstract class AbstractMyFacesTes
* @param facesContext
* @throws Exception
*/
- protected void processRestoreViewPhase(FacesContext facesContext) throws Exception
+ public void restoreView(FacesContext facesContext)
{
lifecycle.attachWindow(facesContext);
executePhase(facesContext, PhaseId.RESTORE_VIEW);
@@ -399,12 +420,13 @@ public abstract class AbstractMyFacesTes
* @param facesContext
* @throws Exception
*/
- protected void processApplyRequestValuesPhase(FacesContext facesContext) throws Exception
+ public void applyRequestValues(FacesContext facesContext)
{
if (facesContext.getRenderResponse() || facesContext.getResponseComplete())
{
return;
}
+ processRemainingPhasesBefore(facesContext, PhaseId.APPLY_REQUEST_VALUES);
executePhase(facesContext, PhaseId.APPLY_REQUEST_VALUES);
facesContext.getAttributes().put(LAST_PHASE_PROCESSED, PhaseId.APPLY_REQUEST_VALUES);
}
@@ -416,12 +438,13 @@ public abstract class AbstractMyFacesTes
* @param facesContext
* @throws Exception
*/
- protected void processValidationsPhase(FacesContext facesContext) throws Exception
+ public void processValidations(FacesContext facesContext)
{
if (facesContext.getRenderResponse() || facesContext.getResponseComplete())
{
return;
}
+ processRemainingPhasesBefore(facesContext, PhaseId.PROCESS_VALIDATIONS);
executePhase(facesContext, PhaseId.PROCESS_VALIDATIONS);
facesContext.getAttributes().put(LAST_PHASE_PROCESSED, PhaseId.PROCESS_VALIDATIONS);
}
@@ -433,12 +456,13 @@ public abstract class AbstractMyFacesTes
* @param facesContext
* @throws Exception
*/
- protected void processUpdateModelPhase(FacesContext facesContext) throws Exception
+ public void updateModelValues(FacesContext facesContext)
{
if (facesContext.getRenderResponse() || facesContext.getResponseComplete())
{
return;
}
+ processRemainingPhasesBefore(facesContext, PhaseId.UPDATE_MODEL_VALUES);
executePhase(facesContext, PhaseId.UPDATE_MODEL_VALUES);
facesContext.getAttributes().put(LAST_PHASE_PROCESSED, PhaseId.UPDATE_MODEL_VALUES);
@@ -451,19 +475,20 @@ public abstract class AbstractMyFacesTes
* @param facesContext
* @throws Exception
*/
- protected void processInvokeApplicationPhase(FacesContext facesContext) throws Exception
+ public void invokeApplication(FacesContext facesContext)
{
if (facesContext.getRenderResponse() || facesContext.getResponseComplete())
{
return;
}
+ processRemainingPhasesBefore(facesContext, PhaseId.INVOKE_APPLICATION);
executePhase(facesContext, PhaseId.INVOKE_APPLICATION);
facesContext.getAttributes().put(LAST_PHASE_PROCESSED, PhaseId.INVOKE_APPLICATION);
}
- protected void processLifecycleRender(FacesContext facesContext) throws Exception
+ public void processLifecycleRender(FacesContext facesContext)
{
- processRender(facesContext);
+ renderResponse(facesContext);
}
/**
@@ -471,7 +496,7 @@ public abstract class AbstractMyFacesTes
*
* @param facesContext
*/
- protected void processRender(FacesContext facesContext) throws Exception
+ public void renderResponse(FacesContext facesContext)
{
processRemainingExecutePhases(facesContext);
lifecycle.render(facesContext);
@@ -479,7 +504,76 @@ public abstract class AbstractMyFacesTes
facesContext.getAttributes().put(LAST_RENDER_PHASE_STEP, AFTER_RENDER_STEP);
}
- protected void processRemainingExecutePhases(FacesContext facesContext) throws Exception
+ protected void processRemainingPhasesBefore(FacesContext facesContext, PhaseId phaseId)
+ {
+ PhaseId lastPhaseId = (PhaseId) facesContext.getAttributes().get(LAST_PHASE_PROCESSED);
+ if (lastPhaseId == null)
+ {
+ if (!phaseId.equals(PhaseId.RESTORE_VIEW))
+ {
+ restoreView(facesContext);
+ lastPhaseId = (PhaseId) facesContext.getAttributes().get(LAST_PHASE_PROCESSED);
+ }
+ else
+ {
+ // There are no phases before restore view
+ return;
+ }
+ }
+ if (PhaseId.APPLY_REQUEST_VALUES.equals(phaseId))
+ {
+ return;
+ }
+ boolean continueProcess = false;
+ if (continueProcess || PhaseId.RESTORE_VIEW.equals(lastPhaseId))
+ {
+ applyRequestValues(facesContext);
+ lastPhaseId = (PhaseId) facesContext.getAttributes().get(LAST_PHASE_PROCESSED);
+ continueProcess = true;
+ }
+ if (PhaseId.PROCESS_VALIDATIONS.equals(phaseId))
+ {
+ return;
+ }
+ if (continueProcess || PhaseId.APPLY_REQUEST_VALUES.equals(lastPhaseId))
+ {
+ processValidations(facesContext);
+ lastPhaseId = (PhaseId) facesContext.getAttributes().get(LAST_PHASE_PROCESSED);
+ continueProcess = true;
+ }
+ if (PhaseId.UPDATE_MODEL_VALUES.equals(phaseId))
+ {
+ return;
+ }
+ if (continueProcess || PhaseId.PROCESS_VALIDATIONS.equals(lastPhaseId))
+ {
+ updateModelValues(facesContext);
+ lastPhaseId = (PhaseId) facesContext.getAttributes().get(LAST_PHASE_PROCESSED);
+ continueProcess = true;
+ }
+ if (PhaseId.INVOKE_APPLICATION.equals(phaseId))
+ {
+ return;
+ }
+ if (continueProcess || PhaseId.UPDATE_MODEL_VALUES.equals(lastPhaseId))
+ {
+ invokeApplication(facesContext);
+ lastPhaseId = (PhaseId) facesContext.getAttributes().get(LAST_PHASE_PROCESSED);
+ continueProcess = true;
+ }
+ if (PhaseId.RENDER_RESPONSE.equals(phaseId))
+ {
+ return;
+ }
+ if (continueProcess || PhaseId.INVOKE_APPLICATION.equals(lastPhaseId))
+ {
+ renderResponse(facesContext);
+ lastPhaseId = (PhaseId) facesContext.getAttributes().get(LAST_PHASE_PROCESSED);
+ continueProcess = true;
+ }
+ }
+
+ public void processRemainingExecutePhases(FacesContext facesContext)
{
PhaseId lastPhaseId = (PhaseId) facesContext.getAttributes().get(LAST_PHASE_PROCESSED);
if (lastPhaseId == null)
@@ -492,34 +586,34 @@ public abstract class AbstractMyFacesTes
boolean continueProcess = false;
if (PhaseId.RESTORE_VIEW.equals(lastPhaseId))
{
- processApplyRequestValuesPhase(facesContext);
+ applyRequestValues(facesContext);
continueProcess = true;
}
if (continueProcess || PhaseId.APPLY_REQUEST_VALUES.equals(lastPhaseId))
{
- processValidationsPhase(facesContext);
+ processValidations(facesContext);
continueProcess = true;
}
if (continueProcess || PhaseId.PROCESS_VALIDATIONS.equals(lastPhaseId))
{
- processUpdateModelPhase(facesContext);
+ updateModelValues(facesContext);
continueProcess = true;
}
if (continueProcess || PhaseId.UPDATE_MODEL_VALUES.equals(lastPhaseId))
{
- processInvokeApplicationPhase(facesContext);
+ invokeApplication(facesContext);
continueProcess = true;
}
}
}
- protected void processRemainingPhases(FacesContext facesContext) throws Exception
+ public void processRemainingPhases(FacesContext facesContext)
{
PhaseId lastPhaseId = (PhaseId) facesContext.getAttributes().get(LAST_PHASE_PROCESSED);
if (lastPhaseId == null)
{
processLifecycleExecute(facesContext);
- processRender(facesContext);
+ renderResponse(facesContext);
return;
}
else
@@ -527,22 +621,22 @@ public abstract class AbstractMyFacesTes
boolean continueProcess = false;
if (PhaseId.RESTORE_VIEW.equals(lastPhaseId))
{
- processApplyRequestValuesPhase(facesContext);
+ applyRequestValues(facesContext);
continueProcess = true;
}
if (continueProcess || PhaseId.APPLY_REQUEST_VALUES.equals(lastPhaseId))
{
- processValidationsPhase(facesContext);
+ processValidations(facesContext);
continueProcess = true;
}
if (continueProcess || PhaseId.PROCESS_VALIDATIONS.equals(lastPhaseId))
{
- processUpdateModelPhase(facesContext);
+ updateModelValues(facesContext);
continueProcess = true;
}
if (continueProcess || PhaseId.UPDATE_MODEL_VALUES.equals(lastPhaseId))
{
- processInvokeApplicationPhase(facesContext);
+ invokeApplication(facesContext);
continueProcess = true;
}
if (continueProcess || PhaseId.INVOKE_APPLICATION.equals(lastPhaseId))
@@ -550,7 +644,7 @@ public abstract class AbstractMyFacesTes
Integer step = (Integer) facesContext.getAttributes().get(LAST_RENDER_PHASE_STEP);
if (step == null)
{
- processRender(facesContext);
+ renderResponse(facesContext);
}
else
{
@@ -585,41 +679,75 @@ public abstract class AbstractMyFacesTes
return false;
}
- protected void executeBeforeRender(FacesContext facesContext) throws Exception
+ public void executeBeforeRender(FacesContext facesContext)
{
if (lifecycle instanceof LifecycleImpl)
{
LifecycleImpl lifecycleImpl = (LifecycleImpl) lifecycle;
Object phaseExecutor = null;
- Field renderExecutorField = lifecycleImpl.getClass().getDeclaredField("renderExecutor");
- if (!renderExecutorField.isAccessible())
- {
- renderExecutorField.setAccessible(true);
- }
- phaseExecutor = renderExecutorField.get(lifecycleImpl);
-
- if (facesContext.getResponseComplete())
- {
- return;
- }
-
- Object phaseManager = facesContext.getAttributes().get(PHASE_MANAGER_INSTANCE);
- if (phaseManager == null)
+ Object phaseManager = null;
+ try
{
- Method getPhaseListenersMethod = lifecycleImpl.getClass().getDeclaredMethod("getPhaseListeners");
- if (!getPhaseListenersMethod.isAccessible())
+ Field renderExecutorField = lifecycleImpl.getClass().getDeclaredField("renderExecutor");
+ if (!renderExecutorField.isAccessible())
{
- getPhaseListenersMethod.setAccessible(true);
+ renderExecutorField.setAccessible(true);
}
-
- Constructor<?> plmc = PHASE_MANAGER_CLASS.getDeclaredConstructor(new Class[]{Lifecycle.class, FacesContext.class, PhaseListener[].class});
- if (!plmc.isAccessible())
+ phaseExecutor = renderExecutorField.get(lifecycleImpl);
+
+ if (facesContext.getResponseComplete())
{
- plmc.setAccessible(true);
+ return;
}
- phaseManager = plmc.newInstance(lifecycle, facesContext, getPhaseListenersMethod.invoke(lifecycleImpl, null));
- facesContext.getAttributes().put(PHASE_MANAGER_INSTANCE, phaseManager);
+
+ phaseManager = facesContext.getAttributes().get(PHASE_MANAGER_INSTANCE);
+ if (phaseManager == null)
+ {
+ Method getPhaseListenersMethod = lifecycleImpl.getClass().getDeclaredMethod("getPhaseListeners");
+ if (!getPhaseListenersMethod.isAccessible())
+ {
+ getPhaseListenersMethod.setAccessible(true);
+ }
+
+ Constructor<?> plmc = PHASE_MANAGER_CLASS.getDeclaredConstructor(
+ new Class[]{Lifecycle.class, FacesContext.class, PhaseListener[].class});
+ if (!plmc.isAccessible())
+ {
+ plmc.setAccessible(true);
+ }
+ phaseManager = plmc.newInstance(lifecycle, facesContext, getPhaseListenersMethod.invoke(
+ lifecycleImpl, null));
+ facesContext.getAttributes().put(PHASE_MANAGER_INSTANCE, phaseManager);
+ }
+ }
+ catch (NoSuchFieldException ex)
+ {
+ throw new IllegalStateException("Cannot get executors from LifecycleImpl", ex);
+ }
+ catch (SecurityException ex)
+ {
+ throw new UnsupportedOperationException("Cannot get executors from LifecycleImpl", ex);
+ }
+ catch (IllegalArgumentException ex)
+ {
+ throw new UnsupportedOperationException("Cannot get executors from LifecycleImpl", ex);
+ }
+ catch (IllegalAccessException ex)
+ {
+ throw new UnsupportedOperationException("Cannot get executors from LifecycleImpl", ex);
+ }
+ catch (NoSuchMethodException ex)
+ {
+ throw new UnsupportedOperationException("Cannot get executors from LifecycleImpl", ex);
+ }
+ catch (InvocationTargetException ex)
+ {
+ throw new UnsupportedOperationException("Cannot get executors from LifecycleImpl", ex);
+ }
+ catch (InstantiationException ex)
+ {
+ throw new UnsupportedOperationException("Cannot get executors from LifecycleImpl", ex);
}
Flash flash = facesContext.getExternalContext().getFlash();
@@ -689,7 +817,7 @@ public abstract class AbstractMyFacesTes
}
}
- public void executeBuildViewCycle(FacesContext facesContext) throws Exception
+ public void executeBuildViewCycle(FacesContext facesContext)
{
Application application = facesContext.getApplication();
ViewHandler viewHandler = application.getViewHandler();
@@ -811,48 +939,81 @@ public abstract class AbstractMyFacesTes
}
}
- public void executeAfterRender(FacesContext facesContext) throws Exception
+ public void executeAfterRender(FacesContext facesContext)
{
if (lifecycle instanceof LifecycleImpl)
{
LifecycleImpl lifecycleImpl = (LifecycleImpl) lifecycle;
Object phaseExecutor = null;
- Field renderExecutorField = lifecycleImpl.getClass().getDeclaredField("renderExecutor");
- if (!renderExecutorField.isAccessible())
+ Object phaseManager = null;
+ Method informPhaseListenersAfterMethod = null;
+ try
{
- renderExecutorField.setAccessible(true);
- }
- phaseExecutor = renderExecutorField.get(lifecycleImpl);
+ Field renderExecutorField = lifecycleImpl.getClass().getDeclaredField("renderExecutor");
+ if (!renderExecutorField.isAccessible())
+ {
+ renderExecutorField.setAccessible(true);
+ }
+ phaseExecutor = renderExecutorField.get(lifecycleImpl);
- Object phaseManager = facesContext.getAttributes().get(PHASE_MANAGER_INSTANCE);
- if (phaseManager == null)
- {
- Method getPhaseListenersMethod = lifecycleImpl.getClass().getDeclaredMethod("getPhaseListeners");
- if (!getPhaseListenersMethod.isAccessible())
+ phaseManager = facesContext.getAttributes().get(PHASE_MANAGER_INSTANCE);
+ if (phaseManager == null)
{
- getPhaseListenersMethod.setAccessible(true);
+ Method getPhaseListenersMethod = lifecycleImpl.getClass().getDeclaredMethod("getPhaseListeners");
+ if (!getPhaseListenersMethod.isAccessible())
+ {
+ getPhaseListenersMethod.setAccessible(true);
+ }
+
+ Constructor<?> plmc = PHASE_MANAGER_CLASS.getDeclaredConstructor(new Class[]{Lifecycle.class, FacesContext.class, PhaseListener[].class});
+ if (!plmc.isAccessible())
+ {
+ plmc.setAccessible(true);
+ }
+ phaseManager = plmc.newInstance(lifecycle, facesContext, getPhaseListenersMethod.invoke(lifecycleImpl, null));
+ facesContext.getAttributes().put(PHASE_MANAGER_INSTANCE, phaseManager);
}
-
- Constructor<?> plmc = PHASE_MANAGER_CLASS.getDeclaredConstructor(new Class[]{Lifecycle.class, FacesContext.class, PhaseListener[].class});
- if (!plmc.isAccessible())
+
+ //phaseListenerMgr.informPhaseListenersAfter(renderExecutor.getPhase());
+ informPhaseListenersAfterMethod = phaseManager.getClass().getDeclaredMethod("informPhaseListenersAfter", PhaseId.class);
+ if(!(informPhaseListenersAfterMethod.isAccessible()))
{
- plmc.setAccessible(true);
+ informPhaseListenersAfterMethod.setAccessible(true);
}
- phaseManager = plmc.newInstance(lifecycle, facesContext, getPhaseListenersMethod.invoke(lifecycleImpl, null));
- facesContext.getAttributes().put(PHASE_MANAGER_INSTANCE, phaseManager);
+
+ informPhaseListenersAfterMethod.invoke(phaseManager, PhaseId.RENDER_RESPONSE);
}
-
-
- Flash flash = facesContext.getExternalContext().getFlash();
-
- //phaseListenerMgr.informPhaseListenersAfter(renderExecutor.getPhase());
- Method informPhaseListenersAfterMethod = phaseManager.getClass().getDeclaredMethod("informPhaseListenersAfter", PhaseId.class);
- if(!(informPhaseListenersAfterMethod.isAccessible()))
+ catch (NoSuchFieldException ex)
+ {
+ throw new IllegalStateException("Cannot get executors from LifecycleImpl", ex);
+ }
+ catch (SecurityException ex)
{
- informPhaseListenersAfterMethod.setAccessible(true);
+ throw new UnsupportedOperationException("Cannot get executors from LifecycleImpl", ex);
}
- informPhaseListenersAfterMethod.invoke(phaseManager, PhaseId.RENDER_RESPONSE);
+ catch (IllegalArgumentException ex)
+ {
+ throw new UnsupportedOperationException("Cannot get executors from LifecycleImpl", ex);
+ }
+ catch (IllegalAccessException ex)
+ {
+ throw new UnsupportedOperationException("Cannot get executors from LifecycleImpl", ex);
+ }
+ catch (NoSuchMethodException ex)
+ {
+ throw new UnsupportedOperationException("Cannot get executors from LifecycleImpl", ex);
+ }
+ catch (InvocationTargetException ex)
+ {
+ throw new UnsupportedOperationException("Cannot get executors from LifecycleImpl", ex);
+ }
+ catch (InstantiationException ex)
+ {
+ throw new UnsupportedOperationException("Cannot get executors from LifecycleImpl", ex);
+ }
+
+ Flash flash = facesContext.getExternalContext().getFlash();
flash.doPostPhaseActions(facesContext);
@@ -877,7 +1038,7 @@ public abstract class AbstractMyFacesTes
* @param phase
* @throws Exception
*/
- protected void executePhase(FacesContext facesContext, PhaseId phase) throws Exception
+ protected void executePhase(FacesContext facesContext, PhaseId phase)
{
if (lifecycle instanceof LifecycleImpl)
{
@@ -889,52 +1050,86 @@ public abstract class AbstractMyFacesTes
phase.equals(PhaseId.UPDATE_MODEL_VALUES) ? 3 :
phase.equals(PhaseId.INVOKE_APPLICATION) ? 4 : 5 ;
+ Method executePhaseMethod = null;
+ Object phaseManager = null;
Object phaseExecutor = null;
- if (phaseId < 5)
+ try
{
- Field lifecycleExecutorsField = lifecycleImpl.getClass().getDeclaredField("lifecycleExecutors");
- if (!lifecycleExecutorsField.isAccessible())
+ if (phaseId < 5)
{
- lifecycleExecutorsField.setAccessible(true);
+ Field lifecycleExecutorsField;
+ lifecycleExecutorsField = lifecycleImpl.getClass().getDeclaredField("lifecycleExecutors");
+ if (!lifecycleExecutorsField.isAccessible())
+ {
+ lifecycleExecutorsField.setAccessible(true);
+ }
+ phaseExecutor = ((Object[])lifecycleExecutorsField.get(lifecycleImpl))[phaseId];
}
- phaseExecutor = ((Object[])lifecycleExecutorsField.get(lifecycleImpl))[phaseId];
- }
- else
- {
- Field renderExecutorField = lifecycleImpl.getClass().getDeclaredField("renderExecutor");
- if (!renderExecutorField.isAccessible())
+ else
{
- renderExecutorField.setAccessible(true);
+ Field renderExecutorField = lifecycleImpl.getClass().getDeclaredField("renderExecutor");
+ if (!renderExecutorField.isAccessible())
+ {
+ renderExecutorField.setAccessible(true);
+ }
+ phaseExecutor = renderExecutorField.get(lifecycleImpl);
}
- phaseExecutor = renderExecutorField.get(lifecycleImpl);
- }
-
- Object phaseManager = facesContext.getAttributes().get(PHASE_MANAGER_INSTANCE);
- if (phaseManager == null)
- {
- Method getPhaseListenersMethod = lifecycleImpl.getClass().getDeclaredMethod("getPhaseListeners");
- if (!getPhaseListenersMethod.isAccessible())
+
+ phaseManager = facesContext.getAttributes().get(PHASE_MANAGER_INSTANCE);
+ if (phaseManager == null)
{
- getPhaseListenersMethod.setAccessible(true);
+ Method getPhaseListenersMethod = lifecycleImpl.getClass().getDeclaredMethod("getPhaseListeners");
+ if (!getPhaseListenersMethod.isAccessible())
+ {
+ getPhaseListenersMethod.setAccessible(true);
+ }
+
+ Constructor<?> plmc = PHASE_MANAGER_CLASS.getDeclaredConstructor(new Class[]{Lifecycle.class, FacesContext.class, PhaseListener[].class});
+ if (!plmc.isAccessible())
+ {
+ plmc.setAccessible(true);
+ }
+ phaseManager = plmc.newInstance(lifecycle, facesContext, getPhaseListenersMethod.invoke(lifecycleImpl, null));
+ facesContext.getAttributes().put(PHASE_MANAGER_INSTANCE, phaseManager);
}
-
- Constructor<?> plmc = PHASE_MANAGER_CLASS.getDeclaredConstructor(new Class[]{Lifecycle.class, FacesContext.class, PhaseListener[].class});
- if (!plmc.isAccessible())
+
+ executePhaseMethod = lifecycleImpl.getClass().getDeclaredMethod("executePhase", new Class[]{
+ FacesContext.class, PHASE_EXECUTOR_CLASS, PHASE_MANAGER_CLASS});
+ if (!executePhaseMethod.isAccessible())
{
- plmc.setAccessible(true);
+ executePhaseMethod.setAccessible(true);
}
- phaseManager = plmc.newInstance(lifecycle, facesContext, getPhaseListenersMethod.invoke(lifecycleImpl, null));
- facesContext.getAttributes().put(PHASE_MANAGER_INSTANCE, phaseManager);
+
+ executePhaseMethod.invoke(lifecycleImpl, facesContext, phaseExecutor, phaseManager);
}
-
- Method executePhaseMethod = lifecycleImpl.getClass().getDeclaredMethod("executePhase", new Class[]{
- FacesContext.class, PHASE_EXECUTOR_CLASS, PHASE_MANAGER_CLASS});
- if (!executePhaseMethod.isAccessible())
+ catch (NoSuchFieldException ex)
{
- executePhaseMethod.setAccessible(true);
+ throw new IllegalStateException("Cannot get executors from LifecycleImpl", ex);
}
-
- executePhaseMethod.invoke(lifecycleImpl, facesContext, phaseExecutor, phaseManager);
+ catch (SecurityException ex)
+ {
+ throw new UnsupportedOperationException("Cannot get executors from LifecycleImpl", ex);
+ }
+ catch (IllegalArgumentException ex)
+ {
+ throw new UnsupportedOperationException("Cannot get executors from LifecycleImpl", ex);
+ }
+ catch (IllegalAccessException ex)
+ {
+ throw new UnsupportedOperationException("Cannot get executors from LifecycleImpl", ex);
+ }
+ catch (NoSuchMethodException ex)
+ {
+ throw new UnsupportedOperationException("Cannot get executors from LifecycleImpl", ex);
+ }
+ catch (InvocationTargetException ex)
+ {
+ throw new UnsupportedOperationException("Cannot get executors from LifecycleImpl", ex);
+ }
+ catch (InstantiationException ex)
+ {
+ throw new UnsupportedOperationException("Cannot get executors from LifecycleImpl", ex);
+ }
if (phase.equals(PhaseId.RENDER_RESPONSE))
{
@@ -962,6 +1157,7 @@ public abstract class AbstractMyFacesTes
// Servlet objects
protected MockServletConfig servletConfig = null;
protected MockServletContext servletContext = null;
+ protected MockWebContainer webContainer = null;
// MyFaces specific objects created by the servlet environment
protected StartupServletContextListener listener = null;
@@ -972,6 +1168,9 @@ public abstract class AbstractMyFacesTes
protected Lifecycle lifecycle;
private static FacesConfig standardFacesConfig;
+ private static Map<String, SharedFacesConfiguration> sharedConfiguration =
+ new ConcurrentHashMap<String, SharedFacesConfiguration>();
+ private SharedFacesConfiguration jsfConfiguration;
// ------------------------------------------------------ Subclasses
@@ -1010,47 +1209,98 @@ public abstract class AbstractMyFacesTes
public FacesConfig getAnnotationsFacesConfig(ExternalContext ectx,
boolean metadataComplete)
{
- FacesConfig facesConfig = null;
- if (isScanAnnotations())
+ FacesConfig facesConfig = jsfConfiguration.getAnnotationsFacesConfig();
+ if (facesConfig == null)
{
- facesConfig = super.getAnnotationsFacesConfig(ectx, metadataComplete);
- }
-
- ManagedBeans annoManagedBeans = testCase.getClass().getAnnotation(ManagedBeans.class);
- if (annoManagedBeans != null)
- {
- if (facesConfig == null)
+ if (isScanAnnotations())
{
- facesConfig = new org.apache.myfaces.config.impl.digester.elements.FacesConfigImpl();
+ facesConfig = super.getAnnotationsFacesConfig(ectx, metadataComplete);
}
- for (PageBean annoPageBean : annoManagedBeans.values())
+
+ ManagedBeans annoManagedBeans = testCase.getClass().getAnnotation(ManagedBeans.class);
+ if (annoManagedBeans != null)
{
+ if (facesConfig == null)
+ {
+ facesConfig = new org.apache.myfaces.config.impl.digester.elements.FacesConfigImpl();
+ }
+ for (PageBean annoPageBean : annoManagedBeans.values())
+ {
+ org.apache.myfaces.config.impl.digester.elements.ManagedBeanImpl bean = new
+ org.apache.myfaces.config.impl.digester.elements.ManagedBeanImpl();
+ bean.setBeanClass(annoPageBean.clazz().getName());
+ bean.setName(annoPageBean.name() == null ? annoPageBean.clazz().getName() : annoPageBean.name());
+ bean.setScope(annoPageBean.scope() == null ? "request" : annoPageBean.scope());
+ bean.setEager(Boolean.toString(annoPageBean.eager()));
+
+ ((org.apache.myfaces.config.impl.digester.elements.FacesConfigImpl)facesConfig).addManagedBean(bean);
+ }
+ }
+
+ PageBean annoPageBean = testCase.getClass().getAnnotation(PageBean.class);
+ if (annoPageBean != null)
+ {
+ if (facesConfig == null)
+ {
+ facesConfig = new org.apache.myfaces.config.impl.digester.elements.FacesConfigImpl();
+ }
org.apache.myfaces.config.impl.digester.elements.ManagedBeanImpl bean = new
org.apache.myfaces.config.impl.digester.elements.ManagedBeanImpl();
bean.setBeanClass(annoPageBean.clazz().getName());
bean.setName(annoPageBean.name() == null ? annoPageBean.clazz().getName() : annoPageBean.name());
bean.setScope(annoPageBean.scope() == null ? "request" : annoPageBean.scope());
bean.setEager(Boolean.toString(annoPageBean.eager()));
-
+
((org.apache.myfaces.config.impl.digester.elements.FacesConfigImpl)facesConfig).addManagedBean(bean);
}
+ jsfConfiguration.setAnnotationFacesConfig(facesConfig);
}
+ return facesConfig;
+ }
- PageBean annoPageBean = testCase.getClass().getAnnotation(PageBean.class);
- if (annoPageBean != null)
+ @Override
+ public List<FacesConfig> getClassloaderFacesConfig(ExternalContext ectx)
+ {
+ List<FacesConfig> list = jsfConfiguration.getClassloaderFacesConfig();
+ if (list == null)
{
- if (facesConfig == null)
- {
- facesConfig = new org.apache.myfaces.config.impl.digester.elements.FacesConfigImpl();
- }
- org.apache.myfaces.config.impl.digester.elements.ManagedBeanImpl bean = new
- org.apache.myfaces.config.impl.digester.elements.ManagedBeanImpl();
- bean.setBeanClass(annoPageBean.clazz().getName());
- bean.setName(annoPageBean.name() == null ? annoPageBean.clazz().getName() : annoPageBean.name());
- bean.setScope(annoPageBean.scope() == null ? "request" : annoPageBean.scope());
- bean.setEager(Boolean.toString(annoPageBean.eager()));
-
- ((org.apache.myfaces.config.impl.digester.elements.FacesConfigImpl)facesConfig).addManagedBean(bean);
+ list = super.getClassloaderFacesConfig(ectx);
+ jsfConfiguration.setClassloaderFacesConfig(list);
+ }
+ return list;
+ }
+
+ @Override
+ public List<FacesConfig> getFaceletTaglibFacesConfig(ExternalContext externalContext)
+ {
+ List<FacesConfig> list = jsfConfiguration.getFaceletTaglibFacesConfig();
+ if (list == null)
+ {
+ list = super.getFaceletTaglibFacesConfig(externalContext);
+ jsfConfiguration.setFaceletTaglibFacesConfig(list);
+ }
+ return list;
+ }
+
+ @Override
+ public List<FacesConfig> getFacesFlowFacesConfig(ExternalContext ectx)
+ {
+ List<FacesConfig> list = jsfConfiguration.getFacesFlowFacesConfig();
+ if (list == null)
+ {
+ list = super.getFacesFlowFacesConfig(ectx);
+ jsfConfiguration.setFacesFlowFacesConfig(list);
+ }
+ return list;
+ }
+
+ @Override
+ public FacesConfig getMetaInfServicesFacesConfig(ExternalContext ectx)
+ {
+ FacesConfig facesConfig = jsfConfiguration.getMetaInfServicesFacesConfig();
+ if (facesConfig == null)
+ {
+ facesConfig = super.getMetaInfServicesFacesConfig(ectx);
}
return facesConfig;
}
@@ -1111,4 +1361,143 @@ public abstract class AbstractMyFacesTes
ConfigFilesXmlValidationUtils.validateFacesConfigFile(url, ectx, version);
}
}
+
+ protected class JUnitFacesInitializer extends AbstractFacesInitializer
+ {
+ private final AbstractMyFacesTestCase testCase;
+
+ public JUnitFacesInitializer(AbstractMyFacesTestCase testCase)
+ {
+ this.testCase = testCase;
+ }
+
+ @Override
+ protected void initContainerIntegration(ServletContext servletContext,
+ ExternalContext externalContext)
+ {
+ ExpressionFactory expressionFactory = createExpressionFactory();
+
+ RuntimeConfig runtimeConfig = buildConfiguration(servletContext, externalContext, expressionFactory);
+ }
+
+ public AbstractMyFacesTestCase getTestCase()
+ {
+ return testCase;
+ }
+
+ }
+
+ protected static class SharedFacesConfiguration
+ {
+ private List<FacesConfig> classloaderFacesConfig;
+ private FacesConfig annotationFacesConfig;
+ private List<FacesConfig> faceletTaglibFacesConfig;
+ private List<FacesConfig> facesFlowFacesConfig;
+ private FacesConfig metaInfServicesFacesConfig;
+ private List<FacesConfig> contextSpecifiedFacesConfig;
+
+ /**
+ * @return the annotationFacesConfig
+ */
+ public FacesConfig getAnnotationsFacesConfig()
+ {
+ return annotationFacesConfig;
+ }
+
+ /**
+ * @param annotationFacesConfig the annotationFacesConfig to set
+ */
+ public void setAnnotationFacesConfig(FacesConfig annotationFacesConfig)
+ {
+ this.annotationFacesConfig = annotationFacesConfig;
+ }
+
+ /**
+ * @return the annotationFacesConfig
+ */
+ public FacesConfig getAnnotationFacesConfig()
+ {
+ return annotationFacesConfig;
+ }
+
+ /**
+ * @return the faceletTaglibFacesConfig
+ */
+ public List<FacesConfig> getFaceletTaglibFacesConfig()
+ {
+ return faceletTaglibFacesConfig;
+ }
+
+ /**
+ * @param faceletTaglibFacesConfig the faceletTaglibFacesConfig to set
+ */
+ public void setFaceletTaglibFacesConfig(List<FacesConfig> faceletTaglibFacesConfig)
+ {
+ this.faceletTaglibFacesConfig = faceletTaglibFacesConfig;
+ }
+
+ /**
+ * @return the facesFlowFacesConfig
+ */
+ public List<FacesConfig> getFacesFlowFacesConfig()
+ {
+ return facesFlowFacesConfig;
+ }
+
+ /**
+ * @param facesFlowFacesConfig the facesFlowFacesConfig to set
+ */
+ public void setFacesFlowFacesConfig(List<FacesConfig> facesFlowFacesConfig)
+ {
+ this.facesFlowFacesConfig = facesFlowFacesConfig;
+ }
+
+ /**
+ * @return the metaInfServicesFacesConfig
+ */
+ public FacesConfig getMetaInfServicesFacesConfig()
+ {
+ return metaInfServicesFacesConfig;
+ }
+
+ /**
+ * @param metaInfServicesFacesConfig the metaInfServicesFacesConfig to set
+ */
+ public void setMetaInfServicesFacesConfig(FacesConfig metaInfServicesFacesConfig)
+ {
+ this.metaInfServicesFacesConfig = metaInfServicesFacesConfig;
+ }
+
+ /**
+ * @return the contextSpecifiedFacesConfig
+ */
+ public List<FacesConfig> getContextSpecifiedFacesConfig()
+ {
+ return contextSpecifiedFacesConfig;
+ }
+
+ /**
+ * @param contextSpecifiedFacesConfig the contextSpecifiedFacesConfig to set
+ */
+ public void setContextSpecifiedFacesConfig(List<FacesConfig> contextSpecifiedFacesConfig)
+ {
+ this.contextSpecifiedFacesConfig = contextSpecifiedFacesConfig;
+ }
+
+ /**
+ * @return the classloaderFacesConfigList
+ */
+ public List<FacesConfig> getClassloaderFacesConfig()
+ {
+ return classloaderFacesConfig;
+ }
+
+ /**
+ * @param classloaderFacesConfigList the classloaderFacesConfigList to set
+ */
+ public void setClassloaderFacesConfig(List<FacesConfig> classloaderFacesConfigList)
+ {
+ this.classloaderFacesConfig = classloaderFacesConfigList;
+ }
+ }
}
Modified: myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/mc/test/core/MockMyFacesClient.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/mc/test/core/MockMyFacesClient.java?rev=1561418&r1=1561417&r2=1561418&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/mc/test/core/MockMyFacesClient.java (original)
+++ myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/mc/test/core/MockMyFacesClient.java Sat Jan 25 22:54:34 2014
@@ -20,6 +20,7 @@ package org.apache.myfaces.mc.test.core;
import java.util.HashMap;
import java.util.Map;
+import javax.faces.FacesException;
import javax.faces.component.UICommand;
import javax.faces.component.UIComponent;
@@ -32,10 +33,13 @@ import javax.faces.component.visit.Visit
import javax.faces.context.FacesContext;
import javax.faces.render.ResponseStateManager;
import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
import org.apache.myfaces.shared.renderkit.RendererUtils;
import org.apache.myfaces.test.mock.MockHttpServletRequest;
import org.apache.myfaces.test.mock.MockHttpServletResponse;
+import org.junit.Assert;
/**
* Client that keep track and "translate" the commands done in a JSF component.
@@ -53,36 +57,100 @@ public class MockMyFacesClient
private Map<String, Cookie> cookies = new HashMap<String, Cookie>();
private Map<String, Object> headers = new HashMap<String, Object>();
- private final FacesContext facesContext;
-
// It has sense the client has a reference over the test, because
// after all this class encapsulate some automatic operations
- private AbstractMyFacesRequestTestCase testCase;
+ private ServletMockContainer testCase;
- public MockMyFacesClient(FacesContext facesContext, AbstractMyFacesRequestTestCase testCase)
+ public MockMyFacesClient(FacesContext facesContext, ServletMockContainer testCase)
{
- this.facesContext = facesContext;
this.testCase = testCase;
}
+ public void processRedirect()
+ {
+ HttpServletResponse response = testCase.getResponse();
+ HttpServletRequest request = testCase.getRequest();
+ if (response.getStatus() == HttpServletResponse.SC_FOUND)
+ {
+ testCase.processRemainingPhases(); //testCase.processRemainingPhases();
+ testCase.endRequest();
+ String location = response.getHeader("Location");
+ String contextPath = request.getContextPath() == null ? "" : request.getContextPath();
+ String servletPath = request.getServletPath() == null ? "" : request.getServletPath();
+ int cpi = location.indexOf(contextPath);
+ int spi = cpi < 0 ? -1 : location.indexOf(servletPath, cpi+contextPath.length());
+ String viewId;
+ if (spi >= 0)
+ {
+ viewId = location.substring(spi+servletPath.length());
+ }
+ else
+ {
+ viewId = location;
+ }
+ testCase.startViewRequest(viewId);
+ }
+ else
+ {
+ Assert.fail("Expected redirect not found");
+ }
+ }
+
public void inputText(UIInput input, String text)
{
parameters.put(input.getClientId(), text);
}
- public void submit(UIComponent component) throws Exception
+ public void inputText(String clientId, String text)
+ {
+ UIComponent input = getTestCase().getFacesContext().
+ getViewRoot().findComponent(clientId);
+ if (input == null)
+ {
+ throw new FacesException("input with clientId:"+clientId+" not found");
+ }
+ else
+ {
+ parameters.put(input.getClientId(), text);
+ }
+ }
+
+ /**
+ * Simulate a submit, processing the remaining phases and setting up the new request.
+ * It delegates to client.submit, where the necessary data is gathered to be applied
+ * later on client.apply method.
+ *
+ * @param component
+ * @throws Exception
+ */
+ public void submit(UIComponent component)
{
testCase.processRemainingPhases();
this.internalSubmit((UICommand)component);
- String viewId = facesContext.getViewRoot().getViewId();
- testCase.tearDownRequest();
- testCase.setupRequest(viewId);
+ String viewId = testCase.getFacesContext().getViewRoot().getViewId();
+ testCase.endRequest();
+ testCase.startViewRequest(viewId);
+ }
+
+ public void submit(String clientId)
+ {
+ UIComponent button = getTestCase().getFacesContext().
+ getViewRoot().findComponent(clientId);
+ if (button == null)
+ {
+ throw new FacesException("button with clientId:"+clientId+" not found");
+ }
+ else
+ {
+ submit(button);
+ }
}
protected void internalSubmit(UICommand command)
{
if (command instanceof HtmlCommandButton)
{
+ final FacesContext facesContext = testCase.getFacesContext();
UIForm form = getParentForm(command);
VisitContext visitContext = VisitContext.createVisitContext(facesContext);
form.visitTree(visitContext, new VisitCallback(){
@@ -102,16 +170,19 @@ public class MockMyFacesClient
});
parameters.put(form.getClientId(facesContext)+"_SUBMIT", "1");
- parameters.put(ResponseStateManager.VIEW_STATE_PARAM, facesContext.getApplication().getStateManager().getViewState(facesContext));
Object value = command.getValue();
parameters.put(command.getClientId(), value == null ? "" : value.toString());
+
+ applyStateFromPreviousRequest();
+ /*
+ parameters.put(ResponseStateManager.VIEW_STATE_PARAM, facesContext.getApplication().getStateManager().getViewState(facesContext));
if (facesContext.getExternalContext().getClientWindow() != null)
{
parameters.put(ResponseStateManager.CLIENT_WINDOW_URL_PARAM, facesContext.getExternalContext().getClientWindow().getId());
}
MockHttpServletResponse response = (MockHttpServletResponse) facesContext.getExternalContext().getResponse();
Cookie cookie = response.getCookie("oam.Flash.RENDERMAP.TOKEN");
- getCookies().put("oam.Flash.RENDERMAP.TOKEN", cookie);
+ getCookies().put("oam.Flash.RENDERMAP.TOKEN", cookie);*/
}
}
@@ -120,21 +191,23 @@ public class MockMyFacesClient
ajax(source, event, execute, render, submit, false);
}
- public void ajax(UIComponent source, String event, String execute, String render, boolean submit, boolean resetValues) throws Exception
+ public void ajax(UIComponent source, String event, String execute, String render, boolean submit, boolean resetValues)
{
testCase.processRemainingPhases();
this.internalAjax(source, event, execute, render, submit, resetValues);
- String viewId = facesContext.getViewRoot().getViewId();
- testCase.tearDownRequest();
- testCase.setupRequest(viewId);
+ String viewId = testCase.getFacesContext().getViewRoot().getViewId();
+ testCase.endRequest();
+ testCase.startViewRequest(viewId);
}
protected void internalAjax(UIComponent source, String event, String execute, String render, boolean submit, boolean resetValues)
{
+ final FacesContext facesContext = testCase.getFacesContext();
parameters.put("javax.faces.partial.ajax", "true");
parameters.put("javax.faces.behavior.event", event);
parameters.put("javax.faces.partial.event", "action".equals(event) ? "click" : event);
- parameters.put(ResponseStateManager.VIEW_STATE_PARAM, facesContext.getApplication().getStateManager().getViewState(facesContext));
+ applyStateFromPreviousRequest();
+ //parameters.put(ResponseStateManager.VIEW_STATE_PARAM, facesContext.getApplication().getStateManager().getViewState(facesContext));
parameters.put("javax.faces.source", source.getClientId(facesContext));
if (execute == null)
{
@@ -160,14 +233,35 @@ public class MockMyFacesClient
parameters.put("javax.faces.partial.resetValues", "true");
}
- MockHttpServletResponse response = (MockHttpServletResponse) facesContext.getExternalContext().getResponse();
- Cookie cookie = response.getCookie("oam.Flash.RENDERMAP.TOKEN");
- getCookies().put("oam.Flash.RENDERMAP.TOKEN", cookie);
-
headers.put("Faces-Request", "partial/ajax");
headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
}
+ protected void applyStateFromPreviousRequest()
+ {
+ FacesContext facesContext = testCase.getFacesContext();
+
+ parameters.put(ResponseStateManager.VIEW_STATE_PARAM, facesContext.getApplication().getStateManager().getViewState(facesContext));
+ if (facesContext.getExternalContext().getClientWindow() != null)
+ {
+ parameters.put(ResponseStateManager.CLIENT_WINDOW_URL_PARAM, facesContext.getExternalContext().getClientWindow().getId());
+ }
+
+ applyCookiesFromPreviousRequest();
+ }
+
+ protected void applyCookiesFromPreviousRequest()
+ {
+ MockHttpServletResponse response = (MockHttpServletResponse) testCase.getResponse();
+ if (response.getCookies() != null && !response.getCookies().isEmpty())
+ {
+ for (Map.Entry<String, Cookie> entry : response.getCookies().entrySet())
+ {
+ getCookies().put(entry.getKey(), entry.getValue());
+ }
+ }
+ }
+
public Map<String, String> getParameters()
{
return parameters;
@@ -231,8 +325,15 @@ public class MockMyFacesClient
request.addCookie(entry.getValue());
}
}
+
+ public void reset(FacesContext facesContext)
+ {
+ this.parameters.clear();
+ this.headers.clear();
+ this.cookies.clear();
+ }
- public AbstractMyFacesRequestTestCase getTestCase()
+ public ServletMockContainer getTestCase()
{
return testCase;
}
Added: myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/mc/test/core/ServletMockContainer.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/mc/test/core/ServletMockContainer.java?rev=1561418&view=auto
==============================================================================
--- myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/mc/test/core/ServletMockContainer.java (added)
+++ myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/mc/test/core/ServletMockContainer.java Sat Jan 25 22:54:34 2014
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.myfaces.mc.test.core;
+
+import javax.faces.context.FacesContext;
+import org.apache.myfaces.test.mock.MockHttpServletRequest;
+import org.apache.myfaces.test.mock.MockHttpServletResponse;
+
+/**
+ *
+ */
+public interface ServletMockContainer
+{
+
+ public MockHttpServletRequest getRequest();
+
+ public MockHttpServletResponse getResponse();
+
+ public FacesContext getFacesContext();
+
+ public void processRemainingPhases();
+
+ public void endRequest();
+
+ public void startViewRequest(String viewId);
+}
Propchange: myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/mc/test/core/ServletMockContainer.java
------------------------------------------------------------------------------
svn:eol-style = native