/*
 * Copyright 2015-present 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();

    /**
     * To get Builder Object for PcepLabelRangeObject.
     *
     * @return Builder Object for PcepLabelRangeObject
     */
    PcepLabelRangeObject.Builder buildPcepLabelRangeObject();

    /**
     * To get Builder Object for PcepLabelRangeResvMsg.
     *
     * @return Builder Object for PcepLabelRangeResvMsg
     */
    PcepLabelRangeResvMsg.Builder buildPcepLabelRangeResvMsg();
}
