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); } }