Skip to content

Commit a817523

Browse files
committed
fix for GRAILS-10652 "Make a standard way to load Groovy extensions"
1 parent 41c719b commit a817523

File tree

1 file changed

+48
-7
lines changed

1 file changed

+48
-7
lines changed

grails-core/src/main/groovy/org/codehaus/groovy/grails/commons/DefaultGrailsApplication.java

Lines changed: 48 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,15 @@
1919
import grails.util.GrailsNameUtils;
2020
import grails.util.GrailsUtil;
2121
import groovy.lang.GroovyClassLoader;
22+
import groovy.lang.GroovyRuntimeException;
2223
import groovy.lang.GroovySystem;
24+
import groovy.lang.MetaMethod;
2325
import groovy.util.ConfigObject;
2426

2527
import java.io.IOException;
26-
import java.util.ArrayList;
27-
import java.util.Arrays;
28-
import java.util.HashMap;
29-
import java.util.LinkedHashSet;
30-
import java.util.List;
31-
import java.util.Map;
32-
import java.util.Set;
28+
import java.io.InputStream;
29+
import java.net.URL;
30+
import java.util.*;
3331
import java.util.regex.Matcher;
3432
import java.util.regex.Pattern;
3533

@@ -39,6 +37,9 @@
3937
import org.codehaus.groovy.grails.core.io.support.GrailsFactoriesLoader;
4038
import org.codehaus.groovy.grails.exceptions.GrailsConfigurationException;
4139
import org.codehaus.groovy.grails.plugins.support.aware.GrailsApplicationAwareBeanPostProcessor;
40+
import org.codehaus.groovy.reflection.CachedClass;
41+
import org.codehaus.groovy.runtime.m12n.ExtensionModuleScanner;
42+
import org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl;
4243
import org.springframework.beans.factory.BeanClassLoaderAware;
4344
import org.springframework.core.io.Resource;
4445
import org.springframework.util.Assert;
@@ -679,9 +680,49 @@ public void initialise() {
679680
}
680681
Class<?>[] classes = populateAllClasses();
681682
configureLoadedClasses(classes);
683+
684+
initialiseGroovyExtensionModules();
682685
initialised = true;
683686
}
684687

688+
protected void initialiseGroovyExtensionModules() {
689+
Map<CachedClass, List<MetaMethod>> map = new HashMap<CachedClass, List<MetaMethod>>();
690+
691+
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
692+
693+
try {
694+
Enumeration<URL> resources = classLoader.getResources(ExtensionModuleScanner.MODULE_META_INF_FILE);
695+
while (resources.hasMoreElements()) {
696+
URL url = resources.nextElement();
697+
if (url.getPath().contains("groovy-all")) {
698+
// already registered
699+
continue;
700+
}
701+
Properties properties = new Properties();
702+
InputStream inStream = null;
703+
try {
704+
inStream = url.openStream();
705+
properties.load(inStream);
706+
((MetaClassRegistryImpl)GroovySystem.getMetaClassRegistry()).registerExtensionModuleFromProperties(properties, classLoader, map);
707+
}
708+
catch (IOException e) {
709+
throw new GroovyRuntimeException("Unable to load module META-INF descriptor", e);
710+
}
711+
finally {
712+
if(inStream != null) {
713+
inStream.close();
714+
}
715+
}
716+
}
717+
}
718+
catch (IOException ignored) {}
719+
720+
for (Map.Entry<CachedClass, List<MetaMethod>> moduleMethods : map.entrySet()) {
721+
CachedClass cls = moduleMethods.getKey();
722+
cls.addNewMopMethods( moduleMethods.getValue() );
723+
}
724+
}
725+
685726
public boolean isInitialised() {
686727
return initialised;
687728
}

0 commit comments

Comments
 (0)