diff --git a/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareOwner.java b/ebean-api/src/main/java/io/ebean/ModifyAwareType.java
similarity index 54%
rename from ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareOwner.java
rename to ebean-api/src/main/java/io/ebean/ModifyAwareType.java
index 6d3b048d5..f846eecf4 100644
--- a/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareOwner.java
+++ b/ebean-api/src/main/java/io/ebean/ModifyAwareType.java
@@ -1,11 +1,9 @@
-package io.ebeaninternal.json;
-
-import java.io.Serializable;
+package io.ebean;
/**
* Owner object notified when a modification is detected.
*/
-public interface ModifyAwareOwner extends Serializable {
+public interface ModifyAwareType {
/**
* Return true if the value is considered dirty.
@@ -16,11 +14,6 @@ public interface ModifyAwareOwner extends Serializable {
/**
* Marks the object as modified.
*/
- void markAsModified();
-
- /**
- * Reset the dirty state to clean.
- */
- void resetMarkedDirty();
+ void setMarkedDirty(boolean markedDirty);
}
diff --git a/ebean-core/src/main/java/io/ebeaninternal/json/EJsonReader.java b/ebean-core/src/main/java/io/ebeaninternal/json/EJsonReader.java
index 2b36f54f5..fa3451f8e 100644
--- a/ebean-core/src/main/java/io/ebeaninternal/json/EJsonReader.java
+++ b/ebean-core/src/main/java/io/ebeaninternal/json/EJsonReader.java
@@ -3,6 +3,7 @@ package io.ebeaninternal.json;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
+import io.ebean.ModifyAwareType;
import java.io.IOException;
import java.io.Reader;
@@ -145,7 +146,7 @@ class EJsonReader {
currentContext = stack.pop(currentContext);
}
if (modifyAwareOwner != null) {
- modifyAwareOwner.resetMarkedDirty();
+ modifyAwareOwner.setMarkedDirty(false);
}
}
@@ -296,7 +297,7 @@ class EJsonReader {
map = new LinkedHashMap<>();
}
- ObjectContext(ModifyAwareOwner owner) {
+ ObjectContext(ModifyAwareType owner) {
map = new ModifyAwareMap<>(owner, new LinkedHashMap<>());
}
@@ -334,7 +335,7 @@ class EJsonReader {
values = new ArrayList<>();
}
- ArrayContext(ModifyAwareOwner owner) {
+ ArrayContext(ModifyAwareType owner) {
values = new ModifyAwareList<>(owner, new ArrayList<>());
}
diff --git a/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareFlag.java b/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareFlag.java
index 45b6d9ab9..911675605 100644
--- a/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareFlag.java
+++ b/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareFlag.java
@@ -1,28 +1,26 @@
package io.ebeaninternal.json;
+import io.ebean.ModifyAwareType;
+
+import java.io.Serializable;
+
/**
* Detects when content has been modified and as such needs to be persisted (included in an update).
*/
-public class ModifyAwareFlag implements ModifyAwareOwner {
+public class ModifyAwareFlag implements ModifyAwareType, Serializable {
private static final long serialVersionUID = 1;
- boolean dirty;
+ private boolean markedDirty;
@Override
public boolean isMarkedDirty() {
- if (!dirty) return false;
- dirty = false;
- return true;
+ return markedDirty;
}
@Override
- public void markAsModified() {
- dirty = true;
+ public void setMarkedDirty(boolean markedDirty) {
+ this.markedDirty = markedDirty;
}
- @Override
- public void resetMarkedDirty() {
- dirty = false;
- }
}
diff --git a/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareIterator.java b/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareIterator.java
index 848395782..7e21e297f 100644
--- a/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareIterator.java
+++ b/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareIterator.java
@@ -1,5 +1,7 @@
package io.ebeaninternal.json;
+import io.ebean.ModifyAwareType;
+
import java.util.Iterator;
/**
@@ -7,7 +9,7 @@ import java.util.Iterator;
*/
public class ModifyAwareIterator implements Iterator {
- private final ModifyAwareOwner owner;
+ private final ModifyAwareType owner;
private final Iterator it;
@@ -17,7 +19,7 @@ public class ModifyAwareIterator implements Iterator {
* The owner is notified of the removals.
*
*/
- public ModifyAwareIterator(ModifyAwareOwner owner, Iterator it) {
+ public ModifyAwareIterator(ModifyAwareType owner, Iterator it) {
this.owner = owner;
this.it = it;
}
@@ -34,7 +36,7 @@ public class ModifyAwareIterator implements Iterator {
@Override
public void remove() {
- owner.markAsModified();
+ owner.setMarkedDirty(true);
it.remove();
}
diff --git a/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareList.java b/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareList.java
index 197f02466..7803871df 100644
--- a/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareList.java
+++ b/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareList.java
@@ -1,5 +1,8 @@
package io.ebeaninternal.json;
+import io.ebean.ModifyAwareType;
+
+import java.io.Serializable;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedHashSet;
@@ -10,20 +13,20 @@ import java.util.Objects;
/**
* Modify aware wrapper of a list.
*/
-public class ModifyAwareList implements List, ModifyAwareOwner {
+public class ModifyAwareList implements List, ModifyAwareType, Serializable {
private static final long serialVersionUID = 1;
final List list;
- final ModifyAwareOwner owner;
+ final ModifyAwareType owner;
public ModifyAwareList(List list) {
this.list = list;
this.owner = new ModifyAwareFlag();
}
- public ModifyAwareList(ModifyAwareOwner owner, List list) {
+ public ModifyAwareList(ModifyAwareType owner, List list) {
this.list = list;
this.owner = owner;
}
@@ -56,13 +59,12 @@ public class ModifyAwareList implements List, ModifyAwareOwner {
}
@Override
- public void markAsModified() {
- owner.markAsModified();
+ public void setMarkedDirty(boolean markedDirty) {
+ owner.setMarkedDirty(markedDirty);
}
- @Override
- public void resetMarkedDirty() {
- owner.resetMarkedDirty();
+ private void markAsDirty() {
+ owner.setMarkedDirty(true);
}
@Override
@@ -98,13 +100,13 @@ public class ModifyAwareList implements List, ModifyAwareOwner {
@Override
public boolean add(E e) {
- owner.markAsModified();
+ markAsDirty();
return list.add(e);
}
@Override
public boolean remove(Object o) {
- owner.markAsModified();
+ markAsDirty();
return list.remove(o);
}
@@ -115,31 +117,31 @@ public class ModifyAwareList implements List, ModifyAwareOwner {
@Override
public boolean addAll(Collection extends E> c) {
- owner.markAsModified();
+ markAsDirty();
return list.addAll(c);
}
@Override
public boolean addAll(int index, Collection extends E> c) {
- owner.markAsModified();
+ markAsDirty();
return list.addAll(index, c);
}
@Override
public boolean removeAll(Collection> c) {
- owner.markAsModified();
+ markAsDirty();
return list.removeAll(c);
}
@Override
public boolean retainAll(Collection> c) {
- owner.markAsModified();
+ markAsDirty();
return list.retainAll(c);
}
@Override
public void clear() {
- owner.markAsModified();
+ markAsDirty();
list.clear();
}
@@ -150,19 +152,19 @@ public class ModifyAwareList implements List, ModifyAwareOwner {
@Override
public E set(int index, E element) {
- owner.markAsModified();
+ markAsDirty();
return list.set(index, element);
}
@Override
public void add(int index, E element) {
- owner.markAsModified();
+ markAsDirty();
list.add(index, element);
}
@Override
public E remove(int index) {
- owner.markAsModified();
+ markAsDirty();
return list.remove(index);
}
@@ -195,7 +197,6 @@ public class ModifyAwareList implements List, ModifyAwareOwner {
* Create an return a modify aware Set.
*/
public ModifyAwareSet asSet() {
-
return new ModifyAwareSet<>(owner, new LinkedHashSet<>(list));
}
}
diff --git a/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareListIterator.java b/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareListIterator.java
index 9b57442f3..5f6d5f013 100644
--- a/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareListIterator.java
+++ b/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareListIterator.java
@@ -1,5 +1,7 @@
package io.ebeaninternal.json;
+import io.ebean.ModifyAwareType;
+
import java.util.ListIterator;
/**
@@ -7,11 +9,11 @@ import java.util.ListIterator;
*/
public class ModifyAwareListIterator implements ListIterator {
- final ModifyAwareOwner owner;
+ final ModifyAwareType owner;
final ListIterator iterator;
- public ModifyAwareListIterator(ModifyAwareOwner owner, ListIterator iterator) {
+ public ModifyAwareListIterator(ModifyAwareType owner, ListIterator iterator) {
this.owner = owner;
this.iterator = iterator;
}
@@ -48,19 +50,19 @@ public class ModifyAwareListIterator implements ListIterator {
@Override
public void remove() {
- owner.markAsModified();
+ owner.setMarkedDirty(true);
iterator.remove();
}
@Override
public void set(E e) {
- owner.markAsModified();
+ owner.setMarkedDirty(true);
iterator.set(e);
}
@Override
public void add(E e) {
- owner.markAsModified();
+ owner.setMarkedDirty(true);
iterator.add(e);
}
}
diff --git a/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareMap.java b/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareMap.java
index 74eb81c87..9d5e1fffe 100644
--- a/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareMap.java
+++ b/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareMap.java
@@ -1,5 +1,8 @@
package io.ebeaninternal.json;
+import io.ebean.ModifyAwareType;
+
+import java.io.Serializable;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.Map;
@@ -9,11 +12,11 @@ import java.util.Set;
/**
* Map that is wraps an underlying map for the purpose of detecting changes.
*/
-public class ModifyAwareMap implements Map, ModifyAwareOwner {
+public class ModifyAwareMap implements Map, ModifyAwareType, Serializable {
private static final long serialVersionUID = 1;
- final ModifyAwareOwner owner;
+ final ModifyAwareType owner;
/**
* The underlying map.
@@ -25,7 +28,7 @@ public class ModifyAwareMap implements Map, ModifyAwareOwner {
this.owner = new ModifyAwareFlag();
}
- public ModifyAwareMap(ModifyAwareOwner owner, Map underlying) {
+ public ModifyAwareMap(ModifyAwareType owner, Map underlying) {
this.owner = owner;
this.map = underlying;
}
@@ -58,13 +61,12 @@ public class ModifyAwareMap implements Map, ModifyAwareOwner {
}
@Override
- public void markAsModified() {
- owner.markAsModified();
+ public void setMarkedDirty(boolean markedDirty) {
+ owner.setMarkedDirty(markedDirty);
}
- @Override
- public void resetMarkedDirty() {
- owner.resetMarkedDirty();
+ private void markAsDirty() {
+ owner.setMarkedDirty(true);
}
@Override
@@ -94,7 +96,7 @@ public class ModifyAwareMap implements Map, ModifyAwareOwner {
@Override
public V put(K key, V value) {
- markAsModified();
+ markAsDirty();
return map.put(key, value);
}
@@ -102,14 +104,14 @@ public class ModifyAwareMap implements Map, ModifyAwareOwner {
public V remove(Object key) {
V value = map.remove(key);
if (value != null) {
- markAsModified();
+ markAsDirty();
}
return value;
}
@Override
public void putAll(Map extends K, ? extends V> m) {
- markAsModified();
+ markAsDirty();
map.putAll(m);
}
@@ -117,7 +119,7 @@ public class ModifyAwareMap implements Map, ModifyAwareOwner {
@Override
public void clear() {
if (!map.isEmpty()) {
- markAsModified();
+ markAsDirty();
}
map.clear();
}
diff --git a/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareSet.java b/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareSet.java
index f80b16347..f20b39602 100644
--- a/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareSet.java
+++ b/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareSet.java
@@ -1,5 +1,8 @@
package io.ebeaninternal.json;
+import io.ebean.ModifyAwareType;
+
+import java.io.Serializable;
import java.util.Collection;
import java.util.Iterator;
import java.util.Objects;
@@ -8,11 +11,11 @@ import java.util.Set;
/**
* Wraps a Set for the purposes of detecting modifications.
*/
-public class ModifyAwareSet implements Set, ModifyAwareOwner {
+public class ModifyAwareSet implements Set, ModifyAwareType, Serializable {
private static final long serialVersionUID = 1;
- protected final ModifyAwareOwner owner;
+ protected final ModifyAwareType owner;
protected final Set set;
@@ -26,7 +29,7 @@ public class ModifyAwareSet implements Set, ModifyAwareOwner {
/**
* Create with an Owner that is notified of modifications.
*/
- public ModifyAwareSet(ModifyAwareOwner owner, Set underlying) {
+ public ModifyAwareSet(ModifyAwareType owner, Set underlying) {
this.owner = owner;
this.set = underlying;
}
@@ -37,16 +40,14 @@ public class ModifyAwareSet implements Set, ModifyAwareOwner {
}
@Override
- public void markAsModified() {
- owner.markAsModified();
+ public void setMarkedDirty(boolean markedDirty) {
+ owner.setMarkedDirty(markedDirty);
}
- @Override
- public void resetMarkedDirty() {
- owner.resetMarkedDirty();
+ private void markAsDirty() {
+ owner.setMarkedDirty(true);
}
-
@Override
public String toString() {
return set.toString();
@@ -72,7 +73,7 @@ public class ModifyAwareSet implements Set, ModifyAwareOwner {
@Override
public boolean add(E o) {
if (set.add(o)) {
- owner.markAsModified();
+ markAsDirty();
return true;
}
return false;
@@ -83,7 +84,7 @@ public class ModifyAwareSet implements Set, ModifyAwareOwner {
boolean changed = false;
for (E o : collection) {
if (set.add(o)) {
- owner.markAsModified();
+ markAsDirty();
changed = true;
}
}
@@ -93,7 +94,7 @@ public class ModifyAwareSet implements Set, ModifyAwareOwner {
@Override
public void clear() {
if (!set.isEmpty()) {
- owner.markAsModified();
+ markAsDirty();
}
set.clear();
}
@@ -121,7 +122,7 @@ public class ModifyAwareSet implements Set, ModifyAwareOwner {
@Override
public boolean remove(Object o) {
if (set.remove(o)) {
- owner.markAsModified();
+ markAsDirty();
return true;
}
return false;
@@ -132,7 +133,7 @@ public class ModifyAwareSet implements Set, ModifyAwareOwner {
boolean changed = false;
for (Object element : collection) {
if (set.remove(element)) {
- owner.markAsModified();
+ markAsDirty();
changed = true;
}
}
@@ -147,7 +148,7 @@ public class ModifyAwareSet implements Set, ModifyAwareOwner {
Object o = it.next();
if (!collection.contains(o)) {
it.remove();
- owner.markAsModified();
+ markAsDirty();
changed = true;
}
}
diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/CheckMarkedDirty.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/CheckMarkedDirty.java
new file mode 100644
index 000000000..321a35fec
--- /dev/null
+++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/CheckMarkedDirty.java
@@ -0,0 +1,26 @@
+package io.ebeaninternal.server.type;
+
+import io.ebean.ModifyAwareType;
+
+/**
+ * Check dirty state of json value which might be modify aware.
+ */
+class CheckMarkedDirty {
+
+ /**
+ * Return true if the value should be considered dirty (and included in an update).
+ */
+ static boolean isDirty(Object value) {
+ if (value instanceof ModifyAwareType) {
+ ModifyAwareType modifyAware = (ModifyAwareType) value;
+ if (modifyAware.isMarkedDirty()) {
+ // reset the dirty state (consider not dirty after update)
+ modifyAware.setMarkedDirty(false);
+ return true;
+ } else {
+ return false;
+ }
+ }
+ return true;
+ }
+}
diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonCollection.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonCollection.java
index fbbd92855..a6c51ff05 100644
--- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonCollection.java
+++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonCollection.java
@@ -2,7 +2,6 @@ package io.ebeaninternal.server.type;
import io.ebean.core.type.DataBinder;
import io.ebean.core.type.DocPropertyType;
-import io.ebeaninternal.json.ModifyAwareOwner;
import java.io.DataInput;
import java.io.DataOutput;
@@ -62,7 +61,7 @@ abstract class ScalarTypeJsonCollection extends ScalarTypeBase implements
*/
@Override
public boolean isDirty(Object value) {
- return !(value instanceof ModifyAwareOwner) || ((ModifyAwareOwner) value).isMarkedDirty();
+ return CheckMarkedDirty.isDirty(value);
}
@Override
diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonMap.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonMap.java
index 4d2b64b59..f0714c467 100644
--- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonMap.java
+++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonMap.java
@@ -8,7 +8,6 @@ import io.ebean.core.type.DataReader;
import io.ebean.core.type.DocPropertyType;
import io.ebean.text.TextException;
import io.ebean.text.json.EJson;
-import io.ebeaninternal.json.ModifyAwareOwner;
import java.io.DataInput;
import java.io.DataOutput;
@@ -124,7 +123,7 @@ public abstract class ScalarTypeJsonMap extends ScalarTypeBase