/*
 * Copyright 2016-present 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.config;

import org.onosproject.config.model.ResourceIdentifier;
import org.onosproject.config.model.DataNode;
import org.onosproject.event.ListenerService;

/**
 * Service for storing and distributing dynamic configuration data.
 */
public interface DynamicConfigService
        extends ListenerService<DynamicConfigEvent, DynamicConfigListener> {
    /**
     * Creates a new node in the dynamic config store.
     * This method would throw an exception if there is a node with the same
     * identifier, already present at the specified path or any of the parent
     * nodes were not present in the path leading up to the requested node.
     * Failure reason will be the error message in the exception.
     *
     * @param path data structure with absolute path to the parent
     * @param node recursive data structure, holding a leaf node or a subtree
     * @throws FailedException if the new node could not be created
     */
    void createNode(ResourceIdentifier path, DataNode node);

    /**
     * Creates a new node in the dynamic config store.
     * Creates any missing parent nodes, leading up to the given node.
     * This method will throw an exception if there is a node with the same
     * identifier, already present at the specified path or any of the parent
     * nodes were not present in the path leading up to the requested node.
     * Failure reason will be the error message in the exception.
     *
     * @param path data structure with absolute path to the parent
     * @param node recursive data structure, holding a leaf node or a subtree
     * @throws FailedException if the new node could not be created
     */
    void createNodeRecursive(ResourceIdentifier path, DataNode node);

    /**
     * Reads the requested node form the dynamic config store.
     * This operation would get translated to reading a leaf node or a subtree.
     * Will return an empty DataNode if after applying the filter, the result
     * is an empty list of nodes. This method would throw an exception if the
     * requested node or any parent nodes in the path were not present.
     * Failure reason will be the error message in the exception.
     *
     * @param path data structure with absolute path to the intended node
     * @param filter filtering conditions to be applied on the result list of nodes
     * @return a recursive data structure, holding a leaf node or a subtree
     * @throws FailedException if the requested node could not be read
     */
    DataNode readNode(ResourceIdentifier path, Filter filter);

    /**
     * Returns the number of children under the node at the given path.
     * This method would throw an exception if the requested node or any parent
     * nodes in the path were not present.
     * Failure reason will be the error message in the exception.
     *
     * @param path data structure with absolute path to the intended node
     * @param filter filtering conditions to be applied on the result list of nodes
     * @return the number of children after applying the filtering conditions if any
     * @throws FailedException if the request failed
     */
    Integer getNumberOfChildren(ResourceIdentifier path, Filter filter);

    /**
     * Updates an existing node in the dynamic config store.
     * This method would throw an exception if the requested node, any of its
     * children or any parent nodes in the path were not present.
     * Failure reason will be the error message in the exception.
     *
     * @param path data structure with absolute path to the parent
     * @param node recursive data structure, holding a leaf node or a subtree
     * @throws FailedException if the update request failed
     */
    void updateNode(ResourceIdentifier path, DataNode node);

    /**
     * Updates an existing node in the dynamic config store.
     * Any missing children nodes will be created with this request.
     * This method would throw an exception if the requested node or any of the
     * parent nodes in the path were not present.
     * Failure reason will be the error message in the exception.
     *
     * @param path data structure with absolute path to the parent
     * @param node recursive data structure, holding a leaf node or a subtree
     * @throws FailedException if the update request failed for any reason
     *
     */
    void updateNodeRecursive(ResourceIdentifier path, DataNode node);

    /**
     * Replaces nodes in the dynamic config store.
     * This will ensure that only the tree structure in the given DataNode will
     * be in place after a replace. This method would throw an exception if
     * the requested node or any of the parent nodes in the path were not
     * present. Failure reason will be the error message in the exception.
     *
     * @param path data structure with absolute path to the parent
     * @param node recursive data structure, holding a leaf node or a subtree
     * @throws FailedException if the replace request failed
     */
    void replaceNode(ResourceIdentifier path, DataNode node);

    /**
     * Removes a leaf node from the dynamic config store.
     * This method would throw an exception if the requested node or any of the
     * parent nodes in the path were not present or the specified node is the
     * root node or has one or more children.
     * Failure reason will be the error message in the exception.
     *
     * @param path data structure with absolute path to the intended node
     * @throws FailedException if the delete request failed
     */
    void deleteNode(ResourceIdentifier path);

    /**
     * Removes a subtree from the dynamic config store.
     * This method will delete all the children recursively, under the given
     * node. It will throw an exception if the requested node or any of the
     * parent nodes in the path were not present.
     * Failure reason will be the error message in the exception.
     *
     * @param path data structure with absolute path to the intended node
     * @throws FailedException if the delete request failed
     */
    void deleteNodeRecursive(ResourceIdentifier path);

    /**
     * Adds a listener to be notified when a leaf or subtree rooted at the
     * specified path is modified.
     *
     * @param path data structure with absolute path to the node being listened to
     * @param listener listener to be notified
     * @throws FailedException if the listener could not be added
     */
    void addConfigListener(ResourceIdentifier path, DynamicConfigListener listener);

    /**
     * Removes a previously added listener.
     *
     * @param path data structure with absolute path to the node being listened to
     * @param listener listener to unregister
     * @throws FailedException if the listener could not be removed
     */
    void removeConfigListener(ResourceIdentifier path, DynamicConfigListener listener);

    /**
     * Registers an RPC handler.
     *
     * @param handler RPC handler
     * @param command RPC command
     * @throws FailedException if the handler could not be added
     */
    void registerHandler(RpcHandler handler, RpcCommand command);

    /**
     * Unregisters an RPC receiver.
     *
     * @param handler RPC handler
     * @param command RPC command
     * @throws FailedException if the handler could not be removed
     */
    void unRegisterHandler(RpcHandler handler, RpcCommand command);

    /**
     * Invokes an RPC.
     *
     * @param caller of the of the RPC
     * @param msgId RPC message id
     * @param command RPC command
     * @param input RPC input
     * @throws FailedException if the RPC could not be invoked
     */
    void invokeRpc(RpcCaller caller, Integer msgId, RpcCommand command, RpcInput input);

    /**
     * Provides response to a a previously invoked RPC.
     *
     * @param msgId of a previously invoked RPC
     * @param output data from the RPC execution
     * @throws FailedException if the RPC response was invalid
     * (or the msg id was not recognised by the store)
     */
    void rpcResponse(Integer msgId, RpcOutput output);
}