001 package org.tynamo.services;
002
003 import org.apache.tapestry5.ioc.services.Coercion;
004 import org.tynamo.descriptor.TynamoClassDescriptor;
005
006 import java.util.HashMap;
007 import java.util.Map;
008
009 public class EntityCoercerServiceImpl implements EntityCoercerService
010 {
011
012 Map<String, Class> stringToClass;
013 Map<Class, String> classToString;
014
015 /**
016 *
017 * @param descriptorService used to initialize the mappings to avoid TRAILS-173
018 */
019 public EntityCoercerServiceImpl(DescriptorService descriptorService)
020 {
021 stringToClass = new HashMap<String, Class>();
022 classToString = new HashMap<Class, String>();
023
024 for (TynamoClassDescriptor classDescriptor : descriptorService.getAllDescriptors())
025 {
026 classToString(classDescriptor.getType());
027 }
028 }
029
030 public String classToString(Class clazz)
031 {
032 String simpleName = classToString.get(clazz);
033 if (simpleName == null)
034 {
035 simpleName = clazz.getSimpleName().toLowerCase();
036 classToString.put(clazz, simpleName);
037 stringToClass.put(simpleName, clazz);
038 }
039 return simpleName;
040 }
041
042 public Class stringToClass(String simpleName)
043 {
044 return stringToClass.get(simpleName);
045 }
046 }
047
048 class ClassToStringCoercion implements Coercion<Class, String>
049 {
050
051 EntityCoercerService entityCoercerService;
052
053 public ClassToStringCoercion(final EntityCoercerService entityCoercerService)
054 {
055 this.entityCoercerService = entityCoercerService;
056 }
057
058 public String coerce(Class clazz)
059 {
060 return entityCoercerService.classToString(clazz);
061 }
062
063 }
064
065 class StringToClassCoercion implements Coercion<String, Class>
066 {
067
068 EntityCoercerService entityCoercerService;
069
070 public StringToClassCoercion(final EntityCoercerService entityCoercerService)
071 {
072 this.entityCoercerService = entityCoercerService;
073 }
074
075 public Class coerce(String simpleName)
076 {
077 return entityCoercerService.stringToClass(simpleName);
078 }
079
080 }