Skip to content

Commit 0d69985

Browse files
committed
Merge branch '3.2.x' of github.com:grails/grails-core into 3.2.x
2 parents 19138ed + 7534a79 commit 0d69985

File tree

2 files changed

+39
-16
lines changed

2 files changed

+39
-16
lines changed

grails-web-url-mappings/src/main/groovy/org/grails/web/mapping/CachingLinkGenerator.java

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package org.grails.web.mapping;
1717

18+
import java.util.LinkedHashMap;
1819
import java.util.Map;
1920

2021
import grails.util.GrailsStringUtils;
@@ -100,24 +101,25 @@ private boolean isCacheable(Map attrs) {
100101
}
101102

102103
// Based on DGM toMapString, but with StringBuilder instead of StringBuffer
103-
private void appendMapKey(StringBuilder buffer, Map map) {
104-
if (map==null || map.isEmpty()) {
104+
private void appendMapKey(StringBuilder buffer, Map<String, Object> params) {
105+
if (params==null || params.isEmpty()) {
105106
buffer.append(EMPTY_MAP_STRING);
106-
}
107-
final String requestControllerName = getRequestStateLookupStrategy().getControllerName();
108-
if (map.get(UrlMapping.ACTION) != null && map.get(UrlMapping.CONTROLLER) == null) {
109-
Object action = map.remove(UrlMapping.ACTION);
110-
map.put(UrlMapping.CONTROLLER, requestControllerName);
111-
map.put(UrlMapping.ACTION, action);
112-
}
113-
if (map.get(UrlMapping.NAMESPACE) == null && map.get(UrlMapping.CONTROLLER) == requestControllerName) {
114-
String namespace = getRequestStateLookupStrategy().getControllerNamespace();
115-
if (GrailsStringUtils.isNotEmpty(namespace)) {
116-
map.put(UrlMapping.NAMESPACE, namespace);
107+
buffer.append(OPENING_BRACKET);
108+
} else {
109+
buffer.append(OPENING_BRACKET);
110+
Map map = new LinkedHashMap<>(params);
111+
final String requestControllerName = getRequestStateLookupStrategy().getControllerName();
112+
if (map.get(UrlMapping.ACTION) != null && map.get(UrlMapping.CONTROLLER) == null && map.get(RESOURCE_PREFIX) == null) {
113+
Object action = map.remove(UrlMapping.ACTION);
114+
map.put(UrlMapping.CONTROLLER, requestControllerName);
115+
map.put(UrlMapping.ACTION, action);
116+
}
117+
if (map.get(UrlMapping.NAMESPACE) == null && map.get(UrlMapping.CONTROLLER) == requestControllerName) {
118+
String namespace = getRequestStateLookupStrategy().getControllerNamespace();
119+
if (GrailsStringUtils.isNotEmpty(namespace)) {
120+
map.put(UrlMapping.NAMESPACE, namespace);
121+
}
117122
}
118-
}
119-
buffer.append(OPENING_BRACKET);
120-
if (map != null) {
121123
boolean first = true;
122124
for (Object o : map.entrySet()) {
123125
Map.Entry entry = (Map.Entry) o;

grails-web-url-mappings/src/test/groovy/org/grails/web/mapping/CachingLinkGeneratorSpec.groovy

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,19 @@ class CachingLinkGeneratorSpec extends Specification {
8787
key == "link[controller:foo, action:bar, namespace:fooParam]"
8888
}
8989

90+
void "test resource with action"() {
91+
given:
92+
String key
93+
94+
when: "the args are a resource and action"
95+
request.setControllerNamespace("fooReq")
96+
request.setControllerName("foo")
97+
key = linkGenerator.makeKey([resource: new Resource(id: 1), action: "bar"])
98+
99+
then: "controller and namespace aren't in the key"
100+
key == "link[resource:org.grails.web.mapping.CachingLinkGeneratorSpec\$Resource->1, action:bar]"
101+
}
102+
90103

91104
class MyCachingLinkGenerator extends CachingLinkGenerator {
92105
public MyCachingLinkGenerator(String serverBaseURL) {
@@ -97,4 +110,12 @@ class CachingLinkGeneratorSpec extends Specification {
97110
super.makeKey(LINK_PREFIX, attrs)
98111
}
99112
}
113+
114+
class Resource {
115+
Long id
116+
117+
Long ident() {
118+
id
119+
}
120+
}
100121
}

0 commit comments

Comments
 (0)