package com.almworks.jira.structure.api.forest;
import com.almworks.integers.LongArray;
import com.almworks.integers.LongList;
import com.almworks.integers.util.LongListConcatenation;
/**
* @author Igor Sereda
*/
public abstract class ForestOp {
// implementation note: when adding a new type, don't forget about ForestOpPeer
public abstract LongList getAffectedIssues();
/**
* @return a list of issues that used to be parents of the affected issues
*/
public abstract LongList getPreviousParents();
public abstract LongList getAnchorIssues();
public static class Move extends ForestOp {
private final long myIssue;
private final long myUnder;
private final long myAfter;
private final long myFromUnder;
private final LongArray myAnchor = new LongArray(3);
public Move(long issue, long under, long after, long fromUnder) {
myIssue = issue;
myUnder = under;
myAfter = after;
myFromUnder = fromUnder;
myAnchor.add(issue);
if (under > 0) myAnchor.add(under);
if (after > 0) myAnchor.add(after);
}
public LongList getAffectedIssues() {
// todo perhaps all sub-issues should also be affected - need precise contract for this method and review how it's used
return LongArray.create(myIssue);
}
public LongList getPreviousParents() {
return myFromUnder > 0 ? LongArray.create(myFromUnder) : LongList.EMPTY;
}
public LongList getAnchorIssues() {
return myAnchor;
}
public long getUnder() {
return myUnder;
}
public long getAfter() {
return myAfter;
}
public long getIssue() {
return myIssue;
}
}
public static class Merge extends ForestOp {
private final Forest myForest;
private final long myUnder;
private final long myAfter;
private final LongList myAnchor;
private final LongList myPreviousParents;
public Merge(Forest forest, long under, long after, LongList previousParents) {
myPreviousParents = previousParents;
assert forest.size() > 0 : forest + " " + under + " " + after;
myForest = forest.makeImmutable();
myUnder = under;
myAfter = after;
if (myUnder > 0 || myAfter > 0) {
LongArray array = new LongArray();
if (myUnder > 0) array.add(myUnder);
if (myAfter > 0) array.add(myAfter);
myAnchor = new LongListConcatenation(array, myForest.getIssues());
} else {
myAnchor = myForest.getIssues();
}
}
public LongList getAffectedIssues() {
return myForest.getIssues();
}
public LongList getPreviousParents() {
return myPreviousParents;
}
public LongList getAnchorIssues() {
return myAnchor;
}
public Forest getForest() {
return myForest;
}
public long getUnder() {
return myUnder;
}
public long getAfter() {
return myAfter;
}
}
public static class Delete extends ForestOp {
private final long myIssue;
private final Forest myRemoved;
private final long myFromParent;
public Delete(long issue, Forest removed, long fromParent) {
myIssue = issue;
myRemoved = removed;
myFromParent = fromParent;
assert removed.isEmpty() || removed.getIssues().get(0) == issue : issue + " " + removed;
}
public long getIssue() {
return myIssue;
}
public LongList getAffectedIssues() {
return myRemoved.getIssues();
}
public LongList getPreviousParents() {
return myFromParent > 0 ? LongArray.create(myFromParent) : LongList.EMPTY;
}
public LongList getAnchorIssues() {
return getAffectedIssues();
}
}
}