package models;
import lombok.Getter;
import models.algebra.Symbol;
@Getter
public class Dependency extends RDLTerm{
private RDLTerm dependingTerm;
private ResourceVariable dependedVariable;
private Dependency dependency;
public Dependency(RDLTerm dependingTerm, ResourceVariable dependedVariable) {
super(new Symbol(":", 2), dependedVariable.getOrder());
this.dependingTerm = dependingTerm;
this.dependedVariable = dependedVariable;
this.dependency = null;
this.addChild(dependingTerm);
this.addChild(dependedVariable);
}
public Dependency(Dependency dependency) {
super(new Symbol(":", 1), dependency.getOrder() - 1);
this.dependency = dependency;
this.dependingTerm = null;
this.dependedVariable = null;
this.addChild(dependency);
}
public Dependency(RDLTerm dependingTerm, ResourceVariable dependedVariable, int order) {
super(new Symbol(":", order == dependedVariable.order ? 2 : 1), order);
if(order == dependedVariable.order) {
this.dependingTerm = dependingTerm;
this.dependedVariable = dependedVariable;
this.addChild(dependingTerm);
this.addChild(dependedVariable);
this.dependency = null;
} else {
this.dependency = new Dependency(dependingTerm, dependedVariable, order+1);
this.dependingTerm = null;
this.dependedVariable = null;
this.addChild(dependency);
}
}
public Dependency getDependency() {
return this.dependency;
}
@Override
public int getTermOrder() {
return getOrder() - 1;
}
public boolean isDependeingTermEvaluatable() {
return dependingTerm instanceof EvaluatableTerm;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
if(dependency == null) {
sb.append(dependingTerm.toString());
sb.append(" : ");
sb.append(dependedVariable.toString());
} else {
sb.append('[');
sb.append(dependency.toString());
sb.append(']');
}
return sb.toString();
}
@Override
public String toStringWithOrder() {
StringBuilder sb = new StringBuilder();
if(dependency == null) {
sb.append(dependingTerm.toStringWithOrder());
sb.append(" : ");
sb.append(dependedVariable.toStringWithOrder());
} else {
sb.append('[');
sb.append(dependency.toStringWithOrder());
sb.append(']');
}
return sb.toString() + "(" + order + ")";
}
@Override
public String toTermString() {
return "[" + toString() + "]";
}
@Override
public Object clone() {
return new Dependency((RDLTerm) dependingTerm.clone(), (ResourceVariable) dependedVariable.clone());
}
}