- Revision
- 321
- Author
- mward
- Date
- 2007-10-10 07:36:24 -0500 (Wed, 10 Oct 2007)
Log Message
DefaultActionMethodResponseHandler will process ActionMethodExceptions so that response status code will be set correctly
Modified Paths
- trunk/core/src/main/java/org/codehaus/waffle/action/ActionMethodException.java
- trunk/core/src/main/java/org/codehaus/waffle/action/DefaultActionMethodResponseHandler.java
- trunk/core/src/test/java/org/codehaus/waffle/testmodel/FakeController.java
Added Paths
Removed Paths
Diff
Modified: trunk/core/src/main/java/org/codehaus/waffle/action/ActionMethodException.java (320 => 321)
--- trunk/core/src/main/java/org/codehaus/waffle/action/ActionMethodException.java 2007-10-09 17:42:22 UTC (rev 320) +++ trunk/core/src/main/java/org/codehaus/waffle/action/ActionMethodException.java 2007-10-10 12:36:24 UTC (rev 321) @@ -14,7 +14,29 @@ /** * This is a specialized exception that will be thrown directly from an ActionMethod. Exceptions of this type - * will set the response status code and response body specially. + * will set the response statusCode code and response body. */ public class ActionMethodException extends WaffleException { + private final int statusCode; + private final String message; + + /** + * An expected error has occurred the requestor should be notified with the appropriate status and message. + * + * @param statusCode the value the response status should be set to + * @param message the text to be returned + */ + public ActionMethodException(int statusCode, String message) { + this.statusCode = statusCode; + this.message = message; + } + + public int getStatusCode() { + return statusCode; + } + + public String getMessage() { + return message; + } + }
Modified: trunk/core/src/main/java/org/codehaus/waffle/action/DefaultActionMethodResponseHandler.java (320 => 321)
--- trunk/core/src/main/java/org/codehaus/waffle/action/DefaultActionMethodResponseHandler.java 2007-10-09 17:42:22 UTC (rev 320) +++ trunk/core/src/main/java/org/codehaus/waffle/action/DefaultActionMethodResponseHandler.java 2007-10-10 12:36:24 UTC (rev 321) @@ -58,10 +58,10 @@ if (returnValue instanceof View) { View view = (View) returnValue; viewDispatcher.dispatch(request, response, view); - } else if (returnValue instanceof Exception) { - Exception exception = (Exception) returnValue; - monitor.actionMethodExecutionFailed(exception); - response.setStatus(HttpServletResponse.SC_BAD_REQUEST); + } else if (returnValue instanceof ActionMethodException) { + ActionMethodException exception = (ActionMethodException) returnValue; + monitor.actionMethodExecutionFailed(exception); // todo ... this isn't really necessarily a true failure + response.setStatus(exception.getStatusCode()); handleResponse(response, exception.getMessage()); } else { handleResponse(response, returnValue.toString());
Copied: trunk/core/src/test/java/org/codehaus/waffle/action/DefaultActionMethodResponseHandlerTest.java (from rev 317, trunk/core/src/test/java/org/codehaus/waffle/action/DefaultActionResponseHandlerTest.java) (0 => 321)
--- trunk/core/src/test/java/org/codehaus/waffle/action/DefaultActionMethodResponseHandlerTest.java (rev 0) +++ trunk/core/src/test/java/org/codehaus/waffle/action/DefaultActionMethodResponseHandlerTest.java 2007-10-10 12:36:24 UTC (rev 321) @@ -0,0 +1,157 @@ +package org.codehaus.waffle.action; + +import org.codehaus.waffle.monitor.ActionMonitor; +import org.codehaus.waffle.testmodel.StubMonitor; +import org.codehaus.waffle.testmodel.StubViewDispatcher; +import org.codehaus.waffle.view.View; +import org.codehaus.waffle.view.ViewDispatcher; +import org.jmock.Expectations; +import org.jmock.Mockery; +import org.jmock.integration.junit4.JMock; +import org.jmock.integration.junit4.JUnit4Mockery; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; + +import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + [EMAIL PROTECTED](JMock.class) +public class DefaultActionMethodResponseHandlerTest { + private final Mockery context = new JUnit4Mockery(); + + @Test + public void constructorShouldsNotAcceptNulls() { + try { + new DefaultActionMethodResponseHandler(null, null); + Assert.fail("IllegalArgumentException expected, null is not a valid argument"); + } catch (IllegalArgumentException expected) { + // expected + } + try { + new DefaultActionMethodResponseHandler(null, new StubMonitor()); + Assert.fail("IllegalArgumentException expected, null is not a valid argument"); + } catch (IllegalArgumentException expected) { + // expected + } + try { + new DefaultActionMethodResponseHandler(new StubViewDispatcher(), null); + Assert.fail("IllegalArgumentException expected, null is not a valid argument"); + } catch (IllegalArgumentException expected) { + // expected + } + } + + @Test + public void executeShouldNotProcessResponseValueWhenResponseHasBeenCommitted() throws Exception { + final HttpServletResponse response = context.mock(HttpServletResponse.class); + context.checking(new Expectations() {{ + one (response).isCommitted(); + will(returnValue(true)); + }}); + + ViewDispatcher viewDispatcher = context.mock(ViewDispatcher.class); + ActionMonitor actionMonitor = context.mock(ActionMonitor.class); + + ActionMethodResponseHandler handler = new DefaultActionMethodResponseHandler(viewDispatcher, actionMonitor); + handler.handle(null, response, null); + } + + @Test + public void responseValueOfTypeViewShouldBeDelegatedToViewDispatcher() throws IOException, ServletException { + final View view = new View("foobar", null); + ActionMethodResponse actionMethodResponse = new ActionMethodResponse(); + actionMethodResponse.setReturnValue(view); + + final HttpServletResponse response = context.mock(HttpServletResponse.class); + context.checking(new Expectations() {{ + one (response).isCommitted(); + will(returnValue(false)); + }}); + + final HttpServletRequest request = context.mock(HttpServletRequest.class); + final ViewDispatcher viewDispatcher = context.mock(ViewDispatcher.class); + context.checking(new Expectations() {{ + one (viewDispatcher).dispatch(request, response, view); + }}); + + ActionMonitor actionMonitor = context.mock(ActionMonitor.class); + + ActionMethodResponseHandler handler = new DefaultActionMethodResponseHandler(viewDispatcher, actionMonitor); + handler.handle(request, response, actionMethodResponse); + } + + @Test + public void responseValueShouldBeWrittenToOutputStream() throws Exception { + ActionMethodResponse actionMethodResponse = new ActionMethodResponse(); + actionMethodResponse.setReturnValue("Mmmmm Waffles!"); + + final StubServletOutputStream out = new StubServletOutputStream(); + + final HttpServletResponse response = context.mock(HttpServletResponse.class); + context.checking(new Expectations() {{ + one (response).isCommitted(); + will(returnValue(false)); + one(response).getOutputStream(); + will(returnValue(out)); + one(response).flushBuffer(); + }}); + + HttpServletRequest request = context.mock(HttpServletRequest.class); + ViewDispatcher viewDispatcher = context.mock(ViewDispatcher.class); + ActionMonitor actionMonitor = context.mock(ActionMonitor.class); + + ActionMethodResponseHandler handler = new DefaultActionMethodResponseHandler(viewDispatcher, actionMonitor); + handler.handle(request, response, actionMethodResponse); + + Assert.assertEquals("Mmmmm Waffles!", out.buffer.toString()); + } + + @SuppressWarnings({"ThrowableInstanceNeverThrown"}) + @Test + public void responseValueOfTypeActionMethodExceptionShouldSetResponseCorrectly() throws IOException, ServletException { + final Exception exception = new ActionMethodException(1985, "my message"); + ActionMethodResponse actionMethodResponse = new ActionMethodResponse(); + actionMethodResponse.setReturnValue(exception); + final StubServletOutputStream out = new StubServletOutputStream(); + + HttpServletRequest request = context.mock(HttpServletRequest.class); + + final HttpServletResponse response = context.mock(HttpServletResponse.class); + context.checking(new Expectations() {{ + one (response).isCommitted(); + will(returnValue(false)); + one(response).setStatus(1985); + one(response).getOutputStream(); + will(returnValue(out)); + one(response).flushBuffer(); + }}); + + ViewDispatcher viewDispatcher = context.mock(ViewDispatcher.class); + final ActionMonitor actionMonitor = context.mock(ActionMonitor.class); + context.checking(new Expectations() {{ + one (actionMonitor).actionMethodExecutionFailed(exception); + }}); + + // must fire the exception to the monitor + ActionMethodResponseHandler handler = new DefaultActionMethodResponseHandler(viewDispatcher, actionMonitor); + handler.handle(request, response, actionMethodResponse); + + Assert.assertEquals("my message", out.buffer.toString()); + } + + private class StubServletOutputStream extends ServletOutputStream { + public StringBuffer buffer = new StringBuffer(); + + public void print(String string) throws IOException { + buffer.append(string); + } + + public void write(int b) throws IOException { + // do nothing + } + } +}
Deleted: trunk/core/src/test/java/org/codehaus/waffle/action/DefaultActionResponseHandlerTest.java (320 => 321)
--- trunk/core/src/test/java/org/codehaus/waffle/action/DefaultActionResponseHandlerTest.java 2007-10-09 17:42:22 UTC (rev 320) +++ trunk/core/src/test/java/org/codehaus/waffle/action/DefaultActionResponseHandlerTest.java 2007-10-10 12:36:24 UTC (rev 321) @@ -1,202 +0,0 @@ -package org.codehaus.waffle.action; - -import org.codehaus.waffle.monitor.ActionMonitor; -import org.codehaus.waffle.testmodel.StubMonitor; -import org.codehaus.waffle.testmodel.StubViewDispatcher; -import org.codehaus.waffle.view.View; -import org.codehaus.waffle.view.ViewDispatcher; -import org.jmock.Mock; -import org.jmock.MockObjectTestCase; - -import javax.servlet.ServletException; -import javax.servlet.ServletOutputStream; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -public class DefaultActionResponseHandlerTest extends MockObjectTestCase { - - public void testConstructorDoesNotAcceptNull() { - try { - new DefaultActionMethodResponseHandler(null, null); - fail("IllegalArgumentException expected, null is not a valid argument"); - } catch (IllegalArgumentException expected) { - // expected - } - try { - new DefaultActionMethodResponseHandler(null, new StubMonitor()); - fail("IllegalArgumentException expected, null is not a valid argument"); - } catch (IllegalArgumentException expected) { - // expected - } - try { - new DefaultActionMethodResponseHandler(new StubViewDispatcher(), null); - fail("IllegalArgumentException expected, null is not a valid argument"); - } catch (IllegalArgumentException expected) { - // expected - } - } - - public void testHandleWhenResponseIsCommitted() throws Exception { - // Mock HttpServletResponse - Mock mockHttpServletResponse = mock(HttpServletResponse.class); - mockHttpServletResponse.expects(once()) - .method("isCommitted") - .will(returnValue(true)); - HttpServletResponse response = (HttpServletResponse) mockHttpServletResponse.proxy(); - - // Mock ViewDispatcher - Mock mockViewResolver = mock(ViewDispatcher.class); - ViewDispatcher viewDispatcher = (ViewDispatcher) mockViewResolver.proxy(); - - // Mock ActionMonitor - Mock mockActionMonitor = mock(ActionMonitor.class); - ActionMonitor actionMonitor = (ActionMonitor) mockActionMonitor.proxy(); - - ActionMethodResponseHandler handler = new DefaultActionMethodResponseHandler(viewDispatcher, actionMonitor); - handler.handle(null, response, null); - } - - public void testMethodResponseWrapsView() throws IOException, ServletException { - View view = new View("foobar", null); - ActionMethodResponse actionMethodResponse = new ActionMethodResponse(); - actionMethodResponse.setReturnValue(view); - - // Mock HttpServletResponse - Mock mockResponse = mock(HttpServletResponse.class); - mockResponse.expects(once()) - .method("isCommitted") - .will(returnValue(false)); - HttpServletResponse response = (HttpServletResponse) mockResponse.proxy(); - - // Mock HttpServletRequest - Mock mockRequest = mock(HttpServletRequest.class); - HttpServletRequest request = (HttpServletRequest) mockRequest.proxy(); - - // Mock ViewDispatcher - Mock mockViewResolver = mock(ViewDispatcher.class); - mockViewResolver.expects(once()).method("dispatch"); - ViewDispatcher viewDispatcher = (ViewDispatcher) mockViewResolver.proxy(); - - // Mock ActionMonitor - Mock mockActionMonitor = mock(ActionMonitor.class); - ActionMonitor actionMonitor = (ActionMonitor) mockActionMonitor.proxy(); - - ActionMethodResponseHandler handler = new DefaultActionMethodResponseHandler(viewDispatcher, actionMonitor); - handler.handle(request, response, actionMethodResponse); - } - - public void testDirectResponseActionMethod() throws Exception { - ActionMethodResponse actionMethodResponse = new ActionMethodResponse(); - actionMethodResponse.setReturnValue("Mmmmm Waffles!"); - - // Mock HttpServletRequest - Mock mockRequest = mock(HttpServletRequest.class); - HttpServletRequest request = (HttpServletRequest) mockRequest.proxy(); - - // Mock HttpServletResponse - Mock mockResponse = mock(HttpServletResponse.class); - mockResponse.expects(once()) - .method("isCommitted") - .will(returnValue(false)); - StubServletOutputStream out = new StubServletOutputStream(); - mockResponse.expects(once()).method("getOutputStream") - .will(returnValue(out)); - mockResponse.expects(once()).method("flushBuffer"); - HttpServletResponse response = (HttpServletResponse) mockResponse.proxy(); - - // Mock ViewDispatcher - Mock mockViewResolver = mock(ViewDispatcher.class); - ViewDispatcher viewDispatcher = (ViewDispatcher) mockViewResolver.proxy(); - - // Mock ActionMonitor - Mock mockActionMonitor = mock(ActionMonitor.class); - ActionMonitor actionMonitor = (ActionMonitor) mockActionMonitor.proxy(); - - ActionMethodResponseHandler handler = new DefaultActionMethodResponseHandler(viewDispatcher, actionMonitor); - handler.handle(request, response, actionMethodResponse); - - assertEquals("Mmmmm Waffles!", out.buffer.toString()); - } - - public void testResponseIsAnException() throws IOException, ServletException { - Exception exception = new Exception("error for testing"); - ActionMethodResponse actionMethodResponse = new ActionMethodResponse(); - actionMethodResponse.setReturnValue(exception); - - // Mock HttpServletRequest - Mock mockRequest = mock(HttpServletRequest.class); - HttpServletRequest request = (HttpServletRequest) mockRequest.proxy(); - - // Mock HttpServletResponse - Mock mockResponse = mock(HttpServletResponse.class); - mockResponse.expects(once()) - .method("isCommitted") - .will(returnValue(false)); - StubServletOutputStream out = new StubServletOutputStream(); - mockResponse.expects(once()).method("setStatus") - .with(eq(HttpServletResponse.SC_BAD_REQUEST)); - mockResponse.expects(once()).method("getOutputStream") - .will(returnValue(out)); - mockResponse.expects(once()).method("flushBuffer"); - HttpServletResponse response = (HttpServletResponse) mockResponse.proxy(); - - // Mock ViewDispatcher - Mock mockViewResolver = mock(ViewDispatcher.class); - ViewDispatcher viewDispatcher = (ViewDispatcher) mockViewResolver.proxy(); - - // Mock ActionMonitor - Mock mockActionMonitor = mock(ActionMonitor.class); - // must fire the exception to the monitor - mockActionMonitor.expects(once()).method("actionMethodExecutionFailed").with(same(exception)); - ActionMonitor actionMonitor = (ActionMonitor) mockActionMonitor.proxy(); - - ActionMethodResponseHandler handler = new DefaultActionMethodResponseHandler(viewDispatcher, actionMonitor); - handler.handle(request, response, actionMethodResponse); - - assertEquals("error for testing", out.buffer.toString()); - } - - public void handleNullMethodResponse() throws IOException, ServletException { - // Mock HttpServletRequest - Mock mockRequest = mock(HttpServletRequest.class); - mockRequest.expects(once()) - .method("getHeader") - .with(eq("referer")) - .will(returnValue("foobar")); - HttpServletRequest request = (HttpServletRequest) mockRequest.proxy(); - - // Mock HttpServletResponse - Mock mockResponse = mock(HttpServletResponse.class); - mockResponse.expects(once()) - .method("isCommitted") - .will(returnValue(false)); - mockResponse.expects(once()) - .method("sendRedirect") - .with(eq("foobar")); - HttpServletResponse response = (HttpServletResponse) mockResponse.proxy(); - - // Mock ViewDispatcher - Mock mockViewResolver = mock(ViewDispatcher.class); - ViewDispatcher viewDispatcher = (ViewDispatcher) mockViewResolver.proxy(); - - // Mock ActionMonitor - Mock mockActionMonitor = mock(ActionMonitor.class); - ActionMonitor actionMonitor = (ActionMonitor) mockActionMonitor.proxy(); - - ActionMethodResponseHandler handler = new DefaultActionMethodResponseHandler(viewDispatcher, actionMonitor); - handler.handle(request, response, null); - } - - private class StubServletOutputStream extends ServletOutputStream { - public StringBuffer buffer = new StringBuffer(); - - public void print(String string) throws IOException { - buffer.append(string); - } - - public void write(int b) throws IOException { - - } - } -}
Modified: trunk/core/src/test/java/org/codehaus/waffle/testmodel/FakeController.java (320 => 321)
--- trunk/core/src/test/java/org/codehaus/waffle/testmodel/FakeController.java 2007-10-09 17:42:22 UTC (rev 320) +++ trunk/core/src/test/java/org/codehaus/waffle/testmodel/FakeController.java 2007-10-10 12:36:24 UTC (rev 321) @@ -64,7 +64,7 @@ } public void actionThrowsActionMethodException() throws ActionMethodException { - throw new ActionMethodException(); + throw new ActionMethodException(0, "blah blah"); } public void sayHello() {
To unsubscribe from this list please visit:
