1515 */
1616package org.codehaus.groovy.grails.plugins.converters
1717
18- import grails.converters.*
19- import org.codehaus.groovy. grails.commons.ControllerArtefactHandler
18+ import grails.converters.JSON
19+ import grails.converters.XML
2020import grails.util.GrailsUtil
21- import org.codehaus.groovy.grails.plugins.converters.codecs.JSONCodec
21+ import javax.servlet.http.HttpServletRequest
2222import org.codehaus.groovy.grails.web.converters.Converter
2323import org.codehaus.groovy.grails.web.converters.ConverterUtil
24+ import org.codehaus.groovy.grails.web.json.JSONArray
25+ import org.codehaus.groovy.grails.web.json.JSONObject
2426
2527/**
2628 * A plug-in that allows the obj as XML syntax
@@ -33,74 +35,100 @@ import org.codehaus.groovy.grails.web.converters.ConverterUtil
3335 *
3436 */
3537class ConvertersGrailsPlugin {
36- def version = GrailsUtil . getGrailsVersion()
38+ def version = GrailsUtil . getGrailsVersion()
3739
38- def author = " Siegfried Puchbauer"
39- def title = " Provides JSON and XML Conversion for common Objects (Domain Classes, Lists, Maps, POJO)"
40- def description = """
40+ def author = " Siegfried Puchbauer"
41+ def title = " Provides JSON and XML Conversion for common Objects (Domain Classes, Lists, Maps, POJO)"
42+ def description = """
4143 The grails-converters plugin aims to give you the ability to convert your domain objects, maps and lists to JSON or XML very quickly, to ease development for AJAX based applications. The plugin leverages the the groovy "as" operator and extends the render method in grails controllers to directly send the result to the output stream. It also adds the Grails Codecs mechanism for XML and JSON.
4244 """
43- def documentation = " http://grails.org/Converters+Plugin"
44- def providedArtefacts = [ JSONCodec ]
45- def observe = [" controllers" ]
45+ def documentation = " http://grails.org/Converters+Plugin"
46+ def providedArtefacts = [org.codehaus.groovy.grails.plugins.converters.codecs. JSONCodec, org.codehaus.groovy.grails.plugins.converters.codecs.XMLCodec ]
47+ def observe = [" controllers" ]
4648
47- def dependsOn = [
48- controllers : GrailsUtil . getGrailsVersion(),
49- domainClass : GrailsUtil . getGrailsVersion()
50- ]
49+ def dependsOn = [
50+ controllers : GrailsUtil . getGrailsVersion(),
51+ domainClass : GrailsUtil . getGrailsVersion()
52+ ]
5153
52- def renderMethod = { Converter converter ->
53- converter. render(delegate. response);
54+ def renderMethod = {Converter converter ->
55+ converter. render(delegate. response);
5456 }
55- def headerMethod = { String key , def value ->
56- if (value) delegate. response?. setHeader(key, value. toString())
57+ def headerMethod = {String key , def value ->
58+ if (value) delegate. response?. setHeader(key, value. toString())
5759 }
58- def jsonHeaderMethod = { def value ->
59- if (value) delegate. response?. setHeader(" X-JSON" , value. toString())
60+ def jsonHeaderMethod = {def value ->
61+ def json = (value instanceof JSON || value instanceof JSONObject || value instanceof JSONArray ) ? value : (new JSON(value));
62+ if (value) delegate. response?. setHeader(" X-JSON" , value. toString())
6063 }
6164
62- def onChange = { event ->
65+ def onChange = {event ->
6366 def mc = event. source. metaClass
6467 mc. render = renderMethod
6568 mc. header = headerMethod
6669 mc. jsonHeader = jsonHeaderMethod
6770 }
6871
69- def doWithDynamicMethods = { applicationContext ->
70- ConverterUtil . setGrailsApplication(application);
72+ def doWithDynamicMethods = {applicationContext ->
73+ try {
74+ ConverterUtil . setGrailsApplication(application);
7175
72- def controllerClasses = application. controllerClasses
73- for (controller in controllerClasses) {
74- def mc = controller. metaClass
75- mc. render = renderMethod
76- mc. header = headerMethod
77- mc. jsonHeader = jsonHeaderMethod
78- }
76+ log. debug " Applying new header and render methods to all Controllers..."
77+ def controllerClasses = application. controllerClasses
78+ for (controller in controllerClasses) {
79+ def mc = controller. metaClass
80+ mc. render = renderMethod
81+ mc. header = headerMethod
82+ mc. jsonHeader = jsonHeaderMethod
83+ }
7984
80- def asTypeMethod = { Class clazz ->
81- if (ConverterUtil . isConverterClass(clazz)) {
85+ def asTypeMethod = {java.lang. Class clazz ->
86+ if (ConverterUtil . isConverterClass(clazz)) {
8287 return ConverterUtil . createConverter(clazz, delegate)
8388 } else {
8489 return ConverterUtil . invokeOriginalAsTypeMethod(delegate, clazz)
8590 }
86- }
91+ }
8792
88- for (dc in application. domainClasses) {
89- def mc = dc. metaClass
90- mc. asType = asTypeMethod
91- XML . addAlias(dc. propertyName, dc. clazz);
92- log. debug " Adding XStream alias ${ dc.propertyName} for class ${ dc.clazz.getName()} "
93- }
93+ for (dc in application. domainClasses) {
94+ def mc = dc. metaClass
95+ mc. asType = asTypeMethod
96+ ConverterUtil . addAlias(dc. propertyName, dc. clazz);
97+ log. debug " Adding XStream alias ${ dc.propertyName} for class ${ dc.clazz.getName()} "
98+ }
99+
100+
101+ // Override GDK asType for some common Interfaces and Classes
102+ [java.util.ArrayList , java.util.TreeSet , java.util.HashSet , java.util.List , java.util.Set , java.util.Collection , groovy.lang.GroovyObject , java.lang.Object ]. each {Class clazz ->
103+ def mc = GroovySystem . metaClassRegistry. getMetaClass(clazz)
104+ if (! mc instanceof ExpandoMetaClass ) {
105+ log. warn " Unable to add Converter Functionality to Class ${ className} "
106+ return ;
107+ }
108+ log. debug " Adding Converter asType Method to Class ${ clazz} [${ clazz.class} ] -> [${ mc.class} ]"
109+ mc. asType = asTypeMethod
110+ mc. initialize()
111+ }
94112
95- [Collection ,List ,Set ,ArrayList ,HashSet ,TreeSet , Object ]. each { collectionClass ->
96- collectionClass. metaClass. asType = { Class clazz ->
97- if (ConverterUtil . isConverterClass(clazz)) {
98- return ConverterUtil . createConverter(clazz, delegate);
99- } else {
100- return ConverterUtil . invokeOriginalAsTypeMethod(delegate, clazz)
101- }
102- }
103- }
104- log. debug " Converters Plugin configured successfully"
105- }
113+ // Methods for Reading JSON/XML from Requests
114+ def getXMLMethod = {->
115+ return XML . parse((HttpServletRequest ) delegate)
116+ }
117+ def getJSONMethod = {->
118+ return JSON . parse((HttpServletRequest ) delegate)
119+ }
120+ def requestMc = GroovySystem . metaClassRegistry. getMetaClass(HttpServletRequest )
121+ requestMc. getXML = getXMLMethod
122+ requestMc. getJSON = getJSONMethod
123+ requestMc. initialize()
124+
125+ // TODO:
126+ // add asType Method to XmlSlurper to unmarshalling
127+ // of XML Content and implement unmarshalling in JSONObject/Array...
128+
129+ log. debug " Converters Plugin configured successfully"
130+ } catch (Exception e) {
131+ log. error(e)
132+ }
133+ }
106134}
0 commit comments