1 /* Copyright 2006-2007 Graeme Rocher
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
7 * http://www.apache.org/licenses/LICENSE-2.0
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
15 package org
.codehaus
.groovy
.grails
.web
.converters
;
18 * A utility class for creating and dealing with Converter objects
20 * @author Siegfried Puchbauer
24 import com
.thoughtworks
.xstream
.XStream
;
25 import grails
.converters
.XML
;
26 import groovy
.lang
.Closure
;
27 import org
.apache
.commons
.logging
.Log
;
28 import org
.apache
.commons
.logging
.LogFactory
;
29 import org
.codehaus
.groovy
.grails
.commons
.DomainClassArtefactHandler
;
30 import org
.codehaus
.groovy
.grails
.commons
.GrailsApplication
;
31 import org
.codehaus
.groovy
.grails
.commons
.GrailsDomainClass
;
32 import org
.codehaus
.groovy
.grails
.web
.converters
.exceptions
.ConverterException
;
33 import org
.codehaus
.groovy
.runtime
.DefaultGroovyMethods
;
38 public class ConverterUtil
{
40 private final static Log log
= LogFactory
.getLog(ConverterUtil
.class);
42 private static ConverterUtil INSTANCE
;
44 public static Object
createConverter(Class converterClass
, Object target
) throws ConverterException
{
46 AbstractConverter converter
= (AbstractConverter
) converterClass
.newInstance();
47 converter
.setTarget(target
);
49 } catch (Exception e
) {
50 throw new ConverterException("Initialization of Converter Object " + converterClass
.getName()
51 + " failed for target " + target
.getClass().getName(), e
);
55 private static Map XSTREAM_MAP
= new HashMap();
56 private static Map ALIAS_MAP
= new HashMap();
59 getXStream(Class clazz
) {
60 XStream xs
= (XStream
) XSTREAM_MAP
.get(clazz
);
62 xs
= setupXStream(clazz
);
67 protected static XStream
setupXStream(Class converter
) {
68 XStream xs
= new XStream();
70 xs
.setMode(XStream
.XPATH_ABSOLUTE_REFERENCES
);
71 for (Iterator iterator
= ALIAS_MAP
.keySet().iterator(); iterator
.hasNext();) {
72 Class cls
= (Class
) iterator
.next();
73 String alias
= (String
) ALIAS_MAP
.get(cls
);
77 XML instance
= (XML
) converter
.newInstance();
78 instance
.configureXStream(xs
);
80 XSTREAM_MAP
.put(converter
, xs
);
81 } catch (Exception e
) {
82 log
.error("Error configuring XStream for Converter " + converter
.getName(), e
);
87 public static void addAlias(String alias
, Class clazz
) {
88 ALIAS_MAP
.put(clazz
, alias
);
92 public static String
getAlias(Class cls
) {
93 return (String
) ALIAS_MAP
.get(cls
);
96 public static String
resolveAlias(Class cls
) {
97 String alias
= (String
) ALIAS_MAP
.get(cls
);
98 if (alias
== null) return cls
.getName();
102 public static GrailsDomainClass
getDomainClass(String name
) {
104 name
= trimProxySuffix(name
);
105 return (GrailsDomainClass
) getGrailsApplication().getArtefact(DomainClassArtefactHandler
.TYPE
, name
);
108 private static String
trimProxySuffix(String name
) {
109 int i
= name
.indexOf("$$");
111 name
= name
.substring(0,i
);
116 private static GrailsApplication
getGrailsApplication() {
117 return getInstance().grailsApplication
;
120 protected static ConverterUtil
getInstance() {
121 if (INSTANCE
== null) {
122 INSTANCE
= new ConverterUtil();
127 public static boolean isConverterClass(Class clazz
) {
128 return Converter
.class.isAssignableFrom(clazz
);
131 public static boolean isDomainClass(Class clazz
) {
132 String name
= trimProxySuffix(clazz
.getName());
133 return getGrailsApplication().isArtefactOfType(DomainClassArtefactHandler
.TYPE
, name
);
136 public static Set
getDomainClassNames() {
137 return getGrailsApplication().getArtefactInfo(DomainClassArtefactHandler
.TYPE
).getClassesByName().keySet();
140 public static void setGrailsApplication(GrailsApplication grailsApp
) {
141 getInstance().grailsApplication
= grailsApp
;
144 private GrailsApplication grailsApplication
;
146 protected ConverterUtil() {
150 public static Object
invokeOriginalAsTypeMethod(Object delegate
, Class clazz
) {
151 if (delegate
instanceof Collection
)
152 return DefaultGroovyMethods
.asType((Collection
) delegate
, clazz
);
153 else if (delegate
instanceof Closure
)
154 return DefaultGroovyMethods
.asType((Closure
) delegate
, clazz
);
155 else if (delegate
instanceof Map
)
156 return DefaultGroovyMethods
.asType((Map
) delegate
, clazz
);
157 else if (delegate
instanceof Number
)
158 return DefaultGroovyMethods
.asType((Number
) delegate
, clazz
);
159 else if (delegate
instanceof File
)
160 return DefaultGroovyMethods
.asType((File
) delegate
, clazz
);
161 else if (delegate
instanceof String
)
162 return DefaultGroovyMethods
.asType((String
) delegate
, clazz
);
164 return DefaultGroovyMethods
.asType(delegate
, clazz
);