Skip to content

Commit a2afb5a

Browse files
author
graeme
committed
fix for GRAILS-2465
git-svn-id: https://svn.codehaus.org/grails/trunk@6712 1cfb16fd-6d17-0410-8ff1-b7e8e1e2867d
1 parent 78c2ed4 commit a2afb5a

File tree

3 files changed

+118
-29
lines changed

3 files changed

+118
-29
lines changed

src/groovy/org/codehaus/groovy/grails/plugins/web/ControllersGrailsPlugin.groovy

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -193,18 +193,14 @@ class ControllersGrailsPlugin {
193193

194194
def lastFilter = filters[filters.size() - 1]
195195
def lastFilterMapping = filterMappings[filterMappings.size() - 1]
196-
def charEncodingFilter = filterMappings.find {it.'filter-name'.text() == 'charEncodingFilter'}
196+
def charEncodingFilterMapping = filterMappings.find {it.'filter-name'.text() == 'charEncodingFilter'}
197197

198198
// add the Grails web request filter
199199
lastFilter + {
200200
filter {
201201
'filter-name'('grailsWebRequest')
202202
'filter-class'(org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequestFilter.getName())
203203
}
204-
filter {
205-
'filter-name'('urlMapping')
206-
'filter-class'(org.codehaus.groovy.grails.web.mapping.filter.UrlMappingsFilter.getName())
207-
}
208204
if (grailsEnv == "development") {
209205
filter {
210206
'filter-name'('reloadFilter')
@@ -224,21 +220,13 @@ class ControllersGrailsPlugin {
224220
}
225221
}
226222
}
227-
if (charEncodingFilter) {
228-
charEncodingFilter + grailsWebRequestFilter
223+
if (charEncodingFilterMapping) {
224+
charEncodingFilterMapping + grailsWebRequestFilter
229225
}
230226
else {
231227
lastFilterMapping + grailsWebRequestFilter
232228
}
233-
filterMappings = webXml.'filter-mapping'
234-
lastFilterMapping = filterMappings[filterMappings.size() - 1]
235229

236-
lastFilterMapping + {
237-
'filter-mapping' {
238-
'filter-name'('urlMapping')
239-
'url-pattern'("/*")
240-
}
241-
}
242230
// if we're in development environment first add a the reload filter
243231
// to the web.xml by finding the last filter and appending it after
244232
if (grailsEnv == "development") {

src/groovy/org/codehaus/groovy/grails/plugins/web/mapping/UrlMappingsGrailsPlugin.groovy

Lines changed: 45 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -53,35 +53,66 @@ class UrlMappingsGrailsPlugin {
5353
}
5454

5555
def doWithWebDescriptor = { webXml ->
56-
// here we augment web.xml with all the error codes contained within the UrlMapping definitions
5756
def filters = webXml.filter
5857
def lastFilter = filters[filters.size()-1]
59-
6058
lastFilter + {
59+
filter {
60+
'filter-name'('urlMapping')
61+
'filter-class'(org.codehaus.groovy.grails.web.mapping.filter.UrlMappingsFilter.getName())
62+
}
63+
}
64+
// here we augment web.xml with all the error codes contained within the UrlMapping definitions
65+
def servlets = webXml.servlet
66+
def lastServlet = servlets[servlets.size()-1]
67+
68+
lastServlet + {
6169
'servlet' {
6270
'servlet-name'("grails-errorhandler")
6371
'servlet-class'(org.codehaus.groovy.grails.web.mapping.filter.ErrorHandlingServlet.getName())
6472
}
65-
for(Resource r in watchedResources) {
66-
r.file.eachLine { line ->
67-
def matcher = line =~ /\s*"(\d+?)"\(.+?\)/
68-
if(matcher) {
69-
def errorCode = matcher[0][1]
70-
'error-page' {
71-
'error-code'(errorCode)
72-
'location'("/grails-errorhandler")
73-
}
73+
}
7474

75-
}
76-
}
77-
}
75+
def servletMappings = webXml.'servlet-mapping'
76+
def lastMapping = servletMappings[servletMappings.size()-1]
77+
lastMapping + {
7878
'servlet-mapping' {
7979
'servlet-name'("grails-errorhandler")
8080
'url-pattern'("/grails-errorhandler")
8181
}
8282
}
83+
def welcomeFileList = webXml.'welcome-file-list'
84+
def errorPages = {
85+
for(Resource r in watchedResources) {
86+
r.file.eachLine { line ->
87+
def matcher = line =~ /\s*"(\d+?)"\(.+?\)/
88+
if(matcher) {
89+
def errorCode = matcher[0][1]
90+
'error-page' {
91+
'error-code'(errorCode)
92+
'location'("/grails-errorhandler")
93+
}
8394

95+
}
96+
}
97+
}
98+
}
99+
if(welcomeFileList.size() > 0) {
100+
welcomeFileList = welcomeFileList[welcomeFileList.size()-1]
101+
welcomeFileList + errorPages
102+
}
103+
else {
104+
lastMapping + errorPages
105+
}
84106

107+
def filterMappings = webXml.'filter-mapping'
108+
def lastFilterMapping = filterMappings[filterMappings.size() - 1]
109+
110+
lastFilterMapping + {
111+
'filter-mapping' {
112+
'filter-name'('urlMapping')
113+
'url-pattern'("/*")
114+
}
115+
}
85116
}
86117

87118
def onChange = { event ->
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package org.codehaus.groovy.grails.plugins.web.mapping
2+
3+
import org.springframework.core.io.FileSystemResource
4+
import groovy.xml.StreamingMarkupBuilder
5+
6+
/**
7+
* @author Graeme Rocher
8+
* @since 1.0
9+
*
10+
* Created: Feb 18, 2008
11+
*/
12+
class UrlMappingsGrailsPluginTests extends GroovyTestCase {
13+
14+
void testErrorPageWebXmlPositioning() {
15+
def text = '''<?xml version="1.0"?>
16+
<web-app>
17+
<filter>
18+
<filter-name>sitemesh</filter-name>
19+
<filter-class>org.codehaus.groovy.grails.web.sitemesh.GrailsPageFilter</filter-class>
20+
</filter>
21+
<filter-mapping>
22+
<filter-name>sitemesh</filter-name>
23+
<url-pattern>/*</url-pattern>
24+
</filter-mapping>
25+
<listener>
26+
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
27+
</listener>
28+
<listener>
29+
<listener-class>org.codehaus.groovy.grails.web.context.GrailsContextLoaderListener</listener-class>
30+
</listener>
31+
<servlet>
32+
<servlet-name>grails</servlet-name>
33+
<servlet-class>org.codehaus.groovy.grails.web.servlet.GrailsDispatcherServlet</servlet-class>
34+
<load-on-startup>1</load-on-startup>
35+
</servlet>
36+
<servlet-mapping>
37+
<servlet-name>grails</servlet-name>
38+
<url-pattern>*.dispatch</url-pattern>
39+
</servlet-mapping>
40+
<welcome-file-list>
41+
<welcome-file>index.html</welcome-file>
42+
<welcome-file>index.jsp</welcome-file>
43+
<welcome-file>index.gsp</welcome-file>
44+
</welcome-file-list>
45+
</web-app>
46+
'''
47+
48+
FileSystemResource.metaClass.getFile = {->
49+
[ eachLine:{ Closure c ->
50+
c.call('"404"(controller:"foo")')
51+
}]
52+
}
53+
UrlMappingsGrailsPlugin.metaClass.getWatchedResources ={->
54+
new FileSystemResource("/dummy/path")
55+
}
56+
def plugin = new UrlMappingsGrailsPlugin()
57+
58+
def xml = new XmlSlurper().parseText(text)
59+
60+
plugin.doWithWebDescriptor(xml)
61+
62+
def sw = new StringWriter()
63+
sw = new StreamingMarkupBuilder().bind{
64+
out << xml
65+
}
66+
67+
assertEquals '<web-app><filter><filter-name>sitemesh</filter-name><filter-class>org.codehaus.groovy.grails.web.sitemesh.GrailsPageFilter</filter-class></filter><filter><filter-name>urlMapping</filter-name><filter-class>org.codehaus.groovy.grails.web.mapping.filter.UrlMappingsFilter</filter-class></filter><filter-mapping><filter-name>sitemesh</filter-name><url-pattern>/*</url-pattern></filter-mapping><filter-mapping><filter-name>urlMapping</filter-name><url-pattern>/*</url-pattern></filter-mapping><listener><listener-class>org.springframework.web.util.Log4jConfigListener</listener-class></listener><listener><listener-class>org.codehaus.groovy.grails.web.context.GrailsContextLoaderListener</listener-class></listener><servlet><servlet-name>grails</servlet-name><servlet-class>org.codehaus.groovy.grails.web.servlet.GrailsDispatcherServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet><servlet-name>grails-errorhandler</servlet-name><servlet-class>org.codehaus.groovy.grails.web.mapping.filter.ErrorHandlingServlet</servlet-class></servlet><servlet-mapping><servlet-name>grails</servlet-name><url-pattern>*.dispatch</url-pattern></servlet-mapping><servlet-mapping><servlet-name>grails-errorhandler</servlet-name><url-pattern>/grails-errorhandler</url-pattern></servlet-mapping><welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.jsp</welcome-file><welcome-file>index.gsp</welcome-file></welcome-file-list><error-page><error-code>404</error-code><location>/grails-errorhandler</location></error-page></web-app>', sw.toString()
68+
}
69+
70+
}

0 commit comments

Comments
 (0)