Title: [waffle-scm] [440] trunk/examples/simple-example/resources: Refactored WaffleServlet to expose messages in request after method execution.
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

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:

http://xircles.codehaus.org/manage_email

Reply via email to