From 7b8a85106c28cfc3513da61d59030c2074ff8a37 Mon Sep 17 00:00:00 2001 From: Roland Praml Date: Mon, 19 Jun 2017 12:50:20 +0200 Subject: [PATCH] FIX: deleting and adding same bean in beanCollection leads to deletion in DB (#1035) --- .../ebean/common/AbstractBeanCollection.java | 4 ++++ src/main/java/io/ebean/common/BeanList.java | 18 +++++++++--------- src/main/java/io/ebean/common/BeanMap.java | 4 ++-- src/main/java/io/ebean/common/BeanSet.java | 12 ++++++------ .../java/io/ebean/common/ModifyHolder.java | 12 ++++++++++-- 5 files changed, 31 insertions(+), 19 deletions(-) diff --git a/src/main/java/io/ebean/common/AbstractBeanCollection.java b/src/main/java/io/ebean/common/AbstractBeanCollection.java index 5aceb959e..8f6e4bf2c 100644 --- a/src/main/java/io/ebean/common/AbstractBeanCollection.java +++ b/src/main/java/io/ebean/common/AbstractBeanCollection.java @@ -175,6 +175,8 @@ abstract class AbstractBeanCollection implements BeanCollection { public void modifyAddition(E bean) { if (modifyAddListening) { getModifyHolder().modifyAddition(bean); + } else if (modifyRemoveListening) { + getModifyHolder().undoDeletion(bean); } } @@ -182,6 +184,8 @@ abstract class AbstractBeanCollection implements BeanCollection { public void modifyRemoval(Object bean) { if (modifyRemoveListening) { getModifyHolder().modifyRemoval(bean); + } else if (modifyAddListening) { + getModifyHolder().undoAddition(bean); } } diff --git a/src/main/java/io/ebean/common/BeanList.java b/src/main/java/io/ebean/common/BeanList.java index 2093c5177..c11ed6179 100644 --- a/src/main/java/io/ebean/common/BeanList.java +++ b/src/main/java/io/ebean/common/BeanList.java @@ -232,7 +232,7 @@ public final class BeanList extends AbstractBeanCollection implements List public void add(int index, E element) { checkReadOnly(); init(); - if (modifyAddListening) { + if (modifyListening) { modifyAddition(element); } list.add(index, element); @@ -247,7 +247,7 @@ public final class BeanList extends AbstractBeanCollection implements List public boolean add(E o) { checkReadOnly(); init(); - if (modifyAddListening) { + if (modifyListening) { if (list.add(o)) { modifyAddition(o); return true; @@ -262,7 +262,7 @@ public final class BeanList extends AbstractBeanCollection implements List public boolean addAll(Collection c) { checkReadOnly(); init(); - if (modifyAddListening) { + if (modifyListening) { // all elements in c are added (no contains checking) getModifyHolder().modifyAdditionAll(c); } @@ -273,7 +273,7 @@ public final class BeanList extends AbstractBeanCollection implements List public boolean addAll(int index, Collection c) { checkReadOnly(); init(); - if (modifyAddListening) { + if (modifyListening) { // all elements in c are added (no contains checking) getModifyHolder().modifyAdditionAll(c); } @@ -286,7 +286,7 @@ public final class BeanList extends AbstractBeanCollection implements List // TODO: when clear() and not initialised could be more clever // and fetch just the Id's initClear(); - if (modifyRemoveListening) { + if (modifyListening) { for (E aList : list) { getModifyHolder().modifyRemoval(aList); } @@ -380,7 +380,7 @@ public final class BeanList extends AbstractBeanCollection implements List public E remove(int index) { checkReadOnly(); init(); - if (modifyRemoveListening) { + if (modifyListening) { E o = list.remove(index); modifyRemoval(o); return o; @@ -392,7 +392,7 @@ public final class BeanList extends AbstractBeanCollection implements List public boolean remove(Object o) { checkReadOnly(); init(); - if (modifyRemoveListening) { + if (modifyListening) { boolean isRemove = list.remove(o); if (isRemove) { modifyRemoval(o); @@ -406,7 +406,7 @@ public final class BeanList extends AbstractBeanCollection implements List public boolean removeAll(Collection beans) { checkReadOnly(); init(); - if (modifyRemoveListening) { + if (modifyListening) { boolean changed = false; for (Object bean : beans) { if (list.remove(bean)) { @@ -424,7 +424,7 @@ public final class BeanList extends AbstractBeanCollection implements List public boolean retainAll(Collection retainBeans) { checkReadOnly(); init(); - if (modifyRemoveListening) { + if (modifyListening) { boolean changed = false; Iterator it = list.iterator(); while (it.hasNext()) { diff --git a/src/main/java/io/ebean/common/BeanMap.java b/src/main/java/io/ebean/common/BeanMap.java index 7bf211ee1..0d049df0a 100644 --- a/src/main/java/io/ebean/common/BeanMap.java +++ b/src/main/java/io/ebean/common/BeanMap.java @@ -211,7 +211,7 @@ public final class BeanMap extends AbstractBeanCollection implements Ma public void clear() { checkReadOnly(); initClear(); - if (modifyRemoveListening) { + if (modifyListening) { // add all beans to the removal list for (E bean : map.values()) { modifyRemoval(bean); @@ -313,7 +313,7 @@ public final class BeanMap extends AbstractBeanCollection implements Ma public E remove(Object key) { checkReadOnly(); init(); - if (modifyRemoveListening) { + if (modifyListening) { E o = map.remove(key); modifyRemoval(o); return o; diff --git a/src/main/java/io/ebean/common/BeanSet.java b/src/main/java/io/ebean/common/BeanSet.java index e0dfa4f8d..6ad3e0072 100644 --- a/src/main/java/io/ebean/common/BeanSet.java +++ b/src/main/java/io/ebean/common/BeanSet.java @@ -210,7 +210,7 @@ public final class BeanSet extends AbstractBeanCollection implements Set extends AbstractBeanCollection implements Set addCollection) { checkReadOnly(); init(); - if (modifyAddListening) { + if (modifyListening) { boolean changed = false; for (E bean : addCollection) { if (set.add(bean)) { @@ -243,7 +243,7 @@ public final class BeanSet extends AbstractBeanCollection implements Set extends AbstractBeanCollection implements Set extends AbstractBeanCollection implements Set beans) { checkReadOnly(); init(); - if (modifyRemoveListening) { + if (modifyListening) { boolean changed = false; for (Object bean : beans) { if (set.remove(bean)) { @@ -316,7 +316,7 @@ public final class BeanSet extends AbstractBeanCollection implements Set beans) { checkReadOnly(); init(); - if (modifyRemoveListening) { + if (modifyListening) { boolean changed = false; Iterator it = set.iterator(); while (it.hasNext()) { diff --git a/src/main/java/io/ebean/common/ModifyHolder.java b/src/main/java/io/ebean/common/ModifyHolder.java index 51971dc13..e618ac0bc 100644 --- a/src/main/java/io/ebean/common/ModifyHolder.java +++ b/src/main/java/io/ebean/common/ModifyHolder.java @@ -44,21 +44,29 @@ class ModifyHolder implements Serializable { } } + boolean undoDeletion(E bean) { + return (bean != null) && modifyDeletions.remove(bean); + } + void modifyAddition(E bean) { if (bean != null) { // If it is to delete then just remove the deletion - if (!modifyDeletions.remove(bean)) { + if (!undoDeletion(bean)) { // Insert modifyAdditions.add(bean); } } } + boolean undoAddition(Object bean) { + return (bean != null) && modifyAdditions.remove(bean); + } + @SuppressWarnings("unchecked") void modifyRemoval(Object bean) { if (bean != null) { // If it is to be added then just remove the addition - if (!modifyAdditions.remove(bean)) { + if (!undoAddition(bean)) { modifyDeletions.add((E) bean); } }