annotate src/main/java/org/msgpack/template/builder/beans/IndexedPropertyDescriptor.java @ 0:cb825acd883a

first commit
author sugi
date Sat, 18 Oct 2014 15:06:15 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
cb825acd883a first commit
sugi
parents:
diff changeset
1 // MODIFIED FOR THE MSGPACK PROJECT
cb825acd883a first commit
sugi
parents:
diff changeset
2 // Licensed to the Apache Software Foundation (ASF) under one or more
cb825acd883a first commit
sugi
parents:
diff changeset
3 // contributor license agreements. See the NOTICE file distributed with
cb825acd883a first commit
sugi
parents:
diff changeset
4 // this work for additional information regarding copyright ownership.
cb825acd883a first commit
sugi
parents:
diff changeset
5 // The ASF licenses this file to You under the Apache License, Version 2.0
cb825acd883a first commit
sugi
parents:
diff changeset
6 // (the "License"); you may not use this file except in compliance with
cb825acd883a first commit
sugi
parents:
diff changeset
7 // the License. You may obtain a copy of the License at
cb825acd883a first commit
sugi
parents:
diff changeset
8 //
cb825acd883a first commit
sugi
parents:
diff changeset
9 // http://www.apache.org/licenses/LICENSE-2.0
cb825acd883a first commit
sugi
parents:
diff changeset
10 //
cb825acd883a first commit
sugi
parents:
diff changeset
11 // Unless required by applicable law or agreed to in writing, software
cb825acd883a first commit
sugi
parents:
diff changeset
12 // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
cb825acd883a first commit
sugi
parents:
diff changeset
13 // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
cb825acd883a first commit
sugi
parents:
diff changeset
14 // License for the specific language governing permissions and limitations under
cb825acd883a first commit
sugi
parents:
diff changeset
15 // the License.
cb825acd883a first commit
sugi
parents:
diff changeset
16 //
cb825acd883a first commit
sugi
parents:
diff changeset
17
cb825acd883a first commit
sugi
parents:
diff changeset
18 package org.msgpack.template.builder.beans;
cb825acd883a first commit
sugi
parents:
diff changeset
19
cb825acd883a first commit
sugi
parents:
diff changeset
20 import java.lang.reflect.Method;
cb825acd883a first commit
sugi
parents:
diff changeset
21
cb825acd883a first commit
sugi
parents:
diff changeset
22 import org.apache.harmony.beans.BeansUtils;
cb825acd883a first commit
sugi
parents:
diff changeset
23 import org.apache.harmony.beans.internal.nls.Messages;
cb825acd883a first commit
sugi
parents:
diff changeset
24
cb825acd883a first commit
sugi
parents:
diff changeset
25 public class IndexedPropertyDescriptor extends PropertyDescriptor {
cb825acd883a first commit
sugi
parents:
diff changeset
26
cb825acd883a first commit
sugi
parents:
diff changeset
27 private Class<?> indexedPropertyType;
cb825acd883a first commit
sugi
parents:
diff changeset
28
cb825acd883a first commit
sugi
parents:
diff changeset
29 private Method indexedGetter;
cb825acd883a first commit
sugi
parents:
diff changeset
30
cb825acd883a first commit
sugi
parents:
diff changeset
31 private Method indexedSetter;
cb825acd883a first commit
sugi
parents:
diff changeset
32
cb825acd883a first commit
sugi
parents:
diff changeset
33 /**
cb825acd883a first commit
sugi
parents:
diff changeset
34 * Constructs a new instance of <code>IndexedPropertyDescriptor</code>.
cb825acd883a first commit
sugi
parents:
diff changeset
35 *
cb825acd883a first commit
sugi
parents:
diff changeset
36 * @param propertyName
cb825acd883a first commit
sugi
parents:
diff changeset
37 * the specified indexed property's name.
cb825acd883a first commit
sugi
parents:
diff changeset
38 * @param beanClass
cb825acd883a first commit
sugi
parents:
diff changeset
39 * the bean class
cb825acd883a first commit
sugi
parents:
diff changeset
40 * @param getterName
cb825acd883a first commit
sugi
parents:
diff changeset
41 * the name of the array getter
cb825acd883a first commit
sugi
parents:
diff changeset
42 * @param setterName
cb825acd883a first commit
sugi
parents:
diff changeset
43 * the name of the array setter
cb825acd883a first commit
sugi
parents:
diff changeset
44 * @param indexedGetterName
cb825acd883a first commit
sugi
parents:
diff changeset
45 * the name of the indexed getter.
cb825acd883a first commit
sugi
parents:
diff changeset
46 * @param indexedSetterName
cb825acd883a first commit
sugi
parents:
diff changeset
47 * the name of the indexed setter.
cb825acd883a first commit
sugi
parents:
diff changeset
48 * @throws IntrospectionException
cb825acd883a first commit
sugi
parents:
diff changeset
49 */
cb825acd883a first commit
sugi
parents:
diff changeset
50 public IndexedPropertyDescriptor(String propertyName, Class<?> beanClass,
cb825acd883a first commit
sugi
parents:
diff changeset
51 String getterName, String setterName, String indexedGetterName,
cb825acd883a first commit
sugi
parents:
diff changeset
52 String indexedSetterName) throws IntrospectionException {
cb825acd883a first commit
sugi
parents:
diff changeset
53 super(propertyName, beanClass, getterName, setterName);
cb825acd883a first commit
sugi
parents:
diff changeset
54 setIndexedByName(beanClass, indexedGetterName, indexedSetterName);
cb825acd883a first commit
sugi
parents:
diff changeset
55 }
cb825acd883a first commit
sugi
parents:
diff changeset
56
cb825acd883a first commit
sugi
parents:
diff changeset
57 private void setIndexedByName(Class<?> beanClass, String indexedGetterName,
cb825acd883a first commit
sugi
parents:
diff changeset
58 String indexedSetterName) throws IntrospectionException {
cb825acd883a first commit
sugi
parents:
diff changeset
59
cb825acd883a first commit
sugi
parents:
diff changeset
60 String theIndexedGetterName = indexedGetterName;
cb825acd883a first commit
sugi
parents:
diff changeset
61 if (theIndexedGetterName == null) {
cb825acd883a first commit
sugi
parents:
diff changeset
62 if (indexedSetterName != null) {
cb825acd883a first commit
sugi
parents:
diff changeset
63 setIndexedWriteMethod(beanClass, indexedSetterName);
cb825acd883a first commit
sugi
parents:
diff changeset
64 }
cb825acd883a first commit
sugi
parents:
diff changeset
65 } else {
cb825acd883a first commit
sugi
parents:
diff changeset
66 if (theIndexedGetterName.length() == 0) {
cb825acd883a first commit
sugi
parents:
diff changeset
67 theIndexedGetterName = "get" + name; //$NON-NLS-1$
cb825acd883a first commit
sugi
parents:
diff changeset
68 }
cb825acd883a first commit
sugi
parents:
diff changeset
69 setIndexedReadMethod(beanClass, theIndexedGetterName);
cb825acd883a first commit
sugi
parents:
diff changeset
70 if (indexedSetterName != null) {
cb825acd883a first commit
sugi
parents:
diff changeset
71 setIndexedWriteMethod(beanClass, indexedSetterName,
cb825acd883a first commit
sugi
parents:
diff changeset
72 indexedPropertyType);
cb825acd883a first commit
sugi
parents:
diff changeset
73 }
cb825acd883a first commit
sugi
parents:
diff changeset
74 }
cb825acd883a first commit
sugi
parents:
diff changeset
75
cb825acd883a first commit
sugi
parents:
diff changeset
76 if (!isCompatible()) {
cb825acd883a first commit
sugi
parents:
diff changeset
77 // custom.beans.57=Property type is incompatible with the indexed property type
cb825acd883a first commit
sugi
parents:
diff changeset
78 throw new IntrospectionException(Messages.getString("custom.beans.57")); //$NON-NLS-1$
cb825acd883a first commit
sugi
parents:
diff changeset
79 }
cb825acd883a first commit
sugi
parents:
diff changeset
80 }
cb825acd883a first commit
sugi
parents:
diff changeset
81
cb825acd883a first commit
sugi
parents:
diff changeset
82 private boolean isCompatible() {
cb825acd883a first commit
sugi
parents:
diff changeset
83 Class<?> propertyType = getPropertyType();
cb825acd883a first commit
sugi
parents:
diff changeset
84
cb825acd883a first commit
sugi
parents:
diff changeset
85 if (propertyType == null) {
cb825acd883a first commit
sugi
parents:
diff changeset
86 return true;
cb825acd883a first commit
sugi
parents:
diff changeset
87 }
cb825acd883a first commit
sugi
parents:
diff changeset
88 Class<?> componentTypeOfProperty = propertyType.getComponentType();
cb825acd883a first commit
sugi
parents:
diff changeset
89 if (componentTypeOfProperty == null) {
cb825acd883a first commit
sugi
parents:
diff changeset
90 return false;
cb825acd883a first commit
sugi
parents:
diff changeset
91 }
cb825acd883a first commit
sugi
parents:
diff changeset
92 if (indexedPropertyType == null) {
cb825acd883a first commit
sugi
parents:
diff changeset
93 return false;
cb825acd883a first commit
sugi
parents:
diff changeset
94 }
cb825acd883a first commit
sugi
parents:
diff changeset
95
cb825acd883a first commit
sugi
parents:
diff changeset
96 return componentTypeOfProperty.getName().equals(
cb825acd883a first commit
sugi
parents:
diff changeset
97 indexedPropertyType.getName());
cb825acd883a first commit
sugi
parents:
diff changeset
98 }
cb825acd883a first commit
sugi
parents:
diff changeset
99
cb825acd883a first commit
sugi
parents:
diff changeset
100 /**
cb825acd883a first commit
sugi
parents:
diff changeset
101 * Constructs a new instance of <code>IndexedPropertyDescriptor</code>.
cb825acd883a first commit
sugi
parents:
diff changeset
102 *
cb825acd883a first commit
sugi
parents:
diff changeset
103 * @param propertyName
cb825acd883a first commit
sugi
parents:
diff changeset
104 * the specified indexed property's name.
cb825acd883a first commit
sugi
parents:
diff changeset
105 * @param getter
cb825acd883a first commit
sugi
parents:
diff changeset
106 * the array getter
cb825acd883a first commit
sugi
parents:
diff changeset
107 * @param setter
cb825acd883a first commit
sugi
parents:
diff changeset
108 * the array setter
cb825acd883a first commit
sugi
parents:
diff changeset
109 * @param indexedGetter
cb825acd883a first commit
sugi
parents:
diff changeset
110 * the indexed getter
cb825acd883a first commit
sugi
parents:
diff changeset
111 * @param indexedSetter
cb825acd883a first commit
sugi
parents:
diff changeset
112 * the indexed setter
cb825acd883a first commit
sugi
parents:
diff changeset
113 * @throws IntrospectionException
cb825acd883a first commit
sugi
parents:
diff changeset
114 */
cb825acd883a first commit
sugi
parents:
diff changeset
115 public IndexedPropertyDescriptor(String propertyName, Method getter,
cb825acd883a first commit
sugi
parents:
diff changeset
116 Method setter, Method indexedGetter, Method indexedSetter)
cb825acd883a first commit
sugi
parents:
diff changeset
117 throws IntrospectionException {
cb825acd883a first commit
sugi
parents:
diff changeset
118 super(propertyName, getter, setter);
cb825acd883a first commit
sugi
parents:
diff changeset
119 if (indexedGetter != null) {
cb825acd883a first commit
sugi
parents:
diff changeset
120 internalSetIndexedReadMethod(indexedGetter);
cb825acd883a first commit
sugi
parents:
diff changeset
121 internalSetIndexedWriteMethod(indexedSetter, true);
cb825acd883a first commit
sugi
parents:
diff changeset
122 } else {
cb825acd883a first commit
sugi
parents:
diff changeset
123 internalSetIndexedWriteMethod(indexedSetter, true);
cb825acd883a first commit
sugi
parents:
diff changeset
124 internalSetIndexedReadMethod(indexedGetter);
cb825acd883a first commit
sugi
parents:
diff changeset
125 }
cb825acd883a first commit
sugi
parents:
diff changeset
126
cb825acd883a first commit
sugi
parents:
diff changeset
127 if (!isCompatible()) {
cb825acd883a first commit
sugi
parents:
diff changeset
128 // custom.beans.57=Property type is incompatible with the indexed property type
cb825acd883a first commit
sugi
parents:
diff changeset
129 throw new IntrospectionException(Messages.getString("custom.beans.57")); //$NON-NLS-1$
cb825acd883a first commit
sugi
parents:
diff changeset
130 }
cb825acd883a first commit
sugi
parents:
diff changeset
131 }
cb825acd883a first commit
sugi
parents:
diff changeset
132
cb825acd883a first commit
sugi
parents:
diff changeset
133 /**
cb825acd883a first commit
sugi
parents:
diff changeset
134 * Constructs a new instance of <code>IndexedPropertyDescriptor</code>.
cb825acd883a first commit
sugi
parents:
diff changeset
135 *
cb825acd883a first commit
sugi
parents:
diff changeset
136 * @param propertyName
cb825acd883a first commit
sugi
parents:
diff changeset
137 * the specified indexed property's name.
cb825acd883a first commit
sugi
parents:
diff changeset
138 * @param beanClass
cb825acd883a first commit
sugi
parents:
diff changeset
139 * the bean class.
cb825acd883a first commit
sugi
parents:
diff changeset
140 * @throws IntrospectionException
cb825acd883a first commit
sugi
parents:
diff changeset
141 */
cb825acd883a first commit
sugi
parents:
diff changeset
142 public IndexedPropertyDescriptor(String propertyName, Class<?> beanClass)
cb825acd883a first commit
sugi
parents:
diff changeset
143 throws IntrospectionException {
cb825acd883a first commit
sugi
parents:
diff changeset
144 super(propertyName, beanClass);
cb825acd883a first commit
sugi
parents:
diff changeset
145 setIndexedByName(beanClass, "get" //$NON-NLS-1$
cb825acd883a first commit
sugi
parents:
diff changeset
146 .concat(initialUpperCase(propertyName)), "set" //$NON-NLS-1$
cb825acd883a first commit
sugi
parents:
diff changeset
147 .concat(initialUpperCase(propertyName)));
cb825acd883a first commit
sugi
parents:
diff changeset
148 }
cb825acd883a first commit
sugi
parents:
diff changeset
149
cb825acd883a first commit
sugi
parents:
diff changeset
150 /**
cb825acd883a first commit
sugi
parents:
diff changeset
151 * Sets the indexed getter as the specified method.
cb825acd883a first commit
sugi
parents:
diff changeset
152 *
cb825acd883a first commit
sugi
parents:
diff changeset
153 * @param indexedGetter
cb825acd883a first commit
sugi
parents:
diff changeset
154 * the specified indexed getter.
cb825acd883a first commit
sugi
parents:
diff changeset
155 * @throws IntrospectionException
cb825acd883a first commit
sugi
parents:
diff changeset
156 */
cb825acd883a first commit
sugi
parents:
diff changeset
157 public void setIndexedReadMethod(Method indexedGetter)
cb825acd883a first commit
sugi
parents:
diff changeset
158 throws IntrospectionException {
cb825acd883a first commit
sugi
parents:
diff changeset
159 this.internalSetIndexedReadMethod(indexedGetter);
cb825acd883a first commit
sugi
parents:
diff changeset
160 }
cb825acd883a first commit
sugi
parents:
diff changeset
161
cb825acd883a first commit
sugi
parents:
diff changeset
162 /**
cb825acd883a first commit
sugi
parents:
diff changeset
163 * Sets the indexed setter as the specified method.
cb825acd883a first commit
sugi
parents:
diff changeset
164 *
cb825acd883a first commit
sugi
parents:
diff changeset
165 * @param indexedSetter
cb825acd883a first commit
sugi
parents:
diff changeset
166 * the specified indexed setter.
cb825acd883a first commit
sugi
parents:
diff changeset
167 * @throws IntrospectionException
cb825acd883a first commit
sugi
parents:
diff changeset
168 */
cb825acd883a first commit
sugi
parents:
diff changeset
169 public void setIndexedWriteMethod(Method indexedSetter)
cb825acd883a first commit
sugi
parents:
diff changeset
170 throws IntrospectionException {
cb825acd883a first commit
sugi
parents:
diff changeset
171 this.internalSetIndexedWriteMethod(indexedSetter, false);
cb825acd883a first commit
sugi
parents:
diff changeset
172 }
cb825acd883a first commit
sugi
parents:
diff changeset
173
cb825acd883a first commit
sugi
parents:
diff changeset
174 /**
cb825acd883a first commit
sugi
parents:
diff changeset
175 * Obtains the indexed setter.
cb825acd883a first commit
sugi
parents:
diff changeset
176 *
cb825acd883a first commit
sugi
parents:
diff changeset
177 * @return the indexed setter.
cb825acd883a first commit
sugi
parents:
diff changeset
178 */
cb825acd883a first commit
sugi
parents:
diff changeset
179 public Method getIndexedWriteMethod() {
cb825acd883a first commit
sugi
parents:
diff changeset
180 return indexedSetter;
cb825acd883a first commit
sugi
parents:
diff changeset
181 }
cb825acd883a first commit
sugi
parents:
diff changeset
182
cb825acd883a first commit
sugi
parents:
diff changeset
183 /**
cb825acd883a first commit
sugi
parents:
diff changeset
184 * Obtains the indexed getter.
cb825acd883a first commit
sugi
parents:
diff changeset
185 *
cb825acd883a first commit
sugi
parents:
diff changeset
186 * @return the indexed getter.
cb825acd883a first commit
sugi
parents:
diff changeset
187 */
cb825acd883a first commit
sugi
parents:
diff changeset
188 public Method getIndexedReadMethod() {
cb825acd883a first commit
sugi
parents:
diff changeset
189 return indexedGetter;
cb825acd883a first commit
sugi
parents:
diff changeset
190 }
cb825acd883a first commit
sugi
parents:
diff changeset
191
cb825acd883a first commit
sugi
parents:
diff changeset
192 /**
cb825acd883a first commit
sugi
parents:
diff changeset
193 * Determines if this <code>IndexedPropertyDescriptor</code> is equal to
cb825acd883a first commit
sugi
parents:
diff changeset
194 * the specified object. Two <code>IndexedPropertyDescriptor</code> s are
cb825acd883a first commit
sugi
parents:
diff changeset
195 * equal if the reader, indexed reader, writer, indexed writer, property
cb825acd883a first commit
sugi
parents:
diff changeset
196 * types, indexed property type, property editor and flags are equal.
cb825acd883a first commit
sugi
parents:
diff changeset
197 *
cb825acd883a first commit
sugi
parents:
diff changeset
198 * @param obj
cb825acd883a first commit
sugi
parents:
diff changeset
199 * @return true if this indexed property descriptor is equal to the
cb825acd883a first commit
sugi
parents:
diff changeset
200 * specified object.
cb825acd883a first commit
sugi
parents:
diff changeset
201 */
cb825acd883a first commit
sugi
parents:
diff changeset
202 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
203 public boolean equals(Object obj) {
cb825acd883a first commit
sugi
parents:
diff changeset
204 if (!(obj instanceof IndexedPropertyDescriptor)) {
cb825acd883a first commit
sugi
parents:
diff changeset
205 return false;
cb825acd883a first commit
sugi
parents:
diff changeset
206 }
cb825acd883a first commit
sugi
parents:
diff changeset
207
cb825acd883a first commit
sugi
parents:
diff changeset
208 IndexedPropertyDescriptor other = (IndexedPropertyDescriptor) obj;
cb825acd883a first commit
sugi
parents:
diff changeset
209
cb825acd883a first commit
sugi
parents:
diff changeset
210 return (super.equals(other)
cb825acd883a first commit
sugi
parents:
diff changeset
211 && (indexedPropertyType == null ? other.indexedPropertyType == null
cb825acd883a first commit
sugi
parents:
diff changeset
212 : indexedPropertyType.equals(other.indexedPropertyType))
cb825acd883a first commit
sugi
parents:
diff changeset
213 && (indexedGetter == null ? other.indexedGetter == null
cb825acd883a first commit
sugi
parents:
diff changeset
214 : indexedGetter.equals(other.indexedGetter)) && (indexedSetter == null ? other.indexedSetter == null
cb825acd883a first commit
sugi
parents:
diff changeset
215 : indexedSetter.equals(other.indexedSetter)));
cb825acd883a first commit
sugi
parents:
diff changeset
216 }
cb825acd883a first commit
sugi
parents:
diff changeset
217
cb825acd883a first commit
sugi
parents:
diff changeset
218 /**
cb825acd883a first commit
sugi
parents:
diff changeset
219 * HashCode of the IndexedPropertyDescriptor
cb825acd883a first commit
sugi
parents:
diff changeset
220 */
cb825acd883a first commit
sugi
parents:
diff changeset
221 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
222 public int hashCode() {
cb825acd883a first commit
sugi
parents:
diff changeset
223 return super.hashCode() + BeansUtils.getHashCode(indexedPropertyType)
cb825acd883a first commit
sugi
parents:
diff changeset
224 + BeansUtils.getHashCode(indexedGetter)
cb825acd883a first commit
sugi
parents:
diff changeset
225 + BeansUtils.getHashCode(indexedSetter);
cb825acd883a first commit
sugi
parents:
diff changeset
226 }
cb825acd883a first commit
sugi
parents:
diff changeset
227
cb825acd883a first commit
sugi
parents:
diff changeset
228 /**
cb825acd883a first commit
sugi
parents:
diff changeset
229 * Obtains the Class object of the indexed property type.
cb825acd883a first commit
sugi
parents:
diff changeset
230 *
cb825acd883a first commit
sugi
parents:
diff changeset
231 * @return the Class object of the indexed property type.
cb825acd883a first commit
sugi
parents:
diff changeset
232 */
cb825acd883a first commit
sugi
parents:
diff changeset
233 public Class<?> getIndexedPropertyType() {
cb825acd883a first commit
sugi
parents:
diff changeset
234 return indexedPropertyType;
cb825acd883a first commit
sugi
parents:
diff changeset
235 }
cb825acd883a first commit
sugi
parents:
diff changeset
236
cb825acd883a first commit
sugi
parents:
diff changeset
237 private void setIndexedReadMethod(Class<?> beanClass, String indexedGetterName)
cb825acd883a first commit
sugi
parents:
diff changeset
238 throws IntrospectionException {
cb825acd883a first commit
sugi
parents:
diff changeset
239 Method getter;
cb825acd883a first commit
sugi
parents:
diff changeset
240 try {
cb825acd883a first commit
sugi
parents:
diff changeset
241 getter = beanClass.getMethod(indexedGetterName,
cb825acd883a first commit
sugi
parents:
diff changeset
242 new Class[] { Integer.TYPE });
cb825acd883a first commit
sugi
parents:
diff changeset
243 } catch (NoSuchMethodException exception) {
cb825acd883a first commit
sugi
parents:
diff changeset
244 // custom.beans.58=No such indexed read method
cb825acd883a first commit
sugi
parents:
diff changeset
245 throw new IntrospectionException(Messages.getString("custom.beans.58")); //$NON-NLS-1$
cb825acd883a first commit
sugi
parents:
diff changeset
246 } catch (SecurityException exception) {
cb825acd883a first commit
sugi
parents:
diff changeset
247 // custom.beans.59=Security violation accessing indexed read method
cb825acd883a first commit
sugi
parents:
diff changeset
248 throw new IntrospectionException(Messages.getString("custom.beans.59")); //$NON-NLS-1$
cb825acd883a first commit
sugi
parents:
diff changeset
249 }
cb825acd883a first commit
sugi
parents:
diff changeset
250 internalSetIndexedReadMethod(getter);
cb825acd883a first commit
sugi
parents:
diff changeset
251 }
cb825acd883a first commit
sugi
parents:
diff changeset
252
cb825acd883a first commit
sugi
parents:
diff changeset
253 private void internalSetIndexedReadMethod(Method indexGetter)
cb825acd883a first commit
sugi
parents:
diff changeset
254 throws IntrospectionException {
cb825acd883a first commit
sugi
parents:
diff changeset
255 // Clearing the indexed read method.
cb825acd883a first commit
sugi
parents:
diff changeset
256 if (indexGetter == null) {
cb825acd883a first commit
sugi
parents:
diff changeset
257 if (indexedSetter == null) {
cb825acd883a first commit
sugi
parents:
diff changeset
258 if (getPropertyType() != null) {
cb825acd883a first commit
sugi
parents:
diff changeset
259 // custom.beans.5A=Indexed method is not compatible with non indexed method
cb825acd883a first commit
sugi
parents:
diff changeset
260 throw new IntrospectionException(Messages
cb825acd883a first commit
sugi
parents:
diff changeset
261 .getString("custom.beans.5A")); //$NON-NLS-1$
cb825acd883a first commit
sugi
parents:
diff changeset
262 }
cb825acd883a first commit
sugi
parents:
diff changeset
263 indexedPropertyType = null;
cb825acd883a first commit
sugi
parents:
diff changeset
264 }
cb825acd883a first commit
sugi
parents:
diff changeset
265 this.indexedGetter = null;
cb825acd883a first commit
sugi
parents:
diff changeset
266 return;
cb825acd883a first commit
sugi
parents:
diff changeset
267 }
cb825acd883a first commit
sugi
parents:
diff changeset
268 // Validate the indexed getter.
cb825acd883a first commit
sugi
parents:
diff changeset
269 if ((indexGetter.getParameterTypes().length != 1)
cb825acd883a first commit
sugi
parents:
diff changeset
270 || (indexGetter.getParameterTypes()[0] != Integer.TYPE)) {
cb825acd883a first commit
sugi
parents:
diff changeset
271 // custom.beans.5B=Indexed read method must take a single int argument
cb825acd883a first commit
sugi
parents:
diff changeset
272 throw new IntrospectionException(Messages.getString("custom.beans.5B")); //$NON-NLS-1$
cb825acd883a first commit
sugi
parents:
diff changeset
273 }
cb825acd883a first commit
sugi
parents:
diff changeset
274 Class<?> indexedReadType = indexGetter.getReturnType();
cb825acd883a first commit
sugi
parents:
diff changeset
275 if (indexedReadType == Void.TYPE) {
cb825acd883a first commit
sugi
parents:
diff changeset
276 // custom.beans.5B=Indexed read method must take a single int argument
cb825acd883a first commit
sugi
parents:
diff changeset
277 throw new IntrospectionException(Messages.getString("custom.beans.5B")); //$NON-NLS-1$
cb825acd883a first commit
sugi
parents:
diff changeset
278 } else if (indexedSetter != null
cb825acd883a first commit
sugi
parents:
diff changeset
279 && indexGetter.getReturnType() != indexedSetter
cb825acd883a first commit
sugi
parents:
diff changeset
280 .getParameterTypes()[1]) {
cb825acd883a first commit
sugi
parents:
diff changeset
281 // custom.beans.5A=Indexed read method is not compatible with indexed write method
cb825acd883a first commit
sugi
parents:
diff changeset
282 throw new IntrospectionException(Messages.getString("custom.beans.5A")); //$NON-NLS-1$
cb825acd883a first commit
sugi
parents:
diff changeset
283 }
cb825acd883a first commit
sugi
parents:
diff changeset
284
cb825acd883a first commit
sugi
parents:
diff changeset
285 // Set the indexed property type if not already set, confirm validity if
cb825acd883a first commit
sugi
parents:
diff changeset
286 // it is.
cb825acd883a first commit
sugi
parents:
diff changeset
287 if (this.indexedGetter == null) {
cb825acd883a first commit
sugi
parents:
diff changeset
288 indexedPropertyType = indexedReadType;
cb825acd883a first commit
sugi
parents:
diff changeset
289 } else {
cb825acd883a first commit
sugi
parents:
diff changeset
290 if (indexedPropertyType != indexedReadType) {
cb825acd883a first commit
sugi
parents:
diff changeset
291 // custom.beans.5A=Indexed read method is not compatible with indexed write method
cb825acd883a first commit
sugi
parents:
diff changeset
292 throw new IntrospectionException(Messages.getString("custom.beans.5A")); //$NON-NLS-1$
cb825acd883a first commit
sugi
parents:
diff changeset
293 }
cb825acd883a first commit
sugi
parents:
diff changeset
294 }
cb825acd883a first commit
sugi
parents:
diff changeset
295
cb825acd883a first commit
sugi
parents:
diff changeset
296 // Set the indexed getter
cb825acd883a first commit
sugi
parents:
diff changeset
297 this.indexedGetter = indexGetter;
cb825acd883a first commit
sugi
parents:
diff changeset
298 }
cb825acd883a first commit
sugi
parents:
diff changeset
299
cb825acd883a first commit
sugi
parents:
diff changeset
300 private void setIndexedWriteMethod(Class<?> beanClass, String indexedSetterName)
cb825acd883a first commit
sugi
parents:
diff changeset
301 throws IntrospectionException {
cb825acd883a first commit
sugi
parents:
diff changeset
302 Method setter = null;
cb825acd883a first commit
sugi
parents:
diff changeset
303 try {
cb825acd883a first commit
sugi
parents:
diff changeset
304 setter = beanClass.getMethod(indexedSetterName, new Class[] {
cb825acd883a first commit
sugi
parents:
diff changeset
305 Integer.TYPE, getPropertyType().getComponentType() });
cb825acd883a first commit
sugi
parents:
diff changeset
306 } catch (SecurityException e) {
cb825acd883a first commit
sugi
parents:
diff changeset
307 // custom.beans.5C=Security violation accessing indexed write method
cb825acd883a first commit
sugi
parents:
diff changeset
308 throw new IntrospectionException(Messages.getString("custom.beans.5C")); //$NON-NLS-1$
cb825acd883a first commit
sugi
parents:
diff changeset
309 } catch (NoSuchMethodException e) {
cb825acd883a first commit
sugi
parents:
diff changeset
310 // custom.beans.5D=No such indexed write method
cb825acd883a first commit
sugi
parents:
diff changeset
311 throw new IntrospectionException(Messages.getString("custom.beans.5D")); //$NON-NLS-1$
cb825acd883a first commit
sugi
parents:
diff changeset
312 }
cb825acd883a first commit
sugi
parents:
diff changeset
313 internalSetIndexedWriteMethod(setter, true);
cb825acd883a first commit
sugi
parents:
diff changeset
314 }
cb825acd883a first commit
sugi
parents:
diff changeset
315
cb825acd883a first commit
sugi
parents:
diff changeset
316 private void setIndexedWriteMethod(Class<?> beanClass,
cb825acd883a first commit
sugi
parents:
diff changeset
317 String indexedSetterName, Class<?> argType)
cb825acd883a first commit
sugi
parents:
diff changeset
318 throws IntrospectionException {
cb825acd883a first commit
sugi
parents:
diff changeset
319 try {
cb825acd883a first commit
sugi
parents:
diff changeset
320 Method setter = beanClass.getMethod(indexedSetterName, new Class[] {
cb825acd883a first commit
sugi
parents:
diff changeset
321 Integer.TYPE, argType });
cb825acd883a first commit
sugi
parents:
diff changeset
322 internalSetIndexedWriteMethod(setter, true);
cb825acd883a first commit
sugi
parents:
diff changeset
323 } catch (NoSuchMethodException exception) {
cb825acd883a first commit
sugi
parents:
diff changeset
324 // custom.beans.5D=No such indexed write method
cb825acd883a first commit
sugi
parents:
diff changeset
325 throw new IntrospectionException(Messages.getString("custom.beans.5D")); //$NON-NLS-1$
cb825acd883a first commit
sugi
parents:
diff changeset
326 } catch (SecurityException exception) {
cb825acd883a first commit
sugi
parents:
diff changeset
327 // custom.beans.5C=Security violation accessing indexed write method
cb825acd883a first commit
sugi
parents:
diff changeset
328 throw new IntrospectionException(Messages.getString("custom.beans.5C")); //$NON-NLS-1$
cb825acd883a first commit
sugi
parents:
diff changeset
329 }
cb825acd883a first commit
sugi
parents:
diff changeset
330 }
cb825acd883a first commit
sugi
parents:
diff changeset
331
cb825acd883a first commit
sugi
parents:
diff changeset
332 private void internalSetIndexedWriteMethod(Method indexSetter,
cb825acd883a first commit
sugi
parents:
diff changeset
333 boolean initialize) throws IntrospectionException {
cb825acd883a first commit
sugi
parents:
diff changeset
334 // Clearing the indexed write method.
cb825acd883a first commit
sugi
parents:
diff changeset
335 if (indexSetter == null) {
cb825acd883a first commit
sugi
parents:
diff changeset
336 if (indexedGetter == null) {
cb825acd883a first commit
sugi
parents:
diff changeset
337 if (getPropertyType() != null) {
cb825acd883a first commit
sugi
parents:
diff changeset
338 // custom.beans.5E=Indexed method is not compatible with non indexed method
cb825acd883a first commit
sugi
parents:
diff changeset
339 throw new IntrospectionException(Messages
cb825acd883a first commit
sugi
parents:
diff changeset
340 .getString("custom.beans.5E")); //$NON-NLS-1$
cb825acd883a first commit
sugi
parents:
diff changeset
341 }
cb825acd883a first commit
sugi
parents:
diff changeset
342 indexedPropertyType = null;
cb825acd883a first commit
sugi
parents:
diff changeset
343 }
cb825acd883a first commit
sugi
parents:
diff changeset
344 this.indexedSetter = null;
cb825acd883a first commit
sugi
parents:
diff changeset
345 return;
cb825acd883a first commit
sugi
parents:
diff changeset
346 }
cb825acd883a first commit
sugi
parents:
diff changeset
347
cb825acd883a first commit
sugi
parents:
diff changeset
348 // Validate the indexed write method.
cb825acd883a first commit
sugi
parents:
diff changeset
349 Class<?>[] indexedSetterArgs = indexSetter.getParameterTypes();
cb825acd883a first commit
sugi
parents:
diff changeset
350 if (indexedSetterArgs.length != 2) {
cb825acd883a first commit
sugi
parents:
diff changeset
351 // custom.beans.5F=Indexed write method must take two arguments
cb825acd883a first commit
sugi
parents:
diff changeset
352 throw new IntrospectionException(Messages.getString("custom.beans.5F")); //$NON-NLS-1$
cb825acd883a first commit
sugi
parents:
diff changeset
353 }
cb825acd883a first commit
sugi
parents:
diff changeset
354 if (indexedSetterArgs[0] != Integer.TYPE) {
cb825acd883a first commit
sugi
parents:
diff changeset
355 // custom.beans.60=Indexed write method must take an int as its first argument
cb825acd883a first commit
sugi
parents:
diff changeset
356 throw new IntrospectionException(Messages.getString("custom.beans.60")); //$NON-NLS-1$
cb825acd883a first commit
sugi
parents:
diff changeset
357 }
cb825acd883a first commit
sugi
parents:
diff changeset
358
cb825acd883a first commit
sugi
parents:
diff changeset
359 // Set the indexed property type if not already set, confirm validity if
cb825acd883a first commit
sugi
parents:
diff changeset
360 // it is.
cb825acd883a first commit
sugi
parents:
diff changeset
361 Class<?> indexedWriteType = indexedSetterArgs[1];
cb825acd883a first commit
sugi
parents:
diff changeset
362 if (initialize && indexedGetter == null) {
cb825acd883a first commit
sugi
parents:
diff changeset
363 indexedPropertyType = indexedWriteType;
cb825acd883a first commit
sugi
parents:
diff changeset
364 } else {
cb825acd883a first commit
sugi
parents:
diff changeset
365 if (indexedPropertyType != indexedWriteType) {
cb825acd883a first commit
sugi
parents:
diff changeset
366 // custom.beans.61=Indexed write method is not compatible with indexed read method
cb825acd883a first commit
sugi
parents:
diff changeset
367 throw new IntrospectionException(Messages.getString("custom.beans.61")); //$NON-NLS-1$
cb825acd883a first commit
sugi
parents:
diff changeset
368 }
cb825acd883a first commit
sugi
parents:
diff changeset
369 }
cb825acd883a first commit
sugi
parents:
diff changeset
370
cb825acd883a first commit
sugi
parents:
diff changeset
371 // Set the indexed write method.
cb825acd883a first commit
sugi
parents:
diff changeset
372 this.indexedSetter = indexSetter;
cb825acd883a first commit
sugi
parents:
diff changeset
373 }
cb825acd883a first commit
sugi
parents:
diff changeset
374
cb825acd883a first commit
sugi
parents:
diff changeset
375 private static String initialUpperCase(String string) {
cb825acd883a first commit
sugi
parents:
diff changeset
376 if (Character.isUpperCase(string.charAt(0))) {
cb825acd883a first commit
sugi
parents:
diff changeset
377 return string;
cb825acd883a first commit
sugi
parents:
diff changeset
378 }
cb825acd883a first commit
sugi
parents:
diff changeset
379
cb825acd883a first commit
sugi
parents:
diff changeset
380 String initial = string.substring(0, 1).toUpperCase();
cb825acd883a first commit
sugi
parents:
diff changeset
381 return initial.concat(string.substring(1));
cb825acd883a first commit
sugi
parents:
diff changeset
382 }
cb825acd883a first commit
sugi
parents:
diff changeset
383 }