package models.dataSynchronizationModel;
import models.deltaAlgebra.ObjectNode;
import models.deltaAlgebra.ReferenceEdge;
import java.util.ArrayList;
import java.util.List;
public class ObjectHierarchy {
private ObjectNode top;
private List<ReferenceEdge> edges;
private boolean isFlat = false;
public ObjectHierarchy(ObjectNode top) {
this.top = top;
this.edges = new ArrayList<>();
this.isFlat = true;
}
public ObjectHierarchy(List<ReferenceEdge> edges) {
this.top = (ObjectNode) edges.getFirst().getSource();
this.edges = edges;
this.isFlat = false;
}
public ObjectNode getTop() {
return top;
}
public ObjectNode getBottom() {
if (edges.size() == 0) {
return top;
}
return (ObjectNode) edges.getLast().getDestination();
}
public List<ReferenceEdge> getEdges() {
return edges;
}
public void addEdge(ReferenceEdge edge) {
edges.add(edge);
isFlat = false;
}
public boolean isFlat() {
return isFlat;
}
public int getDepth() {
return edges.size();
}
public ReferenceEdge getEdge(int index) {
return edges.get(index);
}
public boolean contains(ObjectNode node) {
if (top.equals(node)) {
return true;
}
for (ReferenceEdge edge : edges) {
if (edge.getDestination().equals(node)) {
return true;
}
}
return false;
}
public boolean isPrefixOf(ObjectHierarchy another) {
if (!top.equals(another.top)) {
return false;
}
for (int i = 0; i < edges.size(); i++) {
if (i >= another.edges.size() || !edges.get(i).equals(another.edges.get(i))) {
return false;
}
}
return true;
}
public ObjectHierarchy getPrevObjectHierarchy() {
if (isFlat) {
return new ObjectHierarchy(edges);
}
List<ReferenceEdge> edges = new ArrayList<>();
if (this.edges.size() == 1) {
return new ObjectHierarchy(top);
}
for (int i = 0; i < this.edges.size() - 1; i++) {
edges.add(this.edges.get(i));
}
return new ObjectHierarchy(edges);
}
public String toString() {
String str = top.toString();
for (ReferenceEdge edge : edges) {
str += "." + ((ObjectNode) edge.getDestination()).toString();
}
return str;
}
}