Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions grace-plugin-gsp/build.gradle
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
dependencies {
compileOnly libs.jakarta.servlet
api libs.commons.text
api project(":grace-core")
api project(":grace-plugin-api")
api project(":grace-plugin-codecs")
implementation project(":grace-plugin-taglibs")
api project(":grace-web-gsp")
api project(":grace-web-mvc")
api project(":grace-web-taglib")
api project(":grace-web-url-mappings")
api libs.spring.boot.autoconfigure
annotationProcessor libs.spring.boot.autoconfigureProcessor
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,6 @@
import org.grails.web.pages.GroovyPagesServlet;
import org.grails.web.servlet.view.GroovyPageViewResolver;
import org.grails.web.sitemesh.GroovyPageLayoutFinder;
import org.grails.web.taglib.StandaloneTagLibraryLookup;
import org.grails.web.util.GrailsApplicationAttributes;

/**
Expand Down Expand Up @@ -190,12 +189,6 @@ public FilteringCodecsByContentTypeSettings filteringCodecsByContentTypeSettings
return new FilteringCodecsByContentTypeSettings(grailsApplication.getIfAvailable());
}

@Bean
@ConditionalOnMissingBean
public DefaultGrailsTagDateHelper grailsTagDateHelper() {
return new DefaultGrailsTagDateHelper();
}

@Bean
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
public ServletRegistrationBean<GroovyPagesServlet> groovyPagesServlet() {
Expand Down Expand Up @@ -253,14 +246,6 @@ public GroovyPageViewResolver jspViewResolver(GroovyPagesProperties groovyPagesP
return groovyPageViewResolver;
}

@Bean
@ConditionalOnMissingBean
public StandaloneTagLibraryLookup gspTagLibraryLookup(ObjectProvider<GrailsApplication> grailsApplication) {
StandaloneTagLibraryLookup tagLibraryLookup = new StandaloneTagLibraryLookup();
grailsApplication.ifAvailable(tagLibraryLookup::setGrailsApplication);
return tagLibraryLookup;
}

@Bean({"groovyTemplateEngine", "groovyPagesTemplateEngine"})
@ConditionalOnMissingBean
public GroovyPagesTemplateEngine groovyPagesTemplateEngine(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2004-2024 the original author or authors.
* Copyright 2004-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand All @@ -18,24 +18,10 @@ package org.grails.plugins.web
import groovy.transform.CompileStatic
import org.springframework.core.Ordered

import grails.core.gsp.GrailsTagLibClass
import grails.plugins.Plugin
import grails.util.GrailsUtil
import grails.web.pages.GroovyPagesUriService
import org.grails.core.artefact.gsp.TagLibArtefactHandler
import org.grails.gsp.GroovyPagesTemplateEngine
import org.grails.plugins.web.taglib.ApplicationTagLib
import org.grails.plugins.web.taglib.CountryTagLib
import org.grails.plugins.web.taglib.FormTagLib
import org.grails.plugins.web.taglib.FormatTagLib
import org.grails.plugins.web.taglib.JavascriptTagLib
import org.grails.plugins.web.taglib.PluginTagLib
import org.grails.plugins.web.taglib.RenderTagLib
import org.grails.plugins.web.taglib.SitemeshTagLib
import org.grails.plugins.web.taglib.UrlMappingTagLib
import org.grails.plugins.web.taglib.ValidationTagLib
import org.grails.taglib.TagLibraryLookup
import org.grails.taglib.TagLibraryMetaUtils
import org.grails.web.pages.FilteringCodecsByContentTypeSettings

/**
Expand All @@ -54,49 +40,14 @@ class GroovyPagesGrailsPlugin extends Plugin implements Ordered {
def version = GrailsUtil.getGrailsVersion()
def dependsOn = [core: GrailsUtil.getGrailsVersion()]

def watchedResources = ["file:./plugins/*/grails-app/taglib/**/*TagLib.groovy",
"file:./grails-app/taglib/**/*TagLib.groovy",
"file:./plugins/*/app/taglib/**/*TagLib.groovy",
"file:./app/taglib/**/*TagLib.groovy"]

def providedArtefacts = [
ApplicationTagLib,
CountryTagLib,
FormatTagLib,
FormTagLib,
JavascriptTagLib,
RenderTagLib,
UrlMappingTagLib,
ValidationTagLib,
PluginTagLib,
SitemeshTagLib
]

int order = 600

/**
* Configures the various Spring beans required by GSP
*/
Closure doWithSpring() {
{ ->
def application = grailsApplication

// Now go through tag libraries and configure them in Spring too. With AOP proxies and so on
def taglibs = application.getArtefacts(TagLibArtefactHandler.TYPE)
for (taglib in taglibs) {
final tagLibClass = taglib.clazz

"${taglib.fullName}"(tagLibClass) { bean ->
bean.autowire = true
bean.lazyInit = true
Closure doWithSpring() { { ->

// Taglib scoping support could be easily added here. Scope could be based on a static field in the taglib class.
//bean.scope = 'request'
}
}

}
}
} }

/**
* Clear the page cache with the ApplicationContext is loaded
Expand All @@ -109,27 +60,8 @@ class GroovyPagesGrailsPlugin extends Plugin implements Ordered {

@Override
void onChange(Map<String, Object> event) {
def application = grailsApplication
def ctx = applicationContext

if (application.isArtefactOfType(TagLibArtefactHandler.TYPE, event.source)) {
GrailsTagLibClass taglibClass = (GrailsTagLibClass) application.addArtefact(TagLibArtefactHandler.TYPE, event.source)
if (taglibClass) {
// replace tag library bean
def beanName = taglibClass.fullName
beans {
"$beanName"(taglibClass.clazz) { bean ->
bean.autowire = true
}
}

// The tag library lookup class caches "tag -> taglib class"
// so we need to update it now.
def lookup = applicationContext.getBean('gspTagLibraryLookup', TagLibraryLookup)
lookup.registerTagLib(taglibClass)
TagLibraryMetaUtils.enhanceTagLibMetaClass(taglibClass, lookup)
}
}
// clear uri cache after changes
ctx.getBean('groovyPagesUriService', GroovyPagesUriService).clear()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ import org.grails.plugins.codecs.URLCodec
import org.grails.plugins.core.CoreConfiguration
import org.grails.plugins.databinding.DataBindingConfiguration
import org.grails.plugins.support.PluginManagerAwareBeanPostProcessor
import org.grails.plugins.web.GrailsTagLibraryAutoConfiguration
import org.grails.plugins.web.GroovyPagesAutoConfiguration
import org.grails.plugins.web.controllers.ControllersPluginConfiguration
import org.grails.plugins.web.mapping.UrlMappingsPluginConfiguration
Expand Down Expand Up @@ -102,6 +103,7 @@ abstract class AbstractGrailsTagTests {
CodecsPluginConfiguration,
ControllersPluginConfiguration,
DataBindingConfiguration,
GrailsTagLibraryAutoConfiguration,
GroovyPagesAutoConfiguration,
MimeTypesConfiguration,
UrlMappingsPluginConfiguration]
Expand Down Expand Up @@ -317,6 +319,7 @@ class MockController {
dependantPluginClasses << gcl.loadClass("org.grails.plugins.web.mapping.UrlMappingsGrailsPlugin")
dependantPluginClasses << gcl.loadClass("org.grails.plugins.web.controllers.ControllersGrailsPlugin")
dependantPluginClasses << gcl.loadClass("org.grails.plugins.web.GroovyPagesGrailsPlugin")
dependantPluginClasses << gcl.loadClass("org.grails.plugins.web.TaglibsGrailsPlugin")

List<DefaultGrailsPlugin> dependentPlugins = dependantPluginClasses.collect {
new DefaultGrailsPlugin(it, new DescriptiveResource(it.toString()), grailsApplication)
Expand Down
6 changes: 1 addition & 5 deletions grace-plugin-rest/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,7 @@ dependencies {
transitive = false
}
compileOnly libs.grace.datastore.gorm.support
compileOnly(project(":grace-web-gsp")) {
exclude group:'org.graceframework', module:'grace-core'
exclude group:'org.graceframework', module:'grace-encoder'
exclude group:'org.graceframework', module:'grace-web-common'
}
compileOnly project(":grace-web-gsp")
implementation libs.caffeine

testImplementation libs.jakarta.servlet
Expand Down
1 change: 1 addition & 0 deletions grace-plugin-taglibs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
## grace-plugin-taglibs
17 changes: 17 additions & 0 deletions grace-plugin-taglibs/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
dependencies {
compileOnly libs.jakarta.servlet
api libs.commons.text
api project(":grace-core")
api project(":grace-plugin-api")
api project(":grace-plugin-codecs")
api project(":grace-web-gsp")
api project(":grace-web-mvc")
api project(":grace-web-taglib")
api project(":grace-web-url-mappings")
api libs.spring.boot.autoconfigure
annotationProcessor libs.spring.boot.autoconfigureProcessor
annotationProcessor libs.spring.boot.configurationProcessor

testImplementation libs.spring.test
testImplementation project(":grace-test-support")
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2004-2022 the original author or authors.
* Copyright 2004-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2004-2022 the original author or authors.
* Copyright 2004-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/*
* Copyright 2022-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.grails.plugins.web;

import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;

import grails.core.GrailsApplication;

import org.grails.web.taglib.StandaloneTagLibraryLookup;

/**
* {@link EnableAutoConfiguration Auto-configuration} for Grails Tag Library.
*
* @author Michael Yan
* @since 2024.0.0
*/
@AutoConfiguration
public class GrailsTagLibraryAutoConfiguration {

@Bean
@ConditionalOnMissingBean
public DefaultGrailsTagDateHelper grailsTagDateHelper() {
return new DefaultGrailsTagDateHelper();
}

@Bean
@ConditionalOnMissingBean
public StandaloneTagLibraryLookup gspTagLibraryLookup(ObjectProvider<GrailsApplication> grailsApplication) {
StandaloneTagLibraryLookup tagLibraryLookup = new StandaloneTagLibraryLookup();
grailsApplication.ifAvailable(tagLibraryLookup::setGrailsApplication);
return tagLibraryLookup;
}

}
Loading