/*
 * 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
     */
    public 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
     */
    public int write(ChannelBuffer bb) throws PcepParseException;

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

    /**
     * Builder interface with get and set functions to build PcepError.
     */
    public 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);
    }
}
