/*
 * Copyright 2014 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 org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.pcepio.exceptions.PcepParseException;
import org.onosproject.pcepio.types.PcepLabelDownload;
import org.onosproject.pcepio.types.PcepLabelMap;

/***
 * Abstraction to provide PCEP Label Updates.
 */
public interface PcepLabelUpdate {

    /**
     * Writes the byte stream of PcepLabelUpdate into channel buffer.
     *
     * @param bb of type channel buffer
     * @throws PcepParseException while writing LABEL UPDATE.
     */
    public void write(ChannelBuffer bb) throws PcepParseException;

    /**
     * Sets the Label Download object.
     *
     * @param labelDownload PCEP Label Download object
     */
    public void setLabelDownload(PcepLabelDownload labelDownload);

    /**
     * Returns the PcepLabelDownload object.
     *
     * @return labelDownload PCEP Label Download
     */
    public PcepLabelDownload getLabelDownload();

    /**
     * Sets the Label map object.
     *
     * @param labelMap PCEP Label Map object
     */
    public void setLabelMap(PcepLabelMap labelMap);

    /**
     * Returns the PcepLabelMap object.
     *
     * @return labelMap PCEP Label Map
     */
    public PcepLabelMap getLabelMap();

    /**
     * Prints the attributes of PCEP Label update.
     */
    public void print();

    /**
     * Builder interface with get and set functions to build Label Update message.
     */
    public interface Builder {

        /**
         * Builds PcepLableUpdate Object.
         *
         * @return PcepLableUpdate Object
         * @throws PcepParseException while building LABEL-UPDATE.
         */
        PcepLabelUpdate build() throws PcepParseException;

        /**
         * Sets the Label Download object.
         *
         * @param labelDownload PCEP Label Download object
         * @return Builder by setting labelDownload object
         */
        Builder setLabelDownload(PcepLabelDownload labelDownload);

        /**
         * Returns the PcepLabelDownload object.
         *
         * @return labelDownload PCEP Label Download
         */
        PcepLabelDownload getLabelDownload();

        /**
         * Sets the Label map object.
         *
         * @param labelMap PCEP Label Map object
         * @return Builder by setting PcepLabelMap object
         */
        Builder setLabelMap(PcepLabelMap labelMap);

        /**
         * Returns the PcepLabelMap object.
         *
         * @return labelMap PCEP Label Map
         */
        PcepLabelMap getLabelMap();
    }

}
