- Revision
- 441
- Author
- mauro
- Date
- 2007-11-29 06:53:57 -0600 (Thu, 29 Nov 2007)
Log Message
Refactored WaffleServlet not to have errors and messages context as instance variable to ensure thread-safety.
Modified Paths
Diff
Modified: trunk/waffle-core/src/main/java/org/codehaus/waffle/servlet/WaffleServlet.java (440 => 441)
--- trunk/waffle-core/src/main/java/org/codehaus/waffle/servlet/WaffleServlet.java 2007-11-27 13:56:45 UTC (rev 440) +++ trunk/waffle-core/src/main/java/org/codehaus/waffle/servlet/WaffleServlet.java 2007-11-29 12:53:57 UTC (rev 441) @@ -60,8 +60,6 @@ private DataBinder dataBinder; private RequestAttributeBinder requestAttributeBinder; private ControllerDefinitionFactory controllerDefinitionFactory; - private MessagesContext messagesContext; - private ErrorsContext errorsContext; private Validator validator; private String viewPrefix; private String viewSuffix; @@ -83,8 +81,6 @@ * @param dataBinder * @param requestAttributeBinder * @param controllerDefinitionFactory - * @param messagesContext - * @param errorsContext * @param validator */ public WaffleServlet(ActionMethodExecutor actionMethodExecutor, @@ -93,15 +89,13 @@ DataBinder dataBinder, RequestAttributeBinder requestAttributeBinder, ControllerDefinitionFactory controllerDefinitionFactory, - MessagesContext messagesContext, ErrorsContext errorsContext, Validator validator) { + Validator validator) { this.actionMethodExecutor = actionMethodExecutor; this.actionMethodResponseHandler = actionMethodResponseHandler; this.servletMonitor = servletMonitor; this.dataBinder = dataBinder; this.requestAttributeBinder = requestAttributeBinder; this.controllerDefinitionFactory = controllerDefinitionFactory; - this.messagesContext = messagesContext; - this.errorsContext = errorsContext; this.validator = validator; componentsRetrieved = true; } @@ -118,23 +112,29 @@ } if (!componentsRetrieved) { - // Retrieve required components from the Component Registry - ComponentRegistry componentRegistry = ServletContextHelper - .getComponentRegistry(getServletContext()); - actionMethodExecutor = componentRegistry.getActionMethodExecutor(); - actionMethodResponseHandler = componentRegistry.getActionMethodResponseHandler(); - servletMonitor = componentRegistry.getServletMonitor(); - dataBinder = componentRegistry.getDataBinder(); - requestAttributeBinder = componentRegistry.getRequestAttributeBinder(); - controllerDefinitionFactory = componentRegistry.getControllerDefinitionFactory(); - messagesContext = componentRegistry.getMessagesContext(); - errorsContext = componentRegistry.getErrorsContext(); - validator = componentRegistry.getValidator(); + // Retrieve instance components from the ComponentRegistry + ComponentRegistry registry = getComponentRegistry(); + actionMethodExecutor = registry.getActionMethodExecutor(); + actionMethodResponseHandler = registry.getActionMethodResponseHandler(); + servletMonitor = registry.getServletMonitor(); + dataBinder = registry.getDataBinder(); + requestAttributeBinder = registry.getRequestAttributeBinder(); + controllerDefinitionFactory = registry.getControllerDefinitionFactory(); + validator = registry.getValidator(); } } + private ComponentRegistry getComponentRegistry() { + return ServletContextHelper.getComponentRegistry(getServletContext()); + } + /** - * Obtain the controller the user is requesting. + * Obtain the controller defition the user is requesting. + * + * @param request the HttpServletRequest + * @param response the HttpServletResponse + * @return A ControllerDefinition + * @throws ServletException if controller not found */ protected ControllerDefinition getControllerDefinition(HttpServletRequest request, HttpServletResponse response) throws ServletException { @@ -149,16 +149,21 @@ /** * Responsible for servicing the requests from the users. * - * @param request - * @param response + * @param request the HttpServletResponse + * @param response the HttpServletResponse * @throws ServletException * @throws IOException */ protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + ComponentRegistry registry = getComponentRegistry(); + + ErrorsContext errorsContext = registry.getErrorsContext(); + addErrorsToRequest(request, errorsContext); + + MessagesContext messagesContext = registry.getMessagesContext(); messagesContext.clearMessages(); - addErrorsToRequest(request); - + ControllerDefinition controllerDefinition = getControllerDefinition(request, response); dataBinder.bind(request, response, errorsContext, controllerDefinition.getController()); validator.validate(controllerDefinition, errorsContext); @@ -202,7 +207,7 @@ } } - private void addErrorsToRequest(HttpServletRequest request) { + private void addErrorsToRequest(HttpServletRequest request, ErrorsContext errorsContext) { errorsContext.clearErrorMessages(); request.setAttribute(ERRORS_KEY, errorsContext); }
Modified: trunk/waffle-core/src/test/java/org/codehaus/waffle/servlet/WaffleServletTest.java (440 => 441)
--- trunk/waffle-core/src/test/java/org/codehaus/waffle/servlet/WaffleServletTest.java 2007-11-27 13:56:45 UTC (rev 440) +++ trunk/waffle-core/src/test/java/org/codehaus/waffle/servlet/WaffleServletTest.java 2007-11-29 12:53:57 UTC (rev 441) @@ -44,7 +44,6 @@ import org.codehaus.waffle.i18n.MessagesContext; import org.codehaus.waffle.monitor.ServletMonitor; import org.codehaus.waffle.monitor.SilentMonitor; -import org.codehaus.waffle.validation.DefaultErrorsContext; import org.codehaus.waffle.validation.ErrorsContext; import org.codehaus.waffle.validation.Validator; import org.codehaus.waffle.view.View; @@ -67,31 +66,36 @@ @SuppressWarnings("serial") @Test - public void canInitSetsAttributeOnServletContext() throws ServletException { + public void canConfigureComponentsViaInitAttributes() throws ServletException { // Mock ServletConfig final ServletConfig servletConfig = mockery.mock(ServletConfig.class); - final ServletContext servletContext = mockery.mock(ServletContext.class); - final ComponentRegistry componentRegistry = mockery.mock(ComponentRegistry.class); - mockery.checking(new Expectations() {{ one(servletConfig).getInitParameter(Constants.VIEW_PREFIX_KEY); will(returnValue(null)); one(servletConfig).getInitParameter(Constants.VIEW_SUFFIX_KEY); will(returnValue(".jsp")); - one(servletContext).getAttribute(ComponentRegistry.class.getName()); - will(returnValue(componentRegistry)); - // Component Registry... + }}); + + // Mock ComponentRegistry + final ComponentRegistry componentRegistry = mockery.mock(ComponentRegistry.class); + mockery.checking(new Expectations() {{ one(componentRegistry).getActionMethodExecutor(); one(componentRegistry).getActionMethodResponseHandler(); one(componentRegistry).getServletMonitor(); one(componentRegistry).getDataBinder(); one(componentRegistry).getRequestAttributeBinder(); one(componentRegistry).getControllerDefinitionFactory(); - one(componentRegistry).getMessagesContext(); - one(componentRegistry).getErrorsContext(); one(componentRegistry).getValidator(); }}); + // Mock ServletContext + final ServletContext servletContext = mockery.mock(ServletContext.class); + mockery.checking(new Expectations() {{ + one(servletContext).getAttribute(ComponentRegistry.class.getName()); + will(returnValue(componentRegistry)); + }}); + + WaffleServlet servlet = new WaffleServlet() { @Override public ServletConfig getServletConfig() { @@ -109,12 +113,33 @@ @SuppressWarnings("serial") @Test - public void canServiceForNonDispatchingController() throws Exception { + public void canServiceNonDispatchingController() throws Exception { RequestLevelContainer.set(new PicoContextContainer(new DefaultPicoContainer())); final NonDispatchingController nonDispatchingController = new NonDispatchingController(); List<?> list = Collections.EMPTY_LIST; final Enumeration<?> enumeration = Collections.enumeration(list); + // Mock ComponentRegistry + final ComponentRegistry componentRegistry = mockery.mock(ComponentRegistry.class); + mockery.checking(new Expectations() {{ + one(componentRegistry).getMessagesContext(); + one(componentRegistry).getErrorsContext(); + }}); + + // Mock ServletContext + final ServletContext servletContext = mockery.mock(ServletContext.class); + mockery.checking(new Expectations() {{ + one(servletContext).getAttribute(ComponentRegistry.class.getName()); + will(returnValue(componentRegistry)); + }}); + + // Mock ServletConfig + final ServletConfig servletConfig = mockery.mock(ServletConfig.class); + mockery.checking(new Expectations() {{ + one(servletConfig).getServletContext(); + will(returnValue(servletContext)); + }}); + // Mock HttpServletRequest final HttpServletRequest request = mockery.mock(HttpServletRequest.class); mockery.checking(new Expectations() {{ @@ -157,11 +182,15 @@ monitor, new OgnlDataBinder(new OgnlValueConverterFinder(), null, monitor), requestAttributeBinder, - null, new DefaultMessagesContext(), new DefaultErrorsContext(), validator) { + null, validator) { @Override protected ControllerDefinition getControllerDefinition(HttpServletRequest request, HttpServletResponse response) { return new ControllerDefinition("no name", nonDispatchingController, methodDefinition); } + @Override + public ServletConfig getServletConfig() { + return servletConfig; + } }; waffleServlet.service(request, response); @@ -176,6 +205,27 @@ List<?> list = Collections.EMPTY_LIST; final Enumeration<?> enumeration = Collections.enumeration(list); + // Mock ComponentRegistry + final ComponentRegistry componentRegistry = mockery.mock(ComponentRegistry.class); + mockery.checking(new Expectations() {{ + one(componentRegistry).getMessagesContext(); + one(componentRegistry).getErrorsContext(); + }}); + + // Mock ServletContext + final ServletContext servletContext = mockery.mock(ServletContext.class); + mockery.checking(new Expectations() {{ + one(servletContext).getAttribute(ComponentRegistry.class.getName()); + will(returnValue(componentRegistry)); + }}); + + // Mock ServletConfig + final ServletConfig servletConfig = mockery.mock(ServletConfig.class); + mockery.checking(new Expectations() {{ + one(servletConfig).getServletContext(); + will(returnValue(servletContext)); + }}); + // Mock HttpServletRequest final HttpServletRequest request = mockery.mock(HttpServletRequest.class); mockery.checking(new Expectations() {{ @@ -220,11 +270,15 @@ monitor, new OgnlDataBinder(new OgnlValueConverterFinder(), null, monitor), requestAttributeBinder, - null, new DefaultMessagesContext(), new DefaultErrorsContext(), validator) { + null, validator) { @Override protected ControllerDefinition getControllerDefinition(HttpServletRequest request, HttpServletResponse response) { return new ControllerDefinition("no name", nonDispatchingController, methodDefinition); } + @Override + public ServletConfig getServletConfig() { + return servletConfig; + } }; waffleServlet.service(request, response); @@ -233,6 +287,28 @@ @Test(expected = ServletException.class) public void cannotServiceIfControllerNotFound() throws Exception { + + // Mock ComponentRegistry + final ComponentRegistry componentRegistry = mockery.mock(ComponentRegistry.class); + mockery.checking(new Expectations() {{ + one(componentRegistry).getMessagesContext(); + one(componentRegistry).getErrorsContext(); + }}); + + // Mock ServletContext + final ServletContext servletContext = mockery.mock(ServletContext.class); + mockery.checking(new Expectations() {{ + one(servletContext).getAttribute(ComponentRegistry.class.getName()); + will(returnValue(componentRegistry)); + }}); + + // Mock ServletConfig + final ServletConfig servletConfig = mockery.mock(ServletConfig.class); + mockery.checking(new Expectations() {{ + one(servletConfig).getServletContext(); + will(returnValue(servletContext)); + }}); + // Mock HttpServletRequest final HttpServletRequest request = mockery.mock(HttpServletRequest.class); mockery.checking(new Expectations() {{ @@ -249,21 +325,18 @@ will(returnValue(new ControllerDefinition("junk", null, null))); }}); - WaffleServlet waffleServlet = new WaffleServlet(); + WaffleServlet waffleServlet = new WaffleServlet(){ + @Override + public ServletConfig getServletConfig() { + return servletConfig; + } + }; // Set up what normally would happen via "init()" Field actionFactoryField = WaffleServlet.class.getDeclaredField("controllerDefinitionFactory"); 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()); - waffleServlet.service(request, null); } @@ -274,6 +347,27 @@ List<?> list = Collections.EMPTY_LIST; final Enumeration<?> enumeration = Collections.enumeration(list); + // Mock ComponentRegistry + final ComponentRegistry componentRegistry = mockery.mock(ComponentRegistry.class); + mockery.checking(new Expectations() {{ + one(componentRegistry).getMessagesContext(); + one(componentRegistry).getErrorsContext(); + }}); + + // Mock ServletContext + final ServletContext servletContext = mockery.mock(ServletContext.class); + mockery.checking(new Expectations() {{ + one(servletContext).getAttribute(ComponentRegistry.class.getName()); + will(returnValue(componentRegistry)); + }}); + + // Mock ServletConfig + final ServletConfig servletConfig = mockery.mock(ServletConfig.class); + mockery.checking(new Expectations() {{ + one(servletConfig).getServletContext(); + will(returnValue(servletContext)); + }}); + // Mock HttpServletRequest final HttpServletRequest request = mockery.mock(HttpServletRequest.class); mockery.checking(new Expectations() {{ @@ -310,13 +404,16 @@ new SilentMonitor(), new OgnlDataBinder(new OgnlValueConverterFinder(), null, new SilentMonitor()), requestAttributeBinder, - null, new DefaultMessagesContext(), new DefaultErrorsContext(), validator) { + null, validator) { @Override protected ControllerDefinition getControllerDefinition(HttpServletRequest request, HttpServletResponse response) { return new ControllerDefinition("no name", nonDispatchingController, null); } - @Override + public ServletConfig getServletConfig() { + return servletConfig; + } + @Override public void log(String string) { // ignore } @@ -332,6 +429,27 @@ List<?> list = Collections.EMPTY_LIST; final Enumeration<?> enumeration = Collections.enumeration(list); + // Mock ComponentRegistry + final ComponentRegistry componentRegistry = mockery.mock(ComponentRegistry.class); + mockery.checking(new Expectations() {{ + one(componentRegistry).getMessagesContext(); + one(componentRegistry).getErrorsContext(); + }}); + + // Mock ServletContext + final ServletContext servletContext = mockery.mock(ServletContext.class); + mockery.checking(new Expectations() {{ + one(servletContext).getAttribute(ComponentRegistry.class.getName()); + will(returnValue(componentRegistry)); + }}); + + // Mock ServletConfig + final ServletConfig servletConfig = mockery.mock(ServletConfig.class); + mockery.checking(new Expectations() {{ + one(servletConfig).getServletContext(); + will(returnValue(servletContext)); + }}); + // Mock HttpServletRequest final HttpServletRequest request = mockery.mock(HttpServletRequest.class); mockery.checking(new Expectations() {{ @@ -351,8 +469,11 @@ @Override protected ControllerDefinition getControllerDefinition(HttpServletRequest request, HttpServletResponse response) { return new ControllerDefinition("no name", nonDispatchingController, new MethodDefinition(null)); + } + @Override + public ServletConfig getServletConfig() { + return servletConfig; } - @Override public void log(String string) { // ignore @@ -392,14 +513,6 @@ 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()); - Field validatorFactoryField = WaffleServlet.class.getDeclaredField("validator"); validatorFactoryField.setAccessible(true); validatorFactoryField.set(waffleServlet, validator);
To unsubscribe from this list please visit:
