You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673
  1. package com.vaadin.tests.server.component.grid;
  2. import static org.junit.Assert.assertEquals;
  3. import static org.junit.Assert.assertFalse;
  4. import static org.junit.Assert.assertNotNull;
  5. import java.lang.reflect.InvocationTargetException;
  6. import java.lang.reflect.Method;
  7. import java.text.DecimalFormat;
  8. import java.text.DecimalFormatSymbols;
  9. import java.util.ArrayList;
  10. import java.util.Arrays;
  11. import java.util.Collections;
  12. import java.util.Date;
  13. import java.util.HashSet;
  14. import java.util.List;
  15. import java.util.Locale;
  16. import java.util.Optional;
  17. import java.util.Random;
  18. import java.util.Set;
  19. import java.util.concurrent.atomic.AtomicInteger;
  20. import java.util.concurrent.atomic.AtomicReference;
  21. import java.util.stream.Collectors;
  22. import java.util.stream.Stream;
  23. import com.vaadin.data.provider.DataCommunicator;
  24. import org.easymock.Capture;
  25. import org.junit.Assert;
  26. import org.junit.Before;
  27. import org.junit.Test;
  28. import com.vaadin.data.Binder.Binding;
  29. import com.vaadin.data.ValidationException;
  30. import com.vaadin.data.ValueProvider;
  31. import com.vaadin.data.provider.DataGenerator;
  32. import com.vaadin.data.provider.GridSortOrder;
  33. import com.vaadin.data.provider.QuerySortOrder;
  34. import com.vaadin.data.provider.bov.Person;
  35. import com.vaadin.event.selection.SelectionEvent;
  36. import com.vaadin.server.SerializableComparator;
  37. import com.vaadin.shared.data.sort.SortDirection;
  38. import com.vaadin.shared.ui.grid.HeightMode;
  39. import com.vaadin.tests.util.MockUI;
  40. import com.vaadin.ui.Grid;
  41. import com.vaadin.ui.Grid.Column;
  42. import com.vaadin.ui.Grid.SelectionMode;
  43. import com.vaadin.ui.TextField;
  44. import com.vaadin.ui.renderers.NumberRenderer;
  45. import elemental.json.Json;
  46. import elemental.json.JsonObject;
  47. import junit.framework.AssertionFailedError;
  48. public class GridTest {
  49. private Grid<String> grid;
  50. private Column<String, String> fooColumn;
  51. private Column<String, Integer> lengthColumn;
  52. private Column<String, Object> objectColumn;
  53. private Column<String, String> randomColumn;
  54. @Before
  55. public void setUp() {
  56. grid = new Grid<>();
  57. fooColumn = grid.addColumn(ValueProvider.identity()).setId("foo");
  58. lengthColumn = grid.addColumn(String::length, new NumberRenderer())
  59. .setId("length");
  60. objectColumn = grid.addColumn(string -> new Object());
  61. randomColumn = grid.addColumn(ValueProvider.identity())
  62. .setId("randomColumnId");
  63. }
  64. @Test
  65. public void testCreateGridWithDataCommunicator() {
  66. DataCommunicator specificDataCommunicator = new DataCommunicator<>();
  67. TestGrid<String> grid = new TestGrid(String.class, specificDataCommunicator);
  68. assertEquals(specificDataCommunicator, grid.getDataCommunicator());
  69. }
  70. @Test
  71. public void testGridHeightModeChange() {
  72. assertEquals("Initial height mode was not CSS", HeightMode.CSS,
  73. grid.getHeightMode());
  74. grid.setHeightByRows(13.24);
  75. assertEquals("Setting height by rows did not change height mode",
  76. HeightMode.ROW, grid.getHeightMode());
  77. grid.setHeight("100px");
  78. assertEquals("Setting height did not change height mode.",
  79. HeightMode.CSS, grid.getHeightMode());
  80. }
  81. @Test(expected = IllegalArgumentException.class)
  82. public void testFrozenColumnCountTooBig() {
  83. grid.setFrozenColumnCount(5);
  84. }
  85. @Test(expected = IllegalArgumentException.class)
  86. public void testFrozenColumnCountTooSmall() {
  87. grid.setFrozenColumnCount(-2);
  88. }
  89. @Test()
  90. public void testSetFrozenColumnCount() {
  91. for (int i = -1; i < 2; ++i) {
  92. grid.setFrozenColumnCount(i);
  93. assertEquals("Frozen column count not updated", i,
  94. grid.getFrozenColumnCount());
  95. }
  96. }
  97. @Test
  98. public void testGridColumnIdentifier() {
  99. grid.getColumn("foo").setCaption("Bar");
  100. assertEquals("Column header not updated correctly", "Bar",
  101. grid.getHeaderRow(0).getCell("foo").getText());
  102. }
  103. @Test(expected = IllegalArgumentException.class)
  104. public void testGridMultipleColumnsWithSameIdentifier() {
  105. grid.addColumn(t -> t).setId("foo");
  106. }
  107. @Test
  108. public void testAddSelectionListener_singleSelectMode() {
  109. grid.setItems("foo", "bar", "baz");
  110. Capture<SelectionEvent<String>> eventCapture = new Capture<>();
  111. grid.addSelectionListener(event -> eventCapture.setValue(event));
  112. grid.getSelectionModel().select("foo");
  113. SelectionEvent<String> event = eventCapture.getValue();
  114. assertNotNull(event);
  115. assertFalse(event.isUserOriginated());
  116. assertEquals("foo", event.getFirstSelectedItem().get());
  117. assertEquals("foo",
  118. event.getAllSelectedItems().stream().findFirst().get());
  119. grid.getSelectionModel().select("bar");
  120. event = eventCapture.getValue();
  121. assertNotNull(event);
  122. assertFalse(event.isUserOriginated());
  123. assertEquals("bar", event.getFirstSelectedItem().get());
  124. assertEquals("bar",
  125. event.getAllSelectedItems().stream().findFirst().get());
  126. grid.getSelectionModel().deselect("bar");
  127. event = eventCapture.getValue();
  128. assertNotNull(event);
  129. assertFalse(event.isUserOriginated());
  130. assertEquals(Optional.empty(), event.getFirstSelectedItem());
  131. assertEquals(0, event.getAllSelectedItems().size());
  132. }
  133. @Test
  134. public void testAddSelectionListener_multiSelectMode() {
  135. grid.setItems("foo", "bar", "baz");
  136. grid.setSelectionMode(SelectionMode.MULTI);
  137. Capture<SelectionEvent<String>> eventCapture = new Capture<>();
  138. grid.addSelectionListener(event -> eventCapture.setValue(event));
  139. grid.getSelectionModel().select("foo");
  140. SelectionEvent<String> event = eventCapture.getValue();
  141. assertNotNull(event);
  142. assertFalse(event.isUserOriginated());
  143. assertEquals("foo", event.getFirstSelectedItem().get());
  144. assertEquals("foo",
  145. event.getAllSelectedItems().stream().findFirst().get());
  146. grid.getSelectionModel().select("bar");
  147. event = eventCapture.getValue();
  148. assertNotNull(event);
  149. assertFalse(event.isUserOriginated());
  150. assertEquals("foo", event.getFirstSelectedItem().get());
  151. assertEquals("foo",
  152. event.getAllSelectedItems().stream().findFirst().get());
  153. Assert.assertArrayEquals(new String[] { "foo", "bar" },
  154. event.getAllSelectedItems().toArray(new String[2]));
  155. grid.getSelectionModel().deselect("foo");
  156. event = eventCapture.getValue();
  157. assertNotNull(event);
  158. assertFalse(event.isUserOriginated());
  159. assertEquals("bar", event.getFirstSelectedItem().get());
  160. assertEquals("bar",
  161. event.getAllSelectedItems().stream().findFirst().get());
  162. Assert.assertArrayEquals(new String[] { "bar" },
  163. event.getAllSelectedItems().toArray(new String[1]));
  164. grid.getSelectionModel().deselectAll();
  165. event = eventCapture.getValue();
  166. assertNotNull(event);
  167. assertFalse(event.isUserOriginated());
  168. assertEquals(Optional.empty(), event.getFirstSelectedItem());
  169. assertEquals(0, event.getAllSelectedItems().size());
  170. }
  171. @Test(expected = UnsupportedOperationException.class)
  172. public void testAddSelectionListener_noSelectionMode() {
  173. grid.setSelectionMode(SelectionMode.NONE);
  174. grid.addSelectionListener(
  175. event -> Assert.fail("never ever happens (tm)"));
  176. }
  177. @Test
  178. public void sortByColumn_sortOrderIsAscendingOneColumn() {
  179. Column<String, ?> column = grid.getColumns().get(1);
  180. grid.sort(column);
  181. GridSortOrder<String> sortOrder = grid.getSortOrder().get(0);
  182. Assert.assertEquals(column, sortOrder.getSorted());
  183. Assert.assertEquals(SortDirection.ASCENDING, sortOrder.getDirection());
  184. }
  185. @Test
  186. public void sortByColumnDesc_sortOrderIsDescendingOneColumn() {
  187. Column<String, ?> column = grid.getColumns().get(1);
  188. grid.sort(column, SortDirection.DESCENDING);
  189. GridSortOrder<String> sortOrder = grid.getSortOrder().get(0);
  190. Assert.assertEquals(column, sortOrder.getSorted());
  191. Assert.assertEquals(SortDirection.DESCENDING, sortOrder.getDirection());
  192. }
  193. @Test
  194. public void setSortOrder() {
  195. Column<String, ?> column1 = grid.getColumns().get(1);
  196. Column<String, ?> column2 = grid.getColumns().get(2);
  197. List<GridSortOrder<String>> order = Arrays.asList(
  198. new GridSortOrder<>(column2, SortDirection.DESCENDING),
  199. new GridSortOrder<>(column1, SortDirection.ASCENDING));
  200. grid.setSortOrder(order);
  201. List<GridSortOrder<String>> sortOrder = grid.getSortOrder();
  202. Assert.assertEquals(column2, sortOrder.get(0).getSorted());
  203. Assert.assertEquals(SortDirection.DESCENDING,
  204. sortOrder.get(0).getDirection());
  205. Assert.assertEquals(column1, sortOrder.get(1).getSorted());
  206. Assert.assertEquals(SortDirection.ASCENDING,
  207. sortOrder.get(1).getDirection());
  208. }
  209. @Test
  210. public void clearSortOrder() {
  211. Column<String, ?> column = grid.getColumns().get(1);
  212. grid.sort(column);
  213. grid.clearSortOrder();
  214. assertEquals(0, grid.getSortOrder().size());
  215. }
  216. @Test
  217. public void sortListener_eventIsFired() {
  218. Column<String, ?> column1 = grid.getColumns().get(1);
  219. Column<String, ?> column2 = grid.getColumns().get(2);
  220. List<GridSortOrder<String>> list = new ArrayList<>();
  221. AtomicReference<Boolean> fired = new AtomicReference<>();
  222. grid.addSortListener(event -> {
  223. Assert.assertTrue(list.isEmpty());
  224. fired.set(true);
  225. list.addAll(event.getSortOrder());
  226. });
  227. grid.sort(column1, SortDirection.DESCENDING);
  228. Assert.assertEquals(column1, list.get(0).getSorted());
  229. Assert.assertEquals(SortDirection.DESCENDING,
  230. list.get(0).getDirection());
  231. List<GridSortOrder<String>> order = Arrays.asList(
  232. new GridSortOrder<>(column2, SortDirection.DESCENDING),
  233. new GridSortOrder<>(column1, SortDirection.ASCENDING));
  234. list.clear();
  235. grid.setSortOrder(order);
  236. Assert.assertEquals(column2, list.get(0).getSorted());
  237. Assert.assertEquals(SortDirection.DESCENDING,
  238. list.get(0).getDirection());
  239. Assert.assertEquals(column1, list.get(1).getSorted());
  240. Assert.assertEquals(SortDirection.ASCENDING,
  241. list.get(1).getDirection());
  242. list.clear();
  243. fired.set(false);
  244. grid.clearSortOrder();
  245. Assert.assertEquals(0, list.size());
  246. Assert.assertTrue(fired.get());
  247. }
  248. @Test
  249. public void beanGrid() {
  250. Grid<Person> grid = new Grid<>(Person.class);
  251. Column<Person, ?> nameColumn = grid.getColumn("name");
  252. Column<Person, ?> bornColumn = grid.getColumn("born");
  253. Assert.assertNotNull(nameColumn);
  254. Assert.assertNotNull(bornColumn);
  255. Assert.assertEquals("Name", nameColumn.getCaption());
  256. Assert.assertEquals("Born", bornColumn.getCaption());
  257. JsonObject json = getRowData(grid, new Person("Lorem", 2000));
  258. Set<String> values = Stream.of(json.keys()).map(json::getString)
  259. .collect(Collectors.toSet());
  260. Assert.assertEquals(new HashSet<>(Arrays.asList("Lorem", "2000")),
  261. values);
  262. assertSingleSortProperty(nameColumn, "name");
  263. assertSingleSortProperty(bornColumn, "born");
  264. }
  265. @Test
  266. public void beanGrid_editor() throws ValidationException {
  267. Grid<Person> grid = new Grid<>(Person.class);
  268. Column<Person, ?> nameColumn = grid.getColumn("name");
  269. TextField nameField = new TextField();
  270. nameColumn.setEditorComponent(nameField);
  271. Optional<Binding<Person, ?>> maybeBinding = grid.getEditor().getBinder()
  272. .getBinding("name");
  273. Assert.assertTrue(maybeBinding.isPresent());
  274. Binding<Person, ?> binding = maybeBinding.get();
  275. Assert.assertSame(nameField, binding.getField());
  276. Person person = new Person("Lorem", 2000);
  277. grid.getEditor().getBinder().setBean(person);
  278. Assert.assertEquals("Lorem", nameField.getValue());
  279. nameField.setValue("Ipsum");
  280. Assert.assertEquals("Ipsum", person.getName());
  281. }
  282. @Test(expected = IllegalStateException.class)
  283. public void oneArgSetEditor_nonBeanGrid() {
  284. Grid<Person> grid = new Grid<>();
  285. Column<Person, String> nameCol = grid.addColumn(Person::getName)
  286. .setId("name");
  287. nameCol.setEditorComponent(new TextField());
  288. }
  289. @Test(expected = IllegalStateException.class)
  290. public void addExistingColumnById_throws() {
  291. Grid<Person> grid = new Grid<>(Person.class);
  292. grid.addColumn("name");
  293. }
  294. @Test
  295. public void removeByColumn_readdById() {
  296. Grid<Person> grid = new Grid<>(Person.class);
  297. grid.removeColumn(grid.getColumn("name"));
  298. grid.addColumn("name");
  299. List<Column<Person, ?>> columns = grid.getColumns();
  300. Assert.assertEquals(2, columns.size());
  301. Assert.assertEquals("born", columns.get(0).getId());
  302. Assert.assertEquals("name", columns.get(1).getId());
  303. }
  304. @Test
  305. public void removeColumnByColumn() {
  306. grid.removeColumn(fooColumn);
  307. Assert.assertEquals(
  308. Arrays.asList(lengthColumn, objectColumn, randomColumn),
  309. grid.getColumns());
  310. }
  311. @Test
  312. public void removeColumnByColumn_alreadyRemoved() {
  313. grid.removeColumn(fooColumn);
  314. // Questionable that this doesn't throw, but that's a separate ticket...
  315. grid.removeColumn(fooColumn);
  316. Assert.assertEquals(
  317. Arrays.asList(lengthColumn, objectColumn, randomColumn),
  318. grid.getColumns());
  319. }
  320. @Test(expected = IllegalStateException.class)
  321. public void removeColumnById_alreadyRemoved() {
  322. grid.removeColumn("foo");
  323. grid.removeColumn("foo");
  324. }
  325. @Test
  326. public void removeColumnById() {
  327. grid.removeColumn("foo");
  328. Assert.assertEquals(
  329. Arrays.asList(lengthColumn, objectColumn, randomColumn),
  330. grid.getColumns());
  331. }
  332. @Test
  333. public void removeAllColumns() {
  334. grid.removeAllColumns();
  335. Assert.assertEquals(Collections.emptyList(), grid.getColumns());
  336. }
  337. @Test
  338. public void removeAllColumnsInGridWithoutColumns() {
  339. grid.removeAllColumns();
  340. grid.removeAllColumns();
  341. Assert.assertEquals(Collections.emptyList(), grid.getColumns());
  342. }
  343. @Test
  344. public void removeFrozenColumn() {
  345. grid.setFrozenColumnCount(3);
  346. grid.removeColumn(fooColumn);
  347. assertEquals(2, grid.getFrozenColumnCount());
  348. }
  349. @Test
  350. public void removeHiddenFrozenColumn() {
  351. lengthColumn.setHidden(true);
  352. grid.setFrozenColumnCount(3);
  353. grid.removeColumn(lengthColumn);
  354. assertEquals(2, grid.getFrozenColumnCount());
  355. }
  356. @Test
  357. public void removeNonFrozenColumn() {
  358. grid.setFrozenColumnCount(3);
  359. grid.removeColumn(randomColumn);
  360. assertEquals(3, grid.getFrozenColumnCount());
  361. }
  362. @Test
  363. public void testFrozenColumnRemoveColumn() {
  364. assertEquals("Grid should not start with a frozen column", 0,
  365. grid.getFrozenColumnCount());
  366. int columnCount = grid.getColumns().size();
  367. grid.setFrozenColumnCount(columnCount);
  368. grid.removeColumn(grid.getColumns().get(0));
  369. assertEquals(
  370. "Frozen column count should be updated when removing a frozen column",
  371. columnCount - 1, grid.getFrozenColumnCount());
  372. }
  373. @Test
  374. public void setColumns_reorder() {
  375. // Will remove other columns
  376. grid.setColumns("length", "foo");
  377. List<Column<String, ?>> columns = grid.getColumns();
  378. Assert.assertEquals(2, columns.size());
  379. Assert.assertEquals("length", columns.get(0).getId());
  380. Assert.assertEquals("foo", columns.get(1).getId());
  381. }
  382. @Test(expected = IllegalStateException.class)
  383. public void setColumns_addColumn_notBeangrid() {
  384. // Not possible to add a column in a grid that cannot add columns based
  385. // on a string
  386. grid.setColumns("notHere");
  387. }
  388. @Test
  389. public void setColumns_addColumns_beangrid() {
  390. Grid<Person> grid = new Grid<>(Person.class);
  391. // Remove so we can add it back
  392. grid.removeColumn("name");
  393. grid.setColumns("born", "name");
  394. List<Column<Person, ?>> columns = grid.getColumns();
  395. Assert.assertEquals(2, columns.size());
  396. Assert.assertEquals("born", columns.get(0).getId());
  397. Assert.assertEquals("name", columns.get(1).getId());
  398. }
  399. @Test
  400. public void setColumnOrder_byColumn() {
  401. grid.setColumnOrder(randomColumn, lengthColumn);
  402. Assert.assertEquals(Arrays.asList(randomColumn, lengthColumn, fooColumn,
  403. objectColumn), grid.getColumns());
  404. }
  405. @Test(expected = IllegalStateException.class)
  406. public void setColumnOrder_byColumn_removedColumn() {
  407. grid.removeColumn(randomColumn);
  408. grid.setColumnOrder(randomColumn, lengthColumn);
  409. }
  410. @Test
  411. public void setColumnOrder_byString() {
  412. grid.setColumnOrder("randomColumnId", "length");
  413. Assert.assertEquals(Arrays.asList(randomColumn, lengthColumn, fooColumn,
  414. objectColumn), grid.getColumns());
  415. }
  416. @Test(expected = IllegalStateException.class)
  417. public void setColumnOrder_byString_removedColumn() {
  418. grid.removeColumn("randomColumnId");
  419. grid.setColumnOrder("randomColumnId", "length");
  420. }
  421. @Test
  422. public void defaultSorting_comparableTypes() {
  423. testValueProviderSorting(1, 2, 3);
  424. }
  425. @Test
  426. public void defaultSorting_strings() {
  427. testValueProviderSorting("a", "b", "c");
  428. }
  429. @Test
  430. public void defaultSorting_notComparable() {
  431. assert !Comparable.class.isAssignableFrom(AtomicInteger.class);
  432. testValueProviderSorting(new AtomicInteger(10), new AtomicInteger(8),
  433. new AtomicInteger(9));
  434. }
  435. @Test
  436. public void defaultSorting_differentComparables() {
  437. testValueProviderSorting(10.1, 200, 3000.1, 4000);
  438. }
  439. @Test
  440. public void defaultSorting_mutuallyComparableTypes() {
  441. testValueProviderSorting(new Date(10), new java.sql.Date(1000000),
  442. new Date(100000000));
  443. }
  444. private static void testValueProviderSorting(Object... expectedOrder) {
  445. SerializableComparator<Object> comparator = new Grid<>()
  446. .addColumn(ValueProvider.identity())
  447. .getComparator(SortDirection.ASCENDING);
  448. Assert.assertNotNull(comparator);
  449. List<Object> values = new ArrayList<>(Arrays.asList(expectedOrder));
  450. Collections.shuffle(values, new Random(42));
  451. Assert.assertArrayEquals(expectedOrder,
  452. values.stream().sorted(comparator).toArray());
  453. }
  454. @Test
  455. public void addBeanColumn_validRenderer() {
  456. Grid<Person> grid = new Grid<>(Person.class);
  457. grid.removeColumn("born");
  458. grid.addColumn("born", new NumberRenderer(new DecimalFormat("#,###",
  459. DecimalFormatSymbols.getInstance(Locale.US))));
  460. Person person = new Person("Name", 2017);
  461. JsonObject rowData = getRowData(grid, person);
  462. String formattedValue = Stream.of(rowData.keys())
  463. .map(rowData::getString).filter(value -> !value.equals("Name"))
  464. .findFirst().orElse(null);
  465. Assert.assertEquals(formattedValue, "2,017");
  466. }
  467. @Test(expected = IllegalArgumentException.class)
  468. public void addBeanColumn_invalidRenderer() {
  469. Grid<Person> grid = new Grid<>(Person.class);
  470. grid.removeColumn("name");
  471. grid.addColumn("name", new NumberRenderer());
  472. }
  473. @Test
  474. public void columnId_sortProperty() {
  475. assertSingleSortProperty(lengthColumn, "length");
  476. }
  477. @Test
  478. public void columnId_sortProperty_noId() {
  479. Assert.assertEquals(0,
  480. objectColumn.getSortOrder(SortDirection.ASCENDING).count());
  481. }
  482. @Test
  483. public void sortProperty_setId_doesntOverride() {
  484. objectColumn.setSortProperty("foo");
  485. objectColumn.setId("bar");
  486. assertSingleSortProperty(objectColumn, "foo");
  487. }
  488. private static void assertSingleSortProperty(Column<?, ?> column,
  489. String expectedProperty) {
  490. QuerySortOrder[] sortOrders = column
  491. .getSortOrder(SortDirection.ASCENDING)
  492. .toArray(QuerySortOrder[]::new);
  493. Assert.assertEquals(1, sortOrders.length);
  494. Assert.assertEquals(SortDirection.ASCENDING,
  495. sortOrders[0].getDirection());
  496. Assert.assertEquals(expectedProperty, sortOrders[0].getSorted());
  497. }
  498. private static <T> JsonObject getRowData(Grid<T> grid, T row) {
  499. JsonObject json = Json.createObject();
  500. if (grid.getColumns().isEmpty()) {
  501. return json;
  502. }
  503. // generateData only works if Grid is attached
  504. new MockUI().setContent(grid);
  505. Method getter = findDataGeneratorGetterMethod();
  506. grid.getColumns().forEach(column -> {
  507. DataGenerator<T> dataGenerator;
  508. try {
  509. dataGenerator = (DataGenerator<T>) getter.invoke(column,
  510. new Object[] {});
  511. dataGenerator.generateData(row, json);
  512. } catch (IllegalAccessException | IllegalArgumentException
  513. | InvocationTargetException e) {
  514. throw new AssertionFailedError(
  515. "Cannot get DataGenerator from Column");
  516. }
  517. });
  518. // Detach again
  519. grid.getUI().setContent(null);
  520. return json.getObject("d");
  521. }
  522. private static Method findDataGeneratorGetterMethod() {
  523. Method getter;
  524. try {
  525. getter = Column.class.getDeclaredMethod("getDataGenerator",
  526. new Class<?>[] {});
  527. getter.setAccessible(true);
  528. return getter;
  529. } catch (NoSuchMethodException | SecurityException e) {
  530. throw new AssertionFailedError(
  531. "Cannot get DataGenerator from Column");
  532. }
  533. }
  534. }