1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 package org.org.usurper.handlers.defaults;
24
25 import java.lang.reflect.Field;
26 import java.lang.reflect.Type;
27 import java.util.HashSet;
28 import java.util.LinkedHashMap;
29 import java.util.Map;
30 import java.util.Set;
31
32 import org.org.usurper.handlers.basic.AbstractPropertyTypeHandler;
33 import org.org.usurper.handlers.basic.EnumHandler;
34 import org.org.usurper.handlers.exceptions.NoHandlerDefinedException;
35 import org.org.usurper.handlers.exceptions.PropertyTypeHandlingException;
36 import org.org.usurper.model.HandledBeanProperty;
37 import org.org.usurper.model.HandledConstructorArg;
38 import org.org.usurper.model.PropertyTypeDefinition;
39 import org.org.usurper.utils.ReflectionUtils;
40
41
42
43
44
45
46
47
48
49 public class MapPropertyTypeHandler extends AbstractPropertyTypeHandler {
50
51 private final static Integer KEY_TYPE_ARGUMENTS_INDEX = 0;
52
53 private final static Integer VALUE_TYPE_ARGUMENTS_INDEX = 1;
54
55 private static Set<PropertyTypeDefinition> handledTypes;
56
57 static {
58 handledTypes = new HashSet<PropertyTypeDefinition>();
59 handledTypes.add(new PropertyTypeDefinition(Map.class));
60 }
61
62
63
64
65 public MapPropertyTypeHandler() {
66 super(handledTypes);
67 }
68
69
70
71
72 @SuppressWarnings("unchecked")
73 public Object handle(HandledBeanProperty handledBeanProperty) {
74 Map result = null;
75 final Integer MAP_ENTRIES = handledBeanProperty.getUsurperGeneratorSetup().getCountCallback().determineCount(handledBeanProperty);
76 try {
77 Field attribute = ReflectionUtils.getField(handledBeanProperty.getTargetObject(), handledBeanProperty.getPropertyName());
78 Type[] usurpedClasses = ReflectionUtils.getGenericTypes(attribute);
79 Class keyGenericType = (Class) usurpedClasses[KEY_TYPE_ARGUMENTS_INDEX];
80 Class valueGenericType = (Class) usurpedClasses[VALUE_TYPE_ARGUMENTS_INDEX];
81 int entryNumber = MAP_ENTRIES;
82 result = new LinkedHashMap(entryNumber);
83 HandledBeanProperty handledMapKeyItem = new HandledBeanProperty(handledBeanProperty.getTargetObject(), keyGenericType, handledBeanProperty.getPropertyName(), handledBeanProperty.getUsurperGeneratorSetup());
84 HandledBeanProperty handledMapValueItem = new HandledBeanProperty(handledBeanProperty.getTargetObject(), valueGenericType, handledBeanProperty.getPropertyName(), handledBeanProperty.getUsurperGeneratorSetup());
85 for (int i = 0; i < entryNumber; i++) {
86 Object key = null;
87 Object value = null;
88 if (handledBeanProperty.getUsurperGeneratorSetup().getAllHandlers().get(new PropertyTypeDefinition(keyGenericType)) != null) {
89 key = handledBeanProperty.getUsurperGeneratorSetup().getAllHandlers().get(new PropertyTypeDefinition(keyGenericType)).handle(handledMapKeyItem);
90 } else {
91 if (keyGenericType.isEnum()) {
92 key = new EnumHandler().handle(handledMapKeyItem);
93 } else {
94 throw new NoHandlerDefinedException("no handler found for Map attribute <" + attribute.getName() + "> of Class <" + keyGenericType.getName() + ">.");
95 }
96 }
97 if (handledBeanProperty.getUsurperGeneratorSetup().getAllHandlers().get(new PropertyTypeDefinition(valueGenericType)) != null) {
98 value = handledBeanProperty.getUsurperGeneratorSetup().getAllHandlers().get(new PropertyTypeDefinition(valueGenericType)).handle(handledMapValueItem);
99 } else {
100 if (valueGenericType.isEnum()) {
101 value = new EnumHandler().handle(handledMapValueItem);
102 } else {
103 throw new NoHandlerDefinedException("no handler found for Map attribute <" + attribute.getName() + "> of Class <" + valueGenericType.getName() + ">.");
104 }
105 }
106 result.put(key, value);
107 }
108 } catch (NoSuchFieldException e) {
109 throw new PropertyTypeHandlingException("Unable to handle field <" + handledBeanProperty.getPropertyName() + "(" + handledBeanProperty.getPropertyClass().getName() + ")> from object " + handledBeanProperty.getTargetObject(), e);
110 }
111 return result;
112 }
113
114
115
116
117 @SuppressWarnings("unchecked")
118 public Object handle(HandledConstructorArg handledConstructorArg) {
119 Map result = null;
120 final Integer MAP_ENTRIES = handledConstructorArg.getUsurperGeneratorSetup().getCountCallback().determineCount(handledConstructorArg);
121 Type[] usurpedClasses = ReflectionUtils.getGenericTypes(handledConstructorArg.getTargetConstructor(), handledConstructorArg.getConstructorArgOrderingNumber());
122 Class keyGenericType = (Class) usurpedClasses[KEY_TYPE_ARGUMENTS_INDEX];
123 Class valueGenericType = (Class) usurpedClasses[VALUE_TYPE_ARGUMENTS_INDEX];
124 int entryNumber = MAP_ENTRIES;
125 result = new LinkedHashMap(entryNumber);
126 HandledConstructorArg handledMapKeyItem = new HandledConstructorArg(handledConstructorArg.getTargetConstructor(), keyGenericType, handledConstructorArg.getConstructorArgOrderingNumber(), handledConstructorArg.getUsurperGeneratorSetup());
127 HandledConstructorArg handledMapValueItem = new HandledConstructorArg(handledConstructorArg.getTargetConstructor(), valueGenericType, handledConstructorArg.getConstructorArgOrderingNumber(), handledConstructorArg.getUsurperGeneratorSetup());
128 for (int i = 0; i < entryNumber; i++) {
129 Object key = null;
130 Object value = null;
131 if (handledConstructorArg.getUsurperGeneratorSetup().getAllHandlers().get(new PropertyTypeDefinition(keyGenericType)) != null) {
132 key = handledConstructorArg.getUsurperGeneratorSetup().getAllHandlers().get(new PropertyTypeDefinition(keyGenericType)).handle(handledMapKeyItem);
133 } else {
134 if (keyGenericType.isEnum()) {
135 key = new EnumHandler().handle(handledMapKeyItem);
136 } else {
137 throw new NoHandlerDefinedException("no handler found for Map Key's Class <" + new PropertyTypeDefinition(keyGenericType) + ">.");
138 }
139 }
140 if (handledConstructorArg.getUsurperGeneratorSetup().getAllHandlers().get(new PropertyTypeDefinition(valueGenericType)) != null) {
141 value = handledConstructorArg.getUsurperGeneratorSetup().getAllHandlers().get(new PropertyTypeDefinition(valueGenericType)).handle(handledMapValueItem);
142 } else {
143 if (valueGenericType.isEnum()) {
144 value = new EnumHandler().handle(handledMapValueItem);
145 } else {
146 throw new NoHandlerDefinedException("no handler found for Map Value's Class <" + new PropertyTypeDefinition(valueGenericType) + ">.");
147 }
148 }
149 result.put(key, value);
150 }
151
152 return result;
153 }
154 }