GRAILS-1019: Allowing expressions to be used with the 'disabled' attribute for g...
[grails.git] / src / web / org / codehaus / groovy / grails / web / converters / ConverterUtil.java
blobe4323abf65d7c90f56af6fb2d6cc2bb99e443b43
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;
17 /**
18 * A utility class for creating and dealing with Converter objects
20 * @author Siegfried Puchbauer
21 * @since 0.6
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;
35 import java.io.File;
36 import java.util.*;
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 {
45 try {
46 AbstractConverter converter = (AbstractConverter) converterClass.newInstance();
47 converter.setTarget(target);
48 return converter;
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();
58 public static XStream
59 getXStream(Class clazz) {
60 XStream xs = (XStream) XSTREAM_MAP.get(clazz);
61 if (xs == null) {
62 xs = setupXStream(clazz);
64 return xs;
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);
74 xs.alias(alias, cls);
76 try {
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);
84 return xs;
87 public static void addAlias(String alias, Class clazz) {
88 ALIAS_MAP.put(clazz, alias);
89 XSTREAM_MAP.clear();
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();
99 else return alias;
102 public static GrailsDomainClass getDomainClass(String name) {
103 // deal with proxies
104 name = trimProxySuffix(name);
105 return (GrailsDomainClass) getGrailsApplication().getArtefact(DomainClassArtefactHandler.TYPE, name);
108 private static String trimProxySuffix(String name) {
109 int i = name.indexOf("$$");
110 if(i > -1) {
111 name = name.substring(0,i);
113 return name;
116 private static GrailsApplication getGrailsApplication() {
117 return getInstance().grailsApplication;
120 protected static ConverterUtil getInstance() {
121 if (INSTANCE == null) {
122 INSTANCE = new ConverterUtil();
124 return INSTANCE;
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);
163 else
164 return DefaultGroovyMethods.asType(delegate, clazz);