package models.objectOrientedTransfer;
import java.util.ArrayList;
import java.util.List;
/**
* A program structure related to specific data transfer.
* Deltas can be generated from a data transfer context.
*
* @author Nitta
*
*/
public class Delta {
private AtomicDelta bottomDelta = null;
private Delta subDelta = null;
public Delta(AtomicDelta delta) {
bottomDelta = delta;
}
public Delta(AtomicDelta bottomDelta, Delta subDelta) {
this.bottomDelta = bottomDelta;
this.subDelta = subDelta;
}
public ObjectNode getCoordinator() {
if (subDelta == null) return bottomDelta.getCoordinator();
return subDelta.getCoordinator();
}
public List<ReferenceEdge> getPullEdges() {
if (subDelta == null) return bottomDelta.getPullEdges();
List<ReferenceEdge> pullEdges = new ArrayList<>(subDelta.getPullEdges());
pullEdges.addAll(bottomDelta.getPullEdges());
return pullEdges;
}
public List<ReferenceEdge> getPushEdges() {
if (subDelta == null) return bottomDelta.getPushEdges();
List<ReferenceEdge> pushEdges = new ArrayList<>(subDelta.getPushEdges());
pushEdges.addAll(bottomDelta.getPushEdges());
return pushEdges;
}
public Delta combine(AtomicDelta delta) {
return new Delta(delta, this);
}
public Delta combine(Delta delta) {
Delta preDelta = this.copy();
for (AtomicDelta atomicDelta: delta.split()) {
preDelta = preDelta.combine(atomicDelta);
}
return preDelta;
}
public List<AtomicDelta> split() {
if (subDelta == null) {
List<AtomicDelta> atomicDeltaSequence = new ArrayList<>();
atomicDeltaSequence.add(bottomDelta);
return atomicDeltaSequence;
}
List<AtomicDelta> atomicDeltaSequence = subDelta.split();
atomicDeltaSequence.add(bottomDelta);
return atomicDeltaSequence;
}
public Delta copy() {
return new Delta(bottomDelta.copy(), subDelta.copy());
}
}