package net.onrc.onos.core.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;
	}
}
