/*
 * 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;

/**
 * Abstraction of an Message factory providing Builder functions to PCEP Messages and Objects.
 *
 */
public interface PcepFactory {

    /**
     * To get Builder Object for Open Message.
     *
     * @return Builder Object for Open Message
     */
    PcepOpenMsg.Builder buildOpenMsg();

    /**
     * To get Builder Object for Open Object.
     *
     * @return Builder Object for Open Object
     */
    PcepOpenObject.Builder buildOpenObject();

    /**
     * To get Builder Object for Keepalive Message.
     *
     * @return Builder Object for Keepalive Message
     */
    PcepKeepaliveMsg.Builder buildKeepaliveMsg();

    /**
     * To get Builder Object for Close Message.
     *
     * @return Builder Object for Close Message
     */
    PcepCloseMsg.Builder buildCloseMsg();

    /**
     * To get Builder Object for Report Message.
     *
     * @return Builder Object for Report Message
     */
    PcepReportMsg.Builder buildReportMsg();

    /**
     * To get Builder Object for Update Message.
     *
     * @return Builder Object for Update Message
     */
    PcepUpdateMsg.Builder buildUpdateMsg();

    /**
     * To get Builder Object for Initiate Message.
     *
     * @return Builder Object for Initiate Message
     */
    PcepInitiateMsg.Builder buildPcepInitiateMsg();

    /**
     * To get Builder Object for LSP Object.
     *
     * @return Builder Object for LSP Object
     */
    PcepLspObject.Builder buildLspObject();

    /**
     * To get Builder Object for SRP Object.
     *
     * @return Builder Object for SRP Object
     */
    PcepSrpObject.Builder buildSrpObject();

    /**
     * To get Builder Object for EndPoints Object.
     *
     * @return Builder Object for EndPoints Object
     */
    PcepEndPointsObject.Builder buildEndPointsObject();

    /**
     * To get Builder Object for ERO Object.
     *
     * @return Builder Object for ERO Object
     */
    PcepEroObject.Builder buildEroObject();

    /**
     * To get Builder Object for RRO Object.
     *
     * @return Builder Object for RRO Object
     */
    PcepRroObject.Builder buildRroObject();

    /**
     * To get Builder Object for LSPA Object.
     *
     * @return Builder Object for LSPA Object
     */
    PcepLspaObject.Builder buildLspaObject();

    /**
     * To get Builder Object for IRO Object.
     *
     * @return Builder Object for IRO Object
     */
    PcepIroObject.Builder buildIroObject();

    /**
     * To get Builder Object for METRIC Object.
     *
     * @return Builder Object for METRIC Object
     */
    PcepMetricObject.Builder buildMetricObject();

    /**
     * To get Builder Object for Bandwidth Object.
     *
     * @return Builder Object for Bandwidth Object
     */
    PcepBandwidthObject.Builder buildBandwidthObject();

    /**
     * Returns PCEP Message Reader.
     *
     * @return PCEP Message Reader
     */
    PcepMessageReader<PcepMessage> getReader();

    /**
     * Returns PCEP version.
     *
     * @return PCEP version
     */
    PcepVersion getVersion();

    /**
     * Returns PcepStateReport.
     *
     * @return PcepStateReport
     */
    PcepStateReport.Builder buildPcepStateReport();

    /**
     * Returns PcepUpdateRequest.
     *
     * @return PcepUpdateRequest
     */
    PcepUpdateRequest.Builder buildPcepUpdateRequest();

    /**
     * Returns PcInitiatedLspRequest.
     *
     * @return PcInitiatedLspRequest
     */
    PcInitiatedLspRequest.Builder buildPcInitiatedLspRequest();

    /**
     * Returns PcepMsgPath.
     *
     * @return PcepMsgPath
     */
    PcepMsgPath.Builder buildPcepMsgPath();

    /**
     * Return PcepAttribute list.
     *
     * @return PcepAttribute
     */
    PcepAttribute.Builder buildPcepAttribute();

    /**
     * To get Builder Object for LabelUpdate message.
     *
     * @return Builder Object for LabelUpdate message
     */
    PcepLabelUpdateMsg.Builder buildPcepLabelUpdateMsg();

    /**
     * To get Builder Object for PcepLabelUpdate Object.
     *
     * @return Builder Object for PcepLabelUpdate Object
     */
    PcepLabelUpdate.Builder buildPcepLabelUpdateObject();

    /**
     * To get Builder Object for PcepLabel Object.
     *
     * @return Builder Object for PcepLabel Object
     */
    PcepLabelObject.Builder buildLabelObject();

    /**
     * To get Builder Object for Error Message.
     *
     * @return Builder Object for Error Message
     */
    PcepErrorMsg.Builder buildPcepErrorMsg();

    /**
     * To get Builder Object for Error Object.
     *
     * @return Builder Object for Error Object
     */
    PcepErrorObject.Builder buildPcepErrorObject();

    /**
     * To get Builder Object for FecIpv4Adjacency.
     *
     * @return Builder Object for FecIpv4Adjacency
     */
    PcepFecObjectIPv4Adjacency.Builder buildFecIpv4Adjacency();

    /**
     * To get Builder Object for ErrorInfo.
     *
     * @return Builder Object for ErrorInfo
     */
    PcepErrorInfo.Builder buildPcepErrorInfo();

    /**
     * To get Builder Object for PcepError.
     *
     * @return Builder Object for PcepError
     */
    PcepError.Builder buildPcepError();
}
