Skip to content

Commit a11d1bd

Browse files
committed
Merge branch '3.0.x' into 3.1.x
2 parents 626f866 + 10f431f commit a11d1bd

File tree

4 files changed

+120
-28
lines changed

4 files changed

+120
-28
lines changed

grails-core/src/main/groovy/org/grails/core/cfg/GroovyConfigPropertySourceLoader.groovy

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,11 @@ class GroovyConfigPropertySourceLoader implements PropertySourceLoader {
4141
final String[] fileExtensions = ['groovy'] as String[]
4242

4343
@Override
44-
PropertySource<?> load(String name, Resource resource, String profile) throws IOException {
44+
PropertySource<?> load(String name, Resource resource, String profile) {
45+
load(name, resource, profile, [])
46+
}
47+
48+
PropertySource<?> load(String name, Resource resource, String profile, List<String> filteredKeys) throws IOException {
4549
def env = Environment.current.name
4650
if(profile == null || env == profile) {
4751

@@ -55,6 +59,11 @@ class GroovyConfigPropertySourceLoader implements PropertySourceLoader {
5559
appVersion: Metadata.getCurrent().getApplicationVersion() )
5660
try {
5761
def configObject = configSlurper.parse(resource.URL)
62+
63+
filteredKeys?.each { key ->
64+
configObject.remove(key)
65+
}
66+
5867
def propertySource = new NavigableMap()
5968
propertySource.merge(configObject, false)
6069
return new NavigableMapPropertySource(name, propertySource)

grails-core/src/main/groovy/org/grails/plugins/AbstractGrailsPlugin.java

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import groovy.lang.GroovyObjectSupport;
2525
import org.grails.config.yaml.YamlPropertySourceLoader;
2626
import org.grails.core.AbstractGrailsClass;
27+
import org.grails.core.cfg.GroovyConfigPropertySourceLoader;
2728
import org.grails.core.legacy.LegacyGrailsApplication;
2829
import org.grails.plugins.support.WatchPattern;
2930
import org.slf4j.Logger;
@@ -49,6 +50,8 @@ public abstract class AbstractGrailsPlugin extends GroovyObjectSupport implement
4950

5051
public static final String PLUGIN_YML = "plugin.yml";
5152
public static final String PLUGIN_YML_PATH = "/" + PLUGIN_YML;
53+
public static final String PLUGIN_GROOVY = "plugin.groovy";
54+
public static final String PLUGIN_GROOVY_PATH = "/" + PLUGIN_GROOVY;
5255
private static final List<String> DEFAULT_CONFIG_IGNORE_LIST = Arrays.asList("dataSource", "hibernate");
5356
private static Resource basePluginResource = null;
5457
protected PropertySource<?> propertySource;
@@ -84,12 +87,19 @@ public AbstractGrailsPlugin(Class<?> pluginClass, GrailsApplication application)
8487
this.grailsApplication = application;
8588
this.pluginClass = pluginClass;
8689
Resource resource = readPluginConfiguration(pluginClass);
90+
8791
if(resource != null && resource.exists()) {
88-
YamlPropertySourceLoader propertySourceLoader = new YamlPropertySourceLoader();
92+
final String filename = resource.getFilename();
8993
try {
90-
this.propertySource = propertySourceLoader.load(GrailsNameUtils.getLogicalPropertyName(pluginClass.getSimpleName(), "GrailsPlugin") + "-plugin.yml", resource, null, true, DEFAULT_CONFIG_IGNORE_LIST);
94+
if (filename.equals(PLUGIN_YML)) {
95+
YamlPropertySourceLoader propertySourceLoader = new YamlPropertySourceLoader();
96+
this.propertySource = propertySourceLoader.load(GrailsNameUtils.getLogicalPropertyName(pluginClass.getSimpleName(), "GrailsPlugin") + "-" + PLUGIN_YML, resource, null, false, DEFAULT_CONFIG_IGNORE_LIST);
97+
} else if (filename.equals(PLUGIN_GROOVY)) {
98+
GroovyConfigPropertySourceLoader propertySourceLoader = new GroovyConfigPropertySourceLoader();
99+
this.propertySource = propertySourceLoader.load(GrailsNameUtils.getLogicalPropertyName(pluginClass.getSimpleName(), "GrailsPlugin") + "-" + PLUGIN_GROOVY, resource, null, DEFAULT_CONFIG_IGNORE_LIST);
100+
}
91101
} catch (IOException e) {
92-
LOG.warn("Error loading plugin.yml for plugin: " + pluginClass.getName() +": " + e.getMessage(), e);
102+
LOG.warn("Error loading " + filename + " for plugin: " + pluginClass.getName() +": " + e.getMessage(), e);
93103
}
94104
}
95105
}
@@ -113,15 +123,28 @@ public boolean isEnabled(String[] profiles) {
113123
}
114124

115125
protected Resource readPluginConfiguration(Class<?> pluginClass) {
116-
final URL urlToPluginYml = IOUtils.findResourceRelativeToClass(pluginClass, PLUGIN_YML_PATH);
126+
Resource ymlResource = getConfigurationResource(pluginClass, PLUGIN_YML_PATH);
127+
Resource groovyResource = getConfigurationResource(pluginClass, PLUGIN_GROOVY_PATH);
128+
129+
Boolean groovyResourceExists = groovyResource != null && groovyResource.exists();
117130

118-
Resource urlResource = urlToPluginYml != null ? new UrlResource(urlToPluginYml) : null;
119-
if(urlResource != null && urlResource.exists()) {
120-
return urlResource;
131+
if(ymlResource != null && ymlResource.exists()) {
132+
if (groovyResourceExists) {
133+
throw new RuntimeException("A plugin may define a plugin.yml or a plugin.groovy, but not both");
134+
}
135+
return ymlResource;
136+
}
137+
if(groovyResourceExists) {
138+
return groovyResource;
121139
}
122140
return null;
123141
}
124142

143+
protected Resource getConfigurationResource(Class<?> pluginClass, String path) {
144+
final URL urlToConfig = IOUtils.findResourceRelativeToClass(pluginClass, path);
145+
return urlToConfig != null ? new UrlResource(urlToConfig) : null;
146+
}
147+
125148
public String getFileSystemName() {
126149
return getFileSystemShortName() + '-' + getVersion();
127150
}

grails-core/src/test/groovy/org/codehaus/groovy/grails/plugins/BinaryPluginSpec.groovy

Lines changed: 70 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@ import grails.core.DefaultGrailsApplication
44
import org.grails.plugins.BinaryGrailsPlugin
55
import org.grails.plugins.BinaryGrailsPluginDescriptor
66
import org.springframework.core.io.ByteArrayResource
7+
import org.springframework.core.io.FileSystemResource
78
import org.springframework.core.io.Resource
8-
9+
import spock.lang.Shared
910
import spock.lang.Specification
1011

1112
class BinaryPluginSpec extends Specification {
1213

13-
def "Test creation of a binary plugin"() {
14-
given:
15-
def str = '''
14+
@Shared
15+
String testBinary = '''
1616
<plugin name='testBinary'>
1717
<class>org.codehaus.groovy.grails.plugins.TestBinaryGrailsPlugin</class>
1818
<resources>
@@ -21,10 +21,9 @@ class BinaryPluginSpec extends Specification {
2121
</plugin>
2222
'''
2323

24-
def xml = new XmlSlurper().parseText(str)
25-
24+
def "Test creation of a binary plugin"() {
2625
when:
27-
def descriptor = new BinaryGrailsPluginDescriptor(new ByteArrayResource(str.getBytes('UTF-8')), ['org.codehaus.groovy.grails.plugins.TestBinaryResource'])
26+
def descriptor = new BinaryGrailsPluginDescriptor(new ByteArrayResource(testBinary.getBytes('UTF-8')), ['org.codehaus.groovy.grails.plugins.TestBinaryResource'])
2827
def binaryPlugin = new BinaryGrailsPlugin(TestBinaryGrailsPlugin, descriptor, new DefaultGrailsApplication())
2928

3029
then:
@@ -36,20 +35,8 @@ class BinaryPluginSpec extends Specification {
3635

3736

3837
def "Test load static resource from binary plugin"() {
39-
given:
40-
def str = '''
41-
<plugin name='testBinary'>
42-
<class>org.codehaus.groovy.grails.plugins.TestBinaryGrailsPlugin</class>
43-
<resources>
44-
<resource>org.codehaus.groovy.grails.plugins.TestBinaryResource</resource>
45-
</resources>
46-
</plugin>
47-
'''
48-
49-
def xml = new XmlSlurper().parseText(str)
50-
5138
when:
52-
def resource = new MockBinaryPluginResource(str.getBytes('UTF-8'))
39+
def resource = new MockBinaryPluginResource(testBinary.getBytes('UTF-8'))
5340
def descriptor = new BinaryGrailsPluginDescriptor(resource, ['org.codehaus.groovy.grails.plugins.TestBinaryResource'])
5441
resource.relativesResources['static/css/main.css'] = new ByteArrayResource(''.bytes)
5542
def binaryPlugin = new BinaryGrailsPlugin(TestBinaryGrailsPlugin, descriptor, new DefaultGrailsApplication())
@@ -63,6 +50,68 @@ class BinaryPluginSpec extends Specification {
6350
then:
6451
cssResource == null
6552
}
53+
54+
def "Test plugin with both plugin.yml and plugin.groovy throws exception"() {
55+
when:
56+
def descriptor = new BinaryGrailsPluginDescriptor(new ByteArrayResource(testBinary.getBytes('UTF-8')), ['org.codehaus.groovy.grails.plugins.TestBinaryResource'])
57+
MockConfigBinaryGrailsPlugin.YAML_EXISTS = true
58+
MockConfigBinaryGrailsPlugin.GROOVY_EXISTS = true
59+
new MockConfigBinaryGrailsPlugin(descriptor)
60+
61+
then:
62+
thrown(RuntimeException)
63+
}
64+
65+
def "Test plugin with only plugin.yml"() {
66+
when:
67+
def descriptor = new BinaryGrailsPluginDescriptor(new ByteArrayResource(testBinary.getBytes('UTF-8')), ['org.codehaus.groovy.grails.plugins.TestBinaryResource'])
68+
MockConfigBinaryGrailsPlugin.YAML_EXISTS = true
69+
MockConfigBinaryGrailsPlugin.GROOVY_EXISTS = false
70+
def binaryPlugin = new MockConfigBinaryGrailsPlugin(descriptor)
71+
72+
then:
73+
binaryPlugin.propertySource.getProperty('foo') == "bar"
74+
}
75+
76+
def "Test plugin with only plugin.groovy"() {
77+
when:
78+
def descriptor = new BinaryGrailsPluginDescriptor(new ByteArrayResource(testBinary.getBytes('UTF-8')), ['org.codehaus.groovy.grails.plugins.TestBinaryResource'])
79+
MockConfigBinaryGrailsPlugin.YAML_EXISTS = false
80+
MockConfigBinaryGrailsPlugin.GROOVY_EXISTS = true
81+
def binaryPlugin = new MockConfigBinaryGrailsPlugin(descriptor)
82+
83+
then:
84+
binaryPlugin.propertySource.getProperty('bar') == "foo"
85+
}
86+
87+
}
88+
89+
class MockConfigBinaryGrailsPlugin extends BinaryGrailsPlugin {
90+
static Boolean YAML_EXISTS = false
91+
static Boolean GROOVY_EXISTS = false
92+
93+
MockConfigBinaryGrailsPlugin(BinaryGrailsPluginDescriptor descriptor) {
94+
super(TestBinaryGrailsPlugin, descriptor, new DefaultGrailsApplication())
95+
}
96+
97+
protected Resource getConfigurationResource(Class<?> pluginClass, String path) {
98+
String tempDir = System.getProperty("java.io.tmpdir")
99+
if (YAML_EXISTS && path == PLUGIN_YML_PATH) {
100+
File file = new File(tempDir, "plugin.yml")
101+
file.write("foo: bar")
102+
return new FileSystemResource(file)
103+
}
104+
if (GROOVY_EXISTS && path == PLUGIN_GROOVY_PATH) {
105+
File file = new File(tempDir, "plugin.groovy")
106+
file.write("bar = 'foo'")
107+
return new FileSystemResource(file)
108+
}
109+
return null
110+
}
111+
112+
public String getVersion() {
113+
super.getVersion()
114+
}
66115
}
67116

68117
class TestBinaryGrailsPlugin {
@@ -91,3 +140,4 @@ class MyView extends Script {
91140
return "Good"
92141
}
93142
}
143+

grails-gradle-plugin/src/main/groovy/org/grails/gradle/plugin/core/GrailsPluginGradlePlugin.groovy

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ class GrailsPluginGradlePlugin extends GrailsGradlePlugin {
5454
void apply(Project project) {
5555
super.apply(project)
5656

57+
checkForConfigurationClash(project)
58+
5759
configureAstSources(project)
5860

5961
configureProjectNameAndVersionASTMetadata(project)
@@ -242,6 +244,14 @@ withConfig(configuration) {
242244
}
243245
}
244246

247+
protected void checkForConfigurationClash(Project project) {
248+
File yamlConfig = new File(project.projectDir,"grails-app/conf/plugin.yml")
249+
File groovyConfig = new File(project.projectDir,"grails-app/conf/plugin.groovy")
250+
if (yamlConfig.exists() && groovyConfig.exists()) {
251+
throw new RuntimeException("A plugin may define a plugin.yml or a plugin.groovy, but not both")
252+
}
253+
}
254+
245255
@CompileStatic
246256
static class ExplodedDir implements PublishArtifact {
247257
final String extension = ""

0 commit comments

Comments
 (0)