package nebula.data.impl; import java.util.HashMap; import java.util.Map; import nebula.data.Editable; import nebula.data.Entity; public class EditableEntity extends EntityImp implements Editable { final Map<String, Object> newData; EntityImp source; boolean dirty = false;// <->pristine boolean valid = true;// <->invalid EditableEntity(DataStoreEx<Entity> store) { super(store, null); this.source = null; this.newData = new HashMap<String, Object>(); } EditableEntity(DataStoreEx<Entity> store, EntityImp source) { super(store, source.data); this.source = source; this.newData = new HashMap<String, Object>(); } public EditableEntity() { super(null, null); this.source = null; this.newData = new HashMap<String, Object>(); } void resetWith(EntityImp source) { this.newData.clear(); this.dirty = false; this.source = source; this.data = source.data; } @SuppressWarnings("unchecked") @Override public <T> T get(String name) { return newData.containsKey(name) || data == null ? (T)newData.get(name) : (T)data.get(name); } public void put(String name, Object v) { newData.put(name, v); if (!this.dirty && data != null) { store.markChanged(this); } this.dirty = true; } public boolean isDirty() { return dirty; } @Override public String toString() { return "EditableEntity {" + newData.toString() + "}"; } @Override public boolean isFresh() { return true; } @Override public void apply() { this.store.apply(this); } }