package regexgolf2.services.persistence.changetracking;
import regexgolf2.model.ObjectChangedListener;
import regexgolf2.model.ObservableObject;
import com.google.java.contract.Requires;
public class PersistenceStateImpl extends ObservableObject implements PersistenceState
{
private final ObservableObject _observedObject;
private boolean _isNew = false;
private boolean _isChanged = false;
private final ObjectChangedListener _listener;
@Requires("object != null")
public PersistenceStateImpl(ObservableObject object, boolean isNew)
{
if (isNew)
setNew();
_observedObject = object;
_listener = e -> reactToObjectChanged();
_observedObject.addObjectChangedListener(_listener);
}
private void reactToObjectChanged()
{
setChanged();
}
private void setNew()
{
if (_isNew == true)
return;
_isNew = true;
_isChanged = true;
fireObjectChangedEvent();
}
private void setChanged()
{
if (_isChanged == true)
return;
_isChanged = true;
fireObjectChangedEvent();
}
/**
* Method that can be called to reset the persistenceState.
* It marks the object as unchanged and not new.
*/
public void objectWasPersisted()
{
if (!_isChanged && !_isNew)
return;
_isNew = false;
_isChanged = false;
fireObjectChangedEvent();
}
@Override
public boolean isNew()
{
return _isNew;
}
@Override
public boolean isChanged()
{
return _isChanged;
}
public void dispose()
{
_observedObject.removeObjectChangedListener(_listener);
}
}