Commit 0594ff2
Previously, TreeData.setParent() only checked for direct self-parenting
(item.equals(parent)) but did not detect transitive cycles where a
descendant becomes an ancestor. This could corrupt the tree structure,
for example when drag-and-drop in TreeGrid moved a parent node under
one of its descendants.
Added isAncestorOf() helper method that walks up the ancestor chain
to detect if the item being moved is an ancestor of the proposed new
parent. If so, setParent() now throws IllegalArgumentException with
a clear error message.
The cycle check has O(h) complexity where h is the tree height, which
is acceptable for typical tree operations.
Fixes #19337
Co-authored-by: Marco Collovati <marco@vaadin.com>
1 parent 398d3ea commit 0594ff2
File tree
2 files changed
+67
-0
lines changed- flow-data/src
- main/java/com/vaadin/flow/data/provider/hierarchy
- test/java/com/vaadin/flow/data/provider/hierarchy
2 files changed
+67
-0
lines changedLines changed: 33 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
400 | 400 | | |
401 | 401 | | |
402 | 402 | | |
| 403 | + | |
| 404 | + | |
| 405 | + | |
| 406 | + | |
| 407 | + | |
| 408 | + | |
| 409 | + | |
| 410 | + | |
403 | 411 | | |
404 | 412 | | |
405 | 413 | | |
| |||
488 | 496 | | |
489 | 497 | | |
490 | 498 | | |
| 499 | + | |
| 500 | + | |
| 501 | + | |
| 502 | + | |
| 503 | + | |
| 504 | + | |
| 505 | + | |
| 506 | + | |
| 507 | + | |
| 508 | + | |
| 509 | + | |
| 510 | + | |
| 511 | + | |
| 512 | + | |
| 513 | + | |
| 514 | + | |
| 515 | + | |
| 516 | + | |
| 517 | + | |
| 518 | + | |
| 519 | + | |
| 520 | + | |
| 521 | + | |
| 522 | + | |
| 523 | + | |
491 | 524 | | |
Lines changed: 34 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
27 | 27 | | |
28 | 28 | | |
29 | 29 | | |
| 30 | + | |
30 | 31 | | |
31 | 32 | | |
32 | 33 | | |
| |||
167 | 168 | | |
168 | 169 | | |
169 | 170 | | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
170 | 204 | | |
171 | 205 | | |
172 | 206 | | |
| |||
0 commit comments