package models.meta;
import exceptions.IllegalTypeException;
import lombok.Getter;
import models.Dependency;
import models.EvaluatableTerm;
import models.RDLTerm;
import models.ResourceVariable;
import models.algebra.Symbol;
@Getter
public class MetaRDLTerm extends RDLTerm {
protected static enum TermType {
META_DEPENDENCY,
META_DEPENDENCY_LIST,
META_DEPENDENCY_VARIABLE,
META_DEPENDENCY_TERM,
META_DEPENDENCY_TERM_VARIABLE,
META_EVALUATABLE_TERM_VARIABLE,
META_RESOURCE_VARIABLE;
}
protected TermType termType;
protected MetaRDLTerm(Symbol symbol, int order, TermType termType) {
super(symbol, order);
this.termType = termType;
}
//dependency
public MetaRDLTerm(RDLTerm dependingTerm, MetaResourceVariable dependedVariable) {
super(new Symbol(":", 2), dependedVariable.getOrder());
addChild(dependingTerm);
addChild(dependedVariable);
this.termType = TermType.META_DEPENDENCY;
}
public MetaRDLTerm(MetaRDLTerm dependingTerm, ResourceVariable dependedVariable) {
super(new Symbol(":", 2), dependedVariable.getOrder());
addChild(dependingTerm);
addChild(dependedVariable);
this.termType = TermType.META_DEPENDENCY;
}
public MetaRDLTerm(MetaRDLTerm dependingTerm, MetaResourceVariable dependedVariable) {
super(new Symbol(":", 2), dependedVariable.getOrder());
addChild(dependingTerm);
addChild(dependedVariable);
this.termType = TermType.META_DEPENDENCY;
}
//list type dependency
public MetaRDLTerm(MetaRDLTerm dependency) {
super(new Symbol(":", 1), dependency.getOrder() - 1);
addChild(dependency);
this.termType = TermType.META_DEPENDENCY_LIST;
}
//dependency term
public MetaRDLTerm(Dependency dependency, MetaRDLTerm argumentTerm) {
super(
new Symbol(":", 3),
dependency.getDependedVariable().getOrder() == argumentTerm.getOrder()
? dependency.getDependedVariable().getOrder()
: dependency.getDependedVariable().getOrder() - 1
);
if(! dependency.isDependeingTermEvaluatable()) {
throw new IllegalTypeException();
}
addChild(dependency.getDependingTerm());
addChild(dependency.getDependedVariable());
addChild(argumentTerm);
this.termType = TermType.META_DEPENDENCY_TERM;
}
public MetaRDLTerm(MetaRDLTerm dependency, EvaluatableTerm argumentTerm) {
super(
new Symbol(":", 3),
((RDLTerm) dependency.getChild(1)).getOrder() == argumentTerm.getOrder()
? ((RDLTerm) dependency.getChild(1)).getOrder()
: ((RDLTerm) dependency.getChild(1)).getOrder() - 1
);
var firstTerm = (RDLTerm) dependency.getChild(0);
if(firstTerm instanceof MetaRDLTerm) {
var firtTerm2 = (MetaRDLTerm) firstTerm;
if(firtTerm2.getTermType() == TermType.META_DEPENDENCY || firtTerm2.getTermType() == TermType.META_DEPENDENCY_TERM) {
throw new IllegalTypeException();
}
} else {
if(! (firstTerm instanceof EvaluatableTerm)) {
throw new IllegalTypeException();
}
}
addChild(dependency.getChild(0));
addChild(dependency.getChild(1));
addChild(argumentTerm);
this.termType = TermType.META_DEPENDENCY_TERM;
}
public MetaRDLTerm(MetaRDLTerm dependency, MetaRDLTerm argumentTerm) {
super(
new Symbol(":", 3),
((RDLTerm) dependency.getChild(1)).getOrder() == argumentTerm.getOrder()
? ((RDLTerm) dependency.getChild(1)).getOrder()
: ((RDLTerm) dependency.getChild(1)).getOrder() - 1
);
var firstTerm = (RDLTerm) dependency.getChild(0);
if(firstTerm instanceof MetaRDLTerm) {
var firtTerm2 = (MetaRDLTerm) firstTerm;
if(firtTerm2.getTermType() == TermType.META_DEPENDENCY || firtTerm2.getTermType() == TermType.META_DEPENDENCY_TERM) {
throw new IllegalTypeException();
}
} else {
if(! (firstTerm instanceof EvaluatableTerm)) {
throw new IllegalTypeException();
}
}
addChild(dependency.getChild(0));
addChild(dependency.getChild(1));
addChild(argumentTerm);
this.termType = TermType.META_DEPENDENCY_TERM;
}
public boolean isVariable() {
return false;
}
@Override
public String toString() {
switch(termType) {
case META_DEPENDENCY:
return "[" + getChild(0).toString() + " : " + getChild(1).toString() + "]";
case META_DEPENDENCY_LIST:
return "[" + getChild(0).toString() + "]";
case META_DEPENDENCY_TERM:
return "[" + getChild(0).toString() + " : " + getChild(1).toString() + " -> " + getChild(2).toString() + "]";
default:
return "";
}
}
@Override
public String toStringWithOrder() {
switch(termType) {
case META_DEPENDENCY:
return "[" + ((RDLTerm) getChild(0)).toStringWithOrder() + " : " + ((RDLTerm) getChild(1)).toStringWithOrder() + "]";
case META_DEPENDENCY_LIST:
return "[" + ((RDLTerm) getChild(0)).toStringWithOrder() + "]";
case META_DEPENDENCY_TERM:
return "[" + ((RDLTerm) getChild(0)).toStringWithOrder() + " : "
+ ((RDLTerm) getChild(1)).toStringWithOrder() + " -> " + ((RDLTerm) getChild(2)).toStringWithOrder() + "]";
default:
return "";
}
}
@Override
public boolean equals(Object another) {
if(! (another instanceof MetaRDLTerm)) {
return false;
}
return false;
}
@Override
public int hashCode() {
// TODO 自動生成されたメソッド・スタブ
return 0;
}
@Override
public Object clone() {
// TODO 自動生成されたメソッド・スタブ
return null;
}
}