@@ -190,4 +190,66 @@ public void testAllMacros() throws Exception {
190190 }
191191 }
192192
193+ // SPR-5172
194+ public void testIdContainsBraces () throws Exception {
195+ DummyMacroRequestContext rc = new DummyMacroRequestContext (request );
196+ Map <String , String > msgMap = new HashMap <String , String >();
197+ msgMap .put ("hello" , "Howdy" );
198+ msgMap .put ("world" , "Mundo" );
199+ rc .setMessageMap (msgMap );
200+ Map <String , String > themeMsgMap = new HashMap <String , String >();
201+ themeMsgMap .put ("hello" , "Howdy!" );
202+ themeMsgMap .put ("world" , "Mundo!" );
203+ rc .setThemeMessageMap (themeMsgMap );
204+ rc .setContextPath ("/springtest" );
205+
206+ TestBean darren = new TestBean ("Darren" , 99 );
207+ TestBean fred = new TestBean ("Fred" );
208+ fred .setJedi (true );
209+ darren .setSpouse (fred );
210+ darren .setJedi (true );
211+ darren .setStringArray (new String [] {"John" , "Fred" });
212+ request .setAttribute ("command" , darren );
213+
214+ Map <String , String > names = new HashMap <String , String >();
215+ names .put ("Darren" , "Darren Davison" );
216+ names .put ("John" , "John Doe" );
217+ names .put ("Fred" , "Fred Bloggs" );
218+
219+ VelocityConfigurer vc = new VelocityConfigurer ();
220+ vc .setPreferFileSystemAccess (false );
221+ VelocityEngine ve = vc .createVelocityEngine ();
222+
223+ Map <String , Object > model = new HashMap <String , Object >();
224+ model .put ("command" , darren );
225+ model .put ("springMacroRequestContext" , rc );
226+ model .put ("nameOptionMap" , names );
227+
228+ VelocityView view = new VelocityView ();
229+ view .setBeanName ("myView" );
230+ view .setUrl ("org/springframework/web/servlet/view/velocity/test-spr5172.vm" );
231+ view .setEncoding ("UTF-8" );
232+ view .setExposeSpringMacroHelpers (false );
233+ view .setVelocityEngine (ve );
234+
235+ view .render (model , request , response );
236+
237+ // tokenize output and ignore whitespace
238+ String output = response .getContentAsString ();
239+ String [] tokens = StringUtils .tokenizeToStringArray (output , "\t \n " );
240+
241+ for (int i = 0 ; i < tokens .length ; i ++) {
242+ if (tokens [i ].equals ("FORM1" )) assertEquals ("<input type=\" text\" id=\" spouses0.name\" name=\" spouses[0].name\" value=\" Fred\" >" , tokens [i + 1 ]); //
243+ if (tokens [i ].equals ("FORM2" )) assertEquals ("<textarea id=\" spouses0.name\" name=\" spouses[0].name\" >Fred</textarea>" , tokens [i + 1 ]);
244+ if (tokens [i ].equals ("FORM3" )) assertEquals ("<select id=\" spouses0.name\" name=\" spouses[0].name\" >" , tokens [i + 1 ]);
245+ if (tokens [i ].equals ("FORM4" )) assertEquals ("<select multiple=\" multiple\" id=\" spouses\" name=\" spouses\" >" , tokens [i + 1 ]);
246+ if (tokens [i ].equals ("FORM5" )) assertEquals ("<input type=\" radio\" name=\" spouses[0].name\" value=\" Darren\" " , tokens [i + 1 ]);
247+ if (tokens [i ].equals ("FORM6" )) assertEquals ("<input type=\" password\" id=\" spouses0.name\" name=\" spouses[0].name\" value=\" \" >" , tokens [i + 1 ]);
248+ if (tokens [i ].equals ("FORM7" )) assertEquals ("<input type=\" hidden\" id=\" spouses0.name\" name=\" spouses[0].name\" value=\" Fred\" >" , tokens [i + 1 ]);
249+ if (tokens [i ].equals ("FORM8" )) assertEquals ("<input type=\" hidden\" name=\" _spouses0.name\" value=\" on\" />" , tokens [i + 1 ]);
250+ if (tokens [i ].equals ("FORM8" )) assertEquals ("<input type=\" checkbox\" id=\" spouses0.name\" name=\" spouses[0].name\" />" , tokens [i + 2 ]);
251+ if (tokens [i ].equals ("FORM9" )) assertEquals ("<input type=\" hidden\" name=\" _spouses0.jedi\" value=\" on\" />" , tokens [i + 1 ]);
252+ if (tokens [i ].equals ("FORM9" )) assertEquals ("<input type=\" checkbox\" id=\" spouses0.jedi\" name=\" spouses[0].jedi\" checked=\" checked\" />" , tokens [i + 2 ]);
253+ }
254+ }
193255}
0 commit comments