- Revision
- 440
- Author
- mauro
- Date
- 2007-11-27 07:56:45 -0600 (Tue, 27 Nov 2007)
Log Message
Refactored WaffleServlet to expose messages in request after method execution. Added example usage of messages in automobile controller.
Modified Paths
- trunk/examples/simple-example/resources/automobile.jspx
- trunk/examples/simple-example/src/main/java/org/codehaus/waffle/example/simple/AutomobileController.java
- trunk/waffle-core/src/main/java/org/codehaus/waffle/servlet/WaffleServlet.java
- trunk/waffle-core/src/test/java/org/codehaus/waffle/servlet/WaffleServletTest.java
Diff
Modified: trunk/examples/simple-example/resources/automobile.jspx (439 => 440)
--- trunk/examples/simple-example/resources/automobile.jspx 2007-11-27 10:10:46 UTC (rev 439) +++ trunk/examples/simple-example/resources/automobile.jspx 2007-11-27 13:56:45 UTC (rev 440) @@ -26,6 +26,13 @@ <br/> Global: <c:out value="${waffle:findErrors(errors, 'GLOBAL')}"/> </c:if> + <c:if test="${messages.messageCount > 0}"> + <c:forEach var="message" items="${messages.messages}"> + <div style="color:green"> + ${message} + </div> + </c:forEach> + </c:if> <table> <tr>
Modified: trunk/examples/simple-example/src/main/java/org/codehaus/waffle/example/simple/AutomobileController.java (439 => 440)
--- trunk/examples/simple-example/src/main/java/org/codehaus/waffle/example/simple/AutomobileController.java 2007-11-27 10:10:46 UTC (rev 439) +++ trunk/examples/simple-example/src/main/java/org/codehaus/waffle/example/simple/AutomobileController.java 2007-11-27 13:56:45 UTC (rev 440) @@ -1,5 +1,7 @@ package org.codehaus.waffle.example.simple; +import org.codehaus.waffle.i18n.DefaultMessagesContext; +import org.codehaus.waffle.i18n.MessagesContext; import org.codehaus.waffle.validation.ErrorsContext; import org.codehaus.waffle.validation.FieldErrorMessage; @@ -9,6 +11,16 @@ private int speed = 0; private int topSpeed; + private MessagesContext messages; + + public AutomobileController(){ + this(new DefaultMessagesContext()); + } + + public AutomobileController(MessagesContext messages) { + this.messages = messages; + } + public void init(String make, String model) { this.make = make; this.model = model; @@ -44,6 +56,7 @@ public void setTopSpeed(int topSpeed) { this.topSpeed = topSpeed; + this.messages.addMessage("success", "Set top speed "+topSpeed); } public void accelerate(int value) { @@ -60,4 +73,9 @@ public void stop() { speed = 0; } + + public MessagesContext getMessages() { + return messages; + } + }
Modified: trunk/waffle-core/src/main/java/org/codehaus/waffle/servlet/WaffleServlet.java (439 => 440)
--- trunk/waffle-core/src/main/java/org/codehaus/waffle/servlet/WaffleServlet.java 2007-11-27 10:10:46 UTC (rev 439) +++ trunk/waffle-core/src/main/java/org/codehaus/waffle/servlet/WaffleServlet.java 2007-11-27 13:56:45 UTC (rev 440) @@ -16,6 +16,7 @@ import static org.codehaus.waffle.Constants.VIEW_SUFFIX_KEY; import java.io.IOException; +import java.lang.reflect.Field; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; @@ -82,7 +83,7 @@ * @param dataBinder * @param requestAttributeBinder * @param controllerDefinitionFactory - * @param messagesContext + * @param messagesContext * @param errorsContext * @param validator */ @@ -155,10 +156,9 @@ */ protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - errorsContext.clearErrorMessages(); - request.setAttribute(ERRORS_KEY, errorsContext); - request.setAttribute(MESSAGES_KEY, messagesContext); - + messagesContext.clearMessages(); + addErrorsToRequest(request); + ControllerDefinition controllerDefinition = getControllerDefinition(request, response); dataBinder.bind(request, response, errorsContext, controllerDefinition.getController()); validator.validate(controllerDefinition, errorsContext); @@ -193,6 +193,8 @@ requestAttributeBinder.bind(request, controllerDefinition.getController()); actionMethodResponseHandler.handle(request, response, actionMethodResponse); + addMessagesToRequest(request, controllerDefinition.getController()); + } catch (ActionMethodInvocationException e) { servletMonitor.servletServiceFailed(e); log(ERROR + e.getMessage()); @@ -200,7 +202,33 @@ } } + private void addErrorsToRequest(HttpServletRequest request) { + errorsContext.clearErrorMessages(); + request.setAttribute(ERRORS_KEY, errorsContext); + } + /** + * Use reflection to extract the MessagesContext from the "messages" field + * + * @param request + * @param controller + */ + //TODO Consider using other conventions or introducing an optional interface + private void addMessagesToRequest(HttpServletRequest request, Object controller) { + try { + Field messagesField = controller.getClass().getDeclaredField("messages"); + messagesField.setAccessible(true); + Object messages = messagesField.get(controller); + if ( messages instanceof MessagesContext ){ + request.setAttribute(MESSAGES_KEY, (MessagesContext)messages); + } + } catch (Exception e) { + //TODO add event to monitor + e.printStackTrace(); + } + } + + /** * Build a view back to the referring page (use the Controller's name as the View name). */ protected View buildViewToReferrer(ControllerDefinition controllerDefinition) {
Modified: trunk/waffle-core/src/test/java/org/codehaus/waffle/servlet/WaffleServletTest.java (439 => 440)
--- trunk/waffle-core/src/test/java/org/codehaus/waffle/servlet/WaffleServletTest.java 2007-11-27 10:10:46 UTC (rev 439) +++ trunk/waffle-core/src/test/java/org/codehaus/waffle/servlet/WaffleServletTest.java 2007-11-27 13:56:45 UTC (rev 440) @@ -128,7 +128,7 @@ // Mock HttpServletResponse final HttpServletResponse response = mockery.mock(HttpServletResponse.class); - + Method method = NonDispatchingController.class.getMethod("increment"); final MethodDefinition methodDefinition = new MethodDefinition(method); @@ -256,6 +256,10 @@ actionFactoryField.setAccessible(true); actionFactoryField.set(waffleServlet, controllerDefinitionFactory); + Field messagesContextField = WaffleServlet.class.getDeclaredField("messagesContext"); + messagesContextField.setAccessible(true); + messagesContextField.set(waffleServlet, new DefaultMessagesContext()); + Field errorsContextField = WaffleServlet.class.getDeclaredField("errorsContext"); errorsContextField.setAccessible(true); errorsContextField.set(waffleServlet, new DefaultErrorsContext()); @@ -276,7 +280,7 @@ one(request).getParameterNames(); will(returnValue(enumeration)); one(request).setAttribute(with(equal(Constants.ERRORS_KEY)), with(any(ErrorsContext.class))); - one(request).setAttribute(with(equal(Constants.MESSAGES_KEY)), with(a(MessagesContext.class))); + one(request).setAttribute(with(equal(Constants.MESSAGES_KEY)), with(any(MessagesContext.class))); }}); // Mock HttpServletResponse @@ -334,7 +338,6 @@ one(request).getParameterNames(); will(returnValue(enumeration)); one(request).setAttribute(with(equal(Constants.ERRORS_KEY)), with(any(ErrorsContext.class))); - one(request).setAttribute(with(equal(Constants.MESSAGES_KEY)), with(any(MessagesContext.class))); }}); // Mock HttpServletResponse @@ -389,6 +392,10 @@ servletMonitorField.setAccessible(true); servletMonitorField.set(waffleServlet, servletMonitor); + Field messagesContextField = WaffleServlet.class.getDeclaredField("messagesContext"); + messagesContextField.setAccessible(true); + messagesContextField.set(waffleServlet, new DefaultMessagesContext()); + Field errorsContextField = WaffleServlet.class.getDeclaredField("errorsContext"); errorsContextField.setAccessible(true); errorsContextField.set(waffleServlet, new DefaultErrorsContext()); @@ -452,14 +459,17 @@ public class NonDispatchingController { private int count = 0; - + private MessagesContext messages = new DefaultMessagesContext(); + public void increment() { count += 1; + messages.addMessage("success", "Incremented count"); } public int getCount() { return count; } + } public class StubServletOutputStream extends ServletOutputStream {
To unsubscribe from this list please visit:
