1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.apache.ibatis.reflection.wrapper;
17
18 import java.util.HashMap;
19 import java.util.List;
20 import java.util.Map;
21
22 import org.apache.ibatis.reflection.MetaObject;
23 import org.apache.ibatis.reflection.SystemMetaObject;
24 import org.apache.ibatis.reflection.factory.ObjectFactory;
25 import org.apache.ibatis.reflection.property.PropertyTokenizer;
26
27
28
29
30 public class MapWrapper extends BaseWrapper {
31
32 private final Map<String, Object> map;
33
34 public MapWrapper(MetaObject metaObject, Map<String, Object> map) {
35 super(metaObject);
36 this.map = map;
37 }
38
39 @Override
40 public Object get(PropertyTokenizer prop) {
41 if (prop.getIndex() != null) {
42 Object collection = resolveCollection(prop, map);
43 return getCollectionValue(prop, collection);
44 } else {
45 return map.get(prop.getName());
46 }
47 }
48
49 @Override
50 public void set(PropertyTokenizer prop, Object value) {
51 if (prop.getIndex() != null) {
52 Object collection = resolveCollection(prop, map);
53 setCollectionValue(prop, collection, value);
54 } else {
55 map.put(prop.getName(), value);
56 }
57 }
58
59 @Override
60 public String findProperty(String name, boolean useCamelCaseMapping) {
61 return name;
62 }
63
64 @Override
65 public String[] getGetterNames() {
66 return map.keySet().toArray(new String[0]);
67 }
68
69 @Override
70 public String[] getSetterNames() {
71 return map.keySet().toArray(new String[0]);
72 }
73
74 @Override
75 public Class<?> getSetterType(String name) {
76 PropertyTokenizer prop = new PropertyTokenizer(name);
77 if (prop.hasNext()) {
78 MetaObject metaValue = metaObject.metaObjectForProperty(prop.getIndexedName());
79 if (metaValue == SystemMetaObject.NULL_META_OBJECT) {
80 return Object.class;
81 } else {
82 return metaValue.getSetterType(prop.getChildren());
83 }
84 } else {
85 if (map.get(name) != null) {
86 return map.get(name).getClass();
87 } else {
88 return Object.class;
89 }
90 }
91 }
92
93 @Override
94 public Class<?> getGetterType(String name) {
95 PropertyTokenizer prop = new PropertyTokenizer(name);
96 if (prop.hasNext()) {
97 MetaObject metaValue = metaObject.metaObjectForProperty(prop.getIndexedName());
98 if (metaValue == SystemMetaObject.NULL_META_OBJECT) {
99 return Object.class;
100 } else {
101 return metaValue.getGetterType(prop.getChildren());
102 }
103 } else {
104 if (map.get(name) != null) {
105 return map.get(name).getClass();
106 } else {
107 return Object.class;
108 }
109 }
110 }
111
112 @Override
113 public boolean hasSetter(String name) {
114 return true;
115 }
116
117 @Override
118 public boolean hasGetter(String name) {
119 PropertyTokenizer prop = new PropertyTokenizer(name);
120 if (prop.hasNext()) {
121 if (map.containsKey(prop.getIndexedName())) {
122 MetaObject metaValue = metaObject.metaObjectForProperty(prop.getIndexedName());
123 if (metaValue == SystemMetaObject.NULL_META_OBJECT) {
124 return true;
125 } else {
126 return metaValue.hasGetter(prop.getChildren());
127 }
128 } else {
129 return false;
130 }
131 } else {
132 return map.containsKey(prop.getName());
133 }
134 }
135
136 @Override
137 public MetaObject instantiatePropertyValue(String name, PropertyTokenizer prop, ObjectFactory objectFactory) {
138 HashMap<String, Object> map = new HashMap<>();
139 set(prop, map);
140 return MetaObject.forObject(map, metaObject.getObjectFactory(), metaObject.getObjectWrapperFactory(), metaObject.getReflectorFactory());
141 }
142
143 @Override
144 public boolean isCollection() {
145 return false;
146 }
147
148 @Override
149 public void add(Object element) {
150 throw new UnsupportedOperationException();
151 }
152
153 @Override
154 public <E> void addAll(List<E> element) {
155 throw new UnsupportedOperationException();
156 }
157
158 }