Skip to content

Commit eaf8da1

Browse files
committed
GRAILS-11167 g:include tag is not namespace aware
- adds also plugin aware support - changes made also to forward method
1 parent d7d6293 commit eaf8da1

File tree

6 files changed

+63
-25
lines changed

6 files changed

+63
-25
lines changed

grails-plugin-controllers/src/main/groovy/org/codehaus/groovy/grails/web/metaclass/ForwardMethod.groovy

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,14 @@ class ForwardMethod {
6262
if(params.action) {
6363
urlInfo.actionName = convert(webRequest, params.action)
6464
}
65+
66+
if(params.namespace) {
67+
urlInfo.namespace = params.namespace
68+
}
69+
70+
if(params.plugin) {
71+
urlInfo.pluginName = params.plugin
72+
}
6573
}
6674

6775
def model = params.model instanceof Map ? params.model : Collections.EMPTY_MAP

grails-plugin-gsp/src/main/groovy/org/codehaus/groovy/grails/plugins/web/taglib/RenderTagLib.groovy

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,12 @@ class RenderTagLib implements RequestConstants {
8989
view: attrs.view,
9090
id: attrs.id,
9191
params: attrs.params)
92-
92+
if (attrs.namespace != null) {
93+
mapping.namespace = attrs.namespace
94+
}
95+
if (attrs.plugin != null) {
96+
mapping.pluginName = attrs.plugin
97+
}
9398
out << WebUtils.includeForUrlMappingInfo(request, response, mapping, attrs.model ?: [:])?.content
9499
}
95100
}

grails-plugin-url-mappings/src/main/groovy/org/codehaus/groovy/grails/web/mapping/filter/UrlMappingsFilter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse
188188
info.configure(webRequest);
189189
UrlConverter urlConverterToUse = urlConverter;
190190
GrailsApplication grailsApplicationToUse = application;
191-
GrailsClass controller = WebUtils.getConfiguredControllerForUrlMappingInfo(webRequest, info, urlConverterToUse, grailsApplicationToUse);
191+
GrailsClass controller = WebUtils.passControllerForUrlMappingInfoInRequest(webRequest, info, urlConverterToUse, grailsApplicationToUse);
192192

193193
if(controller == null && info.getViewName()==null && info.getURI()==null) continue;
194194
}

grails-web/src/main/groovy/org/codehaus/groovy/grails/web/servlet/ErrorHandlingServlet.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ protected void doDispatch(final HttpServletRequest request, final HttpServletRes
145145
WrappedResponseHolder.setWrappedResponse(response);
146146
String viewName = urlMappingInfo.getViewName();
147147
if (viewName == null || viewName.endsWith(GSP_SUFFIX) || viewName.endsWith(JSP_SUFFIX)) {
148-
GrailsClass controller = WebUtils.getConfiguredControllerForUrlMappingInfo( webRequest, urlMappingInfo,
148+
GrailsClass controller = WebUtils.passControllerForUrlMappingInfoInRequest( webRequest, urlMappingInfo,
149149
webRequest.getApplicationContext().getBean(UrlConverter.BEAN_NAME, UrlConverter.class),
150150
webRequest.getAttributes().getGrailsApplication());
151151
if(controller != null) {

grails-web/src/main/groovy/org/codehaus/groovy/grails/web/servlet/mvc/AbstractGrailsControllerHelper.java

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -138,17 +138,14 @@ public ModelAndView handleURI(final String originalUri, GrailsWebRequest grailsW
138138

139139
// Step 2: lookup the controller in the application.
140140
GrailsControllerClass controllerClass=null;
141-
if (!WebUtils.isIncludeRequest(request) && request.getAttribute(FORWARD_IN_PROGRESS) == null) {
142-
143-
Object attribute = grailsWebRequest.getAttribute(GrailsApplicationAttributes.GRAILS_CONTROLLER_CLASS, WebRequest.SCOPE_REQUEST);
144-
if (attribute instanceof GrailsControllerClass) {
145-
controllerClass = (GrailsControllerClass)attribute;
146-
Boolean canUse = (Boolean)grailsWebRequest.getAttribute(GrailsApplicationAttributes.GRAILS_CONTROLLER_CLASS_AVAILABLE, WebRequest.SCOPE_REQUEST);
147-
if(canUse == null) {
148-
controllerClass = null;
149-
} else {
150-
grailsWebRequest.removeAttribute(GrailsApplicationAttributes.GRAILS_CONTROLLER_CLASS_AVAILABLE, WebRequest.SCOPE_REQUEST);
151-
}
141+
Object attribute = grailsWebRequest.getAttribute(GrailsApplicationAttributes.GRAILS_CONTROLLER_CLASS, WebRequest.SCOPE_REQUEST);
142+
if (attribute instanceof GrailsControllerClass) {
143+
controllerClass = (GrailsControllerClass)attribute;
144+
Boolean canUse = (Boolean)grailsWebRequest.getAttribute(GrailsApplicationAttributes.GRAILS_CONTROLLER_CLASS_AVAILABLE, WebRequest.SCOPE_REQUEST);
145+
if(canUse == null) {
146+
controllerClass = null;
147+
} else {
148+
grailsWebRequest.removeAttribute(GrailsApplicationAttributes.GRAILS_CONTROLLER_CLASS_AVAILABLE, WebRequest.SCOPE_REQUEST);
152149
}
153150
}
154151

grails-web/src/main/groovy/org/codehaus/groovy/grails/web/util/WebUtils.java

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import javax.servlet.http.HttpServletRequest;
3939
import javax.servlet.http.HttpServletResponse;
4040

41+
import grails.web.CamelCaseUrlConverter;
4142
import grails.web.UrlConverter;
4243
import groovy.lang.Binding;
4344
import org.apache.commons.lang.StringUtils;
@@ -54,6 +55,7 @@
5455
import org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequest;
5556
import org.codehaus.groovy.grails.web.servlet.mvc.exceptions.ControllerExecutionException;
5657
import org.codehaus.groovy.grails.web.sitemesh.GrailsLayoutDecoratorMapper;
58+
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
5759
import org.springframework.context.ApplicationContext;
5860
import org.springframework.util.Assert;
5961
import org.springframework.web.context.WebApplicationContext;
@@ -325,12 +327,33 @@ public static String forwardRequestForUrlMappingInfo(HttpServletRequest request,
325327
// responsibility for rendering the response.
326328
final GrailsWebRequest webRequest = GrailsWebRequest.lookup(request);
327329
webRequest.removeAttribute(GrailsApplicationAttributes.MODEL_AND_VIEW, 0);
328-
webRequest.setActionName(info.getActionName());
329-
330+
info.configure(webRequest);
331+
passControllerForForwardedRequest(webRequest, info);
330332
dispatcher.forward(request, response);
331333
return forwardUrl;
332334
}
333335

336+
protected static void passControllerForForwardedRequest(final GrailsWebRequest webRequest,
337+
UrlMappingInfo info) {
338+
webRequest.removeAttribute(GrailsApplicationAttributes.GRAILS_CONTROLLER_CLASS_AVAILABLE, WebRequest.SCOPE_REQUEST);
339+
if (info.getViewName() == null && info.getURI() == null) {
340+
GrailsApplication grailsApplicationToUse = webRequest.getAttributes().getGrailsApplication();
341+
if(grailsApplicationToUse != null) {
342+
WebUtils.passControllerForUrlMappingInfoInRequest(webRequest, info, locateUrlConverter(webRequest), grailsApplicationToUse);
343+
}
344+
}
345+
}
346+
347+
private static UrlConverter locateUrlConverter(final GrailsWebRequest webRequest) {
348+
UrlConverter urlConverter = null;
349+
try {
350+
urlConverter = webRequest.getAttributes().getApplicationContext().getBean("grailsUrlConverter", UrlConverter.class);
351+
} catch (NoSuchBeanDefinitionException e) {
352+
urlConverter = new CamelCaseUrlConverter();
353+
}
354+
return urlConverter;
355+
}
356+
334357
/**
335358
* Include whatever the given UrlMappingInfo maps to within the current response
336359
*
@@ -380,6 +403,7 @@ public static IncludedContent includeForUrlMappingInfo(HttpServletRequest reques
380403
info.configure(webRequest);
381404
webRequest.getParameterMap().putAll(info.getParameters());
382405
webRequest.removeAttribute(GrailsApplicationAttributes.MODEL_AND_VIEW, 0);
406+
passControllerForForwardedRequest(webRequest, info);
383407
}
384408
return includeForUrl(includeUrl, request, response, model);
385409
}
@@ -710,25 +734,29 @@ public static String getForwardURI(HttpServletRequest request) {
710734
return result;
711735
}
712736

737+
@Deprecated
713738
public static GrailsClass getConfiguredControllerForUrlMappingInfo(GrailsWebRequest webRequest, UrlMappingInfo info, UrlConverter urlConverterToUse, GrailsApplication grailsApplicationToUse) {
714-
String viewName;
715-
viewName = info.getViewName();
739+
return passControllerForUrlMappingInfoInRequest(webRequest, info, urlConverterToUse, grailsApplicationToUse);
740+
}
716741

717-
GrailsClass controller = null;
718-
if (viewName == null && info.getURI() == null) {
742+
public static GrailsClass passControllerForUrlMappingInfoInRequest(GrailsWebRequest webRequest, UrlMappingInfo info, UrlConverter urlConverterToUse, GrailsApplication grailsApplicationToUse) {
743+
if (info.getViewName() == null && info.getURI() == null) {
719744
ControllerArtefactHandler.ControllerCacheKey featureId = getFeatureId(urlConverterToUse, info);
720-
controller = grailsApplicationToUse.getArtefactForFeature(ControllerArtefactHandler.TYPE, featureId);
745+
GrailsClass controller = grailsApplicationToUse.getArtefactForFeature(ControllerArtefactHandler.TYPE, featureId);
721746
if (controller != null) {
722-
723747
webRequest.setAttribute(GrailsApplicationAttributes.CONTROLLER_NAME_ATTRIBUTE, controller.getLogicalPropertyName(), WebRequest.SCOPE_REQUEST);
724748
webRequest.setAttribute(GrailsApplicationAttributes.GRAILS_CONTROLLER_CLASS, controller, WebRequest.SCOPE_REQUEST);
725749
webRequest.setAttribute(GrailsApplicationAttributes.GRAILS_CONTROLLER_CLASS_AVAILABLE, Boolean.TRUE, WebRequest.SCOPE_REQUEST);
750+
} else {
751+
webRequest.removeAttribute(GrailsApplicationAttributes.GRAILS_CONTROLLER_CLASS_AVAILABLE, WebRequest.SCOPE_REQUEST);
726752
}
727-
753+
return controller;
754+
} else {
755+
webRequest.removeAttribute(GrailsApplicationAttributes.GRAILS_CONTROLLER_CLASS_AVAILABLE, WebRequest.SCOPE_REQUEST);
756+
return null;
728757
}
729-
return controller;
730758
}
731-
759+
732760
public static ControllerArtefactHandler.ControllerCacheKey getFeatureId(UrlConverter urlConverter, UrlMappingInfo info) {
733761
final String action = info.getActionName() == null ? "" : info.getActionName();
734762
final String controllerName = info.getControllerName();

0 commit comments

Comments
 (0)