This is an automated email from the ASF dual-hosted git repository.

emilles pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git


The following commit(s) were added to refs/heads/master by this push:
     new 70f6ab9fa7 GROOVY-6491: empty extension module implies a restriction 
(like OSGi)
70f6ab9fa7 is described below

commit 70f6ab9fa7d24903097001f8924c7b9235b0ec5b
Author: Eric Milles <[email protected]>
AuthorDate: Wed Sep 17 09:57:56 2025 -0500

    GROOVY-6491: empty extension module implies a restriction (like OSGi)
---
 .../runtime/m12n/ExtensionModuleScanner.java       | 37 +++++++++++-----------
 .../m12n/StandardPropertiesModuleFactory.java      | 15 +++++----
 2 files changed, 27 insertions(+), 25 deletions(-)

diff --git 
a/src/main/java/org/codehaus/groovy/runtime/m12n/ExtensionModuleScanner.java 
b/src/main/java/org/codehaus/groovy/runtime/m12n/ExtensionModuleScanner.java
index d15bc6437c..c7167643f9 100644
--- a/src/main/java/org/codehaus/groovy/runtime/m12n/ExtensionModuleScanner.java
+++ b/src/main/java/org/codehaus/groovy/runtime/m12n/ExtensionModuleScanner.java
@@ -23,12 +23,10 @@ import org.codehaus.groovy.runtime.DefaultGroovyMethods;
 import org.codehaus.groovy.util.URLStreams;
 
 import java.io.IOException;
-import java.io.InputStream;
 import java.net.URL;
+import java.util.Objects;
 import java.util.Properties;
 
-import static 
org.codehaus.groovy.runtime.DefaultGroovyMethodsSupport.closeQuietly;
-
 /**
  * A module extension scanner is responsible for searching classpath modules,
  * loading metadata from module descriptors, then perform custom tasks for each
@@ -39,6 +37,7 @@ import static 
org.codehaus.groovy.runtime.DefaultGroovyMethodsSupport.closeQuiet
  * @since 2.1.2
  */
 public class ExtensionModuleScanner {
+
     public static final String LEGACY_MODULE_META_INF_FILE = 
"META-INF/services/org.codehaus.groovy.runtime.ExtensionModule";
     public static final String MODULE_META_INF_FILE = 
"META-INF/groovy/org.codehaus.groovy.runtime.ExtensionModule";
 
@@ -46,8 +45,8 @@ public class ExtensionModuleScanner {
     private final ClassLoader classLoader;
 
     public ExtensionModuleScanner(final ExtensionModuleListener listener, 
final ClassLoader loader) {
-        this.listener = listener;
-        this.classLoader = loader;
+        this.listener = Objects.requireNonNull(listener);
+        this.classLoader = Objects.requireNonNull(loader);
     }
 
     public void scanClasspathModules() {
@@ -55,37 +54,39 @@ public class ExtensionModuleScanner {
         scanClasspathModulesFrom(LEGACY_MODULE_META_INF_FILE);
     }
 
-    private void scanClasspathModulesFrom(String moduleMetaInfFile) {
+    private void scanClasspathModulesFrom(final String moduleMetaInfFile) {
         try {
             for (URL url : 
DefaultGroovyMethods.toSet(classLoader.getResources(moduleMetaInfFile))) {
                 scanExtensionModuleFromMetaInf(url);
             }
-        } catch (IOException e) {
+        } catch (final IOException e) {
             // DO NOTHING
         }
     }
 
     private void scanExtensionModuleFromMetaInf(final URL metadata) {
         Properties properties = new Properties();
-        InputStream inStream = null;
-        try {
-            inStream = URLStreams.openUncachedStream(metadata);
-            properties.load(inStream);
-        } catch (IOException e) {
+
+        try (var stream = URLStreams.openUncachedStream(metadata)) {
+            properties.load(stream);
+        } catch (final IOException e) {
             throw new GroovyRuntimeException("Unable to load module META-INF 
descriptor", e);
-        } finally {
-            closeQuietly(inStream);
         }
+
         scanExtensionModuleFromProperties(properties);
     }
 
     public void scanExtensionModuleFromProperties(final Properties properties) 
{
-        StandardPropertiesModuleFactory factory = new 
StandardPropertiesModuleFactory();
-        ExtensionModule module = factory.newModule(properties, classLoader);
-        listener.onModule(module);
+        var factory = new StandardPropertiesModuleFactory();
+        var module = factory.newModule(properties, classLoader);
+        if (module instanceof SimpleExtensionModule simpleModule
+                && simpleModule.getStaticMethodsExtensionClasses().isEmpty()
+                && 
simpleModule.getInstanceMethodsExtensionClasses().isEmpty()) {
+            module = null; // GROOVY-6491: empty module implies restriction 
(like OSGi)
+        }
+        if (module != null) listener.onModule(module);
     }
 
-
     public interface ExtensionModuleListener {
         void onModule(ExtensionModule module);
     }
diff --git 
a/src/main/java/org/codehaus/groovy/runtime/m12n/StandardPropertiesModuleFactory.java
 
b/src/main/java/org/codehaus/groovy/runtime/m12n/StandardPropertiesModuleFactory.java
index 3c148b6830..6b89b369ff 100644
--- 
a/src/main/java/org/codehaus/groovy/runtime/m12n/StandardPropertiesModuleFactory.java
+++ 
b/src/main/java/org/codehaus/groovy/runtime/m12n/StandardPropertiesModuleFactory.java
@@ -30,24 +30,25 @@ import java.util.Properties;
  * factory is instantiated and used instead of this factory.
  */
 public class StandardPropertiesModuleFactory extends PropertiesModuleFactory {
+
     public static final String MODULE_FACTORY_KEY = "moduleFactory";
 
     @Override
     @SuppressWarnings("unchecked")
     public ExtensionModule newModule(final Properties properties, final 
ClassLoader classLoader) {
         String factoryName = properties.getProperty(MODULE_FACTORY_KEY);
-        if (factoryName!=null) {
+        if (factoryName != null) {
             try {
-                Class<? extends PropertiesModuleFactory> factoryClass = 
(Class<? extends PropertiesModuleFactory>) classLoader.loadClass(factoryName);
+                var factoryClass = (Class<? extends PropertiesModuleFactory>) 
classLoader.loadClass(factoryName);
                 PropertiesModuleFactory delegate = 
factoryClass.getDeclaredConstructor().newInstance();
                 return delegate.newModule(properties, classLoader);
-            } catch (ClassNotFoundException | NoSuchMethodException e) {
-                throw new GroovyRuntimeException("Unable to load module 
factory ["+factoryName+"]",e);
-            } catch (InstantiationException | IllegalAccessException | 
InvocationTargetException e) {
-                throw new GroovyRuntimeException("Unable to instantiate module 
factory ["+factoryName+"]",e);
+            } catch (final ClassNotFoundException | NoSuchMethodException e) {
+                throw new GroovyRuntimeException("Unable to load module 
factory [" + factoryName + "]", e);
+            } catch (final InstantiationException | IllegalAccessException | 
InvocationTargetException e) {
+                throw new GroovyRuntimeException("Unable to instantiate module 
factory [" + factoryName + "]", e);
             }
         }
+
         return MetaInfExtensionModule.newModule(properties, classLoader);
     }
-
 }

Reply via email to