Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to know programmatically if a view or a layout file exists in grails

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

like image 405
user2427 Avatar asked Aug 02 '10 21:08

user2427


3 Answers

Since Grails 2.0, you can inject a GrailsConventionGroovyPageLocator:

GrailsConventionGroovyPageLocator groovyPageLocator

and call

groovyPageLocator.findViewByPath(...)
groovyPageLocator.findTemplateByPath(...)

to check if views or templates exist.

like image 95
Ingo Kegel Avatar answered Nov 02 '22 09:11

Ingo Kegel


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.

like image 38
Esko Avatar answered Nov 02 '22 07:11

Esko


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)) {...}
like image 3
amra Avatar answered Nov 02 '22 07:11

amra