/*
 * 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.pcepio.protocol;

import java.util.LinkedList;

import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.pcepio.exceptions.PcepParseException;

/**
 * Abstraction of an entity which provides PCEP error for PCEP error message.
 */
public interface PcepError {

    /**
     * Returns the PcepRPObject List.
     *
     * @return list of type PcepRPObject
     */
    LinkedList<PcepRPObject> getRPObjList();

    /**
     * Sets the RP Objects lists.
     *
     * @param llRPObjList list of type PcepRPObject
     */
    void setRPObjList(LinkedList<PcepRPObject> llRPObjList);

    /**
     * Returns the PcepTEObject List.
     *
     * @return list of type PcepTEObject
     */
    LinkedList<PcepTEObject> getTEObjList();

    /**
     * Sets the TE Objects lists.
     *
     * @param llTEObjList list of type PcepTEObject
     */
    void setTEObjList(LinkedList<PcepTEObject> llTEObjList);

    /**
     * Returns the PcepErrorObject.
     *
     * @return list of type PcepErrorObject
     */
    LinkedList<PcepErrorObject> getErrorObjList();

    /**
     * Sets the Error Objects lists.
     *
     * @param llErrorObjList list of type PcepErrorObject
     */
    void setErrorObjList(LinkedList<PcepErrorObject> llErrorObjList);

    /**
     * Writes the byte stream of PCEP error to the channel buffer.
     *
     * @param bb of type channel buffer
     * @return object length index
     * @throws PcepParseException while writing Error part into ChannelBuffer
     */
    int write(ChannelBuffer bb) throws PcepParseException;

    /**
     * Prints the attributes of PCEP Error.
     */
    void print();

    /**
     * Builder interface with get and set functions to build PcepError.
     */
    interface Builder {

        /**
         * Builds PcepError Object.
         *
         * @return PcepError Object
         */
        PcepError build();

        /**
         * Returns the PcepRPObject.
         *
         * @return list of type PcepRPObject
         */
        LinkedList<PcepRPObject> getRPObjList();

        /**
         * Sets RP Object lists and returns its builder.
         *
         * @param llRPObjList list of type PcepRpObject
         * @return builder by setting Linked list of RP Object
         */
        Builder setRPObjList(LinkedList<PcepRPObject> llRPObjList);

        /**
         * Returns the PcepTEObject.
         *
         * @return llTEObjList of type PcepTEObject
         */
        LinkedList<PcepTEObject> getTEObjList();

        /**
         * Sets TE Object lists and returns its builder.
         *
         * @param llTEObjList list of type PcepTEObject
         * @return builder by setting list of type PcepTEObject
         */
        Builder setTEObjList(LinkedList<PcepTEObject> llTEObjList);

        /**
         * Returns the PcepErrorObject.
         *
         * @return list of type PcepErrorObject
         */
        LinkedList<PcepErrorObject> getErrorObjList();

        /**
         * Sets Error Object lists and returns its builder.
         *
         * @param llErrorObjList list of type PcepErrorObject
         * @return builder by setting list of type PcepErrorObject
         */
        Builder setErrorObjList(LinkedList<PcepErrorObject> llErrorObjList);
    }
}
