|
19 | 19 | import grails.util.GrailsNameUtils; |
20 | 20 | import grails.util.GrailsUtil; |
21 | 21 | import groovy.lang.GroovyClassLoader; |
| 22 | +import groovy.lang.GroovyRuntimeException; |
22 | 23 | import groovy.lang.GroovySystem; |
| 24 | +import groovy.lang.MetaMethod; |
23 | 25 | import groovy.util.ConfigObject; |
24 | 26 |
|
25 | 27 | 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.*; |
33 | 31 | import java.util.regex.Matcher; |
34 | 32 | import java.util.regex.Pattern; |
35 | 33 |
|
|
39 | 37 | import org.codehaus.groovy.grails.core.io.support.GrailsFactoriesLoader; |
40 | 38 | import org.codehaus.groovy.grails.exceptions.GrailsConfigurationException; |
41 | 39 | 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; |
42 | 43 | import org.springframework.beans.factory.BeanClassLoaderAware; |
43 | 44 | import org.springframework.core.io.Resource; |
44 | 45 | import org.springframework.util.Assert; |
@@ -679,9 +680,49 @@ public void initialise() { |
679 | 680 | } |
680 | 681 | Class<?>[] classes = populateAllClasses(); |
681 | 682 | configureLoadedClasses(classes); |
| 683 | + |
| 684 | + initialiseGroovyExtensionModules(); |
682 | 685 | initialised = true; |
683 | 686 | } |
684 | 687 |
|
| 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 | + |
685 | 726 | public boolean isInitialised() { |
686 | 727 | return initialised; |
687 | 728 | } |
|
0 commit comments