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

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


The following commit(s) were added to refs/heads/GROOVY_3_0_X by this push:
     new 3f13ceeb32 GROOVY-11693: include exception in extension module load 
fail message
3f13ceeb32 is described below

commit 3f13ceeb325ca06c7d32ad90f903f6fa92b8bde0
Author: Eric Milles <eric.mil...@thomsonreuters.com>
AuthorDate: Tue Jul 15 15:18:32 2025 -0500

    GROOVY-11693: include exception in extension module load fail message
    
    3_0_X backport
---
 .../runtime/m12n/MetaInfExtensionModule.java       | 65 +++++++++++-----------
 1 file changed, 34 insertions(+), 31 deletions(-)

diff --git 
a/src/main/java/org/codehaus/groovy/runtime/m12n/MetaInfExtensionModule.java 
b/src/main/java/org/codehaus/groovy/runtime/m12n/MetaInfExtensionModule.java
index 2891ee4dc5..272aaedf59 100644
--- a/src/main/java/org/codehaus/groovy/runtime/m12n/MetaInfExtensionModule.java
+++ b/src/main/java/org/codehaus/groovy/runtime/m12n/MetaInfExtensionModule.java
@@ -20,23 +20,24 @@ package org.codehaus.groovy.runtime.m12n;
 
 import groovy.lang.GroovyRuntimeException;
 
-import java.util.ArrayList;
-import java.util.LinkedList;
 import java.util.List;
+import java.util.Objects;
 import java.util.Properties;
+import java.util.function.Function;
 import java.util.logging.Logger;
+import java.util.stream.Stream;
+
+import static java.util.logging.Level.WARNING;
+import static java.util.stream.Collectors.toList;
 
 /**
- * A {@link SimpleExtensionModule} implementation which reads extension classes
+ * A {@link SimpleExtensionModule} implementation which reads extension class
  * metadata from META-INF.
  *
  * @since 2.0.0
  */
+@SuppressWarnings("rawtypes")
 public class MetaInfExtensionModule extends SimpleExtensionModule {
-    private static final Logger LOG = 
Logger.getLogger(MetaInfExtensionModule.class.getName());
-
-    public static final String MODULE_INSTANCE_CLASSES_KEY = 
"extensionClasses";
-    public static final String MODULE_STATIC_CLASSES_KEY = 
"staticExtensionClasses";
 
     private final List<Class> instanceExtensionClasses;
     private final List<Class> staticExtensionClasses;
@@ -57,38 +58,40 @@ public class MetaInfExtensionModule extends 
SimpleExtensionModule {
         this.staticExtensionClasses = staticExtensionClasses;
     }
 
+    //-----------------------------------------------------------------------
+
+    public static final String MODULE_INSTANCE_CLASSES_KEY = 
"extensionClasses";
+    public static final String MODULE_STATIC_CLASSES_KEY   = 
"staticExtensionClasses";
+
     public static MetaInfExtensionModule newModule(final Properties 
properties, final ClassLoader loader) {
         String name = 
properties.getProperty(PropertiesModuleFactory.MODULE_NAME_KEY);
-        if (name == null)
-            throw new GroovyRuntimeException("Module file hasn't set the 
module name using key [" + PropertiesModuleFactory.MODULE_NAME_KEY + "]");
+        if (name == null) {
+            throw new GroovyRuntimeException("Module file has not set the 
module name using key: " + PropertiesModuleFactory.MODULE_NAME_KEY);
+        }
         String version = 
properties.getProperty(PropertiesModuleFactory.MODULE_VERSION_KEY);
-        if (version == null)
-            throw new GroovyRuntimeException("Module file hasn't set the 
module version using key [" + PropertiesModuleFactory.MODULE_VERSION_KEY + "]");
-        String[] extensionClasses = 
properties.getProperty(MODULE_INSTANCE_CLASSES_KEY, "").trim().split("[,; ]");
-        String[] staticExtensionClasses = 
properties.getProperty(MODULE_STATIC_CLASSES_KEY, "").trim().split("[,; ]");
-        List<Class> instanceClasses = new 
ArrayList<Class>(extensionClasses.length);
-        List<Class> staticClasses = new 
ArrayList<Class>(staticExtensionClasses.length);
-        List<String> errors = new LinkedList<String>();
-        loadExtensionClass(loader, extensionClasses, instanceClasses, errors);
-        loadExtensionClass(loader, staticExtensionClasses, staticClasses, 
errors);
-        if (!errors.isEmpty()) {
-            for (String error : errors) {
-                LOG.warning("Module [" + name + "] - Unable to load extension 
class [" + error + "]");
-            }
+        if (version == null) {
+            throw new GroovyRuntimeException("Module file has not set the 
module version using key: " + PropertiesModuleFactory.MODULE_VERSION_KEY);
         }
-        return new MetaInfExtensionModule(name, version, instanceClasses, 
staticClasses);
-    }
 
-    private static void loadExtensionClass(ClassLoader loader, String[] 
extensionClasses, List<Class> instanceClasses, List<String> errors) {
-        for (String extensionClass : extensionClasses) {
+        Function<String, Class> load = (extensionClass) -> {
             try {
                 extensionClass = extensionClass.trim();
-                if (extensionClass.length() > 0) {
-                    instanceClasses.add(loader.loadClass(extensionClass));
+                if (!extensionClass.isEmpty()) {
+                    return loader.loadClass(extensionClass);
                 }
-            } catch (ClassNotFoundException | NoClassDefFoundError | 
UnsupportedClassVersionError e) {
-                errors.add(extensionClass);
+            } catch (ClassNotFoundException | RuntimeException | LinkageError 
error) {
+                Logger logger = 
Logger.getLogger(MetaInfExtensionModule.class.getName());
+                logger.log(WARNING, "Module [" + name + "] - Unable to load 
extension class: " + extensionClass, error);
             }
-        }
+            return null;
+        };
+
+        String[] objectExtensionClasses = 
properties.getProperty(MODULE_INSTANCE_CLASSES_KEY, "").trim().split("[,; ]");
+        String[] staticExtensionClasses = properties.getProperty(  
MODULE_STATIC_CLASSES_KEY, "").trim().split("[,; ]");
+
+        List<Class> objectClasses = 
Stream.of(objectExtensionClasses).map(load).filter(Objects::nonNull).collect(toList());
+        List<Class> staticClasses = 
Stream.of(staticExtensionClasses).map(load).filter(Objects::nonNull).collect(toList());
+
+        return new MetaInfExtensionModule(name, version, objectClasses, 
staticClasses);
     }
 }

Reply via email to