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    }