- Revision
- 879
- Author
- paul
- Date
- 2009-01-15 12:58:22 -0600 (Thu, 15 Jan 2009)
Log Message
request level container killed
Modified Paths
- sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/action/AbstractMethodDefinitionFinder.java
- sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/action/InterceptingActionMethodExecutor.java
- sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/controller/ContextControllerDefinitionFactory.java
- sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/servlet/WaffleServlet.java
- sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/servlet/WaffleVelocityServlet.java
- sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/validation/DefaultValidator.java
- sandbox/v2experiment/waffle-core/src/test/java/org/codehaus/waffle/action/AbstractMethodDefinitionFinderTest.java
- sandbox/v2experiment/waffle-core/src/test/java/org/codehaus/waffle/action/InterceptingActionMethodExecutorTest.java
- sandbox/v2experiment/waffle-core/src/test/java/org/codehaus/waffle/controller/ContextControllerDefinitionFactoryTest.java
- sandbox/v2experiment/waffle-core/src/test/java/org/codehaus/waffle/servlet/WaffleServletTest.java
- sandbox/v2experiment/waffle-ruby/src/main/java/org/codehaus/waffle/ruby/servlet/RhtmlServlet.java
Added Paths
- sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/context/WaffleWebappComposer.java
Removed Paths
- sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/context/RequestLevelContainer.java
- sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/context/WaffleRequestFilter.java
- sandbox/v2experiment/waffle-core/src/test/java/org/codehaus/waffle/context/WaffleRequestFilterTest.java
Diff
Modified: sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/action/AbstractMethodDefinitionFinder.java (878 => 879)
--- sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/action/AbstractMethodDefinitionFinder.java 2009-01-15 16:35:45 UTC (rev 878) +++ sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/action/AbstractMethodDefinitionFinder.java 2009-01-15 18:58:22 UTC (rev 879) @@ -24,8 +24,6 @@ import org.codehaus.waffle.WaffleException; import org.codehaus.waffle.action.annotation.ActionMethod; import org.codehaus.waffle.bind.StringTransmuter; -import org.codehaus.waffle.context.ContextContainer; -import org.codehaus.waffle.context.RequestLevelContainer; import org.codehaus.waffle.i18n.MessageResources; import org.codehaus.waffle.i18n.MessagesContext; import org.codehaus.waffle.monitor.ActionMonitor;
Modified: sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/action/InterceptingActionMethodExecutor.java (878 => 879)
--- sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/action/InterceptingActionMethodExecutor.java 2009-01-15 16:35:45 UTC (rev 878) +++ sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/action/InterceptingActionMethodExecutor.java 2009-01-15 18:58:22 UTC (rev 879) @@ -15,8 +15,6 @@ import org.codehaus.waffle.action.intercept.InterceptorChain; import org.codehaus.waffle.action.intercept.MethodInterceptor; import org.codehaus.waffle.action.intercept.MethodInterceptorComparator; -import org.codehaus.waffle.context.ContextContainer; -import org.codehaus.waffle.context.RequestLevelContainer; import org.codehaus.waffle.controller.ControllerDefinition; import org.codehaus.waffle.monitor.ActionMonitor;
Deleted: sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/context/RequestLevelContainer.java (878 => 879)
--- sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/context/RequestLevelContainer.java 2009-01-15 16:35:45 UTC (rev 878) +++ sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/context/RequestLevelContainer.java 2009-01-15 18:58:22 UTC (rev 879) @@ -1,21 +0,0 @@ -/* - * Copyright (c) terms as published in http://waffle.codehaus.org/license.html - */ -package org.codehaus.waffle.context; - -import org.picocontainer.MutablePicoContainer; - -public class RequestLevelContainer { - private final static ThreadLocal<MutablePicoContainer> REQUEST_CONTAINER = new ThreadLocal<MutablePicoContainer>(); - - private RequestLevelContainer() { - } - - public static MutablePicoContainer get() { - return REQUEST_CONTAINER.get(); - } - - public static void set(MutablePicoContainer container) { - REQUEST_CONTAINER.set(container); - } -}
Deleted: sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/context/WaffleRequestFilter.java (878 => 879)
--- sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/context/WaffleRequestFilter.java 2009-01-15 16:35:45 UTC (rev 878) +++ sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/context/WaffleRequestFilter.java 2009-01-15 18:58:22 UTC (rev 879) @@ -1,55 +0,0 @@ -/* - * Copyright (c) terms as published in http://waffle.codehaus.org/license.html - */ -package org.codehaus.waffle.context; - -import org.codehaus.waffle.ComponentRegistry; -import org.codehaus.waffle.servlet.ServletContextHelper; -import org.picocontainer.MutablePicoContainer; - -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import java.io.IOException; - -public class WaffleRequestFilter implements Filter { - private ContextContainerFactory contextContainerFactory; - - public void init(FilterConfig filterConfig) throws ServletException { - ComponentRegistry componentRegistry = ServletContextHelper - .getComponentRegistry(filterConfig.getServletContext()); - - contextContainerFactory = componentRegistry.getContextContainerFactory(); - } - - public void doFilter(ServletRequest request, - ServletResponse response, - FilterChain filterChain) throws IOException, ServletException { - HttpServletRequest httpServletRequest = (HttpServletRequest) request; - CurrentHttpServletRequest.set(httpServletRequest); - MutablePicoContainer requestContextContainer = contextContainerFactory - .buildRequestLevelContainer(httpServletRequest); - - try { - RequestLevelContainer.set(requestContextContainer); - requestContextContainer.addComponent(request); - requestContextContainer.addComponent(response); - requestContextContainer.start(); - - filterChain.doFilter(request, response); - } finally { - requestContextContainer.stop(); - requestContextContainer.dispose(); - RequestLevelContainer.set(null); - } - } - - public void destroy() { - contextContainerFactory = null; - } - -}
Added: sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/context/WaffleWebappComposer.java (0 => 879)
--- sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/context/WaffleWebappComposer.java (rev 0) +++ sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/context/WaffleWebappComposer.java 2009-01-15 18:58:22 UTC (rev 879) @@ -0,0 +1,188 @@ +package org.codehaus.waffle.context; + +import org.picocontainer.web.WebappComposer; +import org.picocontainer.MutablePicoContainer; +import org.picocontainer.Characteristics; +import org.picocontainer.Parameter; +import org.codehaus.waffle.WaffleException; +import org.codehaus.waffle.registrar.pico.ParameterResolver; +import org.codehaus.waffle.view.ViewDispatcher; +import org.codehaus.waffle.view.DefaultViewDispatcher; +import org.codehaus.waffle.view.ViewResolver; +import org.codehaus.waffle.view.DefaultViewResolver; +import org.codehaus.waffle.validation.Validator; +import org.codehaus.waffle.validation.DefaultValidator; +import org.codehaus.waffle.monitor.ActionMonitor; +import org.codehaus.waffle.monitor.SilentMonitor; +import org.codehaus.waffle.monitor.BindMonitor; +import org.codehaus.waffle.monitor.ControllerMonitor; +import org.codehaus.waffle.monitor.ServletMonitor; +import org.codehaus.waffle.monitor.ValidationMonitor; +import org.codehaus.waffle.monitor.ViewMonitor; +import org.codehaus.waffle.i18n.MessageResources; +import org.codehaus.waffle.i18n.DefaultMessageResources; +import org.codehaus.waffle.controller.ControllerDefinitionFactory; +import org.codehaus.waffle.controller.ControllerNameResolver; +import org.codehaus.waffle.controller.ContextPathControllerNameResolver; +import org.codehaus.waffle.controller.ContextControllerDefinitionFactory; +import org.codehaus.waffle.bind.BindErrorMessageResolver; +import org.codehaus.waffle.bind.ControllerDataBinder; +import org.codehaus.waffle.bind.ViewDataBinder; +import org.codehaus.waffle.bind.IntrospectingViewDataBinder; +import org.codehaus.waffle.bind.StringTransmuter; +import org.codehaus.waffle.bind.DefaultStringTransmuter; +import org.codehaus.waffle.bind.ValueConverterFinder; +import org.codehaus.waffle.bind.ognl.OgnlBindErrorMessageResolver; +import org.codehaus.waffle.bind.ognl.OgnlControllerDataBinder; +import org.codehaus.waffle.bind.ognl.OgnlValueConverterFinder; +import org.codehaus.waffle.action.ActionMethodExecutor; +import org.codehaus.waffle.action.InterceptingActionMethodExecutor; +import org.codehaus.waffle.action.ActionMethodResponseHandler; +import org.codehaus.waffle.action.DefaultActionMethodResponseHandler; +import org.codehaus.waffle.action.ArgumentResolver; +import org.codehaus.waffle.action.HierarchicalArgumentResolver; +import org.codehaus.waffle.action.MethodDefinitionFinder; +import org.codehaus.waffle.action.AnnotatedMethodDefinitionFinder; +import org.codehaus.waffle.action.MethodNameResolver; +import org.codehaus.waffle.action.RequestParameterMethodNameResolver; + +import javax.servlet.ServletContext; +import java.util.Enumeration; + +public class WaffleWebappComposer implements WebappComposer { + + private static final String REGISTER_KEY = "register:"; + private static final String REGISTER_NON_CACHING_KEY = "registerNonCaching:"; + + private ParameterResolver parameterResolver; + + public void composeApplication(MutablePicoContainer picoContainer, ServletContext servletContext) { + picoContainer.addComponent(servletContext); + + // add all known components + picoContainer.addComponent(ActionMethodExecutor.class, locateComponentClass((Object) ActionMethodExecutor.class, (Class<?>) InterceptingActionMethodExecutor.class, servletContext)); + picoContainer.addComponent(ActionMethodResponseHandler.class, locateComponentClass((Object) ActionMethodResponseHandler.class, (Class<?>) DefaultActionMethodResponseHandler.class, servletContext)); + picoContainer.addComponent(ArgumentResolver.class, locateComponentClass((Object) ArgumentResolver.class, (Class<?>) HierarchicalArgumentResolver.class, servletContext)); + picoContainer.addComponent(MethodDefinitionFinder.class, locateComponentClass((Object) MethodDefinitionFinder.class, (Class<?>) AnnotatedMethodDefinitionFinder.class, servletContext)); + picoContainer.addComponent(MethodNameResolver.class, locateComponentClass((Object) MethodNameResolver.class, (Class<?>) RequestParameterMethodNameResolver.class, servletContext)); + picoContainer.addComponent(BindErrorMessageResolver.class, locateComponentClass((Object) BindErrorMessageResolver.class, (Class<?>) OgnlBindErrorMessageResolver.class, servletContext)); + picoContainer.addComponent(ControllerDataBinder.class, locateComponentClass((Object) ControllerDataBinder.class, (Class<?>) OgnlControllerDataBinder.class, servletContext)); + picoContainer.addComponent(ViewDataBinder.class, locateComponentClass((Object) ViewDataBinder.class, (Class<?>) IntrospectingViewDataBinder.class, servletContext)); + picoContainer.addComponent(StringTransmuter.class, locateComponentClass((Object) StringTransmuter.class, (Class<?>) DefaultStringTransmuter.class, servletContext)); + picoContainer.addComponent(ValueConverterFinder.class, locateComponentClass((Object) ValueConverterFinder.class, (Class<?>) OgnlValueConverterFinder.class, servletContext)); + picoContainer.addComponent(ControllerDefinitionFactory.class, locateComponentClass((Object) ControllerDefinitionFactory.class, (Class<?>) ContextControllerDefinitionFactory.class, servletContext)); + picoContainer.addComponent(ControllerNameResolver.class, locateComponentClass((Object) ControllerNameResolver.class, (Class<?>) ContextPathControllerNameResolver.class, servletContext)); + picoContainer.addComponent(MessageResources.class, locateComponentClass((Object) MessageResources.class, (Class<?>) DefaultMessageResources.class, servletContext)); + picoContainer.addComponent(ActionMonitor.class, locateComponentClass((Object) ActionMonitor.class, (Class<?>) SilentMonitor.class, servletContext)); + picoContainer.addComponent(BindMonitor.class, locateComponentClass((Object) BindMonitor.class, (Class<?>) SilentMonitor.class, servletContext)); + picoContainer.addComponent(ControllerMonitor.class, locateComponentClass((Object) ControllerMonitor.class, (Class<?>) SilentMonitor.class, servletContext)); + picoContainer.addComponent(ServletMonitor.class, locateComponentClass((Object) ServletMonitor.class, (Class<?>) SilentMonitor.class, servletContext)); + picoContainer.addComponent(ValidationMonitor.class, locateComponentClass((Object) ValidationMonitor.class, (Class<?>) SilentMonitor.class, servletContext)); + picoContainer.addComponent(ViewMonitor.class, locateComponentClass((Object) ViewMonitor.class, (Class<?>) SilentMonitor.class, servletContext)); + picoContainer.addComponent(Validator.class, locateComponentClass((Object) Validator.class, (Class<?>) DefaultValidator.class, servletContext)); + picoContainer.addComponent(ViewDispatcher.class, locateComponentClass((Object) ViewDispatcher.class, (Class<?>) DefaultViewDispatcher.class, servletContext)); + picoContainer.addComponent(ViewResolver.class, locateComponentClass((Object) ViewResolver.class, (Class<?>) DefaultViewResolver.class, servletContext)); + picoContainer.addComponent(ParameterResolver.class, locateComponentClass((Object) ParameterResolver.class, (Class<?>) ParameterResolver.class, servletContext)); + + // register other components + addOtherComponents(picoContainer, servletContext); + + parameterResolver = picoContainer.getComponent(ParameterResolver.class); + + } + + @SuppressWarnings("unchecked") + protected void addOtherComponents(MutablePicoContainer picoContainer, ServletContext servletContext) { + //noinspection unchecked + Enumeration<String> enums = servletContext.getInitParameterNames(); + + while (enums != null && enums.hasMoreElements()) { + String name = enums.nextElement(); + + if (name.startsWith(REGISTER_KEY)) { + String key = name.split(REGISTER_KEY)[1]; + Class concreteClass = loadClass(servletContext.getInitParameter(name)); + + picoContainer.addComponent(key, concreteClass); + } else if (name.startsWith(REGISTER_NON_CACHING_KEY)) { + String key = name.split(REGISTER_NON_CACHING_KEY)[1]; + Class concreteClass = loadClass(servletContext.getInitParameter(name)); + picoContainer.as(Characteristics.NO_CACHE).addComponent(key, concreteClass); + } + } + } + + + public void composeSession(MutablePicoContainer picoContainer) { + } + + public void composeRequest(MutablePicoContainer picoContainer) { + } + + + /** + * This method will locate the component Class to use. Each of the components can be + * overwritten by setting <code>context-param</code> in the applications <code>web.xml</code>. + * <p/> + * <code> + * <context-param> + * <param-name>org.codehaus.waffle.actions.ControllerDefinitionFactory</param-name> + * <param-value>org.myurl.FooBarControllerFactory</param-value> + * </context-param> + * </code> + * + * @param key represents the component key which the implementation should be registered under. + * @param defaultClass represents the Class to use by default (when not over-written). + * @param servletContext required to obtain the InitParameter defined for the web application. + * @throws org.codehaus.waffle.WaffleException + */ + protected Class<?> locateComponentClass(Object key, Class<?> defaultClass, ServletContext servletContext) throws WaffleException { + String parameterName; + if (key instanceof Class) { + parameterName = ((Class<?>) key).getName(); + } else if (key instanceof String) { + parameterName = (String) key; + } else { + return defaultClass; + } + + String className = servletContext.getInitParameter(parameterName); + + if (className == null || className.length() == 0) { + return defaultClass; + } else { + return loadClass(className); + } + } + + /** + * Loads class for a given name + * + * @param className the Class name + * @return The Class for the name + * @throws WaffleException if class not found + */ + private Class<?> loadClass(String className) { + try { + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + return classLoader.loadClass(className); + } catch (ClassNotFoundException e) { + throw new WaffleException(e.getMessage(), e); + } + } + + protected Parameter[] picoParameters(Object... parameters) { + if (parameters.length == 0) { + return null; // pico expects a null when no parameters + } + + Parameter[] picoParameters = new Parameter[parameters.length]; + for (int i = 0; i < parameters.length; i++) { + picoParameters[i] = parameterResolver.resolve(parameters[i]); + } + return picoParameters; + } + + + +}
Modified: sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/controller/ContextControllerDefinitionFactory.java (878 => 879)
--- sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/controller/ContextControllerDefinitionFactory.java 2009-01-15 16:35:45 UTC (rev 878) +++ sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/controller/ContextControllerDefinitionFactory.java 2009-01-15 18:58:22 UTC (rev 879) @@ -11,7 +11,6 @@ import org.codehaus.waffle.action.MethodDefinition; import org.codehaus.waffle.action.MethodDefinitionFinder; import org.codehaus.waffle.action.MissingActionMethodException; -import org.codehaus.waffle.context.ContextContainer; import org.codehaus.waffle.context.ContextContainerNotFoundException; import org.codehaus.waffle.i18n.MessageResources; import org.codehaus.waffle.i18n.MessagesContext;
Modified: sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/servlet/WaffleServlet.java (878 => 879)
--- sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/servlet/WaffleServlet.java 2009-01-15 16:35:45 UTC (rev 878) +++ sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/servlet/WaffleServlet.java 2009-01-15 18:58:22 UTC (rev 879) @@ -33,8 +33,6 @@ import org.codehaus.waffle.action.annotation.PRG; import org.codehaus.waffle.bind.ControllerDataBinder; import org.codehaus.waffle.bind.ViewDataBinder; -import org.codehaus.waffle.context.ContextContainer; -import org.codehaus.waffle.context.RequestLevelContainer; import org.codehaus.waffle.controller.ControllerDefinition; import org.codehaus.waffle.controller.ControllerDefinitionFactory; import org.codehaus.waffle.i18n.MessageResources; @@ -50,6 +48,7 @@ import org.codehaus.waffle.view.View; import org.codehaus.waffle.view.ViewResolver; import org.picocontainer.MutablePicoContainer; +import org.picocontainer.web.PicoServletContainerFilter; /** * Waffle's FrontController for handling user requests. @@ -73,6 +72,26 @@ private ServletMonitor servletMonitor; private boolean componentsRetrieved = false; + private static ThreadLocal<MutablePicoContainer> currentRequestContainer = new ThreadLocal<MutablePicoContainer>(); + private static ThreadLocal<MutablePicoContainer> currentSessionContainer = new ThreadLocal<MutablePicoContainer>(); + private static ThreadLocal<MutablePicoContainer> currentAppContainer = new ThreadLocal<MutablePicoContainer>(); + + public static class ServletFilter extends PicoServletContainerFilter { + + protected void setAppContainer(MutablePicoContainer container) { + currentAppContainer.set(container); + } + + protected void setRequestContainer(MutablePicoContainer container) { + currentRequestContainer.set(container); + } + + protected void setSessionContainer(MutablePicoContainer container) { + currentSessionContainer.set(container); + } + } + + /** * Default constructor used by servlet container */ @@ -167,7 +186,7 @@ protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { servletMonitor.servletServiceRequested(parametersOf(request)); - MutablePicoContainer requestContainer = RequestLevelContainer.get(); + MutablePicoContainer requestContainer = currentRequestContainer.get(); ErrorsContext errorsContext = requestContainer.getComponent(ErrorsContext.class); Collection<MethodInterceptor> methodInterceptors = requestContainer.getComponents(MethodInterceptor.class); MessagesContext messageContext = requestContainer.getComponent(MessagesContext.class);
Modified: sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/servlet/WaffleVelocityServlet.java (878 => 879)
--- sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/servlet/WaffleVelocityServlet.java 2009-01-15 16:35:45 UTC (rev 878) +++ sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/servlet/WaffleVelocityServlet.java 2009-01-15 18:58:22 UTC (rev 879) @@ -6,13 +6,14 @@ import org.codehaus.waffle.ComponentRegistry; import org.codehaus.waffle.Constants; import org.codehaus.waffle.i18n.MessagesContext; -import org.codehaus.waffle.context.RequestLevelContainer; import org.codehaus.waffle.context.ContextContainer; import org.codehaus.waffle.controller.ControllerDefinition; import org.codehaus.waffle.controller.ControllerDefinitionFactory; import org.apache.velocity.Template; import org.apache.velocity.context.Context; import org.apache.velocity.tools.view.servlet.VelocityViewServlet; +import org.picocontainer.MutablePicoContainer; +import org.picocontainer.web.PicoServletContainerFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -24,8 +25,29 @@ */ @SuppressWarnings("serial") public class WaffleVelocityServlet extends VelocityViewServlet { + private ControllerDefinitionFactory controllerDefinitionFactory; + private static ThreadLocal<MutablePicoContainer> currentRequestContainer = new ThreadLocal<MutablePicoContainer>(); + private static ThreadLocal<MutablePicoContainer> currentSessionContainer = new ThreadLocal<MutablePicoContainer>(); + private static ThreadLocal<MutablePicoContainer> currentAppContainer = new ThreadLocal<MutablePicoContainer>(); + + public static class ServletFilter extends WaffleServlet.ServletFilter { + + protected void setAppContainer(MutablePicoContainer container) { + currentAppContainer.set(container); + } + + protected void setRequestContainer(MutablePicoContainer container) { + currentRequestContainer.set(container); + } + + protected void setSessionContainer(MutablePicoContainer container) { + currentSessionContainer.set(container); + } + } + + public WaffleVelocityServlet(ControllerDefinitionFactory controllerDefinitionFactory) { this.controllerDefinitionFactory = controllerDefinitionFactory; } @@ -39,7 +61,7 @@ protected Template handleRequest(HttpServletRequest request, HttpServletResponse response, Context context) throws Exception { // Always add the controller to the context - ContextContainer container = (ContextContainer) RequestLevelContainer.get(); + ContextContainer container = (ContextContainer) currentRequestContainer.get(); MessagesContext messageContext = container.getComponent(MessagesContext.class); ControllerDefinition controllerDefinition = controllerDefinitionFactory.getControllerDefinition(request, response, messageContext, container); context.put(Constants.CONTROLLER_KEY, controllerDefinition.getController());
Modified: sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/validation/DefaultValidator.java (878 => 879)
--- sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/validation/DefaultValidator.java 2009-01-15 16:35:45 UTC (rev 878) +++ sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/validation/DefaultValidator.java 2009-01-15 18:58:22 UTC (rev 879) @@ -10,8 +10,6 @@ import org.codehaus.waffle.WaffleException; import org.codehaus.waffle.action.MethodDefinition; -import org.codehaus.waffle.context.ContextContainer; -import org.codehaus.waffle.context.RequestLevelContainer; import org.codehaus.waffle.controller.ControllerDefinition; import org.codehaus.waffle.monitor.ValidationMonitor;
Modified: sandbox/v2experiment/waffle-core/src/test/java/org/codehaus/waffle/action/AbstractMethodDefinitionFinderTest.java (878 => 879)
--- sandbox/v2experiment/waffle-core/src/test/java/org/codehaus/waffle/action/AbstractMethodDefinitionFinderTest.java 2009-01-15 16:35:45 UTC (rev 878) +++ sandbox/v2experiment/waffle-core/src/test/java/org/codehaus/waffle/action/AbstractMethodDefinitionFinderTest.java 2009-01-15 18:58:22 UTC (rev 879) @@ -16,8 +16,6 @@ import org.codehaus.waffle.action.annotation.ActionMethod; import org.codehaus.waffle.bind.StringTransmuter; -import org.codehaus.waffle.context.ContextContainer; -import org.codehaus.waffle.context.RequestLevelContainer; import org.codehaus.waffle.i18n.MessagesContext; import org.codehaus.waffle.testmodel.FakeControllerWithMethodDefinitions; import org.jmock.Expectations; @@ -25,7 +23,6 @@ import org.jmock.integration.junit4.JMock; import org.junit.Test; import org.junit.runner.RunWith; -import org.picocontainer.containers.AbstractDelegatingMutablePicoContainer; import org.picocontainer.MutablePicoContainer; /** @@ -531,8 +528,6 @@ } }); - RequestLevelContainer.set(contextContainer); - // Mock HttpServletRequest final HttpServletRequest request = mockery.mock(HttpServletRequest.class);
Modified: sandbox/v2experiment/waffle-core/src/test/java/org/codehaus/waffle/action/InterceptingActionMethodExecutorTest.java (878 => 879)
--- sandbox/v2experiment/waffle-core/src/test/java/org/codehaus/waffle/action/InterceptingActionMethodExecutorTest.java 2009-01-15 16:35:45 UTC (rev 878) +++ sandbox/v2experiment/waffle-core/src/test/java/org/codehaus/waffle/action/InterceptingActionMethodExecutorTest.java 2009-01-15 18:58:22 UTC (rev 879) @@ -10,7 +10,6 @@ import java.lang.reflect.Method; import java.util.ArrayList; -import org.codehaus.waffle.context.RequestLevelContainer; import org.codehaus.waffle.context.ContextContainer; import org.codehaus.waffle.controller.ControllerDefinition; import org.codehaus.waffle.monitor.SilentMonitor; @@ -25,16 +24,6 @@ private ActionMethodExecutor actionMethodExecutor = new InterceptingActionMethodExecutor(new SilentMonitor()); - @Before - public void setUp() throws Exception { - RequestLevelContainer.set(new ContextContainer()); - } - - @After - public void tearDown() throws Exception { - RequestLevelContainer.set(null); - } - @Test public void canInvokeNoArgumentActionMethod() throws Exception { FakeController fakeController = new FakeController();
Deleted: sandbox/v2experiment/waffle-core/src/test/java/org/codehaus/waffle/context/WaffleRequestFilterTest.java (878 => 879)
--- sandbox/v2experiment/waffle-core/src/test/java/org/codehaus/waffle/context/WaffleRequestFilterTest.java 2009-01-15 16:35:45 UTC (rev 878) +++ sandbox/v2experiment/waffle-core/src/test/java/org/codehaus/waffle/context/WaffleRequestFilterTest.java 2009-01-15 18:58:22 UTC (rev 879) @@ -1,139 +0,0 @@ -package org.codehaus.waffle.context; - -import org.codehaus.waffle.ComponentRegistry; -import org.codehaus.waffle.WaffleException; -import org.codehaus.waffle.testmodel.StubActionMethodExecutor; -import org.codehaus.waffle.testmodel.StubParameterResolver; -import org.codehaus.waffle.action.ActionMethodExecutor; -import org.codehaus.waffle.registrar.pico.ParameterResolver; -import org.codehaus.waffle.monitor.ContextMonitor; -import org.codehaus.waffle.monitor.RegistrarMonitor; -import org.codehaus.waffle.i18n.MessageResources; -import org.jmock.Expectations; -import org.jmock.Mockery; -import org.jmock.integration.junit4.JMock; -import org.junit.Assert; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.picocontainer.MutablePicoContainer; - -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletContext; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.lang.reflect.Field; - - -/** - * @author Michael Ward - * @author Mauro Talevi - */ -...@runwith(JMock.class) -public class WaffleRequestFilterTest { - - private Mockery mockery = new Mockery(); - - @Test - public void canInit() throws ServletException { - - // Mock ServletContext - final ServletContext servletContext = mockery.mock(ServletContext.class); - - // Mock ComponentRegistry - final ComponentRegistry registry = new ComponentRegistry(servletContext) { - protected void register(Object key, Class<?> defaultClass, ServletContext servletContext) throws WaffleException { - } - - @SuppressWarnings("unchecked") - protected void registerOtherComponents(ServletContext servletContext) { - } - }; - - mockery.checking(new Expectations() { - { - one(servletContext).getAttribute(ComponentRegistry.class.getName()); - will(returnValue(registry)); - } - }); - - // Mock FilterConfig - final FilterConfig filterConfig = mockery.mock(FilterConfig.class); - mockery.checking(new Expectations() { - { - one(filterConfig).getServletContext(); - will(returnValue(servletContext)); - } - }); - - Filter filter = new WaffleRequestFilter(); - filter.init(filterConfig); - } - - @Test - public void canDestroy() throws Exception { - Filter filter = new WaffleRequestFilter(); - - Field field = WaffleRequestFilter.class.getDeclaredField("contextContainerFactory"); - field.setAccessible(true); - field.set(filter, new ContextContainerFactory(null, null, null, null)); - - assertNotNull(field.get(filter)); - filter.destroy(); - assertNull(field.get(filter)); - } - - @Test - public void canDoFilter() throws Exception { - CurrentHttpServletRequest.set(null); // ensure clear - - // Mock ContextContainer - final MutablePicoContainer container = mockery.mock(MutablePicoContainer.class); - mockery.checking(new Expectations() { - { - one(container).start(); - one(container).addComponent(with(an(HttpServletRequest.class))); - will(returnValue(null)); - one(container).addComponent(with(an(HttpServletResponse.class))); - will(returnValue(null)); - one(container).stop(); - one(container).dispose(); - } - }); - - // Mock ContextContainerFactory - final ContextContainerFactory contextContainerFactory = new ContextContainerFactory(mockery.mock(MessageResources.class), mockery.mock(ContextMonitor.class), mockery.mock(RegistrarMonitor.class), new StubParameterResolver()) { - public MutablePicoContainer buildRequestLevelContainer(HttpServletRequest request) { - return container; - } - }; - - // Mock HttpServletRequest - final HttpServletRequest request = mockery.mock(HttpServletRequest.class); - - // Mock HttpServletResponse - final HttpServletResponse response = mockery.mock(HttpServletResponse.class); - - // Mock FilterChain - final FilterChain filterChain = mockery.mock(FilterChain.class); - mockery.checking(new Expectations() { - { - one(filterChain).doFilter(with(same(request)), with(same(response))); - } - }); - - Filter filter = new WaffleRequestFilter(); - Field field = WaffleRequestFilter.class.getDeclaredField("contextContainerFactory"); - field.setAccessible(true); - field.set(filter, contextContainerFactory); - - filter.doFilter(request, response, filterChain); - - Assert.assertSame("Filter should have set request", request, CurrentHttpServletRequest.get()); - } - -}
Modified: sandbox/v2experiment/waffle-core/src/test/java/org/codehaus/waffle/controller/ContextControllerDefinitionFactoryTest.java (878 => 879)
--- sandbox/v2experiment/waffle-core/src/test/java/org/codehaus/waffle/controller/ContextControllerDefinitionFactoryTest.java 2009-01-15 16:35:45 UTC (rev 878) +++ sandbox/v2experiment/waffle-core/src/test/java/org/codehaus/waffle/controller/ContextControllerDefinitionFactoryTest.java 2009-01-15 18:58:22 UTC (rev 879) @@ -10,7 +10,6 @@ import org.codehaus.waffle.WaffleException; import org.codehaus.waffle.action.MethodDefinition; import org.codehaus.waffle.action.MethodDefinitionFinder; -import org.codehaus.waffle.context.RequestLevelContainer; import org.codehaus.waffle.context.ContextContainer; import org.codehaus.waffle.i18n.DefaultMessageResources; import org.codehaus.waffle.i18n.MessagesContext; @@ -39,7 +38,6 @@ final MutablePicoContainer pico = new DefaultPicoContainer(new Caching()); pico.addComponent("theController", FakeController.class); ContextContainer container = new ContextContainer(pico); - RequestLevelContainer.set(container); // Mock HttpServletRequest final HttpServletRequest request = mockery.mock(HttpServletRequest.class); @@ -80,7 +78,6 @@ public void cannotRequestControllerDefinitionThatiIsNotRegistered() { MutablePicoContainer pico = new DefaultPicoContainer(new Caching()); ContextContainer container = new ContextContainer(pico); - RequestLevelContainer.set(container); // Mock HttpServletRequest final HttpServletRequest request = mockery.mock(HttpServletRequest.class);
Modified: sandbox/v2experiment/waffle-core/src/test/java/org/codehaus/waffle/servlet/WaffleServletTest.java (878 => 879)
--- sandbox/v2experiment/waffle-core/src/test/java/org/codehaus/waffle/servlet/WaffleServletTest.java 2009-01-15 16:35:45 UTC (rev 878) +++ sandbox/v2experiment/waffle-core/src/test/java/org/codehaus/waffle/servlet/WaffleServletTest.java 2009-01-15 18:58:22 UTC (rev 879) @@ -9,7 +9,6 @@ import static org.junit.Assert.assertEquals; import java.io.IOException; -import java.io.Writer; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; @@ -41,8 +40,6 @@ import org.codehaus.waffle.bind.ControllerDataBinder; import org.codehaus.waffle.bind.ognl.OgnlControllerDataBinder; import org.codehaus.waffle.bind.ognl.OgnlValueConverterFinder; -import org.codehaus.waffle.context.ContextContainer; -import org.codehaus.waffle.context.RequestLevelContainer; import org.codehaus.waffle.controller.ControllerDefinition; import org.codehaus.waffle.controller.ControllerDefinitionFactory; import org.codehaus.waffle.controller.ControllerNotFoundException; @@ -214,8 +211,9 @@ will(returnValue("yy")); } }); + + new WaffleServlet.ServletFilter().setRequestContainer(contextContainer); - RequestLevelContainer.set(contextContainer); final NonDispatchingController nonDispatchingController = new NonDispatchingController(); List<?> list = Collections.EMPTY_LIST; final Enumeration<?> enumeration = Collections.enumeration(list); @@ -324,7 +322,8 @@ } }); - RequestLevelContainer.set(contextContainer); + new WaffleServlet.ServletFilter().setRequestContainer(contextContainer); + final NonDispatchingController nonDispatchingController = new NonDispatchingController(); List<?> list = Collections.EMPTY_LIST; final Enumeration<?> enumeration = Collections.enumeration(list); @@ -427,7 +426,7 @@ } }); - RequestLevelContainer.set(contextContainer); + new WaffleServlet.ServletFilter().setRequestContainer(contextContainer); // Mock ServletConfig final ServletConfig servletConfig = mockery.mock(ServletConfig.class); @@ -532,7 +531,8 @@ } }); - RequestLevelContainer.set(contextContainer); + new WaffleServlet.ServletFilter().setRequestContainer(contextContainer); + final NonDispatchingController nonDispatchingController = new NonDispatchingController(); List<?> list = Collections.EMPTY_LIST; final Enumeration<?> enumeration = Collections.enumeration(list); @@ -636,7 +636,7 @@ } }); - RequestLevelContainer.set(contextContainer); + new WaffleServlet.ServletFilter().setRequestContainer(contextContainer); final NonDispatchingController nonDispatchingController = new NonDispatchingController(); List<?> list = Collections.EMPTY_LIST;
Modified: sandbox/v2experiment/waffle-ruby/src/main/java/org/codehaus/waffle/ruby/servlet/RhtmlServlet.java (878 => 879)
--- sandbox/v2experiment/waffle-ruby/src/main/java/org/codehaus/waffle/ruby/servlet/RhtmlServlet.java 2009-01-15 16:35:45 UTC (rev 878) +++ sandbox/v2experiment/waffle-ruby/src/main/java/org/codehaus/waffle/ruby/servlet/RhtmlServlet.java 2009-01-15 18:58:22 UTC (rev 879) @@ -15,13 +15,14 @@ import org.codehaus.waffle.Constants; import org.codehaus.waffle.WaffleException; -import org.codehaus.waffle.context.RequestLevelContainer; +import org.codehaus.waffle.servlet.WaffleServlet; import org.codehaus.waffle.ruby.controller.RubyController; import org.codehaus.waffle.controller.ScriptedController; import org.jruby.Ruby; import org.jruby.RubyModule; import org.jruby.javasupport.JavaEmbedUtils; import org.jruby.runtime.builtin.IRubyObject; +import org.picocontainer.MutablePicoContainer; /** * ERB (rhtml) views support @@ -31,12 +32,32 @@ */ @SuppressWarnings("serial") public class RhtmlServlet extends HttpServlet { - + + private static ThreadLocal<MutablePicoContainer> currentRequestContainer = new ThreadLocal<MutablePicoContainer>(); + private static ThreadLocal<MutablePicoContainer> currentSessionContainer = new ThreadLocal<MutablePicoContainer>(); + private static ThreadLocal<MutablePicoContainer> currentAppContainer = new ThreadLocal<MutablePicoContainer>(); + + public static class ServletFilter extends WaffleServlet.ServletFilter { + + protected void setAppContainer(MutablePicoContainer container) { + currentAppContainer.set(container); + } + + protected void setRequestContainer(MutablePicoContainer container) { + currentRequestContainer.set(container); + } + + protected void setSessionContainer(MutablePicoContainer container) { + currentSessionContainer.set(container); + } + } + + @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String template = loadRhtml(request.getServletPath()); - Ruby runtime = RequestLevelContainer.get().getComponent(Ruby.class); + Ruby runtime = currentRequestContainer.get().getComponent(Ruby.class); RubyModule module = runtime.getClassFromPath("ERB"); IRubyObject erb = (IRubyObject) JavaEmbedUtils.invokeMethod(runtime, module, "new",
To unsubscribe from this list please visit:
