summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--server/src/com/vaadin/ui/Tree.java31
-rw-r--r--server/tests/src/com/vaadin/tests/server/component/tree/TreeTest.java5
2 files changed, 31 insertions, 5 deletions
diff --git a/server/src/com/vaadin/ui/Tree.java b/server/src/com/vaadin/ui/Tree.java
index a6dbea51ba..34cfbaf61b 100644
--- a/server/src/com/vaadin/ui/Tree.java
+++ b/server/src/com/vaadin/ui/Tree.java
@@ -861,6 +861,37 @@ public class Tree extends AbstractSelect implements Container.Hierarchical,
}
+ @Override
+ public void containerItemSetChange(
+ com.vaadin.data.Container.ItemSetChangeEvent event) {
+ super.containerItemSetChange(event);
+ if (getContainerDataSource() instanceof Filterable) {
+ boolean hasFilters = ((Filterable) getContainerDataSource())
+ .hasContainerFilters();
+ if (!hasFilters) {
+ /*
+ * If Container is not filtered then the itemsetchange is caused
+ * by either adding or removing items to the container. To
+ * prevent a memory leak we should cleanup the expanded list
+ * from items which was removed.
+ *
+ * However, there will still be a leak if the container is
+ * filtered to show only a subset of the items in the tree and
+ * later unfiltered items are removed from the container. In
+ * that case references to the unfiltered item ids will remain
+ * in the expanded list until the Tree instance is removed and
+ * the list is destroyed, or the container data source is
+ * replaced/updated. To force the removal of the removed items
+ * the application developer needs to a) remove the container
+ * filters temporarly or b) re-apply the container datasource
+ * using setContainerDataSource(getContainerDataSource())
+ */
+ cleanupExpandedItems();
+ }
+ }
+
+ }
+
/* Expand event and listener */
/**
diff --git a/server/tests/src/com/vaadin/tests/server/component/tree/TreeTest.java b/server/tests/src/com/vaadin/tests/server/component/tree/TreeTest.java
index 634e6a86f3..a0d57c4d59 100644
--- a/server/tests/src/com/vaadin/tests/server/component/tree/TreeTest.java
+++ b/server/tests/src/com/vaadin/tests/server/component/tree/TreeTest.java
@@ -9,7 +9,6 @@ import java.lang.reflect.Field;
import java.util.HashSet;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import com.vaadin.data.Container;
@@ -84,10 +83,6 @@ public class TreeTest {
.getContainerDataSource().getClass()));
}
- @Ignore("This test tests that item ids which are removed are also "
- + "removed from the expand list to prevent a memory leak. "
- + "Fixing the memory leak cannot be done without changing some API (see #11053) "
- + "so ignoring this test for the 7.0.x series.")
@Test
public void testRemoveExpandedItems() throws Exception {
tree.expandItem("parent");