11package org .javawebstack .orm ;
22
3- import com .google .gson .annotations .Expose ;
43import org .javawebstack .injector .Injector ;
54import org .javawebstack .orm .exception .ORMQueryException ;
65import org .javawebstack .orm .query .Query ;
76
87import java .lang .reflect .Field ;
98import java .lang .reflect .InvocationTargetException ;
109import java .lang .reflect .Method ;
10+ import java .util .ArrayList ;
1111import java .util .HashMap ;
12+ import java .util .List ;
1213import java .util .Map ;
1314import 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 )
0 commit comments