diff --git a/grails-plugin-testing/src/main/groovy/grails/test/mixin/support/LazyTagLibraryLookup.java b/grails-plugin-testing/src/main/groovy/grails/test/mixin/support/LazyTagLibraryLookup.java index 3c78c9ada7a..2171f83aa84 100644 --- a/grails-plugin-testing/src/main/groovy/grails/test/mixin/support/LazyTagLibraryLookup.java +++ b/grails-plugin-testing/src/main/groovy/grails/test/mixin/support/LazyTagLibraryLookup.java @@ -16,18 +16,14 @@ package grails.test.mixin.support; import grails.core.GrailsTagLibClass; -import grails.util.GrailsClassUtils; import groovy.lang.GroovyObject; -import org.grails.core.artefact.TagLibArtefactHandler; -import org.grails.gsp.GroovyPage; +import org.grails.core.DefaultGrailsTagLibClass; import org.grails.plugins.web.GroovyPagesGrailsPlugin; -import org.grails.taglib.NamespacedTagDispatcher; import org.grails.taglib.TagLibraryLookup; import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.GenericBeanDefinition; import org.springframework.context.support.GenericApplicationContext; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -38,81 +34,49 @@ * @author Graeme Rocher * @since 2.0 */ -@SuppressWarnings({ "unchecked", "rawtypes" }) -public class LazyTagLibraryLookup extends TagLibraryLookup{ - - private Map resolveTagLibraries = new HashMap(); - private Map> tagClassesByNamespace = new HashMap>(); - private Map tagClassToTagLibMap= new HashMap(); +@SuppressWarnings({"unchecked", "rawtypes"}) +public class LazyTagLibraryLookup extends TagLibraryLookup { + List tagLibClasses = (List) new GroovyPagesGrailsPlugin().getProvidedArtefacts(); + private Map lazyLoadableTagLibs = new HashMap(); @Override protected void registerTagLibraries() { - List providedArtefacts = (List) new GroovyPagesGrailsPlugin().getProvidedArtefacts(); - - tagClassesByNamespace.put(GrailsTagLibClass.DEFAULT_NAMESPACE, new ArrayList()); - namespaceDispatchers.put(GrailsTagLibClass.DEFAULT_NAMESPACE, new NamespacedTagDispatcher(GrailsTagLibClass.DEFAULT_NAMESPACE, GroovyPage.class, grailsApplication, this)); - for (Class providedArtefact : providedArtefacts) { - if (!grailsApplication.isArtefactOfType(TagLibArtefactHandler.TYPE, providedArtefact)) continue; - Object value = GrailsClassUtils.getStaticPropertyValue(providedArtefact, GrailsTagLibClass.NAMESPACE_FIELD_NAME); - if (value != null) { - - String namespace = value.toString(); - List classes = tagClassesByNamespace.get(namespace); - if (classes == null) { - classes = new ArrayList(); - tagClassesByNamespace.put(namespace, classes); - } - classes.add(providedArtefact); + super.registerTagLibraries(); + for (Class providedArtefact : tagLibClasses) { + registerLazyLoadableTagLibClass(providedArtefact); + } + } - namespaceDispatchers.put(namespace, new NamespacedTagDispatcher(namespace, GroovyPage.class, grailsApplication, this)); - } - else { - tagClassesByNamespace.get(GrailsTagLibClass.DEFAULT_NAMESPACE).add(providedArtefact); - } + public void registerLazyLoadableTagLibClass(Class tagLibClass) { + GrailsTagLibClass grailsTagLibClass = new DefaultGrailsTagLibClass(tagLibClass); + if (!hasNamespace(grailsTagLibClass.getNamespace())) { + registerNamespaceDispatcher(grailsTagLibClass.getNamespace()); + } + for (String tagName : grailsTagLibClass.getTagNames()) { + String tagKey = tagNameKey(grailsTagLibClass.getNamespace(), tagName); + lazyLoadableTagLibs.put(tagKey, grailsTagLibClass); } } @Override public GroovyObject lookupTagLibrary(String namespace, String tagName) { - String tagKey = tagNameKey(namespace, tagName); - - if (resolveTagLibraries.containsKey(tagKey)) { - return applicationContext.getBean(resolveTagLibraries.get(tagKey), GroovyObject.class); - } - - List tagLibraryClasses = tagClassesByNamespace.get(namespace); - if (tagLibraryClasses != null) { - for (Class tagLibraryClass : tagLibraryClasses) { - - GrailsTagLibClass tagLib = tagClassToTagLibMap.get(tagLibraryClass); - if (tagLib == null) { - tagLib = (GrailsTagLibClass) grailsApplication.addArtefact(TagLibArtefactHandler.TYPE, tagLibraryClass); - tagClassToTagLibMap.put(tagLibraryClass, tagLib); - } - String tagLibraryClassName = tagLibraryClass.getName(); - if (tagLib == null || !tagLib.hasTag(tagName)) { - continue; - } - - if (!applicationContext.containsBean(tagLibraryClassName)) { - registerTagLib(tagLib); - if (tagLib.hasTag(tagName)) { - GenericBeanDefinition bd = new GenericBeanDefinition(); - bd.setBeanClass(tagLibraryClass); - bd.setAutowireCandidate(true); - bd.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_NAME); - ((GenericApplicationContext)applicationContext).getDefaultListableBeanFactory().registerBeanDefinition(tagLibraryClassName, bd); - resolveTagLibraries.put(tagKey, tagLib.getFullName()); - return applicationContext.getBean(tagLibraryClassName, GroovyObject.class); - } - } else { - resolveTagLibraries.put(tagKey, tagLib.getFullName()); - return applicationContext.getBean(tagLibraryClassName, GroovyObject.class); + GroovyObject tagLibrary = super.lookupTagLibrary(namespace, tagName); + if (tagLibrary == null) { + String tagKey = tagNameKey(namespace, tagName); + GrailsTagLibClass taglibClass = lazyLoadableTagLibs.get(tagKey); + if (taglibClass != null) { + if (!applicationContext.containsBean(taglibClass.getFullName())) { + GenericBeanDefinition bd = new GenericBeanDefinition(); + bd.setBeanClass(taglibClass.getClazz()); + bd.setAutowireCandidate(true); + bd.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_NAME); + ((GenericApplicationContext) applicationContext).getDefaultListableBeanFactory().registerBeanDefinition(taglibClass.getFullName(), bd); } + registerTagLib(taglibClass); + tagLibrary = super.lookupTagLibrary(namespace, tagName); } } - - return null; + return tagLibrary; } protected String tagNameKey(String namespace, String tagName) { @@ -121,18 +85,8 @@ protected String tagNameKey(String namespace, String tagName) { @Override protected void putTagLib(Map tags, String name, GrailsTagLibClass taglib) { - tags.put(name, taglib.getFullName()); - } - - @Override - public void registerTagLib(GrailsTagLibClass taglib) { - super.registerTagLib(taglib); - - String ns = taglib.getNamespace(); - - for (String tagName : taglib.getTagNames()) { - String key = tagNameKey(ns, tagName); - resolveTagLibraries.put(key, taglib.getFullName()); + if (applicationContext.containsBean(taglib.getFullName())) { + super.putTagLib(tags, name, taglib); } } -} +} \ No newline at end of file diff --git a/grails-taglib/src/main/groovy/org/grails/taglib/TagLibraryLookup.java b/grails-taglib/src/main/groovy/org/grails/taglib/TagLibraryLookup.java index 9b7e3fefe8f..a2ec5b491d3 100644 --- a/grails-taglib/src/main/groovy/org/grails/taglib/TagLibraryLookup.java +++ b/grails-taglib/src/main/groovy/org/grails/taglib/TagLibraryLookup.java @@ -65,7 +65,7 @@ private void registerNamespaceDispatchers() { } } - private void registerNamespaceDispatcher(String namespace) { + protected void registerNamespaceDispatcher(String namespace) { namespaceDispatchers.put(namespace, new NamespacedTagDispatcher(namespace, null, grailsApplication, this)); }