Newer
Older
ResourceDependencyLogic / src / models / terms / Dependency.java
@Sakoda2269 Sakoda2269 on 23 Oct 3 KB ディレクトリ変更
package models.terms;

import lombok.Getter;
import models.algebra.Symbol;

@Getter
public class Dependency extends RDLTerm{
	
	private RDLTerm dependingTerm;
	private ResourceVariable dependedVariable;
	private Dependency dependency;
	private boolean isListType;
	
	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);
		this.isListType = false;
	}
	
	public Dependency(Dependency dependency) {
		super(new Symbol(":", 1), dependency.getOrder() - 1);
		this.dependency = dependency;
		this.dependingTerm = null;
		this.dependedVariable = null;
		this.addChild(dependency);
		this.isListType = true;
	}
	
	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;
			this.isListType = false;
		} else {
			this.dependency = new Dependency(dependingTerm, dependedVariable, order+1);
			this.dependingTerm = null;
			this.dependedVariable = null;
			this.addChild(dependency);
			this.isListType = true;
		}
	}
	
	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 boolean equals(Object another) {
		if(! (another instanceof Dependency)) {
			return false;
		}
		Dependency anotherDep = (Dependency) another;
		if(anotherDep.isListType() != isListType()) {
			return false;
		}
		if(isListType()) {
			return anotherDep.getDependency().equals(dependency);
		}
		return anotherDep.getDependingTerm().equals(dependingTerm)
				&& anotherDep.getDependedVariable().equals(dependedVariable);
	}

	@Override
	public int hashCode() {
		return ("Dep" + toString()).hashCode();
	}
	
	@Override
	public Object clone() {
		return new Dependency((RDLTerm) dependingTerm.clone(), (ResourceVariable) dependedVariable.clone());
	}

}