forked from bertramdev/grails-asset-pipeline
-
Notifications
You must be signed in to change notification settings - Fork 0
/
AssetPipelineGrailsPlugin.groovy
146 lines (125 loc) · 6.19 KB
/
AssetPipelineGrailsPlugin.groovy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/*
* Copyright 2014 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import grails.util.Environment
import grails.plugin.webxml.FilterManager
import org.codehaus.groovy.grails.plugins.GrailsPluginUtils
import asset.pipeline.grails.LinkGenerator
import asset.pipeline.grails.CachingLinkGenerator
import asset.pipeline.grails.AssetResourceLocator
import asset.pipeline.grails.fs.*
import asset.pipeline.fs.*
import asset.pipeline.*
class AssetPipelineGrailsPlugin {
def version = "2.1.1"
def grailsVersion = "2.2 > *"
def title = "Asset Pipeline Plugin"
def author = "David Estes"
def authorEmail = "destes@bcap.com"
def description = 'The Asset-Pipeline is a plugin used for managing and processing static assets in Grails applications. Asset-Pipeline functions include processing and minification of both CSS and JavaScript files. It is also capable of being extended to compile custom static assets, such as CoffeeScript.'
def documentation = "http://bertramdev.github.io/asset-pipeline"
def license = "APACHE"
def organization = [ name: "Bertram Capital", url: "http://www.bertramcapital.com/" ]
def issueManagement = [ system: "GITHUB", url: "http://github.com/bertramdev/asset-pipeline/issues" ]
def scm = [ url: "http://github.com/bertramdev/asset-pipeline" ]
def pluginExcludes = [
"grails-app/assets/**",
"test/dummy/**"
]
def developers = [ [name: 'Brian Wheeler'] ]
def loadAfter = ['url-mappings']
def doWithApplicationContext = { ctx ->
//Register Plugin Paths
AssetPipelineConfigHolder.registerResolver(new FileSystemAssetResolver('application','grails-app/assets'))
def pluginManager = ctx.pluginManager
if(!application.warDeployed) {
// for(plugin in pluginManager.getAllPlugins()) {
// if(plugin instanceof org.codehaus.groovy.grails.plugins.BinaryGrailsPlugin) {
// def descriptorURI = plugin.binaryDescriptor.resource.URI
// descriptorURI = new java.net.URI( new java.net.URI(descriptorURI.getSchemeSpecificPart()).getSchemeSpecificPart()).toString().split("!")[0]
// AssetPipelineConfigHolder.registerResolver(new JarAssetResolver(plugin.name,descriptorURI,'META-INF/assets'))
// AssetPipelineConfigHolder.registerResolver(new JarAssetResolver(plugin.name,descriptorURI,'META-INF/static'))
// }
// }
AssetPipelineConfigHolder.registerResolver(new SpringResourceAssetResolver('classpath',ctx, 'META-INF/assets'))
AssetPipelineConfigHolder.registerResolver(new SpringResourceAssetResolver('classpath',ctx, 'META-INF/static'))
AssetPipelineConfigHolder.registerResolver(new SpringResourceAssetResolver('classpath',ctx, 'META-INF/resources'))
for(plugin in GrailsPluginUtils.pluginInfos) {
def assetPath = [plugin.pluginDir.getPath(), "grails-app", "assets"].join(File.separator)
def fallbackPath = [plugin.pluginDir.getPath(), "web-app"].join(File.separator)
AssetPipelineConfigHolder.registerResolver(new FileSystemAssetResolver(plugin.name,assetPath))
AssetPipelineConfigHolder.registerResolver(new FileSystemAssetResolver(plugin.name,fallbackPath,true))
}
}
}
def doWithSpring = {
def manifestProps = new Properties()
def manifestFile
try {
manifestFile = application.getParentContext().getResource("assets/manifest.properties")
} catch(e) {
if(application.warDeployed) {
log.warn "Unable to find asset-pipeline manifest, etags will not be properly generated"
}
}
if(manifestFile?.exists()) {
try {
manifestProps.load(manifestFile.inputStream)
application.config.grails.assets.manifest = manifestProps
AssetPipelineConfigHolder.manifest = manifestProps
} catch(e) {
log.warn "Failed to load Manifest"
}
}
if(!application.config.grails.assets.containsKey("precompiled")) {
application.config.grails.assets.precompiled = application.warDeployed
}
AssetPipelineConfigHolder.config = application.config.grails.assets
// Register Link Generator
String serverURL = application.config?.grails?.serverURL ?: null
def cacheUrls = application.config?.grails.web?.linkGenerator?.useCache
if(!(cacheUrls instanceof Boolean)) {
cacheUrls = true
}
grailsLinkGenerator(cacheUrls ? CachingLinkGenerator : LinkGenerator, serverURL) { bean ->
bean.autowire = true
}
assetResourceLocator(AssetResourceLocator) { bean ->
bean.parent = "abstractGrailsResourceLocator"
}
}
def getWebXmlFilterOrder() {
["AssetPipelineFilter": FilterManager.GRAILS_WEB_REQUEST_POSITION - 120]
}
def doWithWebDescriptor = { xml ->
def mapping = application.config?.grails?.assets?.mapping ?: "assets"
def filterClassName = 'asset.pipeline.grails.AssetPipelineFilter'
def filters = xml.filter[0]
filters + {
'filter' {
'filter-name'('AssetPipelineFilter')
'filter-class'(filterClassName)
}
}
def mappings = xml.'filter-mapping'[0]
mappings + {
'filter-mapping' {
'filter-name'('AssetPipelineFilter')
'url-pattern'("/${mapping}/*")
dispatcher('REQUEST')
}
}
}
}