Newer
Older
AlgebraicDataflowArchitectureModel / AlgebraicDataflowArchitectureModel / src / models / dataConstraintModel / ResourcePath.java
package models.dataConstraintModel;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.AbstractMap;
import java.util.AbstractMap.SimpleEntry;

import models.algebra.Expression;
import models.algebra.Type;
import models.algebra.Symbol;
import models.algebra.Term;

public class ResourcePath extends Symbol {
	protected ResourcePath parent = null;
	protected ResourceHierarchy resourceHierarchy = null;
	protected List<Map.Entry<Expression, Expression>> pathParams = null;

	public ResourcePath(String fullResourceName) {
		super(fullResourceName);
		this.parent = null;
		this.resourceHierarchy = new ResourceHierarchy(null, fullResourceName);		
		this.pathParams = new ArrayList<>();
	}
	
	public ResourcePath(String fullResourceName, ResourceHierarchy resourceHierarchy) {
		super(fullResourceName);
		this.parent = null;
		this.resourceHierarchy = resourceHierarchy;		
		this.pathParams = new ArrayList<>();
	}
	
	public ResourcePath(ResourcePath parent, String leafResourceName) {
		super(parent.toString() + "." + leafResourceName);
		this.parent = parent;
		this.resourceHierarchy = new ResourceHierarchy(parent.getResourceHierarchy(), leafResourceName);		
		this.pathParams = parent.getPathParamsAndConstraints();
	}
	
	public ResourcePath(ResourcePath parent, String leafResourceName, ResourceHierarchy resourceHierarchy) {
		super(parent.toString() + "." + leafResourceName);
		this.parent = parent;
		this.resourceHierarchy = resourceHierarchy;		
		this.pathParams = parent.getPathParamsAndConstraints();
	}
	
	public ResourcePath(ResourcePath parent, Expression exp) {
		super(parent.toString() + ".{" + exp + "}");
		this.parent = parent;
		this.resourceHierarchy = new ResourceHierarchy(parent.getResourceHierarchy(), exp);
		this.pathParams = new ArrayList<>(parent.getPathParamsAndConstraints());
		this.pathParams.add(new AbstractMap.SimpleEntry<>(exp, null));
	}
	
	public ResourcePath(ResourcePath parent, Expression exp, Expression constraint) {
		super(parent.toString() + ".{" + exp + "=" + constraint + "}");
		this.parent = parent;
		this.resourceHierarchy = new ResourceHierarchy(parent.getResourceHierarchy(), exp);
		this.pathParams = new ArrayList<>(parent.getPathParamsAndConstraints());
		this.pathParams.add(new AbstractMap.SimpleEntry<>(exp, constraint));
	}
	
	public ResourcePath(ResourcePath parent, Expression exp, ResourceHierarchy resourceHierarchy) {
		super(parent.toString() + ".{" + exp + "}");
		this.parent = parent;
		this.resourceHierarchy = resourceHierarchy;
		this.pathParams = new ArrayList<>(parent.getPathParamsAndConstraints());
		this.pathParams.add(new AbstractMap.SimpleEntry<>(exp, null));
	}
	
	public ResourcePath(ResourcePath parent, Expression exp, Expression constraint, ResourceHierarchy resourceHierarchy) {
		super(parent.toString() + ".{" + exp + "=" + constraint + "}");
		this.parent = parent;
		this.resourceHierarchy = resourceHierarchy;
		this.pathParams = new ArrayList<>(parent.getPathParamsAndConstraints());
		this.pathParams.add(new AbstractMap.SimpleEntry<>(exp, constraint));
	}
	
	public ResourcePath(ResourcePath another) {
		super(another.name);
		this.parent = another.parent;
		this.resourceHierarchy = another.resourceHierarchy;		
		this.pathParams = new ArrayList<>(another.getPathParamsAndConstraints());
	}

	public ResourceHierarchy getResourceHierarchy() {
		return resourceHierarchy;
	}

	public void setResourceHierarchy(ResourceHierarchy resourceHierarchy) {
		this.resourceHierarchy = resourceHierarchy;
	}

	public String getLeafResourceName() {
		return resourceHierarchy.getResourceName();
	}
	
	public int getNumberOfParameters() {
		return resourceHierarchy.getTotalNumParameters();
	}

	public models.algebra.Type getResourceStateType() {
		return resourceHierarchy.getResourceStateType();
	}

	public void setResourceStateType(models.algebra.Type resourceStateType) {
		this.resourceHierarchy.setResourceStateType(resourceStateType);
	}
	
	public List<Expression> getPathParams() {
		List<Expression> params = new ArrayList<>();
		for (Map.Entry<Expression, Expression> paramEnt: this.pathParams) {
			params.add(paramEnt.getKey());
		}
		return params;
	}
	
	public List<Map.Entry<Expression, Expression>> getPathParamsAndConstraints() {
		return pathParams;
	}

	public void setPathParams(List<Map.Entry<Expression, Expression>> pathParams) {
		this.pathParams = pathParams;
	}

	public void addPathParam(Expression pathParam) {
		pathParams.add(new AbstractMap.SimpleEntry<>(pathParam, null));
	}
	 
	public void addPathParamWithConstraint(Expression pathParam, Expression pathConstraint) {
		pathParams.add(new AbstractMap.SimpleEntry<>(pathParam, pathConstraint));
	}
	
	public boolean endsWithParam() {
		if (resourceHierarchy.getNumParameters() > 0) return true;
		return false;
	}
	
	public Expression getLastParam() {
		if (endsWithParam()) {
			return pathParams.get(pathParams.size() - 1).getKey();
		}
		return null;
	}
	
	public Map.Entry<Expression, Expression> getLastParamAndConstraint() {
		if (endsWithParam()) {
			return pathParams.get(pathParams.size() - 1);
		}
		return null;
	}
	
	public ResourcePath getParent() {
		return parent;
	}

	public ResourcePath getRoot() {
		if (parent == null) return this;
		return parent.getRoot();
	}
	
	public ResourcePath getCommonPrefix(ResourcePath another) {
		Set<ResourcePath> ancestors = new HashSet<>();
		while (another != null) {
			ancestors.add(another);
			another = another.getParent();
		}
		ResourcePath curPath = this;
		while (!ancestors.contains(curPath)) {
			curPath = curPath.getParent();
			if (curPath == null) return null;
		}
		return curPath;
	}
	
	public String toString() {
		return resourceHierarchy.toString(pathParams);
	}
}