PageRenderTime 57ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 1ms

/projects/springframework-3.0.5/projects/org.springframework.beans/src/test/java/org/springframework/beans/BeanWrapperTests.java

https://gitlab.com/essere.lab.public/qualitas.class-corpus
Java | 1332 lines | 1167 code | 124 blank | 41 comment | 118 complexity | 2921db539dca4057e27c1a4ee62d66ef MD5 | raw file
  1. /*
  2. * Copyright 2002-2010 the original author or authors.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package org.springframework.beans;
  17. import java.beans.PropertyEditorSupport;
  18. import java.math.BigDecimal;
  19. import java.math.BigInteger;
  20. import java.util.ArrayList;
  21. import java.util.Arrays;
  22. import java.util.Collection;
  23. import java.util.Collections;
  24. import java.util.HashMap;
  25. import java.util.HashSet;
  26. import java.util.LinkedList;
  27. import java.util.List;
  28. import java.util.Map;
  29. import java.util.Properties;
  30. import java.util.Set;
  31. import java.util.SortedMap;
  32. import java.util.SortedSet;
  33. import java.util.TreeMap;
  34. import java.util.TreeSet;
  35. import org.apache.commons.logging.LogFactory;
  36. import static org.junit.Assert.*;
  37. import org.junit.Test;
  38. import test.beans.BooleanTestBean;
  39. import test.beans.ITestBean;
  40. import test.beans.IndexedTestBean;
  41. import test.beans.NumberTestBean;
  42. import test.beans.TestBean;
  43. import org.springframework.beans.factory.annotation.Autowire;
  44. import org.springframework.beans.propertyeditors.CustomNumberEditor;
  45. import org.springframework.beans.propertyeditors.StringArrayPropertyEditor;
  46. import org.springframework.beans.propertyeditors.StringTrimmerEditor;
  47. import org.springframework.beans.support.DerivedFromProtectedBaseBean;
  48. import org.springframework.util.StopWatch;
  49. import org.springframework.util.StringUtils;
  50. /**
  51. * @author Rod Johnson
  52. * @author Juergen Hoeller
  53. * @author Alef Arendsen
  54. * @author Arjen Poutsma
  55. * @author Chris Beams
  56. */
  57. public final class BeanWrapperTests {
  58. @Test
  59. public void testIsReadablePropertyNotReadable() {
  60. NoRead nr = new NoRead();
  61. BeanWrapper bw = new BeanWrapperImpl(nr);
  62. assertFalse(bw.isReadableProperty("age"));
  63. }
  64. /**
  65. * Shouldn't throw an exception: should just return false
  66. */
  67. @Test
  68. public void testIsReadablePropertyNoSuchProperty() {
  69. NoRead nr = new NoRead();
  70. BeanWrapper bw = new BeanWrapperImpl(nr);
  71. assertFalse(bw.isReadableProperty("xxxxx"));
  72. }
  73. @Test
  74. public void testIsReadablePropertyNull() {
  75. NoRead nr = new NoRead();
  76. BeanWrapper bw = new BeanWrapperImpl(nr);
  77. try {
  78. bw.isReadableProperty(null);
  79. fail("Can't inquire into readability of null property");
  80. }
  81. catch (IllegalArgumentException ex) {
  82. // expected
  83. }
  84. }
  85. @Test
  86. public void testIsWritablePropertyNull() {
  87. NoRead nr = new NoRead();
  88. BeanWrapper bw = new BeanWrapperImpl(nr);
  89. try {
  90. bw.isWritableProperty(null);
  91. fail("Can't inquire into writability of null property");
  92. }
  93. catch (IllegalArgumentException ex) {
  94. // expected
  95. }
  96. }
  97. @Test
  98. public void testReadableAndWritableForIndexedProperties() {
  99. BeanWrapper bw = new BeanWrapperImpl(IndexedTestBean.class);
  100. assertTrue(bw.isReadableProperty("array"));
  101. assertTrue(bw.isReadableProperty("list"));
  102. assertTrue(bw.isReadableProperty("set"));
  103. assertTrue(bw.isReadableProperty("map"));
  104. assertFalse(bw.isReadableProperty("xxx"));
  105. assertTrue(bw.isWritableProperty("array"));
  106. assertTrue(bw.isWritableProperty("list"));
  107. assertTrue(bw.isWritableProperty("set"));
  108. assertTrue(bw.isWritableProperty("map"));
  109. assertFalse(bw.isWritableProperty("xxx"));
  110. assertTrue(bw.isReadableProperty("array[0]"));
  111. assertTrue(bw.isReadableProperty("array[0].name"));
  112. assertTrue(bw.isReadableProperty("list[0]"));
  113. assertTrue(bw.isReadableProperty("list[0].name"));
  114. assertTrue(bw.isReadableProperty("set[0]"));
  115. assertTrue(bw.isReadableProperty("set[0].name"));
  116. assertTrue(bw.isReadableProperty("map[key1]"));
  117. assertTrue(bw.isReadableProperty("map[key1].name"));
  118. assertTrue(bw.isReadableProperty("map[key4][0]"));
  119. assertTrue(bw.isReadableProperty("map[key4][0].name"));
  120. assertTrue(bw.isReadableProperty("map[key4][1]"));
  121. assertTrue(bw.isReadableProperty("map[key4][1].name"));
  122. assertFalse(bw.isReadableProperty("array[key1]"));
  123. assertTrue(bw.isWritableProperty("array[0]"));
  124. assertTrue(bw.isWritableProperty("array[0].name"));
  125. assertTrue(bw.isWritableProperty("list[0]"));
  126. assertTrue(bw.isWritableProperty("list[0].name"));
  127. assertTrue(bw.isWritableProperty("set[0]"));
  128. assertTrue(bw.isWritableProperty("set[0].name"));
  129. assertTrue(bw.isWritableProperty("map[key1]"));
  130. assertTrue(bw.isWritableProperty("map[key1].name"));
  131. assertTrue(bw.isWritableProperty("map[key4][0]"));
  132. assertTrue(bw.isWritableProperty("map[key4][0].name"));
  133. assertTrue(bw.isWritableProperty("map[key4][1]"));
  134. assertTrue(bw.isWritableProperty("map[key4][1].name"));
  135. assertFalse(bw.isWritableProperty("array[key1]"));
  136. }
  137. @Test
  138. public void testTypeDeterminationForIndexedProperty() {
  139. BeanWrapper bw = new BeanWrapperImpl(IndexedTestBean.class);
  140. assertEquals(null, bw.getPropertyType("map[key0]"));
  141. bw = new BeanWrapperImpl(IndexedTestBean.class);
  142. bw.setPropertyValue("map[key0]", "my String");
  143. assertEquals(String.class, bw.getPropertyType("map[key0]"));
  144. bw = new BeanWrapperImpl(IndexedTestBean.class);
  145. bw.registerCustomEditor(String.class, "map[key0]", new StringTrimmerEditor(false));
  146. assertEquals(String.class, bw.getPropertyType("map[key0]"));
  147. }
  148. @Test
  149. public void testGetterThrowsException() {
  150. GetterBean gb = new GetterBean();
  151. BeanWrapper bw = new BeanWrapperImpl(gb);
  152. bw.setPropertyValue("name", "tom");
  153. assertTrue("Set name to tom", gb.getName().equals("tom"));
  154. }
  155. @Test
  156. public void testEmptyPropertyValuesSet() {
  157. TestBean t = new TestBean();
  158. int age = 50;
  159. String name = "Tony";
  160. t.setAge(age);
  161. t.setName(name);
  162. try {
  163. BeanWrapper bw = new BeanWrapperImpl(t);
  164. assertTrue("age is OK", t.getAge() == age);
  165. assertTrue("name is OK", name.equals(t.getName()));
  166. bw.setPropertyValues(new MutablePropertyValues());
  167. // Check its unchanged
  168. assertTrue("age is OK", t.getAge() == age);
  169. assertTrue("name is OK", name.equals(t.getName()));
  170. }
  171. catch (BeansException ex) {
  172. fail("Shouldn't throw exception when everything is valid");
  173. }
  174. }
  175. @Test
  176. public void testAllValid() {
  177. TestBean t = new TestBean();
  178. String newName = "tony";
  179. int newAge = 65;
  180. String newTouchy = "valid";
  181. try {
  182. BeanWrapper bw = new BeanWrapperImpl(t);
  183. MutablePropertyValues pvs = new MutablePropertyValues();
  184. pvs.addPropertyValue(new PropertyValue("age", new Integer(newAge)));
  185. pvs.addPropertyValue(new PropertyValue("name", newName));
  186. pvs.addPropertyValue(new PropertyValue("touchy", newTouchy));
  187. bw.setPropertyValues(pvs);
  188. assertTrue("Validly set property must stick", t.getName().equals(newName));
  189. assertTrue("Validly set property must stick", t.getTouchy().equals(newTouchy));
  190. assertTrue("Validly set property must stick", t.getAge() == newAge);
  191. }
  192. catch (BeansException ex) {
  193. fail("Shouldn't throw exception when everything is valid");
  194. }
  195. }
  196. @Test
  197. public void testBeanWrapperUpdates() {
  198. TestBean t = new TestBean();
  199. int newAge = 33;
  200. try {
  201. BeanWrapper bw = new BeanWrapperImpl(t);
  202. t.setAge(newAge);
  203. Object bwAge = bw.getPropertyValue("age");
  204. assertTrue("Age is an integer", bwAge instanceof Integer);
  205. int bwi = ((Integer) bwAge).intValue();
  206. assertTrue("Bean wrapper must pick up changes", bwi == newAge);
  207. }
  208. catch (Exception ex) {
  209. fail("Shouldn't throw exception when everything is valid");
  210. }
  211. }
  212. @Test
  213. public void testValidNullUpdate() {
  214. TestBean t = new TestBean();
  215. t.setName("Frank"); // we need to change it back
  216. t.setSpouse(t);
  217. BeanWrapper bw = new BeanWrapperImpl(t);
  218. assertTrue("name is not null to start off", t.getName() != null);
  219. bw.setPropertyValue("name", null);
  220. assertTrue("name is now null", t.getName() == null);
  221. // now test with non-string
  222. assertTrue("spouse is not null to start off", t.getSpouse() != null);
  223. bw.setPropertyValue("spouse", null);
  224. assertTrue("spouse is now null", t.getSpouse() == null);
  225. }
  226. @Test
  227. public void testIgnoringIndexedProperty() {
  228. MutablePropertyValues values = new MutablePropertyValues();
  229. values.add("toBeIgnored[0]", new Integer(42));
  230. BeanWrapper bw = new BeanWrapperImpl(new Object());
  231. bw.setPropertyValues(values, true);
  232. }
  233. @Test
  234. public void testConvertPrimitiveToString() {
  235. MutablePropertyValues values = new MutablePropertyValues();
  236. values.add("name", new Integer(42));
  237. TestBean tb = new TestBean();
  238. BeanWrapper bw = new BeanWrapperImpl(tb);
  239. bw.setPropertyValues(values);
  240. assertEquals("42", tb.getName());
  241. }
  242. @Test
  243. public void testConvertClassToString() {
  244. MutablePropertyValues values = new MutablePropertyValues();
  245. values.add("name", Integer.class);
  246. TestBean tb = new TestBean();
  247. BeanWrapper bw = new BeanWrapperImpl(tb);
  248. bw.registerCustomEditor(String.class, new PropertyEditorSupport() {
  249. public void setValue(Object value) {
  250. super.setValue(value.toString());
  251. }
  252. });
  253. bw.setPropertyValues(values);
  254. assertEquals(Integer.class.toString(), tb.getName());
  255. }
  256. @Test
  257. public void testBooleanObject() {
  258. BooleanTestBean tb = new BooleanTestBean();
  259. BeanWrapper bw = new BeanWrapperImpl(tb);
  260. bw.setPropertyValue("bool2", "true");
  261. assertTrue("Correct bool2 value", Boolean.TRUE.equals(bw.getPropertyValue("bool2")));
  262. assertTrue("Correct bool2 value", tb.getBool2().booleanValue());
  263. bw.setPropertyValue("bool2", "false");
  264. assertTrue("Correct bool2 value", Boolean.FALSE.equals(bw.getPropertyValue("bool2")));
  265. assertTrue("Correct bool2 value", !tb.getBool2().booleanValue());
  266. }
  267. @Test
  268. public void testNumberObjects() {
  269. NumberTestBean tb = new NumberTestBean();
  270. BeanWrapper bw = new BeanWrapperImpl(tb);
  271. try {
  272. bw.setPropertyValue("short2", "2");
  273. bw.setPropertyValue("int2", "8");
  274. bw.setPropertyValue("long2", "6");
  275. bw.setPropertyValue("bigInteger", "3");
  276. bw.setPropertyValue("float2", "8.1");
  277. bw.setPropertyValue("double2", "6.1");
  278. bw.setPropertyValue("bigDecimal", "4.0");
  279. }
  280. catch (BeansException ex) {
  281. fail("Should not throw BeansException: " + ex.getMessage());
  282. }
  283. assertTrue("Correct short2 value", new Short("2").equals(bw.getPropertyValue("short2")));
  284. assertTrue("Correct short2 value", new Short("2").equals(tb.getShort2()));
  285. assertTrue("Correct int2 value", new Integer("8").equals(bw.getPropertyValue("int2")));
  286. assertTrue("Correct int2 value", new Integer("8").equals(tb.getInt2()));
  287. assertTrue("Correct long2 value", new Long("6").equals(bw.getPropertyValue("long2")));
  288. assertTrue("Correct long2 value", new Long("6").equals(tb.getLong2()));
  289. assertTrue("Correct bigInteger value", new BigInteger("3").equals(bw.getPropertyValue("bigInteger")));
  290. assertTrue("Correct bigInteger value", new BigInteger("3").equals(tb.getBigInteger()));
  291. assertTrue("Correct float2 value", new Float("8.1").equals(bw.getPropertyValue("float2")));
  292. assertTrue("Correct float2 value", new Float("8.1").equals(tb.getFloat2()));
  293. assertTrue("Correct double2 value", new Double("6.1").equals(bw.getPropertyValue("double2")));
  294. assertTrue("Correct double2 value", new Double("6.1").equals(tb.getDouble2()));
  295. assertTrue("Correct bigDecimal value", new BigDecimal("4.0").equals(bw.getPropertyValue("bigDecimal")));
  296. assertTrue("Correct bigDecimal value", new BigDecimal("4.0").equals(tb.getBigDecimal()));
  297. }
  298. @Test
  299. public void testNumberCoercion() {
  300. NumberTestBean tb = new NumberTestBean();
  301. BeanWrapper bw = new BeanWrapperImpl(tb);
  302. try {
  303. bw.setPropertyValue("short2", new Integer(2));
  304. bw.setPropertyValue("int2", new Long(8));
  305. bw.setPropertyValue("long2", new BigInteger("6"));
  306. bw.setPropertyValue("bigInteger", new Integer(3));
  307. bw.setPropertyValue("float2", new Double(8.1));
  308. bw.setPropertyValue("double2", new BigDecimal(6.1));
  309. bw.setPropertyValue("bigDecimal", new Float(4.0));
  310. }
  311. catch (BeansException ex) {
  312. fail("Should not throw BeansException: " + ex.getMessage());
  313. }
  314. assertTrue("Correct short2 value", new Short("2").equals(bw.getPropertyValue("short2")));
  315. assertTrue("Correct short2 value", new Short("2").equals(tb.getShort2()));
  316. assertTrue("Correct int2 value", new Integer("8").equals(bw.getPropertyValue("int2")));
  317. assertTrue("Correct int2 value", new Integer("8").equals(tb.getInt2()));
  318. assertTrue("Correct long2 value", new Long("6").equals(bw.getPropertyValue("long2")));
  319. assertTrue("Correct long2 value", new Long("6").equals(tb.getLong2()));
  320. assertTrue("Correct bigInteger value", new BigInteger("3").equals(bw.getPropertyValue("bigInteger")));
  321. assertTrue("Correct bigInteger value", new BigInteger("3").equals(tb.getBigInteger()));
  322. assertTrue("Correct float2 value", new Float("8.1").equals(bw.getPropertyValue("float2")));
  323. assertTrue("Correct float2 value", new Float("8.1").equals(tb.getFloat2()));
  324. assertTrue("Correct double2 value", new Double("6.1").equals(bw.getPropertyValue("double2")));
  325. assertTrue("Correct double2 value", new Double("6.1").equals(tb.getDouble2()));
  326. assertTrue("Correct bigDecimal value", new BigDecimal("4.0").equals(bw.getPropertyValue("bigDecimal")));
  327. assertTrue("Correct bigDecimal value", new BigDecimal("4.0").equals(tb.getBigDecimal()));
  328. }
  329. @Test
  330. public void testEnumByFieldName() {
  331. EnumTester et = new EnumTester();
  332. BeanWrapper bw = new BeanWrapperImpl(et);
  333. bw.setPropertyValue("autowire", "BY_NAME");
  334. assertEquals(Autowire.BY_NAME, et.getAutowire());
  335. bw.setPropertyValue("autowire", " BY_TYPE ");
  336. assertEquals(Autowire.BY_TYPE, et.getAutowire());
  337. try {
  338. bw.setPropertyValue("autowire", "NHERITED");
  339. fail("Should have thrown TypeMismatchException");
  340. }
  341. catch (TypeMismatchException ex) {
  342. // expected
  343. }
  344. }
  345. @Test
  346. public void testPropertiesProperty() throws Exception {
  347. PropsTester pt = new PropsTester();
  348. BeanWrapper bw = new BeanWrapperImpl(pt);
  349. bw.setPropertyValue("name", "ptest");
  350. // Note format...
  351. String ps = "peace=war\nfreedom=slavery";
  352. bw.setPropertyValue("properties", ps);
  353. assertTrue("name was set", pt.name.equals("ptest"));
  354. assertTrue("props non null", pt.props != null);
  355. String freedomVal = pt.props.getProperty("freedom");
  356. String peaceVal = pt.props.getProperty("peace");
  357. assertTrue("peace==war", peaceVal.equals("war"));
  358. assertTrue("Freedom==slavery", freedomVal.equals("slavery"));
  359. }
  360. @Test
  361. public void testStringArrayProperty() throws Exception {
  362. PropsTester pt = new PropsTester();
  363. BeanWrapper bw = new BeanWrapperImpl(pt);
  364. bw.setPropertyValue("stringArray", new String[] {"foo", "fi", "fi", "fum"});
  365. assertTrue("stringArray length = 4", pt.stringArray.length == 4);
  366. assertTrue("correct values", pt.stringArray[0].equals("foo") && pt.stringArray[1].equals("fi") &&
  367. pt.stringArray[2].equals("fi") && pt.stringArray[3].equals("fum"));
  368. List<String> list = new ArrayList<String>();
  369. list.add("foo");
  370. list.add("fi");
  371. list.add("fi");
  372. list.add("fum");
  373. bw.setPropertyValue("stringArray", list);
  374. assertTrue("stringArray length = 4", pt.stringArray.length == 4);
  375. assertTrue("correct values", pt.stringArray[0].equals("foo") && pt.stringArray[1].equals("fi") &&
  376. pt.stringArray[2].equals("fi") && pt.stringArray[3].equals("fum"));
  377. Set<String> set = new HashSet<String>();
  378. set.add("foo");
  379. set.add("fi");
  380. set.add("fum");
  381. bw.setPropertyValue("stringArray", set);
  382. assertTrue("stringArray length = 3", pt.stringArray.length == 3);
  383. List<String> result = Arrays.asList(pt.stringArray);
  384. assertTrue("correct values", result.contains("foo") && result.contains("fi") && result.contains("fum"));
  385. bw.setPropertyValue("stringArray", "one");
  386. assertTrue("stringArray length = 1", pt.stringArray.length == 1);
  387. assertTrue("stringArray elt is ok", pt.stringArray[0].equals("one"));
  388. bw.setPropertyValue("stringArray", null);
  389. assertTrue("stringArray is null", pt.stringArray == null);
  390. }
  391. @Test
  392. public void testStringArrayPropertyWithCustomStringEditor() throws Exception {
  393. PropsTester pt = new PropsTester();
  394. BeanWrapper bw = new BeanWrapperImpl(pt);
  395. bw.registerCustomEditor(String.class, "stringArray", new PropertyEditorSupport() {
  396. public void setAsText(String text) {
  397. setValue(text.substring(1));
  398. }
  399. });
  400. bw.setPropertyValue("stringArray", new String[] {"4foo", "7fi", "6fi", "5fum"});
  401. assertTrue("stringArray length = 4", pt.stringArray.length == 4);
  402. assertTrue("correct values", pt.stringArray[0].equals("foo") && pt.stringArray[1].equals("fi") &&
  403. pt.stringArray[2].equals("fi") && pt.stringArray[3].equals("fum"));
  404. List<String> list = new ArrayList<String>();
  405. list.add("4foo");
  406. list.add("7fi");
  407. list.add("6fi");
  408. list.add("5fum");
  409. bw.setPropertyValue("stringArray", list);
  410. assertTrue("stringArray length = 4", pt.stringArray.length == 4);
  411. assertTrue("correct values", pt.stringArray[0].equals("foo") && pt.stringArray[1].equals("fi") &&
  412. pt.stringArray[2].equals("fi") && pt.stringArray[3].equals("fum"));
  413. Set<String> set = new HashSet<String>();
  414. set.add("4foo");
  415. set.add("7fi");
  416. set.add("6fum");
  417. bw.setPropertyValue("stringArray", set);
  418. assertTrue("stringArray length = 3", pt.stringArray.length == 3);
  419. List<String> result = Arrays.asList(pt.stringArray);
  420. assertTrue("correct values", result.contains("foo") && result.contains("fi") && result.contains("fum"));
  421. bw.setPropertyValue("stringArray", "8one");
  422. assertTrue("stringArray length = 1", pt.stringArray.length == 1);
  423. assertTrue("correct values", pt.stringArray[0].equals("one"));
  424. }
  425. @Test
  426. public void testStringArrayPropertyWithStringSplitting() throws Exception {
  427. PropsTester pt = new PropsTester();
  428. BeanWrapperImpl bw = new BeanWrapperImpl(pt);
  429. bw.useConfigValueEditors();
  430. bw.setPropertyValue("stringArray", "a1,b2");
  431. assertTrue("stringArray length = 2", pt.stringArray.length == 2);
  432. assertTrue("correct values", pt.stringArray[0].equals("a1") && pt.stringArray[1].equals("b2"));
  433. }
  434. @Test
  435. public void testStringArrayPropertyWithCustomStringDelimiter() throws Exception {
  436. PropsTester pt = new PropsTester();
  437. BeanWrapper bw = new BeanWrapperImpl(pt);
  438. bw.registerCustomEditor(String[].class, "stringArray", new StringArrayPropertyEditor("-"));
  439. bw.setPropertyValue("stringArray", "a1-b2");
  440. assertTrue("stringArray length = 2", pt.stringArray.length == 2);
  441. assertTrue("correct values", pt.stringArray[0].equals("a1") && pt.stringArray[1].equals("b2"));
  442. }
  443. @Test
  444. public void testStringPropertyWithCustomEditor() throws Exception {
  445. TestBean tb = new TestBean();
  446. BeanWrapper bw = new BeanWrapperImpl(tb);
  447. bw.registerCustomEditor(String.class, "name", new PropertyEditorSupport() {
  448. public void setValue(Object value) {
  449. if (value instanceof String[]) {
  450. setValue(StringUtils.arrayToDelimitedString(((String[]) value), "-"));
  451. }
  452. else {
  453. super.setValue(value != null ? value : "");
  454. }
  455. }
  456. });
  457. bw.setPropertyValue("name", new String[] {});
  458. assertEquals("", tb.getName());
  459. bw.setPropertyValue("name", new String[] {"a1", "b2"});
  460. assertEquals("a1-b2", tb.getName());
  461. bw.setPropertyValue("name", null);
  462. assertEquals("", tb.getName());
  463. }
  464. @Test
  465. public void testIntArrayProperty() {
  466. PropsTester pt = new PropsTester();
  467. BeanWrapper bw = new BeanWrapperImpl(pt);
  468. bw.setPropertyValue("intArray", new int[] {4, 5, 2, 3});
  469. assertTrue("intArray length = 4", pt.intArray.length == 4);
  470. assertTrue("correct values", pt.intArray[0] == 4 && pt.intArray[1] == 5 &&
  471. pt.intArray[2] == 2 && pt.intArray[3] == 3);
  472. bw.setPropertyValue("intArray", new String[] {"4", "5", "2", "3"});
  473. assertTrue("intArray length = 4", pt.intArray.length == 4);
  474. assertTrue("correct values", pt.intArray[0] == 4 && pt.intArray[1] == 5 &&
  475. pt.intArray[2] == 2 && pt.intArray[3] == 3);
  476. List<Object> list = new ArrayList<Object>();
  477. list.add(new Integer(4));
  478. list.add("5");
  479. list.add(new Integer(2));
  480. list.add("3");
  481. bw.setPropertyValue("intArray", list);
  482. assertTrue("intArray length = 4", pt.intArray.length == 4);
  483. assertTrue("correct values", pt.intArray[0] == 4 && pt.intArray[1] == 5 &&
  484. pt.intArray[2] == 2 && pt.intArray[3] == 3);
  485. Set<Object> set = new HashSet<Object>();
  486. set.add("4");
  487. set.add(new Integer(5));
  488. set.add("3");
  489. bw.setPropertyValue("intArray", set);
  490. assertTrue("intArray length = 3", pt.intArray.length == 3);
  491. List<Integer> result = new ArrayList<Integer>();
  492. result.add(new Integer(pt.intArray[0]));
  493. result.add(new Integer(pt.intArray[1]));
  494. result.add(new Integer(pt.intArray[2]));
  495. assertTrue("correct values", result.contains(new Integer(4)) && result.contains(new Integer(5)) &&
  496. result.contains(new Integer(3)));
  497. bw.setPropertyValue("intArray", new Integer[] {new Integer(1)});
  498. assertTrue("intArray length = 4", pt.intArray.length == 1);
  499. assertTrue("correct values", pt.intArray[0] == 1);
  500. bw.setPropertyValue("intArray", new Integer(1));
  501. assertTrue("intArray length = 4", pt.intArray.length == 1);
  502. assertTrue("correct values", pt.intArray[0] == 1);
  503. bw.setPropertyValue("intArray", new String[] {"1"});
  504. assertTrue("intArray length = 4", pt.intArray.length == 1);
  505. assertTrue("correct values", pt.intArray[0] == 1);
  506. bw.setPropertyValue("intArray", "1");
  507. assertTrue("intArray length = 4", pt.intArray.length == 1);
  508. assertTrue("correct values", pt.intArray[0] == 1);
  509. }
  510. @Test
  511. public void testIntArrayPropertyWithCustomEditor() {
  512. PropsTester pt = new PropsTester();
  513. BeanWrapper bw = new BeanWrapperImpl(pt);
  514. bw.registerCustomEditor(int.class, new PropertyEditorSupport() {
  515. public void setAsText(String text) {
  516. setValue(new Integer(Integer.parseInt(text) + 1));
  517. }
  518. });
  519. bw.setPropertyValue("intArray", new int[] {4, 5, 2, 3});
  520. assertTrue("intArray length = 4", pt.intArray.length == 4);
  521. assertTrue("correct values", pt.intArray[0] == 4 && pt.intArray[1] == 5 &&
  522. pt.intArray[2] == 2 && pt.intArray[3] == 3);
  523. bw.setPropertyValue("intArray", new String[] {"3", "4", "1", "2"});
  524. assertTrue("intArray length = 4", pt.intArray.length == 4);
  525. assertTrue("correct values", pt.intArray[0] == 4 && pt.intArray[1] == 5 &&
  526. pt.intArray[2] == 2 && pt.intArray[3] == 3);
  527. bw.setPropertyValue("intArray", new Integer(1));
  528. assertTrue("intArray length = 4", pt.intArray.length == 1);
  529. assertTrue("correct values", pt.intArray[0] == 1);
  530. bw.setPropertyValue("intArray", new String[] {"0"});
  531. assertTrue("intArray length = 4", pt.intArray.length == 1);
  532. assertTrue("correct values", pt.intArray[0] == 1);
  533. bw.setPropertyValue("intArray", "0");
  534. assertTrue("intArray length = 4", pt.intArray.length == 1);
  535. assertTrue("correct values", pt.intArray[0] == 1);
  536. }
  537. @Test
  538. public void testIntArrayPropertyWithStringSplitting() throws Exception {
  539. PropsTester pt = new PropsTester();
  540. BeanWrapperImpl bw = new BeanWrapperImpl(pt);
  541. bw.useConfigValueEditors();
  542. bw.setPropertyValue("intArray", "4,5");
  543. assertTrue("intArray length = 2", pt.intArray.length == 2);
  544. assertTrue("correct values", pt.intArray[0] == 4 && pt.intArray[1] == 5);
  545. }
  546. @Test
  547. public void testIndividualAllValid() {
  548. TestBean t = new TestBean();
  549. String newName = "tony";
  550. int newAge = 65;
  551. String newTouchy = "valid";
  552. try {
  553. BeanWrapper bw = new BeanWrapperImpl(t);
  554. bw.setPropertyValue("age", new Integer(newAge));
  555. bw.setPropertyValue(new PropertyValue("name", newName));
  556. bw.setPropertyValue(new PropertyValue("touchy", newTouchy));
  557. assertTrue("Validly set property must stick", t.getName().equals(newName));
  558. assertTrue("Validly set property must stick", t.getTouchy().equals(newTouchy));
  559. assertTrue("Validly set property must stick", t.getAge() == newAge);
  560. }
  561. catch (BeansException ex) {
  562. fail("Shouldn't throw exception when everything is valid");
  563. }
  564. }
  565. @Test
  566. public void test2Invalid() {
  567. TestBean t = new TestBean();
  568. String newName = "tony";
  569. String invalidTouchy = ".valid";
  570. try {
  571. BeanWrapper bw = new BeanWrapperImpl(t);
  572. MutablePropertyValues pvs = new MutablePropertyValues();
  573. pvs.addPropertyValue(new PropertyValue("age", "foobar"));
  574. pvs.addPropertyValue(new PropertyValue("name", newName));
  575. pvs.addPropertyValue(new PropertyValue("touchy", invalidTouchy));
  576. bw.setPropertyValues(pvs);
  577. fail("Should throw exception when everything is valid");
  578. }
  579. catch (PropertyBatchUpdateException ex) {
  580. assertTrue("Must contain 2 exceptions", ex.getExceptionCount() == 2);
  581. // Test validly set property matches
  582. assertTrue("Validly set property must stick", t.getName().equals(newName));
  583. assertTrue("Invalidly set property must retain old value", t.getAge() == 0);
  584. assertTrue("New value of dodgy setter must be available through exception",
  585. ex.getPropertyAccessException("touchy").getPropertyChangeEvent().getNewValue().equals(invalidTouchy));
  586. }
  587. }
  588. @Test
  589. public void testPossibleMatches() {
  590. TestBean tb = new TestBean();
  591. try {
  592. BeanWrapper bw = new BeanWrapperImpl(tb);
  593. bw.setPropertyValue("ag", "foobar");
  594. fail("Should throw exception on invalid property");
  595. }
  596. catch (NotWritablePropertyException ex) {
  597. // expected
  598. assertEquals(1, ex.getPossibleMatches().length);
  599. assertEquals("age", ex.getPossibleMatches()[0]);
  600. }
  601. }
  602. @Test
  603. public void testTypeMismatch() {
  604. TestBean t = new TestBean();
  605. try {
  606. BeanWrapper bw = new BeanWrapperImpl(t);
  607. bw.setPropertyValue("age", "foobar");
  608. fail("Should throw exception on type mismatch");
  609. }
  610. catch (TypeMismatchException ex) {
  611. // expected
  612. }
  613. }
  614. @Test
  615. public void testEmptyValueForPrimitiveProperty() {
  616. TestBean t = new TestBean();
  617. try {
  618. BeanWrapper bw = new BeanWrapperImpl(t);
  619. bw.setPropertyValue("age", "");
  620. fail("Should throw exception on type mismatch");
  621. }
  622. catch (TypeMismatchException ex) {
  623. // expected
  624. }
  625. catch (Exception ex) {
  626. fail("Shouldn't throw exception other than Type mismatch");
  627. }
  628. }
  629. @Test
  630. public void testSetPropertyValuesIgnoresInvalidNestedOnRequest() {
  631. ITestBean rod = new TestBean();
  632. MutablePropertyValues pvs = new MutablePropertyValues();
  633. pvs.addPropertyValue(new PropertyValue("name", "rod"));
  634. pvs.addPropertyValue(new PropertyValue("graceful.rubbish", "tony"));
  635. pvs.addPropertyValue(new PropertyValue("more.garbage", new Object()));
  636. BeanWrapper bw = new BeanWrapperImpl(rod);
  637. bw.setPropertyValues(pvs, true);
  638. assertTrue("Set valid and ignored invalid", rod.getName().equals("rod"));
  639. try {
  640. // Don't ignore: should fail
  641. bw.setPropertyValues(pvs, false);
  642. fail("Shouldn't have ignored invalid updates");
  643. }
  644. catch (NotWritablePropertyException ex) {
  645. // OK: but which exception??
  646. }
  647. }
  648. @Test
  649. public void testGetNestedProperty() {
  650. ITestBean rod = new TestBean("rod", 31);
  651. ITestBean kerry = new TestBean("kerry", 35);
  652. rod.setSpouse(kerry);
  653. kerry.setSpouse(rod);
  654. BeanWrapper bw = new BeanWrapperImpl(rod);
  655. Integer KA = (Integer) bw.getPropertyValue("spouse.age");
  656. assertTrue("kerry is 35", KA.intValue() == 35);
  657. Integer RA = (Integer) bw.getPropertyValue("spouse.spouse.age");
  658. assertTrue("rod is 31, not" + RA, RA.intValue() == 31);
  659. ITestBean spousesSpouse = (ITestBean) bw.getPropertyValue("spouse.spouse");
  660. assertTrue("spousesSpouse = initial point", rod == spousesSpouse);
  661. }
  662. @Test
  663. public void testGetNestedPropertyNullValue() throws Exception {
  664. ITestBean rod = new TestBean("rod", 31);
  665. ITestBean kerry = new TestBean("kerry", 35);
  666. rod.setSpouse(kerry);
  667. BeanWrapper bw = new BeanWrapperImpl(rod);
  668. try {
  669. bw.getPropertyValue("spouse.spouse.age");
  670. fail("Shouldn't have succeded with null path");
  671. }
  672. catch (NullValueInNestedPathException ex) {
  673. // ok
  674. assertTrue("it was the spouse.spouse property that was null, not " + ex.getPropertyName(),
  675. ex.getPropertyName().equals("spouse.spouse"));
  676. }
  677. }
  678. @Test
  679. public void testSetNestedProperty() throws Exception {
  680. ITestBean rod = new TestBean("rod", 31);
  681. ITestBean kerry = new TestBean("kerry", 0);
  682. BeanWrapper bw = new BeanWrapperImpl(rod);
  683. bw.setPropertyValue("spouse", kerry);
  684. assertTrue("nested set worked", rod.getSpouse() == kerry);
  685. assertTrue("no back relation", kerry.getSpouse() == null);
  686. bw.setPropertyValue(new PropertyValue("spouse.spouse", rod));
  687. assertTrue("nested set worked", kerry.getSpouse() == rod);
  688. assertTrue("kerry age not set", kerry.getAge() == 0);
  689. bw.setPropertyValue(new PropertyValue("spouse.age", new Integer(35)));
  690. assertTrue("Set primitive on spouse", kerry.getAge() == 35);
  691. assertEquals(kerry, bw.getPropertyValue("spouse"));
  692. assertEquals(rod, bw.getPropertyValue("spouse.spouse"));
  693. }
  694. @Test
  695. public void testSetNestedPropertyNullValue() throws Exception {
  696. ITestBean rod = new TestBean("rod", 31);
  697. BeanWrapper bw = new BeanWrapperImpl(rod);
  698. try {
  699. bw.setPropertyValue("spouse.age", new Integer(31));
  700. fail("Shouldn't have succeeded with null path");
  701. }
  702. catch (NullValueInNestedPathException ex) {
  703. // expected
  704. assertTrue("it was the spouse property that was null, not " + ex.getPropertyName(),
  705. ex.getPropertyName().equals("spouse"));
  706. }
  707. }
  708. @Test
  709. public void testSetNestedPropertyPolymorphic() throws Exception {
  710. ITestBean rod = new TestBean("rod", 31);
  711. ITestBean kerry = new Employee();
  712. BeanWrapper bw = new BeanWrapperImpl(rod);
  713. bw.setPropertyValue("spouse", kerry);
  714. bw.setPropertyValue("spouse.age", new Integer(35));
  715. bw.setPropertyValue("spouse.name", "Kerry");
  716. bw.setPropertyValue("spouse.company", "Lewisham");
  717. assertTrue("kerry name is Kerry", kerry.getName().equals("Kerry"));
  718. assertTrue("nested set worked", rod.getSpouse() == kerry);
  719. assertTrue("no back relation", kerry.getSpouse() == null);
  720. bw.setPropertyValue(new PropertyValue("spouse.spouse", rod));
  721. assertTrue("nested set worked", kerry.getSpouse() == rod);
  722. BeanWrapper kbw = new BeanWrapperImpl(kerry);
  723. assertTrue("spouse.spouse.spouse.spouse.company=Lewisham",
  724. "Lewisham".equals(kbw.getPropertyValue("spouse.spouse.spouse.spouse.company")));
  725. }
  726. @Test
  727. public void testNullObject() {
  728. try {
  729. new BeanWrapperImpl((Object) null);
  730. fail("Must throw an exception when constructed with null object");
  731. }
  732. catch (IllegalArgumentException ex) {
  733. // expected
  734. }
  735. }
  736. @Test
  737. public void testNestedProperties() {
  738. String doctorCompany = "";
  739. String lawyerCompany = "Dr. Sueem";
  740. TestBean tb = new TestBean();
  741. BeanWrapper bw = new BeanWrapperImpl(tb);
  742. bw.setPropertyValue("doctor.company", doctorCompany);
  743. bw.setPropertyValue("lawyer.company", lawyerCompany);
  744. assertEquals(doctorCompany, tb.getDoctor().getCompany());
  745. assertEquals(lawyerCompany, tb.getLawyer().getCompany());
  746. }
  747. @Test
  748. public void testIndexedProperties() {
  749. IndexedTestBean bean = new IndexedTestBean();
  750. BeanWrapper bw = new BeanWrapperImpl(bean);
  751. TestBean tb0 = bean.getArray()[0];
  752. TestBean tb1 = bean.getArray()[1];
  753. TestBean tb2 = ((TestBean) bean.getList().get(0));
  754. TestBean tb3 = ((TestBean) bean.getList().get(1));
  755. TestBean tb6 = ((TestBean) bean.getSet().toArray()[0]);
  756. TestBean tb7 = ((TestBean) bean.getSet().toArray()[1]);
  757. TestBean tb4 = ((TestBean) bean.getMap().get("key1"));
  758. TestBean tb5 = ((TestBean) bean.getMap().get("key.3"));
  759. assertEquals("name0", tb0.getName());
  760. assertEquals("name1", tb1.getName());
  761. assertEquals("name2", tb2.getName());
  762. assertEquals("name3", tb3.getName());
  763. assertEquals("name6", tb6.getName());
  764. assertEquals("name7", tb7.getName());
  765. assertEquals("name4", tb4.getName());
  766. assertEquals("name5", tb5.getName());
  767. assertEquals("name0", bw.getPropertyValue("array[0].name"));
  768. assertEquals("name1", bw.getPropertyValue("array[1].name"));
  769. assertEquals("name2", bw.getPropertyValue("list[0].name"));
  770. assertEquals("name3", bw.getPropertyValue("list[1].name"));
  771. assertEquals("name6", bw.getPropertyValue("set[0].name"));
  772. assertEquals("name7", bw.getPropertyValue("set[1].name"));
  773. assertEquals("name4", bw.getPropertyValue("map[key1].name"));
  774. assertEquals("name5", bw.getPropertyValue("map[key.3].name"));
  775. assertEquals("name4", bw.getPropertyValue("map['key1'].name"));
  776. assertEquals("name5", bw.getPropertyValue("map[\"key.3\"].name"));
  777. assertEquals("nameX", bw.getPropertyValue("map[key4][0].name"));
  778. assertEquals("nameY", bw.getPropertyValue("map[key4][1].name"));
  779. MutablePropertyValues pvs = new MutablePropertyValues();
  780. pvs.add("array[0].name", "name5");
  781. pvs.add("array[1].name", "name4");
  782. pvs.add("list[0].name", "name3");
  783. pvs.add("list[1].name", "name2");
  784. pvs.add("set[0].name", "name8");
  785. pvs.add("set[1].name", "name9");
  786. pvs.add("map[key1].name", "name1");
  787. pvs.add("map['key.3'].name", "name0");
  788. pvs.add("map[key4][0].name", "nameA");
  789. pvs.add("map[key4][1].name", "nameB");
  790. bw.setPropertyValues(pvs);
  791. assertEquals("name5", tb0.getName());
  792. assertEquals("name4", tb1.getName());
  793. assertEquals("name3", tb2.getName());
  794. assertEquals("name2", tb3.getName());
  795. assertEquals("name1", tb4.getName());
  796. assertEquals("name0", tb5.getName());
  797. assertEquals("name5", bw.getPropertyValue("array[0].name"));
  798. assertEquals("name4", bw.getPropertyValue("array[1].name"));
  799. assertEquals("name3", bw.getPropertyValue("list[0].name"));
  800. assertEquals("name2", bw.getPropertyValue("list[1].name"));
  801. assertEquals("name8", bw.getPropertyValue("set[0].name"));
  802. assertEquals("name9", bw.getPropertyValue("set[1].name"));
  803. assertEquals("name1", bw.getPropertyValue("map[\"key1\"].name"));
  804. assertEquals("name0", bw.getPropertyValue("map['key.3'].name"));
  805. assertEquals("nameA", bw.getPropertyValue("map[key4][0].name"));
  806. assertEquals("nameB", bw.getPropertyValue("map[key4][1].name"));
  807. }
  808. @Test
  809. public void testIndexedPropertiesWithDirectAccess() {
  810. IndexedTestBean bean = new IndexedTestBean();
  811. BeanWrapper bw = new BeanWrapperImpl(bean);
  812. TestBean tb0 = bean.getArray()[0];
  813. TestBean tb1 = bean.getArray()[1];
  814. TestBean tb2 = ((TestBean) bean.getList().get(0));
  815. TestBean tb3 = ((TestBean) bean.getList().get(1));
  816. TestBean tb6 = ((TestBean) bean.getSet().toArray()[0]);
  817. TestBean tb7 = ((TestBean) bean.getSet().toArray()[1]);
  818. TestBean tb4 = ((TestBean) bean.getMap().get("key1"));
  819. TestBean tb5 = ((TestBean) bean.getMap().get("key2"));
  820. assertEquals(tb0, bw.getPropertyValue("array[0]"));
  821. assertEquals(tb1, bw.getPropertyValue("array[1]"));
  822. assertEquals(tb2, bw.getPropertyValue("list[0]"));
  823. assertEquals(tb3, bw.getPropertyValue("list[1]"));
  824. assertEquals(tb6, bw.getPropertyValue("set[0]"));
  825. assertEquals(tb7, bw.getPropertyValue("set[1]"));
  826. assertEquals(tb4, bw.getPropertyValue("map[key1]"));
  827. assertEquals(tb5, bw.getPropertyValue("map[key2]"));
  828. assertEquals(tb4, bw.getPropertyValue("map['key1']"));
  829. assertEquals(tb5, bw.getPropertyValue("map[\"key2\"]"));
  830. MutablePropertyValues pvs = new MutablePropertyValues();
  831. pvs.add("array[0]", tb5);
  832. pvs.add("array[1]", tb4);
  833. pvs.add("list[0]", tb3);
  834. pvs.add("list[1]", tb2);
  835. pvs.add("list[2]", tb0);
  836. pvs.add("list[4]", tb1);
  837. pvs.add("map[key1]", tb1);
  838. pvs.add("map['key2']", tb0);
  839. pvs.add("map[key5]", tb4);
  840. pvs.add("map['key9']", tb5);
  841. bw.setPropertyValues(pvs);
  842. assertEquals(tb5, bean.getArray()[0]);
  843. assertEquals(tb4, bean.getArray()[1]);
  844. assertEquals(tb3, ((TestBean) bean.getList().get(0)));
  845. assertEquals(tb2, ((TestBean) bean.getList().get(1)));
  846. assertEquals(tb0, ((TestBean) bean.getList().get(2)));
  847. assertEquals(null, ((TestBean) bean.getList().get(3)));
  848. assertEquals(tb1, ((TestBean) bean.getList().get(4)));
  849. assertEquals(tb1, ((TestBean) bean.getMap().get("key1")));
  850. assertEquals(tb0, ((TestBean) bean.getMap().get("key2")));
  851. assertEquals(tb4, ((TestBean) bean.getMap().get("key5")));
  852. assertEquals(tb5, ((TestBean) bean.getMap().get("key9")));
  853. assertEquals(tb5, bw.getPropertyValue("array[0]"));
  854. assertEquals(tb4, bw.getPropertyValue("array[1]"));
  855. assertEquals(tb3, bw.getPropertyValue("list[0]"));
  856. assertEquals(tb2, bw.getPropertyValue("list[1]"));
  857. assertEquals(tb0, bw.getPropertyValue("list[2]"));
  858. assertEquals(null, bw.getPropertyValue("list[3]"));
  859. assertEquals(tb1, bw.getPropertyValue("list[4]"));
  860. assertEquals(tb1, bw.getPropertyValue("map[\"key1\"]"));
  861. assertEquals(tb0, bw.getPropertyValue("map['key2']"));
  862. assertEquals(tb4, bw.getPropertyValue("map[\"key5\"]"));
  863. assertEquals(tb5, bw.getPropertyValue("map['key9']"));
  864. }
  865. @Test
  866. public void testMapAccessWithTypeConversion() {
  867. IndexedTestBean bean = new IndexedTestBean();
  868. BeanWrapper bw = new BeanWrapperImpl(bean);
  869. bw.registerCustomEditor(TestBean.class, new PropertyEditorSupport() {
  870. public void setAsText(String text) throws IllegalArgumentException {
  871. if (!StringUtils.hasLength(text)) {
  872. throw new IllegalArgumentException();
  873. }
  874. setValue(new TestBean(text));
  875. }
  876. });
  877. MutablePropertyValues pvs = new MutablePropertyValues();
  878. pvs.add("map[key1]", "rod");
  879. pvs.add("map[key2]", "rob");
  880. bw.setPropertyValues(pvs);
  881. assertEquals("rod", ((TestBean) bean.getMap().get("key1")).getName());
  882. assertEquals("rob", ((TestBean) bean.getMap().get("key2")).getName());
  883. pvs = new MutablePropertyValues();
  884. pvs.add("map[key1]", "rod");
  885. pvs.add("map[key2]", "");
  886. try {
  887. bw.setPropertyValues(pvs);
  888. fail("Should have thrown TypeMismatchException");
  889. }
  890. catch (PropertyBatchUpdateException ex) {
  891. PropertyAccessException pae = ex.getPropertyAccessException("map[key2]");
  892. assertTrue(pae instanceof TypeMismatchException);
  893. }
  894. }
  895. @Test
  896. public void testMapAccessWithUnmodifiableMap() {
  897. IndexedTestBean bean = new IndexedTestBean();
  898. BeanWrapper bw = new BeanWrapperImpl(bean);
  899. bw.registerCustomEditor(TestBean.class, "map", new PropertyEditorSupport() {
  900. public void setAsText(String text) throws IllegalArgumentException {
  901. if (!StringUtils.hasLength(text)) {
  902. throw new IllegalArgumentException();
  903. }
  904. setValue(new TestBean(text));
  905. }
  906. });
  907. Map<Integer, String> inputMap = new HashMap<Integer, String>();
  908. inputMap.put(new Integer(1), "rod");
  909. inputMap.put(new Integer(2), "rob");
  910. MutablePropertyValues pvs = new MutablePropertyValues();
  911. pvs.add("map", Collections.unmodifiableMap(inputMap));
  912. bw.setPropertyValues(pvs);
  913. assertEquals("rod", ((TestBean) bean.getMap().get(new Integer(1))).getName());
  914. assertEquals("rob", ((TestBean) bean.getMap().get(new Integer(2))).getName());
  915. }
  916. @Test
  917. public void testMapAccessWithCustomUnmodifiableMap() {
  918. IndexedTestBean bean = new IndexedTestBean();
  919. BeanWrapper bw = new BeanWrapperImpl(bean);
  920. bw.registerCustomEditor(TestBean.class, "map", new PropertyEditorSupport() {
  921. public void setAsText(String text) throws IllegalArgumentException {
  922. if (!StringUtils.hasLength(text)) {
  923. throw new IllegalArgumentException();
  924. }
  925. setValue(new TestBean(text));
  926. }
  927. });
  928. Map<Object, Object> inputMap = new HashMap<Object, Object>();
  929. inputMap.put(new Integer(1), "rod");
  930. inputMap.put(new Integer(2), "rob");
  931. MutablePropertyValues pvs = new MutablePropertyValues();
  932. pvs.add("map", new ReadOnlyMap(inputMap));
  933. bw.setPropertyValues(pvs);
  934. assertEquals("rod", ((TestBean) bean.getMap().get(new Integer(1))).getName());
  935. assertEquals("rob", ((TestBean) bean.getMap().get(new Integer(2))).getName());
  936. }
  937. @SuppressWarnings("unchecked") // must work with raw map in this test
  938. @Test
  939. public void testRawMapAccessWithNoEditorRegistered() {
  940. IndexedTestBean bean = new IndexedTestBean();
  941. BeanWrapper bw = new BeanWrapperImpl(bean);
  942. Map inputMap = new HashMap();
  943. inputMap.put(new Integer(1), "rod");
  944. inputMap.put(new Integer(2), "rob");
  945. ReadOnlyMap readOnlyMap = new ReadOnlyMap(inputMap);
  946. MutablePropertyValues pvs = new MutablePropertyValues();
  947. pvs.add("map", readOnlyMap);
  948. bw.setPropertyValues(pvs);
  949. assertSame(readOnlyMap, bean.getMap());
  950. assertFalse(readOnlyMap.isAccessed());
  951. }
  952. @Test
  953. public void testTypedMapReadOnlyMap() {
  954. TypedReadOnlyMap map = new TypedReadOnlyMap(Collections.singletonMap("key", new TestBean()));
  955. TypedReadOnlyMapClient bean = new TypedReadOnlyMapClient();
  956. BeanWrapper bw = new BeanWrapperImpl(bean);
  957. bw.setPropertyValue("map", map);
  958. }
  959. @Test
  960. public void testPrimitiveArray() {
  961. PrimitiveArrayBean tb = new PrimitiveArrayBean();
  962. BeanWrapper bw = new BeanWrapperImpl(tb);
  963. bw.setPropertyValue("array", new String[] {"1", "2"});
  964. assertEquals(2, tb.getArray().length);
  965. assertEquals(1, tb.getArray()[0]);
  966. assertEquals(2, tb.getArray()[1]);
  967. }
  968. @Test
  969. public void testLargeMatchingPrimitiveArray() {
  970. if (LogFactory.getLog(BeanWrapperTests.class).isTraceEnabled()) {
  971. // Skip this test: Trace logging blows the time limit.
  972. return;
  973. }
  974. PrimitiveArrayBean tb = new PrimitiveArrayBean();
  975. BeanWrapper bw = new BeanWrapperImpl(tb);
  976. int[] input = new int[1024];
  977. StopWatch sw = new StopWatch();
  978. sw.start("array1");
  979. for (int i = 0; i < 1000; i++) {
  980. bw.setPropertyValue("array", input);
  981. }
  982. sw.stop();
  983. assertEquals(1024, tb.getArray().length);
  984. assertEquals(0, tb.getArray()[0]);
  985. long time1 = sw.getLastTaskTimeMillis();
  986. assertTrue("Took too long", sw.getLastTaskTimeMillis() < 100);
  987. bw.registerCustomEditor(String.class, new StringTrimmerEditor(false));
  988. sw.start("array2");
  989. for (int i = 0; i < 1000; i++) {
  990. bw.setPropertyValue("array", input);
  991. }
  992. sw.stop();
  993. assertTrue("Took too long", sw.getLastTaskTimeMillis() < 125);
  994. bw.registerCustomEditor(int.class, "array.somePath", new CustomNumberEditor(Integer.class, false));
  995. sw.start("array3");
  996. for (int i = 0; i < 1000; i++) {
  997. bw.setPropertyValue("array", input);
  998. }
  999. sw.stop();
  1000. assertTrue("Took too long", sw.getLastTaskTimeMillis() < 100);
  1001. bw.registerCustomEditor(int.class, "array[0].somePath", new CustomNumberEditor(Integer.class, false));
  1002. sw.start("array3");
  1003. for (int i = 0; i < 1000; i++) {
  1004. bw.setPropertyValue("array", input);
  1005. }
  1006. sw.stop();
  1007. assertTrue("Took too long", sw.getLastTaskTimeMillis() < 100);
  1008. bw.registerCustomEditor(int.class, new CustomNumberEditor(Integer.class, false));
  1009. sw.start("array4");
  1010. for (int i = 0; i < 100; i++) {
  1011. bw.setPropertyValue("array", input);
  1012. }
  1013. sw.stop();
  1014. assertEquals(1024, tb.getArray().length);
  1015. assertEquals(0, tb.getArray()[0]);
  1016. assertTrue("Took too long", sw.getLastTaskTimeMillis() > time1);
  1017. }
  1018. @Test
  1019. public void testLargeMatchingPrimitiveArrayWithSpecificEditor() {
  1020. PrimitiveArrayBean tb = new PrimitiveArrayBean();
  1021. BeanWrapper bw = new BeanWrapperImpl(tb);
  1022. bw.registerCustomEditor(int.class, "array", new PropertyEditorSupport() {
  1023. public void setValue(Object value) {
  1024. if (value instanceof Integer) {
  1025. super.setValue(new Integer(((Integer) value).intValue() + 1));
  1026. }
  1027. }
  1028. });
  1029. int[] input = new int[1024];
  1030. bw.setPropertyValue("array", input);
  1031. assertEquals(1024, tb.getArray().length);
  1032. assertEquals(1, tb.getArray()[0]);
  1033. assertEquals(1, tb.getArray()[1]);
  1034. }
  1035. @Test
  1036. public void testLargeMatchingPrimitiveArrayWithIndexSpecificEditor() {
  1037. PrimitiveArrayBean tb = new PrimitiveArrayBean();
  1038. BeanWrapper bw = new BeanWrapperImpl(tb);
  1039. bw.registerCustomEditor(int.class, "array[1]", new PropertyEditorSupport() {
  1040. public void setValue(Object value) {
  1041. if (value instanceof Integer) {
  1042. super.setValue(new Integer(((Integer) value).intValue() + 1));
  1043. }
  1044. }
  1045. });
  1046. int[] input = new int[1024];
  1047. bw.setPropertyValue("array", input);
  1048. assertEquals(1024, tb.getArray().length);
  1049. assertEquals(0, tb.getArray()[0]);
  1050. assertEquals(1, tb.getArray()[1]);
  1051. }
  1052. @Test
  1053. public void testPropertiesInProtectedBaseBean() {
  1054. DerivedFromProtectedBaseBean bean = new DerivedFromProtectedBaseBean();
  1055. BeanWrapper bw = new BeanWrapperImpl(bean);
  1056. bw.setPropertyValue("someProperty", "someValue");
  1057. assertEquals("someValue", bw.getPropertyValue("someProperty"));
  1058. assertEquals("someValue", bean.getSomeProperty());
  1059. }
  1060. @Test
  1061. public void testErrorMessageOfNestedProperty() {
  1062. ITestBean parent = new TestBean();
  1063. ITestBean child = new DifferentTestBean();
  1064. child.setName("test");
  1065. parent.setSpouse(child);
  1066. BeanWrapper bw = new BeanWrapperImpl(parent);
  1067. try {
  1068. bw.getPropertyValue("spouse.bla");
  1069. }
  1070. catch (NotReadablePropertyException ex) {
  1071. assertTrue(ex.getMessage().indexOf(TestBean.class.getName()) != -1);
  1072. }
  1073. }
  1074. @Test
  1075. public void testMatchingCollections() {
  1076. IndexedTestBean tb = new IndexedTestBean();
  1077. BeanWrapper bw = new BeanWrapperImpl(tb);
  1078. Collection<String> coll = new HashSet<String>();
  1079. coll.add("coll1");
  1080. bw.setPropertyValue("collection", coll);
  1081. Set<String> set = new HashSet<String>();
  1082. set.add("set1");
  1083. bw.setPropertyValue("set", set);
  1084. SortedSet<String> sortedSet = new TreeSet<String>();
  1085. sortedSet.add("sortedSet1");
  1086. bw.setPropertyValue("sortedSet", sortedSet);
  1087. List<String> list = new LinkedList<String>();
  1088. list.add("list1");
  1089. bw.setPropertyValue("list", list);
  1090. assertSame(coll, tb.getCollection());
  1091. assertSame(set, tb.getSet());
  1092. assertSame(sortedSet, tb.getSortedSet());
  1093. assertSame(list, tb.getList());
  1094. }
  1095. @SuppressWarnings("unchecked") // list cannot be properly parameterized as it breaks other tests
  1096. @Test
  1097. public void testNonMatchingCollections() {
  1098. IndexedTestBean tb = new IndexedTestBean();
  1099. BeanWrapper bw = new BeanWrapperImpl(tb);
  1100. Collection<String> coll = new ArrayList<String>();
  1101. coll.add("coll1");
  1102. bw.setPropertyValue("collection", coll);
  1103. List<String> set = new LinkedList<String>();
  1104. set.add("set1");
  1105. bw.setPropertyValue("set", set);
  1106. List<String> sortedSet = new ArrayList<String>();
  1107. sortedSet.add("sortedSet1");
  1108. bw.setPropertyValue("sortedSet", sortedSet);
  1109. Set<String> list = new HashSet<String>();
  1110. list.add("list1");
  1111. bw.setPropertyValue("list", list);
  1112. assertEquals(1, tb.getCollection().size());
  1113. assertTrue(tb.getCollection().containsAll(coll));
  1114. assertEquals(1, tb.getSet().size());
  1115. assertTrue(tb.getSet().containsAll(set));
  1116. assertEquals(1, tb.getSortedSet().size());
  1117. assertTrue(tb.getSortedSet().containsAll(sortedSet));
  1118. assertEquals(1, tb.getList().size());
  1119. assertTrue(tb.getList().containsAll(list));
  1120. }
  1121. @SuppressWarnings("unchecked") // list cannot be properly parameterized as it breaks other tests
  1122. @Test
  1123. public void testCollectionsWithArrayValues() {
  1124. IndexedTestBean tb = new IndexedTestBean();
  1125. BeanWrapper bw = new BeanWrapperImpl(tb);
  1126. Collection<String> coll = new HashSet<String>();
  1127. coll.add("coll1");
  1128. bw.setPropertyValue("collection", coll.toArray());
  1129. List<String> set = new LinkedList<String>();
  1130. set.add("set1");
  1131. bw.setPropertyValue("set", set.toArray());
  1132. List<String> sortedSet = new ArrayList<String>();
  1133. sortedSet.add("sortedSet1");
  1134. bw.setPropertyValue("sortedSet", sortedSet.toArray());
  1135. Set<String> list = new HashSet<String>();
  1136. list.add("list1");
  1137. bw.setPropertyValue("list", list.toArray());
  1138. assertEquals(1, tb.getCollection().size());
  1139. assertTrue(tb.getCollection().containsAll(coll));
  1140. assertEquals(1, tb.getSet().size());
  1141. assertTrue(tb.getSet().containsAll(set));
  1142. assertEquals(1, tb.getSortedSet().size());
  1143. assertTrue(tb.getSortedSet().containsAll(sortedSet));
  1144. assertEquals(1, tb.getList().size());
  1145. assertTrue(tb.getList().containsAll(list));
  1146. }
  1147. @SuppressWarnings("unchecked") // list cannot be properly parameterized as it breaks other tests
  1148. @Test
  1149. public void testCollectionsWithIntArrayValues() {
  1150. IndexedTestBean tb = new IndexedTestBean();
  1151. BeanWrapper bw = new BeanWrapperImpl(tb);
  1152. Collection<Integer> coll = new HashSet<Integer>();
  1153. coll.add(new Integer(0));
  1154. bw.setPropertyValue("collection", new int[] {0});
  1155. List<Integer> set = new LinkedList<Integer>();
  1156. set.add(new Integer(1));
  1157. bw.setPropertyValue("set", new int[] {1});
  1158. List<Integer> sortedSet = new ArrayList<Integer>();
  1159. sortedSet.add(new Integer(2));
  1160. bw.setPropertyValue("sortedSet", new int[] {2});
  1161. Set<Integer> list = new HashSet<Integer>();
  1162. list.add(new Integer(3));
  1163. bw.setPropertyValue("list", new int[] {3});
  1164. assertEquals(1, tb.getCollection().size());
  1165. assertTrue(tb.getCollection().containsAll(coll));
  1166. assertEquals(1, tb.getSet().size());
  1167. assertTrue(tb.getSet().containsAll(set));
  1168. assertEquals(1, tb.getSortedSet().size());
  1169. assertTrue(tb.getSortedSet().containsAll(sortedSet));
  1170. assertEquals(1, tb.getList().size());
  1171. assertTrue(tb.getList().containsAll(list));
  1172. }
  1173. @SuppressWarnings("unchecked") // list cannot be properly parameterized as it breaks other tests
  1174. @Test
  1175. public void testCollectionsWithIntegerValues() {
  1176. IndexedTestBean tb = new IndexedTestBean();
  1177. BeanWrapper bw = new BeanWrapperImpl(tb);
  1178. Collection<Integer> coll = new HashSet<Integer>();
  1179. coll.add(new Integer(0));
  1180. bw.setPropertyValue("collection", new Integer(0));
  1181. List<Integer> set = new LinkedList<Integer>();
  1182. set.add(new Integer(1));
  1183. bw.setPropertyValue("set", new Integer(1));
  1184. List<Integer> sortedSet = new ArrayList<Integer>();
  1185. sortedSet.add(new Integer(2));
  1186. bw.setPropertyValue("sortedSet", new Integer(2));
  1187. Set<Integer> list = new HashSet<Integer>();
  1188. list.add(new Integer(3));
  1189. bw.setPropertyValue("list", new Integer(3));
  1190. assertEquals(1, tb.getCollection().size());
  1191. assertTrue(tb.getCollection().containsAll(coll));
  1192. assertEquals(1, tb.getSet().size());
  1193. assertTrue(tb.getSet().containsAll(set));
  1194. assertEquals(1, tb.getSortedSet().size());
  1195. assertTrue(tb.getSortedSet().containsAll(sortedSet));
  1196. assertEquals(1, tb.getList().size());
  1197. assertTrue(tb.getList().containsAll(list));
  1198. }
  1199. @SuppressWarnings("unchecked") // list cannot be properly parameterized as it breaks other tests
  1200. @Test
  1201. public void testCollectionsWithStringValues() {
  1202. IndexedTestBean tb = new IndexedTestBean();
  1203. BeanWrapper bw = new BeanWrapperImpl(tb);
  1204. List<String> set = new LinkedList<String>();
  1205. set.add("set1");
  1206. bw.setPropertyValue("set", "set1");
  1207. List<String> sortedSet = new ArrayList<String>();
  1208. sortedSet.add("sortedSet1");