Skip to content

Commit 26b5249

Browse files
committed
Merge branch '5.3.x' into 6.1.x
2 parents 071a698 + 8d251cc commit 26b5249

File tree

16 files changed

+193
-38
lines changed

16 files changed

+193
-38
lines changed

.github/actions/post-release/entrypoint.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ echo $release_version
2828
echo -n "Determining next version: "
2929
next_version=`/increment_version.sh -p $release_version`
3030
echo $next_version
31-
echo ::set-output name=next_version::${next_version}
31+
echo "next_version=${next_version}" >> $GITHUB_OUTPUT
3232

3333
echo "Configuring git"
3434
git config --global user.email "$GIT_USER_EMAIL"

.github/dependabot.yml

+3
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ updates:
1818
labels:
1919
- "type: dependency upgrade"
2020
- "relates-to: v4"
21+
ignore:
22+
- dependency-name: "*"
23+
update-types: [ "version-update:semver-minor", "version-update:semver-major" ]
2124
- package-ecosystem: gradle
2225
directory: "/"
2326
schedule:

.github/workflows/codeql.yml

+4-2
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,12 @@ name: "CodeQL"
1313

1414
on:
1515
push:
16-
branches: [ 5.2.x ]
16+
branches:
17+
- '[4-9]+.[0-9]+.x'
1718
pull_request:
1819
# The branches below must be a subset of the branches above
19-
branches: [ 5.2.x ]
20+
branches:
21+
- '[4-9]+.[0-9]+.x'
2022

2123
jobs:
2224
analyze:

.github/workflows/sdkman.yml

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
name: Release to SDKMan
2+
on:
3+
workflow_dispatch:
4+
inputs:
5+
version:
6+
description: 'Version to release'
7+
required: true
8+
jobs:
9+
sdkman:
10+
runs-on: ubuntu-latest
11+
permissions:
12+
contents: read
13+
steps:
14+
- name: Checkout repository
15+
uses: actions/checkout@v3
16+
with:
17+
token: ${{ secrets.GH_TOKEN }}
18+
ref: v${{ github.event.inputs.version }}
19+
- name: Set up JDK
20+
uses: actions/setup-java@v3
21+
with:
22+
distribution: 'adopt'
23+
java-version: '8'
24+
- name: Grails SDK Minor Release
25+
uses: gradle/gradle-build-action@v2
26+
with:
27+
arguments: sdkMinorRelease
28+
env:
29+
GVM_SDKVENDOR_KEY: ${{ secrets.GVM_SDKVENDOR_KEY }}
30+
GVM_SDKVENDOR_TOKEN: ${{ secrets.GVM_SDKVENDOR_TOKEN }}
31+
- name: Set output
32+
id: set_output
33+
run: |
34+
echo ::set-output name=release_version::$(cat $GITHUB_OUTPUT)
35+
env:
36+
GITHUB_OUTPUT: ${{ github.workspace }}/build/release_version

grails-core/build.gradle

+3
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ dependencies {
6666

6767
api "org.grails:grails-datastore-core:$datastoreVersion"
6868

69+
testAnnotationProcessor "io.micronaut:micronaut-runtime:$micronautVersion"
70+
testAnnotationProcessor "io.micronaut:micronaut-inject-java:$micronautVersion"
71+
6972
testImplementation("org.springframework:spring-jdbc:${springVersion}") {
7073
exclude group: 'commons-logging', module:'commons-logging'
7174
}

grails-core/src/main/groovy/grails/boot/GrailsApp.groovy

-27
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,6 @@ class GrailsApp extends SpringApplication {
103103
log.debug("Application directory discovered as: {}", IOUtils.findApplicationDirectory())
104104
log.debug("Current base directory is [{}]. Reloading base directory is [{}]", new File("."), BuildSettings.BASE_DIR)
105105

106-
loadPluginConfigurationsToMicronautContext(applicationContext)
107-
108106
if(environment.isReloadEnabled()) {
109107
log.debug("Reloading status: {}", environment.isReloadEnabled())
110108
enableDevelopmentModeWatch(environment, applicationContext)
@@ -114,31 +112,6 @@ class GrailsApp extends SpringApplication {
114112
return applicationContext
115113
}
116114

117-
@SuppressWarnings("GrMethodMayBeStatic")
118-
private void loadPluginConfigurationsToMicronautContext(ConfigurableApplicationContext applicationContext) {
119-
GrailsPluginManager pluginManager = applicationContext.getBean(GrailsPluginManager)
120-
ConfigurableApplicationContext parentApplicationContext = (ConfigurableApplicationContext) applicationContext.parent
121-
ConfigurableEnvironment parentContextEnv = parentApplicationContext.getEnvironment()
122-
if (parentContextEnv instanceof MicronautEnvironment) {
123-
if (log.isDebugEnabled()) {
124-
log.debug("Loading configurations from the plugins to the parent Micronaut context")
125-
}
126-
final io.micronaut.context.env.Environment micronautEnv = ((io.micronaut.context.env.Environment) parentContextEnv.getEnvironment())
127-
final GrailsPlugin[] plugins = pluginManager.allPlugins
128-
Integer priority = AbstractPropertySourceLoader.DEFAULT_POSITION
129-
Arrays.stream(plugins)
130-
.filter({ GrailsPlugin plugin -> plugin.propertySource != null })
131-
.forEach({ GrailsPlugin plugin ->
132-
if (log.isDebugEnabled()) {
133-
log.debug("Loading configurations from {} plugin to the parent Micronaut context", plugin.name)
134-
}
135-
micronautEnv.addPropertySource(PropertySource.of("grails.plugins.$plugin.name", (Map) plugin.propertySource.source, --priority))
136-
})
137-
micronautEnv.refresh()
138-
applicationContext.setParent(parentApplicationContext)
139-
}
140-
}
141-
142115
@Override
143116
protected ConfigurableApplicationContext createApplicationContext() {
144117
setAllowBeanDefinitionOverriding(true)

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

+37
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ import grails.util.Environment
1414
import grails.util.Holders
1515
import groovy.transform.CompileStatic
1616
import groovy.util.logging.Slf4j
17+
import io.micronaut.context.env.AbstractPropertySourceLoader
18+
import io.micronaut.context.env.PropertySource
19+
import io.micronaut.spring.context.env.MicronautEnvironment
1720
import org.grails.config.NavigableMap
1821
import org.grails.config.PrefixedMapPropertySource
1922
import org.grails.config.PropertySourcesConfig
@@ -156,6 +159,10 @@ class GrailsApplicationPostProcessor implements BeanDefinitionRegistryPostProces
156159
config.setConversionService( conversionService )
157160
}
158161
((DefaultGrailsApplication)grailsApplication).config = config
162+
163+
if (applicationContext instanceof ConfigurableApplicationContext) {
164+
loadPluginConfigurationsToMicronautContext(applicationContext)
165+
}
159166
}
160167
}
161168

@@ -283,4 +290,34 @@ class GrailsApplicationPostProcessor implements BeanDefinitionRegistryPostProces
283290
}
284291
}
285292

293+
@SuppressWarnings("GrMethodMayBeStatic")
294+
private void loadPluginConfigurationsToMicronautContext(ConfigurableApplicationContext applicationContext) {
295+
String[] beanNames = applicationContext.getBeanNamesForType(GrailsPluginManager)
296+
if (beanNames.length == 0) {
297+
// do not continue if PluginManager is not available
298+
return
299+
}
300+
301+
GrailsPluginManager pluginManager = applicationContext.getBean(GrailsPluginManager)
302+
ConfigurableApplicationContext parentApplicationContext = (ConfigurableApplicationContext) applicationContext.parent
303+
ConfigurableEnvironment parentContextEnv = parentApplicationContext.getEnvironment()
304+
if (parentContextEnv instanceof MicronautEnvironment) {
305+
if (log.isDebugEnabled()) {
306+
log.debug("Loading configurations from the plugins to the parent Micronaut context")
307+
}
308+
final io.micronaut.context.env.Environment micronautEnv = ((io.micronaut.context.env.Environment) parentContextEnv.getEnvironment())
309+
final GrailsPlugin[] plugins = pluginManager.allPlugins
310+
Integer priority = AbstractPropertySourceLoader.DEFAULT_POSITION
311+
Arrays.stream(plugins)
312+
.filter({ GrailsPlugin plugin -> plugin.propertySource != null })
313+
.forEach({ GrailsPlugin plugin ->
314+
if (log.isDebugEnabled()) {
315+
log.debug("Loading configurations from {} plugin to the parent Micronaut context", plugin.name)
316+
}
317+
micronautEnv.addPropertySource(PropertySource.of("grails.plugins.$plugin.name", (Map) plugin.propertySource.source, --priority))
318+
})
319+
micronautEnv.refresh()
320+
applicationContext.setParent(parentApplicationContext)
321+
}
322+
}
286323
}

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

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2004-2005 the original author or authors.
2+
* Copyright 2004-2023 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -540,6 +540,8 @@ public void doWithRuntimeConfiguration(RuntimeSpringConfiguration springConfig)
540540
if(c != null) {
541541
BeanBuilder bb = new BeanBuilder(getParentCtx(),springConfig, grailsApplication.getClassLoader());
542542
bb.setBinding(b);
543+
c.setDelegate(bb);
544+
c.setResolveStrategy(Closure.OWNER_FIRST);
543545
bb.invokeMethod("beans", new Object[]{c});
544546
}
545547
}
@@ -557,6 +559,7 @@ public void doWithRuntimeConfiguration(RuntimeSpringConfiguration springConfig)
557559
BeanBuilder bb = new BeanBuilder(getParentCtx(),springConfig, grailsApplication.getClassLoader());
558560
bb.setBinding(b);
559561
c.setDelegate(bb);
562+
c.setResolveStrategy(Closure.DELEGATE_FIRST);
560563
bb.invokeMethod("beans", new Object[]{c});
561564
}
562565

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

+3-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import org.springframework.core.io.Resource
99
import spock.lang.Shared
1010
import spock.lang.Specification
1111

12+
import java.nio.file.Files
13+
1214
class BinaryPluginSpec extends Specification {
1315

1416
@Shared
@@ -95,7 +97,7 @@ class MockConfigBinaryGrailsPlugin extends BinaryGrailsPlugin {
9597
}
9698

9799
protected Resource getConfigurationResource(Class<?> pluginClass, String path) {
98-
String tempDir = System.getProperty("java.io.tmpdir")
100+
File tempDir = Files.createTempDirectory("MockConfigBinaryGrailsPlugin").toFile()
99101
if (YAML_EXISTS && path == PLUGIN_YML_PATH) {
100102
File file = new File(tempDir, "plugin.yml")
101103
file.write("foo: bar")
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package org.grails.plugins;
2+
3+
import org.springframework.context.annotation.Configuration;
4+
5+
@Configuration
6+
class ConfigBindingExampleConfiguration {
7+
8+
private final ConfigBindingExampleProperties configBindingExampleProperties;
9+
10+
ConfigBindingExampleConfiguration(ConfigBindingExampleProperties configBindingExampleProperties) {
11+
this.configBindingExampleProperties = configBindingExampleProperties;
12+
}
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package org.grails.plugins;
2+
3+
import io.micronaut.context.annotation.ConfigurationProperties;
4+
5+
@ConfigurationProperties("example")
6+
class ConfigBindingExampleProperties {
7+
8+
private String bar = "default";
9+
10+
public String getBar() {
11+
return bar;
12+
}
13+
14+
public void setBar(String bar) {
15+
this.bar = bar;
16+
}
17+
}

grails-core/src/test/groovy/org/grails/plugins/GrailsPluginConfigurationClass.groovy

+9-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.grails.plugins
22

3+
import grails.boot.config.GrailsAutoConfiguration
34
import grails.core.DefaultGrailsApplication
45
import grails.core.GrailsApplication
56
import grails.plugins.GrailsPlugin
@@ -12,9 +13,11 @@ import org.springframework.context.annotation.Configuration
1213
import org.springframework.core.io.FileSystemResource
1314
import org.springframework.core.io.Resource
1415

16+
import java.nio.file.Files
17+
1518
@CompileStatic
1619
@Configuration
17-
class GrailsPluginConfigurationClass {
20+
class GrailsPluginConfigurationClass extends GrailsAutoConfiguration {
1821

1922
public static Boolean YAML_EXISTS = false
2023
public static Boolean GROOVY_EXISTS = true
@@ -52,17 +55,20 @@ class GrailsPluginConfigurationClass {
5255
}
5356

5457
protected Resource getConfigurationResource(Class<?> pluginClass, String path) {
55-
String tempDir = System.getProperty("java.io.tmpdir")
58+
File tempDir = Files.createTempDirectory("MockTestGrailsPlugin").toFile()
5659
if (YAML_EXISTS && path == PLUGIN_YML_PATH) {
5760
File file = new File(tempDir, "plugin.yml")
5861
file.write("bar: foo\n")
5962
file.append("foo: one\n")
63+
file.append("example:\n")
64+
file.append(" bar: foo\n")
6065
return new FileSystemResource(file)
6166
}
6267
if (GROOVY_EXISTS && path == PLUGIN_GROOVY_PATH) {
6368
File file = new File(tempDir, "plugin.groovy")
6469
file.write("bar = 'foo'\n")
6570
file.append("foo = 'one'\n")
71+
file.append("example.bar = 'foo'\n")
6672
return new FileSystemResource(file)
6773
}
6874
return null
@@ -85,7 +91,7 @@ class GrailsPluginConfigurationClass {
8591
}
8692

8793
protected Resource getConfigurationResource(Class<?> pluginClass, String path) {
88-
String tempDir = System.getProperty("java.io.tmpdir")
94+
File tempDir = Files.createTempDirectory("MockTestTwoGrailsPlugin").toFile()
8995
if (YAML_EXISTS && path == PLUGIN_YML_PATH) {
9096
File file = new File(tempDir, "plugin.yml")
9197
file.write("bar: foo2\n")

grails-core/src/test/groovy/org/grails/plugins/PluginGroovyPropertySourceLoaderSpec.groovy

+12
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.grails.plugins
22

33
import grails.boot.GrailsApp
4+
import grails.boot.config.GrailsAutoConfiguration
45
import io.micronaut.spring.context.env.MicronautEnvironment
56
import org.springframework.context.ConfigurableApplicationContext
67
import spock.lang.Specification
@@ -46,5 +47,16 @@ class PluginGroovyPropertySourceLoaderSpec extends Specification {
4647
environment.getProperty("bar", String.class) == 'foo'
4748
environment.getProperty("abc", String.class) == 'xyz'
4849
}
50+
51+
void "test that the configuration binding of plugin.groovy using @ConfigurationProperties is working inside the micronaut context"() {
52+
53+
given:
54+
GrailsApp app = new GrailsApp(GrailsPluginConfigurationClass.class, GrailsAutoConfiguration.class, ConfigBindingExampleConfiguration.class)
55+
ConfigurableApplicationContext context = app.run()
56+
ConfigBindingExampleProperties properties = context.parent.getBean(ConfigBindingExampleProperties.class)
57+
58+
expect:
59+
properties.bar == 'foo'
60+
}
4961
}
5062

grails-core/src/test/groovy/org/grails/plugins/PluginYamlPropertySourceLoaderSpec.groovy

+11
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,15 @@ class PluginYamlPropertySourceLoaderSpec extends Specification {
4646
environment.getProperty("bar", String.class) == 'foo'
4747
environment.getProperty("abc", String.class) == 'xyz'
4848
}
49+
50+
void "test that the configuration binding of plugin.yml using @ConfigurationProperties is working inside the micronaut context"() {
51+
52+
given:
53+
GrailsApp app = new GrailsApp(GrailsPluginConfigurationClass.class, ConfigBindingExampleConfiguration.class)
54+
ConfigurableApplicationContext context = app.run()
55+
ConfigBindingExampleProperties properties = context.parent.getBean(ConfigBindingExampleProperties.class)
56+
57+
expect:
58+
properties.bar == 'foo'
59+
}
4960
}

0 commit comments

Comments
 (0)