package net.onrc.onos.api.flowmanager;

import net.onrc.onos.api.batchoperation.BatchOperation;
import net.onrc.onos.api.batchoperation.BatchOperationEntry;

/**
 * A list of flow operations.
 */
public class FlowBatchOperation extends
        BatchOperation<BatchOperationEntry<FlowBatchOperation.Operator, ?>> {
    /**
     * The flow operations' operators.
     */
    public enum Operator {
        /**
         * Adds new flow.
         */
        ADD,

        /**
         * Removes the existing flow.
         */
        REMOVE,
    }

    /**
     * Adds an add-flow operation.
     *
     * @param flow the flow to be added
     * @return the FlowBatchOperation object if succeeded, null otherwise
     */
    public FlowBatchOperation addAddFlowOperation(Flow flow) {
        return (null == super.addOperation(
                new BatchOperationEntry<Operator, Flow>(Operator.ADD, flow)))
                ? null : this;
    }

    /**
     * Adds a remove-flow operation.
     *
     * @param flowId the ID of flow to be removed
     * @return the FlowBatchOperation object if succeeded, null otherwise
     */
    public FlowBatchOperation addRemoveFlowOperation(FlowId flowId) {
        return (null == super.addOperation(
                new BatchOperationEntry<Operator, FlowId>(Operator.REMOVE, flowId)))
                ? null : this;
    }
}
