package net.onrc.onos.core.datagrid;

import java.util.Collection;

/**
 * Event Channel Interface.
 */
public interface IEventChannel<K, V> {
    /**
     * Startup the channel operation.
     */
    void startup();

    /**
     * Shutdown the channel operation.
     */
    void shutdown();

    /**
     * Verify the key and value types of a channel.
     *
     * @param typeK the type of the key to verify.
     * @param typeV the type of the value to verify.
     * @return true if the key and value types of the channel match,
     * otherwise false.
     */
    boolean verifyKeyValueTypes(Class typeK, Class typeV);

    /**
     * Add event channel listener.
     *
     * @param listener the listener to add.
     */
    void addListener(IEventChannelListener<K, V> listener);

    /**
     * Remove event channel listener.
     *
     * @param listener the listener to remove.
     */
    void removeListener(IEventChannelListener<K, V> listener);

    /**
     * Add an entry to the channel.
     *
     * @param key   the key of the entry to add.
     * @param value the value of the entry to add.
     */
    void addEntry(K key, V value);

    /**
     * Add a transient entry to the channel.
     * <p/>
     * The added entry is transient and will automatically timeout after 1ms.
     *
     * @param key   the key of the entry to add.
     * @param value the value of the entry to add.
     */
    void addTransientEntry(K key, V value);

    /**
     * Remove an entry from the channel.
     *
     * @param key the key of the entry to remove.
     */
    void removeEntry(K key);

    /**
     * Update an entry in the channel.
     *
     * @param key   the key of the entry to update.
     * @param value the value of the entry to update.
     */
    void updateEntry(K key, V value);

    /**
     * Get an entry from the channel.
     *
     * @param key the key of the entry to get.
     * @return the entry if found, otherwise null.
     */
    @Deprecated
    V getEntry(K key);

    /**
     * Get all entries in the channel.
     *
     * @return all entries that are currently in the channel.
     */
    @Deprecated
    Collection<V> getAllEntries();

    /**
     * Remove all entries in the channel.
     */
    @Deprecated
    void removeAllEntries();
}
