views:

26

answers:

2

I want to know programmatically if a view or a layout exists in grails.

I am thinking in obtain the absolutepath and ask for File.exists but I don't know how to obtain this path for every enviroment.

I had tried groovyPagesTemplateEngine.getUriWithinGrailsViews('a-view.gsp') without success.

Can you give me any pointer?

thanks in advance

A: 

I see 2 possibilities

Search for view file

If you build a war file you will see that views are stored in WEB-INF/grails-app/views. You can search for that resource.

def uri = this.getClass().getResource("/grails-app/views/...").toURI()
if(new File(uri).exists()){...}

Use PathMatchingResourcePatternResolver

Find a inspiration in assertView method of GrailsUrlMappingsTestCase.

def patternResolver = new PathMatchingResourcePatternResolver()
def pathPattern = "grails-app/views/" + ((controller) ? "$controller/" : "") + "${view}.*"
if (!patternResolver.getResources(pathPattern)) {...}
amra
A: 

Additionally to what amra said, you can also use grailsAttributes(see docs for GrailsApplicationAttributes). Quick example:

private templateExists(String name) {
    def template = grailsAttributes.getTemplateUri(name, request)
    def resource = grailsAttributes.pagesTemplateEngine
                                   .getResourceForUri(template)
    return resource && resource.file && resource.exists()
}

This example is of course for templates but as you can see from the docs, similar method exists for views too.

Esko