2020
2121import groovy .lang .GroovyRuntimeException ;
2222
23- import java .util .ArrayList ;
24- import java .util .LinkedList ;
2523import java .util .List ;
24+ import java .util .Objects ;
2625import java .util .Properties ;
26+ import java .util .function .Function ;
2727import java .util .logging .Logger ;
28+ import java .util .stream .Stream ;
29+
30+ import static java .util .logging .Level .WARNING ;
31+ import static java .util .stream .Collectors .toList ;
2832
2933/**
30- * A {@link SimpleExtensionModule} implementation which reads extension classes
34+ * A {@link SimpleExtensionModule} implementation which reads extension class
3135 * metadata from META-INF.
3236 *
3337 * @since 2.0.0
3438 */
39+ @ SuppressWarnings ("rawtypes" )
3540public class MetaInfExtensionModule extends SimpleExtensionModule {
36- private static final Logger LOG = Logger .getLogger (MetaInfExtensionModule .class .getName ());
37-
38- public static final String MODULE_INSTANCE_CLASSES_KEY = "extensionClasses" ;
39- public static final String MODULE_STATIC_CLASSES_KEY = "staticExtensionClasses" ;
4041
4142 private final List <Class > instanceExtensionClasses ;
4243 private final List <Class > staticExtensionClasses ;
@@ -57,38 +58,40 @@ private MetaInfExtensionModule(final String moduleName, final String moduleVersi
5758 this .staticExtensionClasses = staticExtensionClasses ;
5859 }
5960
61+ //-----------------------------------------------------------------------
62+
63+ public static final String MODULE_INSTANCE_CLASSES_KEY = "extensionClasses" ;
64+ public static final String MODULE_STATIC_CLASSES_KEY = "staticExtensionClasses" ;
65+
6066 public static MetaInfExtensionModule newModule (final Properties properties , final ClassLoader loader ) {
6167 String name = properties .getProperty (PropertiesModuleFactory .MODULE_NAME_KEY );
62- if (name == null )
63- throw new GroovyRuntimeException ("Module file hasn't set the module name using key [" + PropertiesModuleFactory .MODULE_NAME_KEY + "]" );
68+ if (name == null ) {
69+ throw new GroovyRuntimeException ("Module file has not set the module name using key: " + PropertiesModuleFactory .MODULE_NAME_KEY );
70+ }
6471 String version = properties .getProperty (PropertiesModuleFactory .MODULE_VERSION_KEY );
65- if (version == null )
66- throw new GroovyRuntimeException ("Module file hasn't set the module version using key [" + PropertiesModuleFactory .MODULE_VERSION_KEY + "]" );
67- String [] extensionClasses = properties .getProperty (MODULE_INSTANCE_CLASSES_KEY , "" ).trim ().split ("[,; ]" );
68- String [] staticExtensionClasses = properties .getProperty (MODULE_STATIC_CLASSES_KEY , "" ).trim ().split ("[,; ]" );
69- List <Class > instanceClasses = new ArrayList <Class >(extensionClasses .length );
70- List <Class > staticClasses = new ArrayList <Class >(staticExtensionClasses .length );
71- List <String > errors = new LinkedList <String >();
72- loadExtensionClass (loader , extensionClasses , instanceClasses , errors );
73- loadExtensionClass (loader , staticExtensionClasses , staticClasses , errors );
74- if (!errors .isEmpty ()) {
75- for (String error : errors ) {
76- LOG .warning ("Module [" + name + "] - Unable to load extension class [" + error + "]" );
77- }
72+ if (version == null ) {
73+ throw new GroovyRuntimeException ("Module file has not set the module version using key: " + PropertiesModuleFactory .MODULE_VERSION_KEY );
7874 }
79- return new MetaInfExtensionModule (name , version , instanceClasses , staticClasses );
80- }
8175
82- private static void loadExtensionClass (ClassLoader loader , String [] extensionClasses , List <Class > instanceClasses , List <String > errors ) {
83- for (String extensionClass : extensionClasses ) {
76+ Function <String , Class > load = (extensionClass ) -> {
8477 try {
8578 extensionClass = extensionClass .trim ();
86- if (extensionClass .length () > 0 ) {
87- instanceClasses . add ( loader .loadClass (extensionClass ) );
79+ if (! extensionClass .isEmpty () ) {
80+ return loader .loadClass (extensionClass );
8881 }
89- } catch (ClassNotFoundException | NoClassDefFoundError | UnsupportedClassVersionError e ) {
90- errors .add (extensionClass );
82+ } catch (ClassNotFoundException | RuntimeException | LinkageError error ) {
83+ Logger logger = Logger .getLogger (MetaInfExtensionModule .class .getName ());
84+ logger .log (WARNING , "Module [" + name + "] - Unable to load extension class: " + extensionClass , error );
9185 }
92- }
86+ return null ;
87+ };
88+
89+ String [] objectExtensionClasses = properties .getProperty (MODULE_INSTANCE_CLASSES_KEY , "" ).trim ().split ("[,; ]" );
90+ String [] staticExtensionClasses = properties .getProperty ( MODULE_STATIC_CLASSES_KEY , "" ).trim ().split ("[,; ]" );
91+
92+ List <Class > objectClasses = Stream .of (objectExtensionClasses ).map (load ).filter (Objects ::nonNull ).collect (toList ());
93+ List <Class > staticClasses = Stream .of (staticExtensionClasses ).map (load ).filter (Objects ::nonNull ).collect (toList ());
94+
95+ return new MetaInfExtensionModule (name , version , objectClasses , staticClasses );
9396 }
9497}
0 commit comments