@@ -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}
0 commit comments