package scrum.server.journal;
import ilarkesto.auth.Auth;
import ilarkesto.core.logging.Log;
import ilarkesto.persistence.AEntity;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import scrum.server.admin.User;
public class Change extends GChange implements Comparable<Change> {
private static Log log = Log.get(Change.class);
@Override
public boolean isVisibleFor(User user) {
return Auth.isVisible(getParent(), user);
}
public boolean isEditableBy(User user) {
return false;
}
public void mergeTo(Change other) {
log.info("Merging", this, "to", other);
other.setOldValue(getOldValue());
if (isCommentSet()) {
if (other.isCommentSet()) {
other.setComment(getComment() + "\n\n" + other.getComment());
} else {
other.setComment(getComment());
}
}
getDao().deleteEntity(this);
}
public boolean isMergableWith(Change other) {
if (getKey().startsWith("@")) return false;
if (!isParent(other.getParent())) return false;
if (!isUser(other.getUser())) return false;
if (!isKey(other.getKey())) return false;
if (getDateAndTime().getPeriodTo(other.getDateAndTime()).abs().toMinutes() > 60) return false;
return true;
}
@Override
public int compareTo(Change other) {
return getDateAndTime().compareTo(other.getDateAndTime());
}
@Override
public String toString() {
AEntity parent;
try {
parent = getParent();
} catch (Throwable ex) {
parent = null;
}
return "Change(" + getUser() + "," + getDateAndTime() + ", " + parent + "." + getKey() + ")";
}
public static void merge(Collection<Change> changes) {
List<Change> list = new ArrayList<Change>(changes);
Collections.sort(list);
Change previous = null;
for (Change change : list) {
if (previous == null) {
previous = change;
continue;
}
if (previous.isMergableWith(change)) previous.mergeTo(change);
previous = change;
}
}
}