1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.apache.commons.clazz.reflect.common;
17
18 import java.lang.reflect.Method;
19 import java.util.Iterator;
20 import java.util.Map;
21
22 import org.apache.commons.clazz.reflect.ReflectedClazz;
23
24
25
26
27
28
29
30 public abstract class ReflectedListPropertyIntrospectorSupport
31 extends ReflectedPropertyIntrospectorSupport
32 {
33 protected static final AccessorMethodParser READ_METHOD_PARSER =
34 new ReadAccessorMethodParser();
35
36 protected static final AccessorMethodParser WRITE_METHOD_PARSER =
37 new WriteAccessorMethodParser();
38
39 protected static final AccessorMethodParser GET_METHOD_PARSER =
40 new GetAccessorMethodParser();
41
42 protected static final AccessorMethodParser SET_METHOD_PARSER =
43 new SetAccessorMethodParser();
44
45 protected AccessorMethodParser getReadAccessMethodParser() {
46 return READ_METHOD_PARSER;
47 }
48
49 protected AccessorMethodParser getWriteAccessMethodParser() {
50 return WRITE_METHOD_PARSER;
51 }
52
53 protected AccessorMethodParser getGetAccessMethodParser() {
54 return GET_METHOD_PARSER;
55 }
56
57 protected AccessorMethodParser getSetAccessMethodParser() {
58 return SET_METHOD_PARSER;
59 }
60
61
62
63
64
65 protected ReflectedListPropertyParseResults getParseResults(
66 ReflectedClazz clazz,
67 Map parseResultMap,
68 String propertyName)
69 {
70 ReflectedListPropertyParseResults parseResults =
71 (ReflectedListPropertyParseResults) parseResultMap.get(
72 propertyName);
73 if (parseResults == null) {
74 parseResults =
75 new ReflectedListPropertyParseResults(clazz, propertyName);
76 parseResultMap.put(propertyName, parseResults);
77 }
78 return parseResults;
79 }
80
81
82
83
84
85
86 protected void mergeSingularMethods(
87 Map parseResultMapPlural, Map parseResultMapSingular)
88 {
89 Iterator iter = parseResultMapSingular.values().iterator();
90 while (iter.hasNext()) {
91
92 ReflectedListPropertyParseResults singular =
93 (ReflectedListPropertyParseResults) iter.next();
94
95 ReflectedListPropertyParseResults plural =
96 findBySingularName(
97 parseResultMapPlural, singular.getPropertyName());
98
99 if (plural != null) {
100 plural.merge(singular);
101 }
102 else {
103
104
105 parseResultMapPlural.put(singular.getPropertyName(), singular);
106 }
107 }
108 }
109
110
111
112
113
114 protected ReflectedListPropertyParseResults findBySingularName(
115 Map parseResultMapPlural,
116 String singularName)
117 {
118 ReflectedListPropertyParseResults plural =
119 (ReflectedListPropertyParseResults)
120 parseResultMapPlural.get(singularName);
121 if (plural != null) {
122 return plural;
123 }
124
125 Iterator iter = parseResultMapPlural.entrySet().iterator();
126 while (iter.hasNext()) {
127 Map.Entry entry = (Map.Entry) iter.next();
128 if (isCorrectPluralForm(singularName, (String) entry.getKey())) {
129 return (ReflectedListPropertyParseResults) entry.getValue();
130 }
131 }
132 return null;
133 }
134
135
136
137
138 protected ReflectedAccessorPairProperty createProperty(
139 ReflectedClazz clazz,
140 ReflectedPropertyParseResults parseResults)
141 {
142 ReflectedListProperty property =
143 new ReflectedListProperty(clazz, parseResults.getPropertyName());
144
145 ReflectedListPropertyParseResults parseResultsList =
146 (ReflectedListPropertyParseResults) parseResults;
147
148 property.setAliases(parseResultsList.getAliases());
149 property.setType(parseResultsList.getPropertyType());
150 property.setContentType(parseResultsList.getContentType());
151 property.setReadMethod(parseResultsList.getReadMethod());
152 property.setWriteMethod(parseResultsList.getWriteMethod());
153 property.setGetMethod(parseResultsList.getGetMethod());
154 property.setSetMethod(parseResultsList.getSetMethod());
155 property.setAddMethod(parseResultsList.getAddMethod());
156 property.setAddIndexedMethod(parseResultsList.getAddIndexedMethod());
157 property.setRemoveMethod(parseResultsList.getRemoveMethod());
158 property.setRemoveIndexedMethod(
159 parseResultsList.getRemoveIndexedMethod());
160 property.setSizeMethod(parseResultsList.getSizeMethod());
161 return property;
162 }
163
164
165
166
167
168
169
170
171
172
173
174
175 public static class ReadAccessorMethodParser extends AccessorMethodParser {
176 protected boolean testReturnType(Class returnType) {
177 return !returnType.equals(Void.TYPE);
178 }
179 protected String requiredPrefix() {
180 return "get";
181 }
182 protected int requiredParameterCount() {
183 return 0;
184 }
185 protected Class getValueType(Method method) {
186 return method.getReturnType();
187 }
188 }
189
190
191
192
193
194
195
196
197
198
199
200
201
202 public static class WriteAccessorMethodParser extends AccessorMethodParser {
203 protected boolean testReturnType(Class returnType) {
204 return returnType.equals(Void.TYPE);
205 }
206 protected int requiredParameterCount() {
207 return 1;
208 }
209 protected String requiredPrefix() {
210 return "set";
211 }
212 protected Class getValueType(Method method) {
213 return method.getParameterTypes()[0];
214 }
215 }
216
217
218
219
220
221
222
223
224
225
226 public static class GetAccessorMethodParser extends AccessorMethodParser {
227 protected boolean testReturnType(Class returnType) {
228 return !returnType.equals(Void.TYPE);
229 }
230 protected String requiredPrefix() {
231 return "get";
232 }
233 protected int requiredParameterCount() {
234 return 1;
235 }
236 protected boolean testParameterType(int index, Class parameterType) {
237 return parameterType.equals(Integer.TYPE);
238 }
239 protected Class getValueType(Method method) {
240 return method.getReturnType();
241 }
242 }
243
244
245
246
247
248
249
250
251
252
253 public static class SetAccessorMethodParser extends AccessorMethodParser {
254 protected String requiredPrefix() {
255 return "set";
256 }
257 protected int requiredParameterCount() {
258 return 2;
259 }
260 protected boolean testParameterType(int index, Class parameterType) {
261 if (index == 0) {
262 return parameterType.equals(Integer.TYPE);
263 }
264 return true;
265 }
266 protected Class getValueType(Method method) {
267 return method.getParameterTypes()[1];
268 }
269 }
270
271 }