Skip to content
This repository was archived by the owner on Mar 10, 2025. It is now read-only.
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit e4114b3

Browse files
authoredJun 12, 2023
Merge pull request #39 from dustindclark/master
Fixes #18.
2 parents 13e9c99 + 38cb35b commit e4114b3

File tree

1 file changed

+51
-19
lines changed

1 file changed

+51
-19
lines changed
 

‎src/main/groovy/grails/plugin/scaffolding/ScaffoldingViewResolver.groovy

Lines changed: 51 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,12 @@ import grails.util.Environment
77
import groovy.text.GStringTemplateEngine
88
import groovy.text.Template
99
import groovy.transform.CompileStatic
10-
import org.grails.buffer.*
10+
import org.grails.buffer.FastStringWriter
1111
import org.grails.web.servlet.mvc.GrailsWebRequest
1212
import org.grails.web.servlet.view.GroovyPageView
1313
import org.grails.web.servlet.view.GroovyPageViewResolver
1414
import org.springframework.context.ResourceLoaderAware
15-
import org.springframework.core.io.ByteArrayResource
16-
import org.springframework.core.io.FileSystemResource
17-
import org.springframework.core.io.Resource
18-
import org.springframework.core.io.ResourceLoader
19-
import org.springframework.core.io.UrlResource
15+
import org.springframework.core.io.*
2016
import org.springframework.web.servlet.View
2117

2218
import java.util.concurrent.ConcurrentHashMap
@@ -27,6 +23,39 @@ import java.util.concurrent.ConcurrentHashMap
2723
*/
2824
@CompileStatic
2925
class ScaffoldingViewResolver extends GroovyPageViewResolver implements ResourceLoaderAware, ModelBuilder {
26+
final Class templateOverridePluginDescriptor
27+
28+
public ScaffoldingViewResolver() {
29+
this.templateOverridePluginDescriptor = null
30+
}
31+
32+
/**
33+
* This constructor allows a plugin to override the default templates provided by the Scaffolding
34+
* plugin. The plugin that contains the template override should be configured to load AFTER the
35+
* scaffolding plugin. An example implementation follows:
36+
*
37+
* <pre>
38+
* {@code
39+
* def loadAfter = ['scaffolding']
40+
* }
41+
* </pre>
42+
* ...
43+
* <pre>
44+
* {@code
45+
* @Override
46+
* Closure doWithSpring() { { ->
47+
* jspViewResolver(ScaffoldingViewResolver, this.class) { bean ->
48+
* bean.lazyInit = true
49+
* bean.parent = "abstractViewResolver"
50+
* }
51+
* }}
52+
* </pre>
53+
*
54+
* @param templateOverridePluginDescriptor
55+
*/
56+
public ScaffoldingViewResolver(Class templateOverridePluginDescriptor) {
57+
this.templateOverridePluginDescriptor = templateOverridePluginDescriptor
58+
}
3059

3160
ResourceLoader resourceLoader
3261
protected Map<String, View> generatedViewCache = new ConcurrentHashMap<>()
@@ -43,42 +72,46 @@ class ScaffoldingViewResolver extends GroovyPageViewResolver implements Resource
4372
@Override
4473
protected View loadView(String viewName, Locale locale) throws Exception {
4574
def view = super.loadView(viewName, locale)
46-
if(view == null) {
75+
if (view == null) {
4776
String cacheKey = buildCacheKey(viewName)
4877
view = generatedViewCache.get(cacheKey)
49-
if(view != null) {
78+
if (view != null) {
5079
return view
51-
}
52-
else {
80+
} else {
5381
def webR = GrailsWebRequest.lookup()
5482
def controllerClass = webR.controllerClass
5583

5684
def scaffoldValue = controllerClass?.getPropertyValue("scaffold")
57-
if(scaffoldValue instanceof Class) {
85+
if (scaffoldValue instanceof Class) {
5886
def shortViewName = viewName.substring(viewName.lastIndexOf('/') + 1)
5987
Resource res = null
6088

61-
if(Environment.isDevelopmentMode()) {
89+
if (Environment.isDevelopmentMode()) {
6290
res = new FileSystemResource(new File(BuildSettings.BASE_DIR, "src/main/templates/scaffolding/${shortViewName}.gsp"))
6391
}
6492

65-
if(!res?.exists()) {
93+
if (!res?.exists()) {
6694
def url = IOUtils.findResourceRelativeToClass(controllerClass.clazz, "/META-INF/templates/scaffolding/${shortViewName}.gsp")
6795
res = url ? new UrlResource(url) : null
6896
}
6997

70-
if(!res.exists()) {
98+
if (!res.exists() && templateOverridePluginDescriptor) {
99+
def url = IOUtils.findResourceRelativeToClass(templateOverridePluginDescriptor, "/META-INF/templates/scaffolding/${shortViewName}.gsp")
100+
res = url ? new UrlResource(url) : null
101+
}
102+
103+
if (!res.exists()) {
71104
res = resourceLoader.getResource("classpath:META-INF/templates/scaffolding/${shortViewName}.gsp")
72105
}
73106

74-
if(res.exists()) {
75-
def model = model((Class)scaffoldValue)
107+
if (res.exists()) {
108+
def model = model((Class) scaffoldValue)
76109
def viewGenerator = new GStringTemplateEngine()
77110
Template t = viewGenerator.createTemplate(res.URL)
78111

79112
def contents = new FastStringWriter()
80113
t.make(model.asMap()).writeTo(contents)
81-
114+
82115
def template = templateEngine.createTemplate(new ByteArrayResource(contents.toString().getBytes(templateEngine.gspEncoding), "view:$cacheKey"))
83116
view = new GroovyPageView()
84117
view.setServletContext(getServletContext())
@@ -88,8 +121,7 @@ class ScaffoldingViewResolver extends GroovyPageViewResolver implements Resource
88121
view.afterPropertiesSet()
89122
generatedViewCache.put(cacheKey, view)
90123
return view
91-
}
92-
else {
124+
} else {
93125
return view
94126
}
95127

0 commit comments

Comments
 (0)
This repository has been archived.