|
I'm building a plugin where I require access to the groovyPagesTemplateEngine outside of a request, but I run into multiple issues when I use g:createLink. My first implementation pass was this:
String compileGsp(File input) { GrailsWebUtil.bindMockWebRequest((WebApplicationContext) ApplicationHolder.application.mainContext)
StringWriter sw = new StringWriter() groovyPagesTemplateEngine.createTemplate(input).make().writeTo(sw)
return sw.toString() } but I received numerous exceptions about getOut being undefined, grailsApplication being undefined, and request being undefined.
My workaround for now is to modify the ApplicationTagLib metaclass during the compilation, but this doesn't seem clean. Is there any easier way to store and restore the metaclass, or a better fix to use groovyPagesTemplateEngine outside the context of a request?
Here's my current workaround.
String compileGsp(File input) { StringWriter gspWriter = new StringWriter() GrailsWebUtil.bindMockWebRequest(grailsApplication.mainContext) prepareAndWriteGsp(input, gspWriter) return gspWriter.toString() } protected def prepareAndWriteGsp(File input, StringWriter gspWriter) { prepareApplicationTagLibMetaclass(gspWriter) try { groovyPagesTemplateEngine.createTemplate(input).make().writeTo(gspWriter) } catch (Exception e) { throw e } finally { restoreApplicationTagLibMetaclass() } } def applicationTagLibGetOut def applicationTagLibGrailsApplication def applicationTagLibRequest protected void prepareApplicationTagLibMetaclass(StringWriter gspWriter) { applicationTagLibGetOut = ApplicationTagLib.metaClass.getOut applicationTagLibGrailsApplication = ApplicationTagLib.metaClass.grailsApplication applicationTagLibRequest = ApplicationTagLib.metaClass.request ApplicationTagLib.metaClass.getOut = {-> gspWriter} ApplicationTagLib.metaClass.grailsApplication = grailsApplication ApplicationTagLib.metaClass.request = {-> new MockHttpServletRequest()} } protected def restoreApplicationTagLibMetaclass() { ApplicationTagLib.metaClass.getOut = applicationTagLibGetOut ApplicationTagLib.metaClass.grailsApplication = applicationTagLibGrailsApplication ApplicationTagLib.metaClass.request = applicationTagLibRequest } |
|
You could use Grails 2.0.0.RC1...
On 23/10/11 08:24, Stefan Kendall wrote:
-- web: http://nerderg.com Twitter: http://twitter.com/pmcneil |
| Powered by Nabble | Edit this page |
