package net.onrc.onos.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.
     *
     * 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();
}
