package scrum.server.journal;
import ilarkesto.base.AFactoryCache;
import ilarkesto.base.Cache;
import ilarkesto.base.time.DateAndTime;
import ilarkesto.fp.Predicate;
import ilarkesto.persistence.AEntity;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import scrum.server.admin.User;
public class ChangeDao extends GChangeDao {
@Override
public void clearCaches() {
super.clearCaches();
changesByParentIdCache.clear();
}
public Change postChange(AEntity parent, User user, String key, Object oldValue, Object newValue) {
Change change = newEntityInstance();
change.setDateAndTime(DateAndTime.now());
change.setParent(parent);
change.setUser(user);
change.setKey(key);
change.setOldValue(oldValue == null ? null : oldValue.toString());
change.setNewValue(newValue == null ? null : newValue.toString());
saveEntity(change);
Change.merge(getChangesByParent(parent));
return change;
}
private Cache<String, Set<Change>> changesByParentIdCache = new AFactoryCache<String, Set<Change>>() {
@Override
public Set<Change> create(final String parentId) {
return getEntities(new Predicate<Change>() {
@Override
public boolean test(Change e) {
return e.getParent().getId().equals(parentId);
}
});
}
};
public Set<Change> getChangesByParentId(final String parentId) {
return changesByParentIdCache.get(parentId);
}
@Override
public void ensureIntegrity() {
super.ensureIntegrity();
Map<AEntity, List<Change>> changesByParent = new HashMap<AEntity, List<Change>>();
for (Change change : getEntities()) {
List<Change> list = changesByParent.get(change.getParent());
if (list == null) {
list = new ArrayList<Change>();
changesByParent.put(change.getParent(), list);
}
list.add(change);
}
for (List<Change> changes : changesByParent.values()) {
Change.merge(changes);
}
}
}