]> source.dussan.org Git - vaadin-framework.git/commitdiff
Fixed tree memory leak when removing expanded items from Tree (based on new Filterabl...
authorJohn Ahlroos <john@vaadin.com>
Thu, 21 Mar 2013 15:09:10 +0000 (17:09 +0200)
committerVaadin Code Review <review@vaadin.com>
Fri, 22 Mar 2013 14:45:02 +0000 (14:45 +0000)
Change-Id: I397124cbfa355417717d2e81bf67b15b202bf16a

server/src/com/vaadin/ui/Tree.java
server/tests/src/com/vaadin/tests/server/component/tree/TreeTest.java

index a6dbea51baa6ec34b74a33bfd4d81e9081e128fe..34cfbaf61bcb32f718410e524e7b6d74e0c7f4c1 100644 (file)
@@ -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 */
 
     /**
index 634e6a86f3ce1a9997154837871a77362b1f19fb..a0d57c4d59568762ab8baee050b0dfd6357b81ff 100644 (file)
@@ -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");