Skip to content

Commit f3b72cd

Browse files
author
pledbrook
committed
The dynamic properties and methods are now added to filters via the
metaclass of FilterConfig. Extended the tests to make sure that the dynamic methods 'redirect' and 'render' still work. git-svn-id: https://svn.codehaus.org/grails/trunk@6483 1cfb16fd-6d17-0410-8ff1-b7e8e1e2867d
1 parent ee79ea7 commit f3b72cd

File tree

8 files changed

+433
-142
lines changed

8 files changed

+433
-142
lines changed

src/groovy/org/codehaus/groovy/grails/plugins/web/filters/DefaultGrailsFiltersClass.groovy

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package org.codehaus.groovy.grails.plugins.web.filters
1717

1818
import org.codehaus.groovy.grails.commons.AbstractInjectableGrailsClass
1919
import org.codehaus.groovy.grails.web.filters.GrailsFiltersClass
20+
2021
/**
2122
* Loads filter definitions into a set of FilterConfig instances
2223
*
@@ -35,24 +36,24 @@ class DefaultGrailsFiltersClass extends AbstractInjectableGrailsClass implement
3536
if (!filters) return [];
3637

3738
def loader = new Loader()
38-
def filters_closure = filters.filters
39-
40-
filters_closure.delegate = loader
41-
filters_closure.call()
39+
def filtersClosure = filters.filters
40+
filtersClosure.delegate = loader
41+
filtersClosure.call()
4242

4343
return loader.filters;
4444
}
4545
}
46+
4647
class Loader {
47-
def filters = []
48+
def filters = []
4849

4950
def methodMissing(String methodName, args) {
5051
if(args) {
51-
52-
def fc = new FilterConfig(name:methodName)
52+
def fc = new FilterConfig(name: methodName)
5353
filters << fc
5454

5555
if(args[0] instanceof Closure) {
56+
fc.scope = [ uri: '/**' ]
5657
def closure = args[0]
5758
closure.delegate = fc
5859
closure.call()
@@ -70,6 +71,3 @@ class Loader {
7071
}
7172
}
7273
}
73-
74-
75-

src/groovy/org/codehaus/groovy/grails/plugins/web/filters/FilterActionDelegate.groovy

Lines changed: 0 additions & 53 deletions
This file was deleted.

src/groovy/org/codehaus/groovy/grails/plugins/web/filters/FilterConfig.groovy

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,26 +15,26 @@
1515
*/
1616
package org.codehaus.groovy.grails.plugins.web.filters
1717

18-
import org.apache.commons.logging.*
18+
import org.springframework.web.servlet.ModelAndView
1919

2020
/**
2121
* @author mike
2222
* @author Graeme Rocher
2323
*/
2424
class FilterConfig {
25-
static final LOG = LogFactory.getLog(FilterConfig)
2625
String name
2726
Map scope
28-
def filter
2927
Closure before
3028
Closure after
3129
Closure afterView
30+
ModelAndView modelAndView
3231
boolean initialised = false
3332

34-
void propertyMissing(String name, value) {
33+
void propertyMissing(String propertyName, value) {
3534
if(!initialised) {
36-
LOG.warn "Setting $name is invalid for filter config $name"
35+
log.warn "Setting $propertyName is invalid for filter config $name"
3736
}
3837
}
38+
3939
public String toString() {"FilterConfig[$name, scope=$scope]"}
40-
}
40+
}

src/groovy/org/codehaus/groovy/grails/plugins/web/filters/FilterToHandlerAdapter.groovy

Lines changed: 17 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ package org.codehaus.groovy.grails.plugins.web.filters
1818
import java.util.regex.Pattern
1919
import javax.servlet.http.HttpServletRequest
2020
import javax.servlet.http.HttpServletResponse
21-
import org.apache.commons.logging.LogFactory
2221
import org.codehaus.groovy.grails.web.servlet.GrailsApplicationAttributes
2322
import org.codehaus.groovy.grails.web.util.WebUtils
2423
import org.springframework.web.servlet.HandlerInterceptor
@@ -28,6 +27,7 @@ import org.springframework.util.AntPathMatcher
2827
import org.codehaus.groovy.grails.web.servlet.view.NullView
2928

3029
/**
30+
* Adapter between a FilterConfig object and a Spring HandlerInterceptor.
3131
* @author mike
3232
* @author Graeme Rocher
3333
*/
@@ -40,12 +40,16 @@ class FilterToHandlerAdapter implements HandlerInterceptor {
4040
def uriPattern;
4141
def urlPathHelper = new UrlPathHelper()
4242

43-
private static final LOG = LogFactory.getLog(FilterToHandlerAdapter)
44-
43+
/**
44+
* Returns the name of the controller targeted by the given request.
45+
*/
4546
String controllerName(request) {
4647
return request.getAttribute(GrailsApplicationAttributes.CONTROLLER_NAME_ATTRIBUTE).toString()
4748
}
4849

50+
/**
51+
* Returns the name of the action targeted by the given request.
52+
*/
4953
String actionName(request) {
5054
return request.getAttribute(GrailsApplicationAttributes.ACTION_NAME_ATTRIBUTE).toString()
5155
}
@@ -66,13 +70,10 @@ class FilterToHandlerAdapter implements HandlerInterceptor {
6670
if (!accept(controllerName, actionName, uri)) return true;
6771

6872
def callable = filterConfig.before.clone()
69-
FilterActionDelegate delegate = new FilterActionDelegate()
70-
callable.delegate = delegate
71-
callable.resolveStrategy = Closure.DELEGATE_FIRST
7273
def result = callable.call();
7374
if(result instanceof Boolean) {
74-
if(!result && delegate.modelAndView) {
75-
renderModelAndView(delegate, request, response, controllerName)
75+
if(!result && filterConfig.modelAndView) {
76+
renderModelAndView(filterConfig, request, response, controllerName)
7677
}
7778
return result
7879
}
@@ -91,26 +92,22 @@ class FilterToHandlerAdapter implements HandlerInterceptor {
9192
if (!accept(controllerName, actionName, uri)) return;
9293

9394
def callable = filterConfig.after.clone()
94-
FilterActionDelegate delegate = new FilterActionDelegate()
95-
callable.delegate = delegate
96-
callable.resolveStrategy = Closure.DELEGATE_FIRST
97-
98-
def result = callable.call(modelAndView?.getModel());
95+
def result = callable.call(modelAndView?.model);
9996
if(result instanceof Boolean) {
10097
// if false is returned don't render a view
10198
if(!result) {
10299
modelAndView.viewName = null
103100
modelAndView.view = new NullView(response.contentType)
104101
}
105102
}
106-
else if(delegate.modelAndView && modelAndView) {
107-
if(delegate.modelAndView.viewName) {
108-
modelAndView.viewName = delegate.modelAndView.viewName
103+
else if(filterConfig.modelAndView && modelAndView) {
104+
if(filterConfig.modelAndView.viewName) {
105+
modelAndView.viewName = filterConfig.modelAndView.viewName
109106
}
110-
modelAndView.getModel().putAll(delegate.modelAndView.getModel())
107+
modelAndView.model.putAll(filterConfig.modelAndView.model)
111108
}
112-
else if(delegate.modelAndView?.viewName) {
113-
renderModelAndView(delegate, request, response, controllerName)
109+
else if(filterConfig.modelAndView?.viewName) {
110+
renderModelAndView(filterConfig, request, response, controllerName)
114111
}
115112

116113
}
@@ -124,7 +121,7 @@ class FilterToHandlerAdapter implements HandlerInterceptor {
124121
view = WebUtils.resolveView(request, modelAndView.viewName, controllerName, viewResolver)
125122
else if (modelAndView.view)
126123
view = modelAndView.view
127-
view?.render(modelAndView.getModel(), request, response)
124+
view?.render(modelAndView.model, request, response)
128125
}
129126

130127
void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) throws java.lang.Exception {
@@ -136,9 +133,6 @@ class FilterToHandlerAdapter implements HandlerInterceptor {
136133

137134
if (!accept(controllerName, actionName, uri)) return;
138135
def callable = filterConfig.afterView.clone()
139-
callable.delegate = new FilterActionDelegate()
140-
callable.resolveStrategy = Closure.DELEGATE_FIRST
141-
142136
callable.call(e);
143137
}
144138
}

src/groovy/org/codehaus/groovy/grails/plugins/web/filters/FiltersGrailsPlugin.groovy

Lines changed: 47 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import org.apache.commons.logging.LogFactory
2020
import org.codehaus.groovy.grails.commons.GrailsApplication
2121
import org.springframework.beans.factory.config.MethodInvokingFactoryBean
2222
import org.codehaus.groovy.grails.web.plugins.support.WebMetaUtils
23+
import org.codehaus.groovy.grails.web.metaclass.RedirectDynamicMethod
24+
import org.codehaus.groovy.grails.web.metaclass.RenderDynamicMethod
2325

2426
/**
2527
* @author Mike
@@ -61,15 +63,57 @@ class FiltersGrailsPlugin {
6163
}
6264
}
6365

66+
def doWithDynamicMethods = { applicationContext ->
67+
def mc = FilterConfig.metaClass
68+
69+
// Add the standard dynamic properties for web requests to all
70+
// the filters, i.e. 'params', 'flash', 'request', etc.
71+
WebMetaUtils.registerCommonWebProperties(mc, application)
72+
73+
// Also make the application context available.
74+
mc.getApplicationContext = {-> applicationContext }
75+
76+
// Add redirect and render methods (copy and pasted from the
77+
// controllers plugin).
78+
def redirect = new RedirectDynamicMethod(applicationContext)
79+
def render = new RenderDynamicMethod()
80+
81+
mc.redirect = {Map args ->
82+
redirect.invoke(delegate, "redirect", args)
83+
}
84+
85+
mc.render = {Object o ->
86+
render.invoke(delegate, "render", [o?.inspect()] as Object[])
87+
}
88+
89+
mc.render = {String txt ->
90+
render.invoke(delegate, "render", [txt] as Object[])
91+
}
92+
93+
mc.render = {Map args ->
94+
render.invoke(delegate, "render", [args] as Object[])
95+
}
96+
97+
mc.render = {Closure c ->
98+
render.invoke(delegate, "render", [c] as Object[])
99+
}
100+
101+
mc.render = {Map args, Closure c ->
102+
render.invoke(delegate, "render", [args, c] as Object[])
103+
}
104+
}
105+
64106
def doWithApplicationContext = { applicationContext ->
65107
reloadFilters(application, applicationContext)
66108
}
109+
67110
def onChange = { event ->
68-
if (log.isDebugEnabled()) log.debug("onChange: ${event}")
111+
if (log.debugEnabled) log.debug("onChange: ${event}")
112+
113+
// Get the new or modified filter and (re-)register the associated
114+
// beans.
69115
def newFilter = event.application.addArtefact(TYPE, event.source)
70-
def ctx = event.ctx
71116
beans(BEANS.curry(newFilter)).registerBeans(event.ctx)
72-
73117
reloadFilters(event.application, event.ctx)
74118
}
75119

0 commit comments

Comments
 (0)