- Revision
- 886
- Author
- paul
- Date
- 2009-01-15 16:31:21 -0600 (Thu, 15 Jan 2009)
Log Message
better composition
Modified Paths
- sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/context/WaffleWebappComposer.java
Diff
Modified: sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/context/WaffleWebappComposer.java (885 => 886)
--- sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/context/WaffleWebappComposer.java 2009-01-15 20:24:08 UTC (rev 885) +++ sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/context/WaffleWebappComposer.java 2009-01-15 22:31:21 UTC (rev 886) @@ -2,9 +2,7 @@ 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; @@ -12,6 +10,8 @@ import org.codehaus.waffle.view.DefaultViewResolver; import org.codehaus.waffle.validation.Validator; import org.codehaus.waffle.validation.DefaultValidator; +import org.codehaus.waffle.validation.ErrorsContext; +import org.codehaus.waffle.validation.DefaultErrorsContext; import org.codehaus.waffle.monitor.ActionMonitor; import org.codehaus.waffle.monitor.SilentMonitor; import org.codehaus.waffle.monitor.BindMonitor; @@ -47,130 +47,146 @@ import org.codehaus.waffle.action.RequestParameterMethodNameResolver; import javax.servlet.ServletContext; -import java.util.Enumeration; -public class WaffleWebappComposer implements WebappComposer { +public abstract 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)); + picoContainer.addComponent(ActionMethodExecutor.class, actionMethodExecutor()); + picoContainer.addComponent(ActionMethodResponseHandler.class, actionMethodResponseHandler()); + picoContainer.addComponent(ArgumentResolver.class, argumentResolver()); + picoContainer.addComponent(MethodDefinitionFinder.class, methodDefinitionFinder()); + picoContainer.addComponent(MethodNameResolver.class, methodNameResolver()); + picoContainer.addComponent(BindErrorMessageResolver.class, bindErrorMessageResolver()); + picoContainer.addComponent(ControllerDataBinder.class, controllerDataBinder()); + picoContainer.addComponent(ViewDataBinder.class, viewDataBinder()); + picoContainer.addComponent(StringTransmuter.class, stringTransmuter()); + picoContainer.addComponent(ValueConverterFinder.class, valueConverterFinder()); + picoContainer.addComponent(ControllerDefinitionFactory.class, controllerDefinitionFactory()); + picoContainer.addComponent(ControllerNameResolver.class, controllerNameResolver()); + picoContainer.addComponent(MessageResources.class, messageResources()); + picoContainer.addComponent(ActionMonitor.class, actionMonitor()); + picoContainer.addComponent(BindMonitor.class, bindMonitor()); + picoContainer.addComponent(ControllerMonitor.class, bindMonitor()); + picoContainer.addComponent(ServletMonitor.class, servletMonitor()); + picoContainer.addComponent(ValidationMonitor.class, validationMonitor()); + picoContainer.addComponent(ViewMonitor.class, viewMonitor()); + picoContainer.addComponent(Validator.class, validator()); + picoContainer.addComponent(ViewDispatcher.class, viewDispatcher()); + picoContainer.addComponent(ViewResolver.class, viewResolver()); + picoContainer.addComponent(ParameterResolver.class, parameterResolver()); - // 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(); + protected Class<InterceptingActionMethodExecutor> actionMethodExecutor() { + return InterceptingActionMethodExecutor.class; + } - while (enums != null && enums.hasMoreElements()) { - String name = enums.nextElement(); + protected Class<DefaultActionMethodResponseHandler> actionMethodResponseHandler() { + return DefaultActionMethodResponseHandler.class; + } - if (name.startsWith(REGISTER_KEY)) { - String key = name.split(REGISTER_KEY)[1]; - Class concreteClass = loadClass(servletContext.getInitParameter(name)); + protected Class<HierarchicalArgumentResolver> argumentResolver() { + return HierarchicalArgumentResolver.class; + } - 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); - } - } + protected Class<AnnotatedMethodDefinitionFinder> methodDefinitionFinder() { + return AnnotatedMethodDefinitionFinder.class; } + protected Class<RequestParameterMethodNameResolver> methodNameResolver() { + return RequestParameterMethodNameResolver.class; + } - public void composeSession(MutablePicoContainer picoContainer) { + protected Class<OgnlBindErrorMessageResolver> bindErrorMessageResolver() { + return OgnlBindErrorMessageResolver.class; } - public void composeRequest(MutablePicoContainer picoContainer) { + protected Class<OgnlControllerDataBinder> controllerDataBinder() { + return OgnlControllerDataBinder.class; } + protected Class<IntrospectingViewDataBinder> viewDataBinder() { + return IntrospectingViewDataBinder.class; + } - /** - * 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; - } + protected Class<DefaultStringTransmuter> stringTransmuter() { + return DefaultStringTransmuter.class; + } - String className = servletContext.getInitParameter(parameterName); + protected Class<OgnlValueConverterFinder> valueConverterFinder() { + return OgnlValueConverterFinder.class; + } - if (className == null || className.length() == 0) { - return defaultClass; - } else { - return loadClass(className); - } + protected Class<ContextControllerDefinitionFactory> controllerDefinitionFactory() { + return ContextControllerDefinitionFactory.class; } - /** - * 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 Class<ContextPathControllerNameResolver> controllerNameResolver() { + return ContextPathControllerNameResolver.class; } + protected Class<DefaultMessageResources> messageResources() { + return DefaultMessageResources.class; + } + + protected Class<ParameterResolver> parameterResolver() { + return ParameterResolver.class; + } + + protected Class<DefaultViewResolver> viewResolver() { + return DefaultViewResolver.class; + } + + protected Class<DefaultViewDispatcher> viewDispatcher() { + return DefaultViewDispatcher.class; + } + + protected Class<DefaultValidator> validator() { + return DefaultValidator.class; + } + + protected Class<SilentMonitor> viewMonitor() { + return SilentMonitor.class; + } + + protected Class<SilentMonitor> validationMonitor() { + return SilentMonitor.class; + } + + protected Class<SilentMonitor> servletMonitor() { + return SilentMonitor.class; + } + + protected Class<SilentMonitor> bindMonitor() { + return SilentMonitor.class; + } + + protected Class<SilentMonitor> actionMonitor() { + return SilentMonitor.class; + } + + + public void composeSession(MutablePicoContainer picoContainer) { + // nothing yet + } + + public void composeRequest(MutablePicoContainer picoContainer) { + picoContainer.addComponent(ErrorsContext.class, errorsContext()); + } + + protected Class<DefaultErrorsContext> errorsContext() { + return DefaultErrorsContext.class; + } + + protected Parameter[] picoParameters(Object... parameters) { if (parameters.length == 0) { return null; // pico expects a null when no parameters
To unsubscribe from this list please visit:
