Skip to content

Commit 06ae1b3

Browse files
committed
Merge pull request #9489 from driverpt/3.0.x
Backported support for Nested Grouped UrlMappings from master
2 parents 8528904 + 5b224d6 commit 06ae1b3

File tree

2 files changed

+57
-2
lines changed

2 files changed

+57
-2
lines changed

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

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ private List<UrlMapping> evaluateMappings(GroovyObject go, Closure<?> mappings,
157157

158158
@SuppressWarnings("rawtypes")
159159
public List<UrlMapping> evaluateMappings(Closure closure) {
160-
UrlMappingBuilder builder = new UrlMappingBuilder(null);
160+
UrlMappingBuilder builder = new UrlMappingBuilder((Binding) null);
161161
closure.setDelegate(builder);
162162
closure.setResolveStrategy(Closure.DELEGATE_FIRST);
163163
if (closure.getParameterTypes().length == 0) {
@@ -233,6 +233,19 @@ public UrlMappingBuilder(Binding binding) {
233233
this.binding = binding;
234234
}
235235

236+
protected UrlMappingBuilder(UrlMappingBuilder parent) {
237+
this(parent.binding);
238+
urlDefiningMode = parent.urlDefiningMode;
239+
previousConstraints = parent.previousConstraints;
240+
inGroupConstraints = parent.inGroupConstraints;
241+
urlMappings = parent.urlMappings;
242+
parameterValues = parent.parameterValues;
243+
exception = parent.exception;
244+
parseRequest = parent.parseRequest;
245+
parentResources = parent.parentResources;
246+
mappingInfoDeque = parent.mappingInfoDeque;
247+
}
248+
236249
public List<UrlMapping> getUrlMappings() {
237250
return urlMappings;
238251
}
@@ -342,8 +355,12 @@ public void name(Map<String, UrlMapping> m) {
342355
public void group(String uri, Closure mappings) {
343356

344357
try {
345-
parentResources.push(new ParentResource(null, uri, true, true));
358+
ParentResource parentResource = new ParentResource(null, uri, true, true);
359+
parentResources.push(parentResource);
346360
pushNewMetaMappingInfo();
361+
UrlGroupMappingRecursionBuilder builder = new UrlGroupMappingRecursionBuilder(this, parentResource);
362+
mappings.setDelegate(builder);
363+
mappings.setResolveStrategy(Closure.DELEGATE_FIRST);
347364
mappings.call();
348365
inGroupConstraints = false;
349366
} finally {
@@ -505,6 +522,7 @@ private Object _invoke(String methodName, Object arg, Object delegate) {
505522

506523
Closure callable = (Closure) args[0];
507524
callable.setDelegate(builder);
525+
callable.setResolveStrategy(Closure.DELEGATE_FIRST);
508526
for (ConstrainedProperty constrainedProperty : currentConstraints) {
509527
builder.getConstrainedProperties().put(constrainedProperty.getPropertyName(), constrainedProperty);
510528
}
@@ -1026,4 +1044,22 @@ class ParentResource {
10261044
}
10271045
}
10281046
}
1047+
1048+
class UrlGroupMappingRecursionBuilder extends UrlMappingBuilder {
1049+
private ParentResource parentResource;
1050+
1051+
public UrlGroupMappingRecursionBuilder(UrlMappingBuilder parent, ParentResource parentResource) {
1052+
super(parent);
1053+
1054+
this.parentResource = parentResource;
1055+
}
1056+
1057+
@Override
1058+
public void group(String uri, Closure mappings) {
1059+
if (parentResource != null) {
1060+
uri = parentResource.uri.concat(uri);
1061+
}
1062+
super.group(uri, mappings);
1063+
}
1064+
}
10291065
}

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,25 @@ class GroupedUrlMappingSpec extends AbstractUrlMappingsSpec {
8484
linkGenerator.link(controller: "test", action: 'show', id: 1, params: [alias: 'foo']) == 'http://localhost/events/foo/orders/1'
8585
}
8686

87+
88+
@Issue('#9394')
89+
void "Test that nested group parameters are supported"() {
90+
given: "A link generator with a dynamic URL mapping"
91+
def linkGenerator = getLinkGenerator {
92+
group "/events/$alias", {
93+
group "/orders", {
94+
"/$id"(controller: 'test', action: 'show')
95+
}
96+
97+
"/"(controller: 'test', action: 'index')
98+
}
99+
}
100+
101+
expect:
102+
linkGenerator.link(controller: "test", action: 'show', id: 1, params: [alias: 'foo']) == 'http://localhost/events/foo/orders/1'
103+
linkGenerator.link(controller: "test", action: 'index', params: [alias: 'foo']) == 'http://localhost/events/foo'
104+
}
105+
87106
@Issue('#9426')
88107
void "Test that constraints embedded within groups are properly respected"() {
89108
given: "A group with a child URL that contains a constraint"

0 commit comments

Comments
 (0)