/*
 * Copyright 2016 Open Networking Foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.onosproject.tetopology.management.api;

import org.onosproject.event.AbstractEvent;

/**
 * TE topology event.
 */
public class TeTopologyEvent
        extends AbstractEvent<TeTopologyEvent.Type, TeTopologyEventSubject> {

    /**
     * Type of TE topology events.
     */
    public enum Type {
        /**
         * Designates addition of a network.
         */
        NETWORK_ADDED,

        /**
         * Designates update of a network.
         */
        NETWORK_UPDATED,

        /**
         * Designates removal of a network.
         */
        NETWORK_REMOVED,

        /**
         * Designates addition of a network node.
         */
        NODE_ADDED,

        /**
         * Designates update of a network node.
         */
        NODE_UPDATED,

        /**
         * Designates removal of a network node.
         */
        NODE_REMOVED,

        /**
         * Designates addition of a termination point.
         */
        TP_ADDED,

        /**
         * Designates update of a termination point.
         */
        TP_UPDATED,

        /**
         * Designates removal of a termination point.
         */
        TP_REMOVED,

        /**
         * Designates addition of a network link.
         */
        LINK_ADDED,

        /**
         * Designates update of a network link.
         */
        LINK_UPDATED,

        /**
         * Designates removal of a network link.
         */
        LINK_REMOVED,

        /**
         * Designates addition of a TE topology.
         */
        TE_TOPOLOGY_ADDED,

        /**
         * Designates update of a TE topology.
         */
        TE_TOPOLOGY_UPDATED,

        /**
         * Designates removal of a TE topology.
         */
        TE_TOPOLOGY_REMOVED,

        /**
         * Designates addition of a TE node.
         */
        TE_NODE_ADDED,

        /**
         * Designates update of a TE node.
         */
        TE_NODE_UPDATED,

        /**
         * Designates removal of a TE node.
         */
        TE_NODE_REMOVED,

        /**
         * Designates addition of a TE link.
         */
        TE_LINK_ADDED,

        /**
         * Designates update of a TE link.
         */
        TE_LINK_UPDATED,

        /**
         * Designates removal of a TE link.
         */
        TE_LINK_REMOVED
    }

    /**
     * Constructor for TeTopologyEvent.
     *
     * @param type    type of topology event
     * @param subject event subject interface
     */
    public TeTopologyEvent(Type type, TeTopologyEventSubject subject) {
        super(type, subject);
    }

    /**
     * Constructor for TeTopologyEvent.
     *
     * @param type    type of topology event
     * @param subject event subject interface
     * @param time    event time
     */
    public TeTopologyEvent(Type type, TeTopologyEventSubject subject, long time) {
        super(type, subject, time);
    }

}
