/*
 * Copyright 2016-present Open Networking Foundation
 *
 * 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.yms.ypm;

/**
 * Abstraction of an entity which represents YANG protocol metadata context
 * information.
 */
public interface YpmContext {

    /**
     * Returns the node name.
     *
     * @return node name
     */
    String getName();

    /**
     * Sets the nodes name.
     *
     * @param name nodes name
     */
    void setName(String name);

    /**
     * Returns the context of parent node.
     *
     * @return context of parent node
     */
    YpmContext getParent();

    /**
     * Sets the context of parent node.
     *
     * @param parent node parent
     */
    void setParent(YpmContext parent);

    /**
     * Retrieves the first child of a node.
     *
     * @return first child of a node
     */
    YpmContext getFirstChild();

    /**
     * Retrieves the child of a node for corresponding ydt node.
     *
     * @param name ypm node
     * @return child of a node
     */
    YpmContext getChild(String name);

    /**
     * Adds child to a node by ydt name.
     *
     * @param name ypm name
     */
    void addChild(String name);

    /**
     * Retrieves sibling of a child by (ydt) name.
     *
     * @param name ypm name
     * @return sibling of a child
     */
    YpmContext getSibling(String name);

    /**
     * Adds new sibling to a child.
     *
     * @param name ypm name
     */
    void addSibling(String name);

    /**
     * Returns the context of next sibling.
     *
     * @return context of next sibling
     */
    YpmContext getNextSibling();

    /**
     * Sets the next sibling of node.
     *
     * @param sibling ypm node
     */
    void setNextSibling(DefaultYpmNode sibling);

    /**
     * Returns the previous sibling of a node.
     *
     * @return previous sibling of a node
     */
    DefaultYpmNode getPreviousSibling();

    /**
     * Sets the previous sibling.
     *
     * @param previousSibling points to predecessor sibling
     */
    void setPreviousSibling(DefaultYpmNode previousSibling);

    /**
     * Retrieves protocol metadata.
     *
     * @return metadata
     */
    Object getMetaData();

    /**
     * Sets the protocol metadata.
     *
     * @param data metadata
     */
    void setMetaData(Object data);
}
