001: /*
002: * Copyright 2003 The Apache Software Foundation
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016: package net.sf.cglib.beans;
017:
018: import java.lang.reflect.Method;
019: import junit.framework.*;
020:
021: /**
022: *
023: * @author baliuka
024: */
025: public class TestBulkBean extends TestCase {
026: private String getters[] = { "getIntP", "getLongP", "getByteP",
027: "getShortP", "getFloatP", "isBooleanP", "getCharP",
028: "getDoubleP", "getStringP", "getId", "getName",
029: "getPrivateName" };
030:
031: private String setters[] = { "setIntP", "setLongP", "setByteP",
032: "setShortP", "setFloatP", "setBooleanP", "setCharP",
033: "setDoubleP", "setStringP", "setId", "setName",
034: "setPrivateName" };
035:
036: private Class types[] = { int.class, long.class, byte.class,
037: short.class, float.class, boolean.class, char.class,
038: double.class, String.class, Long.class, String.class,
039: String.class };
040:
041: private Object values[] = { new Integer(2), new Long(4),
042: new Byte((byte) 8), new Short((short) 4), new Float(1.2),
043: Boolean.TRUE, new Character('S'), new Double(5.6), "test",
044: new Long(88), "test2", "private" };
045:
046: public TestBulkBean(java.lang.String testName) {
047: super (testName);
048: }
049:
050: public static void main(java.lang.String[] args) {
051: junit.textui.TestRunner.run(suite());
052: }
053:
054: public static Test suite() {
055: return new TestSuite(TestBulkBean.class);
056: }
057:
058: /** Test of create method, of class net.sf.cglib.BulkBean. */
059: public void testGetInstance() throws Throwable {
060: BulkBean mClass = BulkBean.create(MA.class, getters, setters,
061: types);
062:
063: MA bean = new MA();
064:
065: mClass.setPropertyValues(bean, values);
066: Object values1[] = mClass.getPropertyValues(bean);
067:
068: for (int i = 0; i < types.length; i++) {
069: assertEquals(" property " + getters[i] + "/" + setters[i],
070: values[i], values1[i]);
071: }
072: }
073:
074: public void testEmpty() throws Throwable {
075: BulkBean.create(MA.class, new String[0], new String[0],
076: new Class[0]);
077: }
078:
079: public void testBadTypes() throws Throwable {
080: Class[] types2 = (Class[]) types.clone();
081: types2[2] = String.class;
082: try {
083: BulkBean.create(MA.class, getters, setters, types2);
084: fail("expected exception");
085: } catch (BulkBeanException e) {
086: assertTrue(e.getIndex() == 2);
087: }
088: }
089:
090: public void testMismatchedLengths() throws Throwable {
091: try {
092: BulkBean.create(MA.class, getters, setters, new Class[0]);
093: fail("expected exception");
094: } catch (BulkBeanException e) {
095: assertTrue(e.getIndex() == -1);
096: }
097: }
098:
099: public void testMissingProperty() throws Throwable {
100: String[] getters2 = (String[]) getters.clone();
101: getters2[3] = "getChris";
102: try {
103: BulkBean.create(MA.class, getters2, setters, types);
104: fail("expected exception");
105: } catch (BulkBeanException e) {
106: assertTrue(e.getIndex() == 3);
107: }
108: }
109:
110: public void testSetWrongType() throws Throwable {
111: BulkBean mClass = BulkBean.create(MA.class, getters, setters,
112: types);
113: MA bean = new MA();
114: Object[] values2 = (Object[]) values.clone();
115: values2[4] = new Object();
116: try {
117: mClass.setPropertyValues(bean, values2);
118: fail("expected exception");
119: } catch (BulkBeanException e) {
120: assertTrue(e.getIndex() == 4);
121: }
122: }
123:
124: public void testBulkBeanPerformance() throws Throwable {
125:
126: int iterations = 100000;
127:
128: System.out.println();
129: System.out.println("iteration count: " + iterations);
130: System.out.println();
131:
132: BulkBean mClass = new BulkBeanReflectImpl(MA.class, getters,
133: setters, types);
134:
135: System.out.println(mClass.getClass().getName() + ": ");
136: int b = performanceTest(mClass, iterations);
137: System.out.println(b + " ms. " + (b / (float) iterations)
138: + " per iteration");
139: System.out.println();
140:
141: mClass = BulkBean.create(MA.class, getters, setters, types);
142:
143: System.out.println(mClass.getClass().getName() + ": ");
144: int a = performanceTest(mClass, iterations);
145: System.out.println(a + " ms. " + (a / (float) iterations)
146: + " per iteration");
147:
148: System.out.println("factor: " + b / (float) a);
149:
150: mClass = new BulkBeanPlainImpl();
151:
152: System.out.println(mClass.getClass().getName() + ": ");
153: a = performanceTest(mClass, iterations);
154: System.out.println(a + " ms. " + (a / (float) iterations)
155: + " per iteration");
156:
157: }
158:
159: public int performanceTest(BulkBean mc, int iterations)
160: throws Throwable {
161:
162: long start = System.currentTimeMillis();
163: for (int i = 0; i < iterations; i++) {
164: MA bean = new MA(); // (MA)mc.newInstance();
165: mc.setPropertyValues(bean, values);
166: mc.getPropertyValues(bean, values);
167: }
168:
169: return (int) (System.currentTimeMillis() - start);
170: }
171:
172: private static class BulkBeanPlainImpl extends BulkBean {
173:
174: public void getPropertyValues(Object bean, Object[] values) {
175:
176: int i = 0;
177: MA ma = (MA) bean;
178:
179: values[i++] = new Integer(ma.getIntP());
180: values[i++] = new Long(ma.getLongP());
181: values[i++] = new Byte(ma.getByteP());
182: values[i++] = new Short(ma.getShortP());
183: values[i++] = new Float(ma.getFloatP());
184: values[i++] = new Boolean(ma.isBooleanP());
185: values[i++] = new Character(ma.getCharP());
186: values[i++] = new Double(ma.getDoubleP());
187: values[i++] = ma.getStringP();
188: values[i++] = ma.getId();
189: values[i++] = ma.getName();
190: values[i++] = ma.getPrivateName();
191:
192: }
193:
194: public void setPropertyValues(Object bean, Object[] values) {
195:
196: int i = 0;
197: MA ma = (MA) bean;
198:
199: ma.setIntP(((Number) values[i++]).intValue());
200: ma.setLongP(((Number) values[i++]).longValue());
201: ma.setByteP(((Number) values[i++]).byteValue());
202: ma.setShortP(((Number) values[i++]).shortValue());
203: ma.setFloatP(((Number) values[i++]).floatValue());
204: ma.setBooleanP(((Boolean) values[i++]).booleanValue());
205: ma.setCharP(((Character) values[i++]).charValue());
206: ma.setDoubleP(((Number) values[i++]).doubleValue());
207: ma.setStringP((String) values[i++]);
208: ma.setId((Long) values[i++]);
209: ma.setName((String) values[i++]);
210: ma.setPrivateName((String) values[i++]);
211:
212: }
213:
214: }
215:
216: /** Generated implementation of abstract class net.sf.cglib.BulkBean. Please fill dummy bodies of generated methods. */
217: private static class BulkBeanReflectImpl extends BulkBean {
218:
219: private Method gets[];
220: private Method sets[];
221: private int size;
222:
223: public BulkBeanReflectImpl(Class target, String[] getters,
224: String[] setters, Class[] types) {
225: this .target = target;
226: this .types = types;
227: this .getters = getters;
228: this .setters = setters;
229:
230: size = this .types.length;
231: gets = new Method[size];
232: sets = new Method[size];
233:
234: try {
235:
236: for (int i = 0; i < size; i++) {
237:
238: if (getters[i] != null) {
239: gets[i] = target.getDeclaredMethod(getters[i],
240: new Class[] {});
241: gets[i].setAccessible(true);
242: }
243: if (setters[i] != null) {
244: sets[i] = target.getDeclaredMethod(setters[i],
245: new Class[] { types[i] });
246: sets[i].setAccessible(true);
247: }
248:
249: }
250: } catch (Exception e) {
251: throw new Error(e.getClass().getName() + ":"
252: + e.getMessage());
253: }
254: }
255:
256: public void getPropertyValues(Object bean, Object[] values) {
257:
258: try {
259: for (int i = 0; i < size; i++) {
260: if (this .gets[i] != null) {
261: values[i] = gets[i].invoke(bean,
262: (Object[]) null);
263: }
264: }
265: } catch (Exception e) {
266: throw new Error(e.getMessage());
267: }
268: }
269:
270: public void setPropertyValues(Object bean, Object[] values) {
271: try {
272:
273: for (int i = 0; i < size; i++) {
274: if (this .sets[i] != null) {
275: sets[i]
276: .invoke(bean,
277: new Object[] { values[i] });
278: }
279: }
280:
281: } catch (Exception e) {
282: e.printStackTrace();
283: throw new Error(e.getMessage());
284: }
285: }
286:
287: }
288:
289: // Add test methods here, they have to start with 'test' name.
290: // for example:
291: // public void testHello() {}
292:
293: }
|