Skip to content

Commit 5fde0d0

Browse files
committed
Merge branch '3.0.x' into 3.1.x
2 parents 687cc60 + f32de54 commit 5fde0d0

File tree

7 files changed

+69
-11
lines changed

7 files changed

+69
-11
lines changed

grails-core/src/main/groovy/grails/boot/config/GrailsAutoConfiguration.groovy

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import org.springframework.context.ResourceLoaderAware
1515
import org.springframework.context.annotation.Bean
1616
import org.springframework.core.io.DefaultResourceLoader
1717
import org.springframework.core.io.Resource
18+
import org.springframework.core.io.UrlResource
1819
import org.springframework.core.io.support.PathMatchingResourcePatternResolver
1920
import org.springframework.core.io.support.ResourcePatternResolver
2021
import org.springframework.core.type.classreading.CachingMetadataReaderFactory
@@ -213,23 +214,33 @@ class GrailsAutoConfiguration implements GrailsApplicationClass, ApplicationCont
213214
private static class ApplicationRelativeClassLoader extends URLClassLoader {
214215

215216
final URL rootResource
217+
final Class applicationClass
218+
final boolean jarDeployed
216219

217220
ApplicationRelativeClassLoader(Class applicationClass) {
218221
super([ IOUtils.findRootResource(applicationClass)] as URL[])
219222

220223
this.rootResource = getURLs()[0]
224+
this.applicationClass = applicationClass
221225
def urlStr = rootResource.toString()
226+
jarDeployed = urlStr.startsWith("jar:")
222227
try {
223228
def withoutBang = new URL("${urlStr.substring(0, urlStr.length() - 2)}/")
224229
addURL(withoutBang)
230+
225231
} catch (MalformedURLException e) {
226232
// ignore, running as a WAR
227233
}
228234
}
229235

230236
@Override
231237
Enumeration<URL> getResources(String name) throws IOException {
232-
return super.findResources(name)
238+
if(jarDeployed && name == '') {
239+
return applicationClass.getClassLoader().getResources(name)
240+
}
241+
else {
242+
return super.findResources(name)
243+
}
233244
}
234245
}
235246

grails-core/src/main/groovy/grails/config/Settings.groovy

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,11 @@ interface Settings {
174174
*/
175175
String RESOURCES_PATTERN = 'grails.resources.pattern'
176176

177+
/**
178+
* The default pattern for static resources
179+
*/
180+
String DEFAULT_RESOURCE_PATTERN = '/static/**'
181+
177182
/**
178183
* Whether to log request parameters in the console
179184
*/

grails-plugin-controllers/src/main/groovy/org/grails/plugins/web/controllers/ControllersGrailsPlugin.groovy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ class ControllersGrailsPlugin extends Plugin {
7979
String grailsServletPath = config.getProperty(Settings.WEB_SERVLET_PATH, '/')
8080
int resourcesCachePeriod = config.getProperty(Settings.RESOURCES_CACHE_PERIOD, Integer, 0)
8181
boolean resourcesEnabled = config.getProperty(Settings.RESOURCES_ENABLED, Boolean, true)
82-
String resourcesPattern = config.getProperty(Settings.RESOURCES_PATTERN, String, '/static/**')
82+
String resourcesPattern = config.getProperty(Settings.RESOURCES_PATTERN, String, Settings.DEFAULT_RESOURCE_PATTERN)
8383

8484
bootStrapClassRunner(BootStrapClassRunner)
8585
tokenResponseActionResultTransformer(TokenResponseActionResultTransformer)

grails-plugin-url-mappings/src/main/groovy/org/grails/plugins/web/mapping/UrlMappingsGrailsPlugin.groovy

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,6 @@ class UrlMappingsGrailsPlugin extends Plugin {
7474
urlMappingsErrorPageCustomizer(UrlMappingsErrorPageCustomizer)
7575
grailsLinkGenerator(cacheUrls ? CachingLinkGenerator : DefaultLinkGenerator, serverURL)
7676

77-
78-
7977
if (isReloadEnabled) {
8078
urlMappingsTargetSource(HotSwappableTargetSourceFactoryBean) {
8179
it.lazyInit = true

grails-test-suite-base/src/main/groovy/org/grails/web/taglib/AbstractGrailsTagTests.groovy

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,9 @@ abstract class AbstractGrailsTagTests extends GroovyTestCase {
9898
}
9999

100100
GrailsWebRequest buildMockRequest(ConfigObject co) throws Exception {
101+
co.grails.resources.pattern = '/**'
101102
def config = new PropertySourcesConfig().merge(co)
103+
102104
ga.config = config
103105
Holders.config = config
104106
servletContext.setAttribute(GrailsApplicationAttributes.APPLICATION_CONTEXT, appCtx)
@@ -222,6 +224,7 @@ abstract class AbstractGrailsTagTests extends GroovyTestCase {
222224
grailsApplication = new DefaultGrailsApplication(gcl.loadedClasses, gcl)
223225
grailsApplication.metadata[Metadata.APPLICATION_NAME] = getClass().name
224226
ga = grailsApplication
227+
ga.config.grails.resources.pattern = '/**'
225228
ga.config.grails.gsp.tldScanPattern = 'classpath*:/META-INF/spring*.tld,classpath*:/META-INF/fmt.tld,classpath*:/META-INF/c.tld,classpath*:/META-INF/core.tld,classpath*:/META-INF/c-1_0-rt.tld'
226229
grailsApplication.initialise()
227230
mockManager = new MockGrailsPluginManager(grailsApplication)

grails-web-url-mappings/src/main/groovy/org/grails/web/mapping/DefaultLinkGenerator.groovy

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,16 @@
1515
*/
1616
package org.grails.web.mapping
1717

18+
import grails.config.Settings
1819
import grails.util.GrailsClassUtils
1920
import grails.web.CamelCaseUrlConverter
2021
import grails.web.mapping.LinkGenerator
2122
import grails.web.mapping.UrlCreator
2223
import grails.web.mapping.UrlMapping
2324
import grails.web.mapping.UrlMappingsHolder
25+
import org.springframework.beans.factory.annotation.Value
2426

27+
import javax.annotation.PostConstruct
2528
import java.util.regex.Pattern
2629

2730
import grails.util.Environment
@@ -76,6 +79,7 @@ class DefaultLinkGenerator implements LinkGenerator, org.codehaus.groovy.grails.
7679
]
7780
String configuredServerBaseURL
7881
String contextPath
82+
String resourcePath
7983

8084
GrailsRequestStateLookupStrategy requestStateLookupStrategy = new DefaultRequestStateLookupStrategy()
8185

@@ -92,6 +96,11 @@ class DefaultLinkGenerator implements LinkGenerator, org.codehaus.groovy.grails.
9296
@Autowired(required = false)
9397
UrlConverter grailsUrlConverter = new CamelCaseUrlConverter()
9498

99+
@Value('${grails.resources.pattern:/static/**}')
100+
String resourcePattern = Settings.DEFAULT_RESOURCE_PATTERN
101+
102+
103+
95104
DefaultLinkGenerator(String serverBaseURL, String contextPath) {
96105
configuredServerBaseURL = serverBaseURL
97106
this.contextPath = contextPath
@@ -101,6 +110,13 @@ class DefaultLinkGenerator implements LinkGenerator, org.codehaus.groovy.grails.
101110
configuredServerBaseURL = serverBaseURL
102111
}
103112

113+
@PostConstruct
114+
void initializeResourcePath() {
115+
if(resourcePattern?.endsWith('/**')) {
116+
resourcePath = resourcePattern.substring(0, resourcePattern.length() - 3)
117+
}
118+
}
119+
104120
/**
105121
* {@inheritDoc}
106122
*/
@@ -324,7 +340,7 @@ class DefaultLinkGenerator implements LinkGenerator, org.codehaus.groovy.grails.
324340
StringBuilder url = new StringBuilder(absolutePath?.toString() ?: '')
325341
def dir = attrs.dir?.toString()
326342
if (attrs.plugin) {
327-
url << pluginManager?.getPluginPath(attrs.plugin?.toString()) ?: ''
343+
url.append pluginManager?.getPluginPath(attrs.plugin?.toString()) ?: ''
328344
}
329345
else {
330346
if (contextPathAttribute == null) {
@@ -335,19 +351,24 @@ class DefaultLinkGenerator implements LinkGenerator, org.codehaus.groovy.grails.
335351
}
336352
}
337353

354+
355+
def slash = '/'
356+
if(resourcePath != null) {
357+
url.append(resourcePath)
358+
}
338359
if (dir) {
339-
if (!dir.startsWith('/')) {
340-
url << '/'
360+
if (!dir.startsWith(slash)) {
361+
url.append slash
341362
}
342-
url << dir
363+
url.append dir
343364
}
344365

345366
def file = attrs.file?.toString()
346367
if (file) {
347-
if (!(file.startsWith('/') || (dir != null && dir.endsWith('/')))) {
348-
url << '/'
368+
if (!(file.startsWith(slash) || (dir != null && dir.endsWith(slash)))) {
369+
url.append slash
349370
}
350-
url << file
371+
url.append file
351372
}
352373

353374
return url.toString()

grails-web-url-mappings/src/test/groovy/org/codehaus/groovy/grails/web/mapping/LinkGeneratorSpec.groovy

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,30 @@ class LinkGeneratorSpec extends Specification {
2323

2424
def baseUrl = "http://myserver.com/foo"
2525
def context = "/bar"
26+
def resourcePath = ''
2627
def someAbsoluteUrl = "http://www.grails.org/"
2728
def resource = null
2829
def linkParams = [:]
2930
def pluginManager
3031

3132
def mainCssResource = [dir:'css', file:'main.css']
3233

34+
35+
def "relative links contain the context with resource path"() {
36+
when:
37+
resource = mainCssResource
38+
39+
then:
40+
link == "$context/$resource.dir/$resource.file"
41+
42+
when:
43+
resourcePath = '/foo'
44+
resource = mainCssResource
45+
46+
then:
47+
link == "$context$resourcePath/$resource.dir/$resource.file"
48+
}
49+
3350
def "Test absolute link"() {
3451
when:
3552
linkParams.uri = someAbsoluteUrl
@@ -284,6 +301,9 @@ class LinkGeneratorSpec extends Specification {
284301
generator.grailsUrlConverter = new CamelCaseUrlConverter()
285302
def urlMappingsHolder = [getReverseMapping: callable,getReverseMappingNoDefault: callable] as UrlMappingsHolder
286303

304+
if(resourcePath != null) {
305+
generator.resourcePath = resourcePath
306+
}
287307
generator.urlMappingsHolder = urlMappingsHolder
288308
if (pluginManager) {
289309
generator.pluginManager = pluginManager

0 commit comments

Comments
 (0)