This is an automated email from the ASF dual-hosted git repository.
jamesfredley pushed a commit to branch bridge-backward-compat-shims
in repository https://gitbox.apache.org/repos/asf/grails-core.git
The following commit(s) were added to refs/heads/bridge-backward-compat-shims
by this push:
new 1f2507bb4e Make deprecated plugin manager shims call reset/init on
discovery
1f2507bb4e is described below
commit 1f2507bb4ea076eb2ad055c179b5ffb5d5c0f85b
Author: James Fredley <[email protected]>
AuthorDate: Fri Mar 13 09:30:47 2026 -0400
Make deprecated plugin manager shims call reset/init on discovery
Instead of being no-ops, setLoadCorePlugins and setPluginFilter now
forward settings to GrailsPluginDiscovery and trigger reset/init when
an application context is available. This makes the deprecated shims
behave the same as the original API per PR review feedback.
- Add initialized flag to DefaultGrailsPluginDiscovery so reset+init
actually rediscovers plugins instead of being blocked by the old
null-check guard on the plugins field
- Override init() as no-op in MockGrailsPluginDiscovery to prevent
classpath scanning on mocks
- Add reinitializeDiscovery() in AbstractGrailsPluginManager with
applicationContext null guard for pre-startup safety
Assisted-by: Claude Code <[email protected]>
---
.../core/plugins/DefaultGrailsPluginDiscovery.java | 5 ++++-
.../plugins/AbstractGrailsPluginManager.java | 22 ++++++++++++++++++++--
.../grails/plugins/MockGrailsPluginDiscovery.java | 9 +++++++++
3 files changed, 33 insertions(+), 3 deletions(-)
diff --git
a/grails-core/src/main/groovy/org/apache/grails/core/plugins/DefaultGrailsPluginDiscovery.java
b/grails-core/src/main/groovy/org/apache/grails/core/plugins/DefaultGrailsPluginDiscovery.java
index bb0cc49341..02c7a94f55 100644
---
a/grails-core/src/main/groovy/org/apache/grails/core/plugins/DefaultGrailsPluginDiscovery.java
+++
b/grails-core/src/main/groovy/org/apache/grails/core/plugins/DefaultGrailsPluginDiscovery.java
@@ -53,6 +53,7 @@ public class DefaultGrailsPluginDiscovery implements
GrailsPluginDiscovery {
protected boolean loadClasspathPlugins = true;
protected boolean requireClasspathPlugin = true;
protected final PluginFilterRetriever filterRetriever;
+ private boolean initialized = false;
public DefaultGrailsPluginDiscovery() {
this(new PluginFilterRetriever());
@@ -109,7 +110,7 @@ public class DefaultGrailsPluginDiscovery implements
GrailsPluginDiscovery {
}
public void init(Environment environment) {
- if (plugins == null) {
+ if (!initialized) {
if (environment == null) {
throw new IllegalArgumentException("Environment must be
provided to determine plugin order");
}
@@ -267,6 +268,7 @@ public class DefaultGrailsPluginDiscovery implements
GrailsPluginDiscovery {
GrailsPluginInfo::loadAfterNames,
GrailsPluginInfo::loadBeforeNames
);
+ initialized = true;
}
private void processDelayedEvictions() {
@@ -552,6 +554,7 @@ public class DefaultGrailsPluginDiscovery implements
GrailsPluginDiscovery {
@Override
public void reset() {
+ initialized = false;
plugins = new LinkedHashMap<>();
loadOrderedPlugins = new ArrayList<>();
pluginToObserverMap = new HashMap<>();
diff --git
a/grails-core/src/main/groovy/org/grails/plugins/AbstractGrailsPluginManager.java
b/grails-core/src/main/groovy/org/grails/plugins/AbstractGrailsPluginManager.java
index b17e5520cd..110c159b03 100644
---
a/grails-core/src/main/groovy/org/grails/plugins/AbstractGrailsPluginManager.java
+++
b/grails-core/src/main/groovy/org/grails/plugins/AbstractGrailsPluginManager.java
@@ -389,20 +389,38 @@ public abstract class AbstractGrailsPluginManager
implements GrailsPluginManager
/**
* @deprecated Core plugin loading is now handled by {@link
org.apache.grails.core.plugins.GrailsPluginDiscovery}.
- * This method is a no-op and will be removed in Grails 8.0.0.
+ * Use {@link
org.apache.grails.core.plugins.GrailsPluginDiscovery#setLoadClasspathPlugins(boolean)}
instead.
+ * This method will be removed in Grails 8.0.0.
*/
@Deprecated(forRemoval = true, since = "7.1")
@Override
public void setLoadCorePlugins(boolean shouldLoadCorePlugins) {
+ pluginDiscovery.setLoadClasspathPlugins(shouldLoadCorePlugins);
+ reinitializeDiscovery();
}
/**
* @deprecated Plugin filtering is now handled by {@link
org.apache.grails.core.plugins.GrailsPluginDiscovery}.
- * This method is a no-op and will be removed in Grails 8.0.0.
+ * Use {@link
org.apache.grails.core.plugins.GrailsPluginDiscovery#setPluginFilter(PluginFilter)}
instead.
+ * This method will be removed in Grails 8.0.0.
*/
@Deprecated(forRemoval = true, since = "7.1")
@Override
public void setPluginFilter(PluginFilter pluginFilter) {
+ pluginDiscovery.setPluginFilter(pluginFilter);
+ reinitializeDiscovery();
+ }
+
+ /**
+ * Resets and reinitializes plugin discovery if an application context is
available.
+ * When called before the application context is set (the typical
pre-startup case),
+ * the forwarded settings will be picked up during normal lifecycle
initialization.
+ */
+ private void reinitializeDiscovery() {
+ if (applicationContext != null) {
+ pluginDiscovery.reset();
+ pluginDiscovery.init(applicationContext.getEnvironment());
+ }
}
public void informOfClassChange(Class<?> aClass) {
diff --git
a/grails-core/src/main/groovy/org/grails/plugins/MockGrailsPluginDiscovery.java
b/grails-core/src/main/groovy/org/grails/plugins/MockGrailsPluginDiscovery.java
index 306451c5b9..10930e3bed 100644
---
a/grails-core/src/main/groovy/org/grails/plugins/MockGrailsPluginDiscovery.java
+++
b/grails-core/src/main/groovy/org/grails/plugins/MockGrailsPluginDiscovery.java
@@ -22,6 +22,7 @@ import grails.plugins.GrailsPlugin;
import org.apache.grails.core.plugins.DefaultGrailsPluginDiscovery;
import org.apache.grails.core.plugins.GrailsPluginInfo;
import org.apache.grails.core.plugins.GrailsPluginUtils;
+import org.springframework.core.env.Environment;
public class MockGrailsPluginDiscovery extends DefaultGrailsPluginDiscovery {
@@ -34,6 +35,14 @@ public class MockGrailsPluginDiscovery extends
DefaultGrailsPluginDiscovery {
super(pluginClasses);
}
+ /**
+ * No-op: mock discovery does not scan the classpath.
+ * Plugins are registered manually via {@link #registerMockPlugin}.
+ */
+ @Override
+ public void init(Environment environment) {
+ }
+
public void registerMockPlugin(GrailsPlugin plugin) {
registerMockPlugin(GrailsPluginUtils.createPluginInfo(plugin.getPluginClass(),
null, true));
}