Skip to content

Commit 0a8cc44

Browse files
committed
Added isDirty
1 parent 940ed7e commit 0a8cc44

4 files changed

Lines changed: 64 additions & 33 deletions

File tree

‎src/main/java/org/javawebstack/orm/Model.java‎

Lines changed: 53 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
package org.javawebstack.orm;
22

3-
import com.google.gson.annotations.Expose;
43
import org.javawebstack.injector.Injector;
54
import org.javawebstack.orm.exception.ORMQueryException;
65
import org.javawebstack.orm.query.Query;
76

87
import java.lang.reflect.Field;
98
import java.lang.reflect.InvocationTargetException;
109
import java.lang.reflect.Method;
10+
import java.util.ArrayList;
1111
import java.util.HashMap;
12+
import java.util.List;
1213
import java.util.Map;
1314
import java.util.function.Function;
1415

@@ -22,6 +23,7 @@ public class Model {
2223

2324
{
2425
inject();
26+
updateOriginal();
2527
}
2628

2729
static {
@@ -36,20 +38,61 @@ public class Model {
3638
}
3739
}
3840

39-
@Expose(serialize = false, deserialize = false)
40-
private boolean internalEntryExists = false;
41-
@Expose(serialize = false, deserialize = false)
42-
private final Map<Class<? extends Model>, Object> internalJoinedModels = new HashMap<>();
43-
@Expose(serialize = false, deserialize = false)
44-
private final Map<String, Object> internalLastValue = new HashMap<>();
41+
private transient boolean internalEntryExists = false;
42+
private transient final Map<Class<? extends Model>, Object> internalJoinedModels = new HashMap<>();
43+
private transient Map<String, Object> internalOriginalValues = new HashMap<>();
4544

4645
void internalAddJoinedModel(Class<? extends Model> type, Object entity) {
4746
internalJoinedModels.put(type, entity);
4847
}
4948

50-
void internalSetLastValue(String key, Object value) {
51-
if (value == null) internalLastValue.remove(key);
52-
else internalLastValue.put(key, value);
49+
void updateOriginal() {
50+
internalOriginalValues = getFieldValues();
51+
}
52+
53+
public Map<String, Object> getFieldValues() {
54+
TableInfo info = Repo.get(getClass()).getInfo();
55+
Map<String, Object> values = new HashMap<>();
56+
for(String field : info.getFields()) {
57+
try {
58+
values.put(field, info.getField(field).get(this));
59+
} catch (IllegalAccessException ignored) { }
60+
}
61+
return values;
62+
}
63+
64+
public Map<String, Object> getOriginalValues() {
65+
return internalOriginalValues;
66+
}
67+
68+
public <T> T getOriginalValue(String field) {
69+
if(internalOriginalValues.get(field) == null)
70+
return null;
71+
return (T) internalOriginalValues.get(field);
72+
}
73+
74+
public boolean isDirty(String... fields) {
75+
List<String> dirty = getDirtyFields();
76+
for(String f : fields) {
77+
if(dirty.contains(f))
78+
return true;
79+
}
80+
return false;
81+
}
82+
83+
public List<String> getDirtyFields() {
84+
List<String> dirty = new ArrayList<>();
85+
Map<String, Object> original = getOriginalValues();
86+
Map<String, Object> current = getFieldValues();
87+
for(String key : current.keySet()) {
88+
Object o = original.get(key);
89+
Object c = current.get(key);
90+
if(o == null && c == null)
91+
continue;
92+
if(o == null || !o.equals(c))
93+
dirty.add(key);
94+
}
95+
return dirty;
5396
}
5497

5598
public <T extends Model> T getJoined(Class<T> model) {
@@ -68,26 +111,6 @@ void setEntryExists(boolean exists) {
68111
this.internalEntryExists = exists;
69112
}
70113

71-
@Deprecated
72-
public boolean isDirty(String... fields) {
73-
Repo<?> repo = Repo.get(getClass());
74-
for (String field : fields) {
75-
try {
76-
Object value = repo.getInfo().getField(field).get(this);
77-
Object oldValue = internalLastValue.get(field);
78-
if ((value == null && oldValue != null) || (oldValue == null && value != null))
79-
return true;
80-
if (value == null)
81-
continue;
82-
if (!value.equals(oldValue))
83-
return true;
84-
} catch (IllegalAccessException e) {
85-
throw new ORMQueryException(e);
86-
}
87-
}
88-
return false;
89-
}
90-
91114
public void inject() {
92115
Injector injector = Repo.get(getClass()).getInfo().getConfig().getInjector();
93116
if (injector != null)

‎src/main/java/org/javawebstack/orm/ORM.java‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,4 +67,8 @@ public static void autoMigrate(boolean fresh) {
6767
AutoMigrator.migrate(fresh, repositories.values().toArray(new Repo<?>[0]));
6868
}
6969

70+
public void reset() {
71+
repositories.clear();
72+
}
73+
7074
}

‎src/main/java/org/javawebstack/orm/Repo.java‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ public void create(T entry) {
107107
executeCreate(entry);
108108
observers.forEach(o -> o.created(entry));
109109
observers.forEach(o -> o.saved(entry));
110+
entry.updateOriginal();
110111
}
111112

112113
private void executeCreate(T entry) {
@@ -159,6 +160,7 @@ public void update(T entry) {
159160
where(info.getIdField(), getId(entry)).update(entry);
160161
observers.forEach(o -> o.updated(entry));
161162
observers.forEach(o -> o.saved(entry));
163+
entry.updateOriginal();
162164
}
163165

164166
public void delete(T entry) {
@@ -172,6 +174,7 @@ public void delete(T entry) {
172174
}
173175
}
174176
observers.forEach(o -> o.deleted(entry));
177+
entry.updateOriginal();
175178
}
176179

177180
public void restore(T entry) {
@@ -192,7 +195,9 @@ public void finalDelete(T entry) {
192195
}
193196

194197
public T refresh(T entry) {
195-
return where(info.getIdField(), getId(entry)).refresh(entry);
198+
where(info.getIdField(), getId(entry)).refresh(entry);
199+
entry.updateOriginal();
200+
return entry;
196201
}
197202

198203
public T get(Object id) {

‎src/main/java/org/javawebstack/orm/SQLMapper.java‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,9 @@ public static <T extends Model> T mapBack(Repo<T> repo, ResultSet rs, T t) {
5050
t.setEntryExists(true);
5151
for (String fieldName : repo.getInfo().getFields()) {
5252
Object value = getValue(rs, repo.getInfo().getType(fieldName).getJavaType(), repo.getInfo().getTableName(), repo.getInfo().getColumnName(fieldName));
53-
t.internalSetLastValue(fieldName, value);
5453
setValue(repo, fieldName, t, value);
5554
}
55+
t.updateOriginal();
5656
return t;
5757
}
5858

@@ -125,7 +125,6 @@ private static <T extends Model> void setValue(Repo<T> repo, String fieldName, T
125125
for (TypeMapper mapper : repo.getInfo().getConfig().getTypeMappers())
126126
value = mapper.mapToJava(value, repo.getInfo().getField(fieldName).getType());
127127
repo.getInfo().getField(fieldName).set(entry, value);
128-
entry.internalSetLastValue(fieldName, value);
129128
} catch (IllegalAccessException e) {
130129
throw new ORMQueryException(e);
131130
}

0 commit comments

Comments
 (0)