Skip to content

Commit

Permalink
Merge branch '2.5.x'
Browse files Browse the repository at this point in the history
Conflicts:
	grails-plugin-testing/src/main/groovy/grails/test/mixin/support/LazyTagLibraryLookup.java
	grails-taglib/src/main/groovy/org/grails/taglib/TagLibraryLookup.java
  • Loading branch information
lhotari committed Feb 4, 2015
2 parents 63423e3 + 4cbf3ed commit 2f62698
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 82 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -38,81 +34,49 @@
* @author Graeme Rocher
* @since 2.0
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public class LazyTagLibraryLookup extends TagLibraryLookup{

private Map<String, String> resolveTagLibraries = new HashMap<String, String>();
private Map<String, List<Class>> tagClassesByNamespace = new HashMap<String, List<Class>>();
private Map<Class, GrailsTagLibClass> tagClassToTagLibMap= new HashMap<Class, GrailsTagLibClass>();
@SuppressWarnings({"unchecked", "rawtypes"})
public class LazyTagLibraryLookup extends TagLibraryLookup {
List<Class> tagLibClasses = (List<Class>) new GroovyPagesGrailsPlugin().getProvidedArtefacts();
private Map<String, GrailsTagLibClass> lazyLoadableTagLibs = new HashMap<String, GrailsTagLibClass>();

@Override
protected void registerTagLibraries() {
List<Class> providedArtefacts = (List<Class>) new GroovyPagesGrailsPlugin().getProvidedArtefacts();

tagClassesByNamespace.put(GrailsTagLibClass.DEFAULT_NAMESPACE, new ArrayList<Class>());
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<Class> classes = tagClassesByNamespace.get(namespace);
if (classes == null) {
classes = new ArrayList<Class>();
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<Class> 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) {
Expand All @@ -121,18 +85,8 @@ protected String tagNameKey(String namespace, String tagName) {

@Override
protected void putTagLib(Map<String, Object> 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);
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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));
}

Expand Down

0 comments on commit 2f62698

Please sign in to comment.