package regexgolf2.services.persistence.changetracking;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;
import regexgolf2.model.ObservableObject;
import com.google.java.contract.Ensures;
import com.google.java.contract.Requires;
public class ChangeTrackingService implements PersistenceInformation
{
private static final Logger _LOG = Logger.getLogger(ChangeTrackingService.class.getName());
private final Map<ObservableObject, PersistenceStateImpl> _persistenceStates = new HashMap<>();
@Requires("object != null")
@Ensures("isTracked(object)")
public void track(ObservableObject object)
{
track(object, true);
}
@Requires("object != null")
@Ensures("isTracked(object)")
public void track(ObservableObject object, boolean isNew)
{
if (isTracked(object))
return;
PersistenceStateImpl ps = new PersistenceStateImpl(object, isNew);
_persistenceStates.put(object, ps);
_LOG.info(object + " is new being tracked. isNew=" + isNew);
}
@Requires("object != null")
@Ensures("!isTracked(object)")
public void untrack(ObservableObject object)
{
if (!_persistenceStates.containsKey(object))
return;
PersistenceStateImpl ps = _persistenceStates.remove(object);
ps.dispose();
_LOG.info(object + " is now untracked.");
}
@Requires("isTracked(object)")
public void objectWasPersisted(ObservableObject object)
{
_persistenceStates.get(object).objectWasPersisted();
}
@Override
public PersistenceState getPersistenceState(ObservableObject object)
{
return _persistenceStates.get(object);
}
@Override
public boolean isNew(ObservableObject object)
{
return getPersistenceState(object).isNew();
}
@Override
public boolean isChanged(ObservableObject object)
{
return getPersistenceState(object).isChanged();
}
@Override
public boolean isTracked(ObservableObject object)
{
return _persistenceStates.containsKey(object);
}
}