package net.onrc.onos.intent;

import net.onrc.onos.ofcontroller.util.FlowEntryAction;

/**
 * 
 * @author Brian O'Connor <bocon@onlab.us>
 *
 */

class ForwardAction extends Action {
	protected long dstPort;
	
	public ForwardAction(long dstPort) {
		this.dstPort = dstPort;
	}
	
	public String toString() {
		return Long.toString(dstPort);
	}

	@Override
	public FlowEntryAction getFlowEntryAction() {
	    FlowEntryAction action = new FlowEntryAction();
	    action.setActionOutput(new net.onrc.onos.ofcontroller.util.Port((short) dstPort));
	    return action;
	}

	public int hashCode() {
	    return (int) dstPort;
	}
	
	public boolean equals(Object o) {
	    if(!(o instanceof ForwardAction)) {
		return false;
	    }
  	    ForwardAction action = (ForwardAction) o;
	    return this.dstPort == action.dstPort;
	}
}
