package net.onrc.onos.core.topology;

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

/**
 * A list of topology operations.
 */
public class TopologyBatchOperation extends
        BatchOperation<BatchOperationEntry<TopologyBatchOperation.Operator, TopologyEvent>> {

    /**
     * The topology operations' operators.
     */
    public enum Operator {
        /**
         * Adds a new topology event.
         */
        ADD,

        /**
         * Removes an existing topology event.
         */
        REMOVE,
    }

    /**
     * Appends an ADD-TopologyEvent operation.
     *
     * @param topologyEvent the Topology Event to be appended
     * @return the TopologyBatchOperation object
     */
    public TopologyBatchOperation appendAddOperation(
                                        TopologyEvent topologyEvent) {
        return (TopologyBatchOperation) addOperation(
                new BatchOperationEntry<Operator, TopologyEvent>(
                                        Operator.ADD, topologyEvent));
    }

    /**
     * Appends a REMOVE-TopologyEvent operation.
     *
     * @param topologyEvent the Topology Event to be appended
     * @return the TopologyBatchOperation object
     */
    public TopologyBatchOperation appendRemoveOperation(
                                        TopologyEvent topologyEvent) {
        return (TopologyBatchOperation) addOperation(
                new BatchOperationEntry<Operator, TopologyEvent>(
                                        Operator.REMOVE, topologyEvent));
    }
}

package net.onrc.onos.core.topology;

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

/**
 * A list of topology operations.
 */
public class TopologyBatchOperation extends
        BatchOperation<BatchOperationEntry<TopologyBatchOperation.Operator, TopologyEvent>> {

    /**
     * The topology operations' operators.
     */
    public enum Operator {
        /**
         * Adds a new topology event.
         */
        ADD,

        /**
         * Removes an existing topology event.
         */
        REMOVE,
    }

    /**
     * Appends an ADD-TopologyEvent operation.
     *
     * @param topologyEvent the Topology Event to be appended
     * @return the TopologyBatchOperation object
     */
    public TopologyBatchOperation appendAddOperation(
                                        TopologyEvent topologyEvent) {
        return (TopologyBatchOperation) addOperation(
                new BatchOperationEntry<Operator, TopologyEvent>(
                                        Operator.ADD, topologyEvent));
    }

    /**
     * Appends a REMOVE-TopologyEvent operation.
     *
     * @param topologyEvent the Topology Event to be appended
     * @return the TopologyBatchOperation object
     */
    public TopologyBatchOperation appendRemoveOperation(
                                        TopologyEvent topologyEvent) {
        return (TopologyBatchOperation) addOperation(
                new BatchOperationEntry<Operator, TopologyEvent>(
                                        Operator.REMOVE, topologyEvent));
    }

    /**
     * Concatenates specified TopologyBatchOperation.
     *
     * @param ops TopologyBatchOperation to concatenate.
     * @return this
     */
    public TopologyBatchOperation concat(final TopologyBatchOperation ops) {
        for (BatchOperationEntry<Operator, TopologyEvent> e : ops.getOperations()) {
            this.addOperation(e);
        }
        return this;
    }
}

Add a method to concatenate 2 TopologyBatchOperations.