package net.onrc.onos.core.topology;

import java.util.Collection;

/**
 * Interface which needs to be implemented to receive Topology events from
 * the Topology.
 */
public interface ITopologyListener {
    /**
     * Topology events.
     * <p/>
     * The recommended ordering rules for applying/processing the events is:
     * (a) Process "added" events before "removed" events.
     * (b) The ordering of the "added" events should be:
     * addedSwitchEvents, addedPortEvents, addedLinkEvents,
     * addedDeviceEvents
     * The above ordering guarantees that adding a port for example
     * will be processed after the corresponding switch itself is added.
     * (c) The ordering of the "removed" events should be:
     * removedDeviceEvents, removedLinkEvents, removedPortEvents,
     * removedSwitchEvents
     * The above ordering guarantees that removing a port for example
     * will be processed before the corresponding switch itself is
     * removed.
     *
     * @param addedSwitchEvents   the Added Switch Events.
     * @param removedSwitchEvents the Removed Switch Events.
     * @param addedPortEvents     the Added Port Events.
     * @param removedPortEvents   the Removed Port Events.
     * @param addedLinkEvents     the Added Link Events.
     * @param removedLinkEvents   the Removed Link Events.
     * @param addedDeviceEvents   the Added Device Events.
     * @param removedDeviceEvents the Removed Device Events.
     */
    // CHECKSTYLE:OFF suppress warning about too many parameters
    public void topologyEvents(Collection<SwitchEvent> addedSwitchEvents,
                                   Collection<SwitchEvent> removedSwitchEvents,
                                   Collection<PortEvent> addedPortEvents,
                                   Collection<PortEvent> removedPortEvents,
                                   Collection<LinkEvent> addedLinkEvents,
                                   Collection<LinkEvent> removedLinkEvents,
                                   Collection<DeviceEvent> addedDeviceEvents,
                                   Collection<DeviceEvent> removedDeviceEvents);
    // CHECKSTYLE:ON
}
