1515package org .codehaus .groovy .grails .web .mapping .filter ;
1616
1717import grails .util .GrailsUtil ;
18+
19+ import java .io .IOException ;
20+ import java .util .Collections ;
21+ import java .util .HashMap ;
22+ import java .util .List ;
23+ import java .util .Map ;
24+
25+ import javax .servlet .FilterChain ;
26+ import javax .servlet .ServletContext ;
27+ import javax .servlet .ServletException ;
28+ import javax .servlet .http .HttpServletRequest ;
29+ import javax .servlet .http .HttpServletResponse ;
30+
1831import org .apache .commons .logging .Log ;
1932import org .apache .commons .logging .LogFactory ;
2033import org .codehaus .groovy .grails .commons .ControllerArtefactHandler ;
2134import org .codehaus .groovy .grails .commons .GrailsApplication ;
2235import org .codehaus .groovy .grails .commons .GrailsClass ;
36+ import org .codehaus .groovy .grails .compiler .GrailsClassLoader ;
2337import org .codehaus .groovy .grails .web .mapping .UrlMappingInfo ;
2438import org .codehaus .groovy .grails .web .mapping .UrlMappingsHolder ;
2539import org .codehaus .groovy .grails .web .mapping .exceptions .UrlMappingException ;
2842import org .codehaus .groovy .grails .web .servlet .WrappedResponseHolder ;
2943import org .codehaus .groovy .grails .web .servlet .mvc .GrailsWebRequest ;
3044import org .codehaus .groovy .grails .web .util .WebUtils ;
31- import org .codehaus .groovy .grails .compiler .GrailsClassLoader ;
3245import org .springframework .web .filter .OncePerRequestFilter ;
46+ import org .springframework .web .multipart .MultipartException ;
47+ import org .springframework .web .multipart .MultipartHttpServletRequest ;
3348import org .springframework .web .servlet .HandlerInterceptor ;
3449import org .springframework .web .servlet .ModelAndView ;
3550import org .springframework .web .servlet .View ;
3651import org .springframework .web .servlet .ViewResolver ;
3752import org .springframework .web .util .UrlPathHelper ;
38- import org .springframework .web .multipart .MultipartException ;
39- import org .springframework .web .multipart .MultipartHttpServletRequest ;
40-
41- import javax .servlet .FilterChain ;
42- import javax .servlet .ServletContext ;
43- import javax .servlet .ServletException ;
44- import javax .servlet .http .HttpServletRequest ;
45- import javax .servlet .http .HttpServletResponse ;
46- import java .io .IOException ;
47- import java .util .Collections ;
48- import java .util .HashMap ;
49- import java .util .List ;
50- import java .util .Map ;
5153
5254/**
53- * <p>A Servlet filter that uses the Grails UrlMappings to match and forward requests to a relevant controller
54- * and action
55+ * Uses the Grails UrlMappings to match and forward requests to a relevant controller and action.
5556 *
5657 * @author Graeme Rocher
5758 * @since 0.5
58- *
59- *
60- * <p/>
61- * Created: Mar 6, 2007
62- * Time: 7:58:19 AM
6359 */
6460public class UrlMappingsFilter extends OncePerRequestFilter {
6561
@@ -71,15 +67,18 @@ public class UrlMappingsFilter extends OncePerRequestFilter {
7167 private GrailsApplication application ;
7268 private ViewResolver viewResolver ;
7369
70+ @ Override
7471 protected void initFilterBean () throws ServletException {
7572 super .initFilterBean ();
7673 urlHelper .setUrlDecode (false );
7774 final ServletContext servletContext = getServletContext ();
78- this .handlerInterceptors = WebUtils .lookupHandlerInterceptors (servletContext );
75+ this .handlerInterceptors = WebUtils .lookupHandlerInterceptors (servletContext );
7976 this .application = WebUtils .lookupApplication (servletContext );
8077 this .viewResolver = WebUtils .lookupViewResolver (servletContext );
8178 }
8279
80+ @ SuppressWarnings ("unchecked" )
81+ @ Override
8382 protected void doFilterInternal (HttpServletRequest request , HttpServletResponse response , FilterChain filterChain ) throws ServletException , IOException {
8483 UrlMappingsHolder holder = WebUtils .lookupUrlMappings (getServletContext ());
8584
@@ -91,31 +90,30 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse
9190 checkForCompilationErrors ();
9291
9392 GrailsClass [] controllers = application .getArtefacts (ControllerArtefactHandler .TYPE );
94- if ((controllers == null || controllers .length == 0 || holder == null ) && !"/" .equals (uri )) {
93+ if ((controllers == null || controllers .length == 0 || holder == null ) && !"/" .equals (uri )) {
9594 processFilterChain (request , response , filterChain );
9695 return ;
97- }else if (excludePatterns !=null && excludePatterns .size ()>0 ){
98- for (String excludePattern :excludePatterns ){
99- if (uri .equals (excludePattern )||
100- (excludePattern .endsWith ("*" )&&
101- excludePattern .substring (0 ,excludePattern .length ()-1 ).
102- regionMatches (0 ,uri ,0 ,excludePattern .length ()-1 ))){
96+ }
97+
98+ if (excludePatterns != null && excludePatterns .size () > 0 ) {
99+ for (String excludePattern :excludePatterns ) {
100+ if (uri .equals (excludePattern ) ||
101+ (excludePattern .endsWith ("*" ) &&
102+ excludePattern .substring (0 ,excludePattern .length () -1 ).regionMatches (0 , uri , 0 , excludePattern .length () - 1 ))) {
103103 processFilterChain (request , response , filterChain );
104104 return ;
105105 }
106106 }
107107 }
108108
109- if (LOG .isDebugEnabled ()) {
109+ if (LOG .isDebugEnabled ()) {
110110 LOG .debug ("Executing URL mapping filter..." );
111111 LOG .debug (holder );
112112 }
113113
114-
115-
116- if (WebUtils .areFileExtensionsEnabled ()) {
114+ if (WebUtils .areFileExtensionsEnabled ()) {
117115 String format = WebUtils .getFormatFromURI (uri );
118- if (format != null ) {
116+ if (format != null ) {
119117 MimeType [] configuredMimes = MimeType .getConfiguredMimeTypes ();
120118 // only remove the file extension if its one of the configured mimes in Config.groovy
121119 for (MimeType configuredMime : configuredMimes ) {
@@ -134,7 +132,6 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse
134132 try {
135133 // GRAILS-3369: Save the original request parameters.
136134 Map backupParameters ;
137-
138135 try {
139136 backupParameters = new HashMap (webRequest .getParams ());
140137 }
@@ -168,8 +165,8 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse
168165 }
169166 catch (Exception e ) {
170167 GrailsUtil .deepSanitize (e );
171- if (e instanceof MultipartException ) {
172- throw ((MultipartException )e );
168+ if (e instanceof MultipartException ) {
169+ throw ((MultipartException )e );
173170 }
174171 LOG .error ("Error when matching URL mapping [" + info + "]:" + e .getMessage (), e );
175172 continue ;
@@ -180,68 +177,63 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse
180177 request = checkMultipart (request );
181178
182179 if (viewName == null || viewName .endsWith (GSP_SUFFIX ) || viewName .endsWith (JSP_SUFFIX )) {
183-
184- if (info .isParsingRequest ()) {
180+ if (info .isParsingRequest ()) {
185181 webRequest .informParameterCreationListeners ();
186182 }
187183 String forwardUrl = WebUtils .forwardRequestForUrlMappingInfo (request , response , info );
188184 if (LOG .isDebugEnabled ()) {
189185 LOG .debug ("Matched URI [" + uri + "] to URL mapping [" + info + "], forwarding to [" + forwardUrl + "] with response [" + response .getClass () + "]" );
190186 }
191-
192187 }
193188 else {
194- if (!renderViewForUrlMappingInfo (request , response , info , viewName )) {
189+ if (!renderViewForUrlMappingInfo (request , response , info , viewName )) {
195190 dispatched = false ;
196191 }
197192 }
198193 break ;
199194 }
200-
201195 }
202196 }
203197 finally {
204198 WrappedResponseHolder .setWrappedResponse (null );
205199 }
206200
207- if (!dispatched ) {
208- if (LOG .isDebugEnabled ()) {
201+ if (!dispatched ) {
202+ if (LOG .isDebugEnabled ()) {
209203 LOG .debug ("No match found, processing remaining filter chain." );
210204 }
211205 processFilterChain (request , response , filterChain );
212206 }
213-
214207 }
215208
216209 private void checkForCompilationErrors () {
217- if (!application .isWarDeployed ()) {
210+ if (application .isWarDeployed ()) {
211+ return ;
212+ }
218213
219- ClassLoader classLoader = application .getClassLoader ();
220- if (classLoader instanceof GrailsClassLoader ) {
221- GrailsClassLoader gcl = (GrailsClassLoader ) classLoader ;
222- if (gcl .hasCompilationErrors ()) {
223- throw gcl .getCompilationError ();
224- }
214+ ClassLoader classLoader = application .getClassLoader ();
215+ if (classLoader instanceof GrailsClassLoader ) {
216+ GrailsClassLoader gcl = (GrailsClassLoader ) classLoader ;
217+ if (gcl .hasCompilationErrors ()) {
218+ throw gcl .getCompilationError ();
225219 }
226220 }
227221 }
228222
229223 protected HttpServletRequest checkMultipart (HttpServletRequest request ) throws MultipartException {
230224 // Lookup from request attribute. The resolver that handles MultiPartRequest is dealt with earlier inside DefaultUrlMappingInfo with Grails
231225 HttpServletRequest resolvedRequest = (HttpServletRequest ) request .getAttribute (MultipartHttpServletRequest .class .getName ());
232- if (resolvedRequest !=null ) return resolvedRequest ;
226+ if (resolvedRequest !=null ) return resolvedRequest ;
233227 return request ;
234228 }
235229
236-
237230 private boolean renderViewForUrlMappingInfo (HttpServletRequest request , HttpServletResponse response , UrlMappingInfo info , String viewName ) {
238- if (viewResolver != null ) {
231+ if (viewResolver != null ) {
239232 View v ;
240233 try {
241-
242234 // execute pre handler interceptors
243235 for (HandlerInterceptor handlerInterceptor : handlerInterceptors ) {
244- if (!handlerInterceptor .preHandle (request , response , this )) return false ;
236+ if (!handlerInterceptor .preHandle (request , response , this )) return false ;
245237 }
246238
247239 // execute post handlers directly after, since there is no controller. The filter has a chance to modify the view at this point;
@@ -257,9 +249,8 @@ private boolean renderViewForUrlMappingInfo(HttpServletRequest request, HttpServ
257249 for (HandlerInterceptor handlerInterceptor : handlerInterceptors ) {
258250 handlerInterceptor .afterCompletion (request , response , this , null );
259251 }
260-
261-
262- } catch (Exception e ) {
252+ }
253+ catch (Exception e ) {
263254 GrailsUtil .deepSanitize (e );
264255 for (HandlerInterceptor handlerInterceptor : handlerInterceptors ) {
265256 try {
@@ -278,12 +269,12 @@ private boolean renderViewForUrlMappingInfo(HttpServletRequest request, HttpServ
278269 private void processFilterChain (HttpServletRequest request , HttpServletResponse response , FilterChain filterChain ) throws IOException , ServletException {
279270 try {
280271 WrappedResponseHolder .setWrappedResponse (response );
281- if (filterChain != null )
272+ if (filterChain != null ) {
282273 filterChain .doFilter (request ,response );
283- } finally {
274+ }
275+ }
276+ finally {
284277 WrappedResponseHolder .setWrappedResponse (null );
285278 }
286279 }
287-
288-
289280}
0 commit comments