Skip to content

Commit

Permalink
clean up and mods so config is injected set instead of looked up
Browse files Browse the repository at this point in the history
  • Loading branch information
basejump committed Jan 17, 2012
1 parent 18006a4 commit cdd030e
Show file tree
Hide file tree
Showing 18 changed files with 405 additions and 341 deletions.
13 changes: 11 additions & 2 deletions .gitignore
@@ -1,8 +1,17 @@
application.properties
target/
stacktrace.log
plugin.xml
grails-freemarker-*.zip
web-app/*
!web-app/WEB-INF
grails-freemarker-*.zip
target
.grails

# Eclipse Project files
.classpath
.project
.settings/

# OS X generated files
.DS_Store

56 changes: 23 additions & 33 deletions FreemarkerGrailsPlugin.groovy
Expand Up @@ -32,7 +32,7 @@ import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer
*/
class FreemarkerGrailsPlugin {
// the plugin version
def version = "1.0"
def version = "1.0.0"
// the version or versions of Grails the plugin is designed for
def grailsVersion = "1.2 > *"
// the other plugins this plugin depends on
Expand Down Expand Up @@ -65,8 +65,6 @@ as views.
def documentation = "http://grails.org/plugin/freemarker"

def doWithSpring = {


def freeconfig = application.mergedConfig.asMap(true).grails.plugin.freemarker
String ftlSuffix = '.ftl'

Expand All @@ -75,14 +73,7 @@ as views.
}

def resolveLoaders = {List loaders ->
List resolvedLoaders = []
for (loader in loaders) {
if (loader != null && loader instanceof CharSequence) {
loader = ref(loader.toString())
}
resolvedLoaders << loader
}
return resolvedLoaders
return loaders.collect{ (it instanceof CharSequence) ? ref(it.toString()) : it }
}

Class configClass = freeconfig.tags.enabled == true? TagLibAwareConfigurer : FreeMarkerConfigurer
Expand All @@ -99,14 +90,12 @@ as views.
} else{
postTemplateLoaders = [ref('freemarkerGrailsTemplateLoader')]
}

// if (freeconfig.tags.enabled == true) {
// suffix = ftlSuffix
// }
}

freemarkerViewResolver(grails.plugin.freemarker.GrailsFreeMarkerViewResolver) {
freemarkerConfig = ref('freemarkerConfig')
prefix = ''
suffix = freeconfig.requireViewSuffix ? '' : ftlSuffix
suffix = ftlSuffix
requireViewSuffix = freeconfig.requireViewSuffix
hideException = freeconfig.viewResolver.hideException
order = 10
Expand All @@ -129,11 +118,10 @@ as views.
}
}

static String transformToValidLocation(String location) {
if (location == '.') return location
if (!location.endsWith(File.separator)) return "${location}${File.separator}"
return location
}
def doWithApplicationContext = { appCtx ->

}


def doWithDynamicMethods = { ctx ->

Expand Down Expand Up @@ -183,17 +171,19 @@ as views.
}
}

def modRenderMethod(application, clazz){
def render = new RenderDynamicMethod()
clazz.metaClass.render = {Map args ->
//if args has a pluginName then set it in a threadlocal so we can get to it from the freemarkerViewResolver
if(args.plugin){
def request = WebUtils.retrieveGrailsWebRequest()?.getCurrentRequest()
if(request) {
request.setAttribute(GrailsTemplateLoader.PLUGIN_NAME_ATTRIBUTE,args.plugin)
}
}
render.invoke(delegate, "render", [args] as Object[])
}
def modRenderMethod(application, controller){
def original = controller.metaClass.getMetaMethod("render", [Map] as Class[])

controller.metaClass.render = {Map args ->
//if args has a pluginName then set it in a threadlocal so we can get to it from the freemarkerViewResolver
def request = WebUtils.retrieveGrailsWebRequest()?.getCurrentRequest()
if(args.plugin && request){
request.setAttribute(GrailsTemplateLoader.PLUGIN_NAME_ATTRIBUTE,args.plugin)
}
if(args.loaderAttribute && request){
request.setAttribute("loaderAttribute",args.loaderAttribute)
}
original.invoke(delegate, [args] as Object[])
}
}
}
2 changes: 1 addition & 1 deletion application.properties
@@ -1,4 +1,4 @@
#Grails Metadata file
#Fri Aug 12 21:44:57 BRT 2011
#Mon Jan 16 12:49:50 CST 2012
app.grails.version=2.0.0
app.name=freemarker
91 changes: 34 additions & 57 deletions grails-app/conf/BuildConfig.groovy
@@ -1,83 +1,60 @@
grails.project.dependency.resolution = {
def versions
if ("$grailsVersion" > "1.3.7") {
versions = [geb:"0.6.2", selenium:"2.15.0", spock:"0.6-SNAPSHOT",pluginConfig:"[0.1.5,)"]
versions = [geb:"0.6.2", selenium:"2.16.1", spock:"0.6-SNAPSHOT",pluginConfig:"0.1.5"]
}else{
versions = [geb:"0.6.0", selenium:"2.0rc3", spock:"0.5-groovy-1.7",pluginConfig:"0.1.5"]
versions = [geb:"0.6.0", selenium:"2.16.1", spock:"0.5-groovy-1.7",pluginConfig:"0.1.5"]
}

inherits('global') {
excludes //"httpclient"//, "httpcore"
}

repositories {
grailsPlugins()
grailsHome()
if ("$grailsVersion" > "1.2.5") {
grailsCentral()
}
grailsCentral()
mavenCentral()
//mavenLocal()
}

dependencies {
runtime "org.freemarker:freemarker:2.3.18"


test("org.codehaus.geb:geb-spock:${versions.geb}"){
exported = false
}
//test "org.codehaus.geb:geb-junit4:$gebVersion" uncomment if you want to use the junit geb
//the version should match what is used on the geb release being used
test "org.codehaus.geb:geb-spock:${versions.geb}"

test("org.seleniumhq.selenium:selenium-htmlunit-driver:${versions.selenium}") {
exported = false
exclude "xml-apis"
excludes "xml-apis"
}

provided("org.codehaus.groovy.modules.http-builder:http-builder:0.5.2"){
export = false
excludes 'nekohtml', "httpclient", "httpcore","xml-apis","groovy"
}
//test("org.seleniumhq.selenium:selenium-chrome-driver:$seleniumVersion")
//test("org.seleniumhq.selenium:selenium-firefox-driver:$seleniumVersion")
provided('net.sourceforge.nekohtml:nekohtml:1.9.15') {
export = false
excludes "xml-apis"
}
}

//println "ABC: $grailsVersion"
//println "ABC: " + ("$grailsVersion" >= "1.3.7")


if ("$grailsVersion" > "1.2.5") {
plugins {
compile(":plugin-config:${versions.pluginConfig}"){
}
test(":spock:${versions.spock}") {
exported = false
}
test(":geb:${versions.geb}") {
exported = false
}
// if ("$grailsVersion" > "1.3.7") {
// compile ":plugin-config:[0.1.3,)"
// test(":spock:0.6-SNAPSHOT") {
// exported = false
// }
// test(":geb:0.6.2") {
// exported = false
// }
//
// }else{
// compile(":plugin-config:0.1.3"){
// }
// test(":spock:0.5-groovy-1.7") {
// exported = false
// }
// test(":geb:0.6.0") {
// exported = false
// }
// }
compile(":tomcat:$grailsVersion", ":hibernate:$grailsVersion") {
exported = false
}

//build(':release:1.0.0.M3') {
//nekohtml was conflicting with htmlunit
// excludes "svn", 'nekohtml'
//}
plugins {
compile(":plugin-config:${versions.pluginConfig}"){}

test ":geb:${versions.geb}",":spock:${versions.spock}"

build(':release:1.0.1') {
excludes 'http-builder','nekohtml','svn'
export = false
}
//this seems to prevent svn from being added to application properties
build ":svn:1.0.2"

compile(":tomcat:$grailsVersion", ":hibernate:$grailsVersion") {
export = false
}


}
}
}
//grails.project.work.dir = '.grails'

Expand Down
18 changes: 10 additions & 8 deletions grails-app/conf/Config.groovy
Expand Up @@ -23,14 +23,16 @@ log4j = {

warn 'org.mortbay.log'

trace 'org.springframework.web.servlet.view',
'org.springframework.context.support'

debug 'grails.plugin.freemarker.GrailsTemplateLoader',
'grails.plugin.freemarker.GrailsFreeMarkerViewResolver',
'grails.app.service.grails.plugin.freemarker.FreemarkerViewService',
'org.codehaus.groovy.grails.web.pages.GroovyPageResourceLoader'
//'org.springframework.ui.freemarker',
// trace 'org.springframework.web.servlet.view',
// 'org.springframework.context.support'
//
// debug 'grails.plugin.freemarker.GrailsTemplateLoader',
// 'grails.plugin.freemarker.GrailsFreeMarkerViewResolver',
// 'grails.app.service.grails.plugin.freemarker.FreemarkerViewService',
// 'org.codehaus.groovy.grails.web.pages.GroovyPageResourceLoader',
// 'grails.plugin.freemarker.AbstractTagLibAwareConfigurer',
// 'grails.plugin.freemarker.TagLibToDirectiveAndFunction' ,
// 'org.springframework.ui.freemarker'
//'org.springframework.web.servlet.view.freemarker',
//'org.springframework.core.io.DefaultResourceLoader',
//'org.springframework.web.context.support.ServletContextResourceLoader'
Expand Down
4 changes: 1 addition & 3 deletions grails-app/conf/FreemarkerDefaultConfig.groovy
Expand Up @@ -18,11 +18,9 @@ grails {
requireViewSuffix = false

viewResolver {
hideException = true
hideException = false
}



tags {
enabled = true
}
Expand Down
50 changes: 35 additions & 15 deletions grails-app/controllers/testing/DemoController.groovy
Expand Up @@ -2,38 +2,47 @@ package testing

class DemoController {

//passes through to index, sitemesh should be set here
def freemarkerViewService

//just a sanity check to make sure the basics still work
def wtf = {
render "wtf"
}

//passes through to index, sitemesh should be set here too
def index = {
[name: 'Jake', state: 'Missouri']
render view: 'index.ftl', model: [name: 'Jake', state: 'Missouri']
}

//a simple normal gsp
//a simple normal gsp for a sanity check
def normal = {
[name: 'Jake', state: 'Missouri']
}

//passes through to the template
//passes through to the ftl template
//fmtemplate also has a number of freemarker includes
def fmtemplate = {
[name: 'Jake']
render view: 'fmtemplate.ftl', model:[name: 'Jake']
}

def specifyView = {
render view: '/demo/fmtemplate', model: [name: 'Abe', state: 'Illinois']

//let grails add the controller name prefix
def justTheView = {
render view: 'index.ftl', model: [name: 'Abe', state: 'Illinois']
}

def wtf = {
render "wtf"
}

def testExplicitRenderFromController = {
render view: 'index', model: [name: 'Abe', state: 'Illinois']

//specify the full path to the view
def fullPathToView = {
render view: '/demo/fmtemplate.ftl', model: [name: 'Abe', state: 'Illinois']
}


//test the fm:render taglib
def testTaglib = {
//render view: 'testTaglib', model:[firstName: 'Zack', middleName: 'Scott']
[firstName: 'Zack', middleName: 'Scott']
}

//test that the flash param is passed through properly
def testFlash = {
flash.message = 'this message is in flash'
redirect action: index
Expand All @@ -51,4 +60,15 @@ class DemoController {
//control test
render template: 'testGspPlugin', model: [name: 'Abe', state: 'Illinois'], plugin:'freemarker-plugin-test'
}

def service = {
response.setHeader("Content-Type","text/html;charset=ISO-8859-1")
freemarkerViewService.render('index.ftl', [name: 'Abe', state: 'Illinois'],response.writer)
render false
}

def db = {
render view: 'gorm:db.ftl', model: [testvar: 'fly away'], plugin:'freemarker-plugin-test'
}

}
Expand Up @@ -24,18 +24,20 @@ class FreemarkerViewService {
* get the view for a plugin.
* sets a threadlocal and then passes call to getTemplate(viewname, locale)
*/
View getView(String viewName, String pluginName = null, boolean removePluginName = true) {
View getView(String viewName, String pluginName = null, boolean removePluginNameFromThread = true) {
try{
if(pluginName) GrailsTemplateLoader.pluginNameForTemplate.set(pluginName)
log.debug("getView called with viewname : $viewName and pluginName : $pluginName")
return freemarkerViewResolver.resolveViewName( viewName, getLocale())
}finally{
if(pluginName && removePluginName) GrailsTemplateLoader.pluginNameForTemplate.remove()
if(pluginName && removePluginNameFromThread) GrailsTemplateLoader.pluginNameForTemplate.remove()
}
}

Writer render(String viewName , Map model, Writer writer, String pluginName = null){
render( getView(viewName, pluginName,false) , model, writer, pluginName)
View view = getView(viewName, pluginName,false)
if(!view) throw new IllegalArgumentException("The ftl view [${viewName}] could not be found" + ( pluginName ? " with plugin [${pluginName}]" : "" ))
render( view, model, writer, pluginName)
}

/**
Expand All @@ -44,6 +46,7 @@ class FreemarkerViewService {
*/
Writer render(View view , Map model, Writer writer,String pluginName = null){
try{
if(!view) throw new IllegalArgumentException("The 'view' argument cannot be null")
if(pluginName) GrailsTemplateLoader.pluginNameForTemplate.set(pluginName)
log.debug("primary render called with view : $view ")
// Consolidate static and dynamic model attributes.
Expand Down

0 comments on commit cdd030e

Please sign in to comment.