/*
 * 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.vtnrsc.flowclassifier;

import org.onosproject.vtnrsc.FlowClassifier;
import org.onosproject.vtnrsc.FlowClassifierId;

/**
 * Provides Services for Flow Classifier.
 */
public interface FlowClassifierService {

    /**
     * Check whether Flow Classifier is present based on given Flow Classifier
     * Id.
     *
     * @param id flow classifier identifier
     * @return true if flow classifier is present otherwise return false
     */
    boolean exists(FlowClassifierId id);

    /**
     * Returns the number of flow classifiers known to the system.
     *
     * @return number of flow classifiers
     */
    int getFlowClassifierCount();

    /**
     * Store Flow Classifier.
     *
     * @param flowClassifier flow classifier
     * @return true if adding flow classifier into store is success otherwise
     *         return false
     */
    boolean createFlowClassifier(FlowClassifier flowClassifier);

    /**
     * Return the existing collection of Flow Classifier.
     *
     * @return flow classifier collections
     */
    Iterable<FlowClassifier> getFlowClassifiers();

    /**
     * Retrieve the Flow Classifier based on given Flow Classifier id.
     *
     * @param id flow classifier identifier
     * @return flow classifier if present otherwise returns null
     */
    FlowClassifier getFlowClassifier(FlowClassifierId id);

    /**
     * Update Flow Classifier based on given Flow Classifier Id.
     *
     * @param flowClassifier flow classifier
     * @return true if flow classifier update is success otherwise return false
     */
    boolean updateFlowClassifier(FlowClassifier flowClassifier);

    /**
     * Remove Flow Classifier from store based on given Flow Classifier Id.
     *
     * @param id flow classifier identifier
     * @return true if flow classifier removal is success otherwise return
     *         false
     */
    boolean removeFlowClassifier(FlowClassifierId id);

    /**
     * Adds the specified listener to Flow-Classifier manager.
     *
     * @param listener Flow-Classifier listener
     */
    void addListener(FlowClassifierListener listener);

    /**
     * Removes the specified listener to Flow-Classifier manager.
     *
     * @param listener Flow-Classifier listener
     */
    void removeListener(FlowClassifierListener listener);
}
