]> source.dussan.org Git - vaadin-framework.git/commitdiff
Fix FieldGroup and TransactionalPropertyWrapper memory leaks (#13438)
authorTeemu Suo-Anttila <teemusa@vaadin.com>
Mon, 14 Apr 2014 07:19:17 +0000 (10:19 +0300)
committerTeemu Suo-Anttila <teemusa@vaadin.com>
Mon, 14 Apr 2014 09:03:50 +0000 (09:03 +0000)
Change-Id: Ifafb6d87b4280f8bd9e631235fff62f42de4b4c8

server/src/com/vaadin/data/fieldgroup/FieldGroup.java
server/src/com/vaadin/data/util/TransactionalPropertyWrapper.java

index 23f2da53ceaf26f383301e083977654c718c6aa2..c5f9907610ab8b9797da5fbd975abaec8c55836a 100644 (file)
@@ -316,12 +316,18 @@ public class FieldGroup implements Serializable {
                     "The given field is not part of this FieldBinder");
         }
 
+        TransactionalPropertyWrapper<?> wrapper = null;
         Property fieldDataSource = field.getPropertyDataSource();
         if (fieldDataSource instanceof TransactionalPropertyWrapper) {
-            fieldDataSource = ((TransactionalPropertyWrapper) fieldDataSource)
+            wrapper = (TransactionalPropertyWrapper<?>) fieldDataSource;
+            fieldDataSource = ((TransactionalPropertyWrapper<?>) fieldDataSource)
                     .getWrappedProperty();
+
         }
         if (fieldDataSource == getItemProperty(propertyId)) {
+            if (null != wrapper) {
+                wrapper.detachFromProperty();
+            }
             field.setPropertyDataSource(null);
         }
         fieldToPropertyId.remove(field);
index 6b0119c50366e8f62cb8a5baea99105833ddfaa5..3bac5bdfb88b023cc9ea51af5b3303f7302329cf 100644 (file)
@@ -48,18 +48,32 @@ public class TransactionalPropertyWrapper<T> extends AbstractProperty<T>
     private boolean inTransaction = false;
     private boolean valueChangePending;
     private T valueBeforeTransaction;
+    private final ValueChangeListener listener = new ValueChangeListener() {
+
+        @Override
+        public void valueChange(ValueChangeEvent event) {
+            fireValueChange();
+        }
+    };
 
     public TransactionalPropertyWrapper(Property<T> wrappedProperty) {
         this.wrappedProperty = wrappedProperty;
         if (wrappedProperty instanceof ValueChangeNotifier) {
             ((ValueChangeNotifier) wrappedProperty)
-                    .addListener(new ValueChangeListener() {
+                    .addValueChangeListener(listener);
+        }
+    }
 
-                        @Override
-                        public void valueChange(ValueChangeEvent event) {
-                            fireValueChange();
-                        }
-                    });
+    /**
+     * Removes the ValueChangeListener from wrapped Property that was added by
+     * TransactionalPropertyWrapper.
+     * 
+     * @since 7.1.14
+     */
+    public void detachFromProperty() {
+        if (wrappedProperty instanceof ValueChangeNotifier) {
+            ((ValueChangeNotifier) wrappedProperty)
+                    .removeValueChangeListener(listener);
         }
     }