Newer
Older
DesignCraft / src / main / java / models / objectOrientedTransfer / Delta.java
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());
	}
}