Quantcast

Using GroovyPagesTemplateEngine outside the context of a request for a plugin?

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

Using GroovyPagesTemplateEngine outside the context of a request for a plugin?

stefankendall
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
    }

Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

Re: Using GroovyPagesTemplateEngine outside the context of a request for a plugin?

pmcneil
You could use Grails 2.0.0.RC1...

On 23/10/11 08:24, Stefan Kendall wrote:
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
    }



-- 
web: http://nerderg.com
Twitter: http://twitter.com/pmcneil
Loading...