package net.onrc.onos.apps.bgproute;

import java.net.InetAddress;
import java.util.Collections;
import java.util.List;

/*
 * A path is always assumed to be from all other interfaces (external-facing
 * switchports) to the destination interface.
 */

public class Path {

	private Interface dstInterface;
	private InetAddress dstIpAddress;
	private int numUsers = 0;
	
	private List<PushedFlowMod> flowMods = null;
	private boolean permanent = false;
	
	public Path(Interface dstInterface, InetAddress dstIpAddress) {
		this.dstInterface = dstInterface;
		this.dstIpAddress = dstIpAddress;
	}

	public Interface getDstInterface() {
		return dstInterface;
	}

	public InetAddress getDstIpAddress() {
		return dstIpAddress;
	}
	
	public void incrementUsers() {
		numUsers++;
	}
	
	public void decrementUsers() {
		numUsers--;
	}
	
	public int getUsers() {
		return numUsers;
	}
	
	public List<PushedFlowMod> getFlowMods() {
		return Collections.unmodifiableList(flowMods);
	}
	
	public void setFlowMods(List<PushedFlowMod> flowMods) {
		this.flowMods = flowMods;
	}
	
	public boolean isPermanent() {
		return permanent;
	}
	
	public void setPermanent() {
		permanent = true;
	}
}
