/**
* This file is part of Path Computation Element Emulator (PCEE).
*
* PCEE is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PCEE is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with PCEE. If not, see <http://www.gnu.org/licenses/>.
*/
package com.pcee.protocol.request;
import java.util.LinkedList;
import com.pcee.protocol.message.PCEPMessageFrame;
import com.pcee.protocol.message.objectframe.PCEPObjectFrame;
import com.pcee.protocol.message.objectframe.impl.PCEPBandwidthObject;
import com.pcee.protocol.message.objectframe.impl.PCEPEndPointsObject;
import com.pcee.protocol.message.objectframe.impl.PCEPIncludeRouteObject;
import com.pcee.protocol.message.objectframe.impl.PCEPLabelSwitchedPathAttributesObject;
import com.pcee.protocol.message.objectframe.impl.PCEPLoadBalancingObject;
import com.pcee.protocol.message.objectframe.impl.PCEPMetricObject;
import com.pcee.protocol.message.objectframe.impl.PCEPObjectiveFunctionObject;
import com.pcee.protocol.message.objectframe.impl.PCEPReportedRouteObject;
import com.pcee.protocol.message.objectframe.impl.PCEPRequestParametersObject;
import com.pcee.protocol.message.objectframe.impl.PCEPSynchronizationVectorObject;
import com.pcee.protocol.message.objectframe.impl.erosubobjects.PCEPAddress;
/**
* <pre>
* The format of a PCReq message is as follows:
*
* <PCReq Message>::= <Common Header>
* [<svec-list>]
* <request-list>
*
* where:
* <svec-list>::=<SVEC>[<svec-list>]
* <request-list>::=<request>[<request-list>]
* <request>::= <RP>
* <END-POINTS>
* [<LSPA>]
* [<BANDWIDTH>]
* [<metric-list>]
* [<RRO>[<BANDWIDTH>]]
* [<IRO>]
* [<LOAD-BALANCING>]
*
* <metric-list>::=<METRIC>[<metric-list>]
* </pre>
*/
public class PCEPRequestFrame implements PCEPMessageFrame {
public final int MESSAGE_TYPE = 3;
LinkedList<PCEPSynchronizationVectorObject> SVECList;
PCEPRequestParametersObject RP;
PCEPEndPointsObject endPoints;
PCEPLabelSwitchedPathAttributesObject LSPA;
PCEPBandwidthObject bandwidth;
LinkedList<PCEPMetricObject> metricList;
PCEPReportedRouteObject RRO;
PCEPIncludeRouteObject IRO;
PCEPLoadBalancingObject loadBalancing;
PCEPObjectiveFunctionObject of;
public PCEPRequestFrame(PCEPRequestParametersObject RP,
PCEPEndPointsObject endPoints) {
this.RP = RP;
this.endPoints = endPoints;
}
public PCEPRequestFrame(PCEPRequestParametersObject RP,
PCEPEndPointsObject endPoints, PCEPBandwidthObject bandwidth) {
this.RP = RP;
this.endPoints = endPoints;
this.bandwidth = bandwidth;
}
// VARIOUS CONVENIENT METHODS
public PCEPRequestFrame(PCEPRequestParametersObject RP,
PCEPEndPointsObject endPoints, PCEPBandwidthObject bandwidth,
PCEPMetricObject metric) {
this.RP = RP;
this.endPoints = endPoints;
this.bandwidth = bandwidth;
this.metricList = new LinkedList<PCEPMetricObject>();
this.insertMetricObject(metric);
}
public int getRequestID() {
return RP.getRequestIDNumberDecimalValue();
}
public PCEPAddress getSourceAddress() {
return new PCEPAddress(endPoints.getSourceAddressBinaryString());
}
public PCEPAddress getDestinationAddress() {
return new PCEPAddress(endPoints.getDestinationAddressBinaryString());
}
// INSERT METHODS
public void insertSynchronizationVectorObject(
PCEPSynchronizationVectorObject SVECObject) {
if (containsSynchronizationVectorObjectList()) {
extractSynchronizationVectorObjectList().add(SVECObject);
} else {
SVECList = new LinkedList<PCEPSynchronizationVectorObject>();
SVECList.add(SVECObject);
}
}
public void insertEndPointsObject(PCEPEndPointsObject endPoints) {
this.endPoints = endPoints;
}
public void insertSynchronizationVectorObjectList(
LinkedList<PCEPSynchronizationVectorObject> SVECList) {
this.SVECList = SVECList;
}
public void insertLabelSwitchedPathAttributesObject(
PCEPLabelSwitchedPathAttributesObject LSPA) {
this.LSPA = LSPA;
}
public void insertBandwidthObject(PCEPBandwidthObject bandwidth) {
this.bandwidth = bandwidth;
}
public void insertObjectiveFunctionObject(PCEPObjectiveFunctionObject of){
this.of = of;
}
public void insertMetricObject(PCEPMetricObject metricObject) {
if (containsMetricObjectList()) {
extractMetricObjectList().add(metricObject);
} else {
metricList = new LinkedList<PCEPMetricObject>();
metricList.add(metricObject);
}
}
public void insertMetricObjectList(LinkedList<PCEPMetricObject> metricList) {
this.metricList = metricList;
}
public void insertReportedRouteObject(PCEPReportedRouteObject RRO) {
this.RRO = RRO;
}
public void insertIncludeRouteObject(PCEPIncludeRouteObject IRO) {
this.IRO = IRO;
}
public void insertLoadBalancingObject(PCEPLoadBalancingObject loadBalancing) {
this.loadBalancing = loadBalancing;
}
// EXTRACT METHODS
public LinkedList<PCEPSynchronizationVectorObject> extractSynchronizationVectorObjectList() {
if (containsSynchronizationVectorObjectList()) {
return SVECList;
}
return null;
}
public PCEPObjectiveFunctionObject extractObjectiveFunctionObject() {
if (containsObjectiveFunctionObject())
return of;
return null;
}
public PCEPEndPointsObject extractEndPointsObject() {
if (containsEndPointsObject())
return endPoints;
return null;
}
public PCEPLabelSwitchedPathAttributesObject extractLabelSwitchedPathAttributesObject() {
if (containsLabelSwitchedPathAttributesObject()) {
return LSPA;
}
return null;
}
public PCEPBandwidthObject extractBandwidthObject() {
if (containsBandwidthObject()) {
return bandwidth;
}
return null;
}
public LinkedList<PCEPMetricObject> extractMetricObjectList() {
if (containsMetricObjectList()) {
return metricList;
}
return null;
}
public PCEPReportedRouteObject extractReportedRouteObject() {
if (containsReportedRouteObject()) {
return RRO;
}
return null;
}
public PCEPIncludeRouteObject extractIncludeRouteObject() {
if (containsIncludeRouteObject()) {
return IRO;
}
return null;
}
public PCEPLoadBalancingObject extractLoadBalancingObject() {
if (containsLoadBalancingObject()) {
return loadBalancing;
}
return null;
}
// CONTAINS METHODS
public boolean containsObjectiveFunctionObject() {
if (of == null)
return false;
return true;
}
public boolean containsEndPointsObject() {
if (endPoints == null)
return false;
return true;
}
public boolean containsSynchronizationVectorObjectList() {
if (SVECList == null) {
return false;
}
return true;
}
public boolean containsLabelSwitchedPathAttributesObject() {
if (LSPA == null) {
return false;
}
return true;
}
public boolean containsBandwidthObject() {
if (bandwidth == null) {
return false;
}
return true;
}
public boolean containsMetricObjectList() {
if (metricList == null) {
return false;
}
return true;
}
public boolean containsReportedRouteObject() {
if (RRO == null) {
return false;
}
return true;
}
public boolean containsIncludeRouteObject() {
if (IRO == null) {
return false;
}
return true;
}
public boolean containsLoadBalancingObject() {
if (loadBalancing == null) {
return false;
}
return true;
}
// INTERFACE METHODS
public int getByteLength() {
int length = 0;
if (containsSynchronizationVectorObjectList()) {
for (int i = 0; i < SVECList.size(); i++) {
length += SVECList.get(i).getObjectFrameByteLength();
}
}
length += RP.getObjectFrameByteLength();
if (containsEndPointsObject())
length += endPoints.getObjectFrameByteLength();
if (containsLabelSwitchedPathAttributesObject()) {
length += LSPA.getObjectFrameByteLength();
}
if (containsBandwidthObject()) {
length += bandwidth.getObjectFrameByteLength();
}
if (containsMetricObjectList()) {
for (int i = 0; i < metricList.size(); i++) {
length += metricList.get(i).getObjectFrameByteLength();
}
}
if (containsReportedRouteObject()) {
length += RRO.getObjectFrameByteLength();
}
if (containsIncludeRouteObject()) {
length += IRO.getObjectFrameByteLength();
}
if (containsLoadBalancingObject()) {
length += loadBalancing.getObjectFrameByteLength();
}
if (containsObjectiveFunctionObject()){
length += of.getObjectFrameByteLength();
}
return length;
}
public String getBinaryString() {
StringBuffer objectsString = new StringBuffer();
if (containsSynchronizationVectorObjectList()) {
for (int i = 0; i < SVECList.size(); i++) {
objectsString.append(SVECList.get(i)
.getObjectFrameBinaryString());
}
}
objectsString.append(RP.getObjectFrameBinaryString());
objectsString.append(endPoints.getObjectFrameBinaryString());
if (containsLabelSwitchedPathAttributesObject()) {
objectsString.append(LSPA.getObjectFrameBinaryString());
}
if (containsBandwidthObject()) {
objectsString.append(bandwidth.getObjectFrameBinaryString());
}
if (containsMetricObjectList()) {
for (int i = 0; i < metricList.size(); i++) {
objectsString.append(metricList.get(i)
.getObjectFrameBinaryString());
}
}
if (containsReportedRouteObject()) {
objectsString.append(RRO.getObjectFrameBinaryString());
}
if (containsIncludeRouteObject()) {
objectsString.append(IRO.getObjectFrameBinaryString());
}
if (containsIncludeRouteObject()) {
objectsString.append(loadBalancing.getObjectFrameBinaryString());
}
if (containsObjectiveFunctionObject()){
objectsString.append(of.getObjectFrameBinaryString());
}
return objectsString.toString();
}
public LinkedList<PCEPObjectFrame> getObjectFrameLinkedList() {
LinkedList<PCEPObjectFrame> requestObjects = new LinkedList<PCEPObjectFrame>();
if (containsSynchronizationVectorObjectList()) {
for (int i = 0; i < SVECList.size(); i++) {
requestObjects.add(SVECList.get(i));
}
}
requestObjects.add(RP);
if (containsEndPointsObject())
requestObjects.add(endPoints);
if (containsLabelSwitchedPathAttributesObject()) {
requestObjects.add(LSPA);
}
if (containsBandwidthObject()) {
requestObjects.add(bandwidth);
}
if (containsMetricObjectList()) {
for (int i = 0; i < metricList.size(); i++) {
requestObjects.add(metricList.get(i));
}
}
if (containsReportedRouteObject()) {
requestObjects.add(RRO);
}
if (containsIncludeRouteObject()) {
requestObjects.add(IRO);
}
if (containsLoadBalancingObject()) {
requestObjects.add(loadBalancing);
}
if (containsObjectiveFunctionObject()) {
requestObjects.add(of);
}
return requestObjects;
}
public int getMessageType() {
return MESSAGE_TYPE;
}
}