/*
 * Copyright 2015 Open Networking Laboratory
 *
 * 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.net.flow;

/**
 * Represents a flow live type for a given flow entry.
 */
public interface TypedStoredFlowEntry extends StoredFlowEntry {
    enum FlowLiveType {
        /**
         * Indicates that this rule has been submitted for addition immediately.
         * Not necessarily collecting flow stats.
         */
        IMMEDIATE_FLOW,

        /**
         * Indicates that this rule has been submitted for a short time.
         * Necessarily collecting flow stats every calAndPollInterval.
         */
        SHORT_FLOW,

        /**
         * Indicates that this rule has been submitted for a mid time.
         * Necessarily collecting flow stats every midPollInterval.
         */
        MID_FLOW,

        /**
         * Indicates that this rule has been submitted for a long time.
         * Necessarily collecting flow stats every longPollInterval.
         */
        LONG_FLOW,

        /**
         * Indicates that this rule has been submitted for UNKNOWN or ERROR.
         * Not necessarily collecting flow stats.
         */
        UNKNOWN_FLOW
    }

    /**
     * Gets the flow live type for this entry.
     *
     * @return flow live type
     */
    FlowLiveType flowLiveType();

    /**
     * Sets the new flow live type for this entry.
     * @param liveType new flow live type.
     */
    void setFlowLiveType(FlowLiveType liveType);
}
