/**
* 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.message.objectframe;
import java.util.ArrayList;
import java.util.LinkedList;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.pcee.common.RequestID;
import com.pcee.common.SessionID;
import com.pcee.protocol.message.PCEPComputationFactory;
import com.pcee.protocol.message.PCEPConstantValues;
import com.pcee.protocol.message.objectframe.impl.*;
import com.pcee.protocol.message.objectframe.impl.erosubobjects.EROSubobjects;
import com.pcee.protocol.message.objectframe.impl.erosubobjects.PCEPAddress;
public class PCEPObjectFrameFactory {
private static Logger logger = LoggerFactory.getLogger(PCEPObjectFrameFactory.class);
public static PCEPOpenObject generatePCEPOpenObject(String pFlag,
String iFlag, int keepAlive, int deadTimer) {
int sessionID = SessionID.getInstance().getID();
PCEPCommonObjectHeader objectHeader = new PCEPCommonObjectHeader(1, 1,
pFlag, iFlag);
PCEPOpenObject object = new PCEPOpenObject(objectHeader, 1, keepAlive,
deadTimer, sessionID);
return object;
}
public static PCEPRequestParametersObject generatePCEPRequestParametersObject(
String pFlag, String iFlag, String oFlag, String bFlag,
String rFlag, String priFlag) {
String requestIDNumber = Long.toString(RequestID.getInstance().getID());
PCEPCommonObjectHeader objectHeader = new PCEPCommonObjectHeader(2, 1,
pFlag, iFlag);
PCEPRequestParametersObject object = new PCEPRequestParametersObject(
objectHeader, oFlag, bFlag, rFlag, priFlag, requestIDNumber);
return object;
}
public static PCEPRequestParametersObject generatePCEPRequestParametersObject(
String pFlag, String iFlag, String oFlag, String bFlag,
String rFlag, String priFlag, String requestID) {
PCEPCommonObjectHeader objectHeader = new PCEPCommonObjectHeader(2, 1,
pFlag, iFlag);
PCEPRequestParametersObject object = new PCEPRequestParametersObject(
objectHeader, oFlag, bFlag, rFlag, priFlag, requestID);
return object;
}
public static PCEPNoPathObject generatePCEPNoPathObject(String pFlag,
String iFlag, int natureOfIssue, String constraintsFlag) {
PCEPCommonObjectHeader objectHeader = new PCEPCommonObjectHeader(3, 1,
pFlag, iFlag);
PCEPNoPathObject object = new PCEPNoPathObject(objectHeader,
natureOfIssue, constraintsFlag);
return object;
}
public static PCEPEndPointsObject generatePCEPEndPointsObject(String pFlag,
String iFlag, PCEPAddress sourceAddress,
PCEPAddress destinationAddress) {
// TODO IPv6
PCEPCommonObjectHeader objectHeader = new PCEPCommonObjectHeader(4, 1,
pFlag, iFlag);
PCEPEndPointsObject object = new PCEPEndPointsObject(objectHeader,
sourceAddress, destinationAddress);
return object;
}
public static PCEPBandwidthObject generatePCEPBandwidthObject(String pFlag,
String iFlag, float bandwidth) {
// TODO Implement Type 2
PCEPCommonObjectHeader objectHeader = new PCEPCommonObjectHeader(5, 1,
pFlag, iFlag);
PCEPBandwidthObject object = new PCEPBandwidthObject(objectHeader,
bandwidth);
return object;
}
public static PCEPMetricObject generatePCEPMetricObject(String pFlag,
String iFlag, String cFlag, String bFlag, int type,
float metricValue) {
PCEPCommonObjectHeader objectHeader = new PCEPCommonObjectHeader(6, 1,
pFlag, iFlag);
PCEPMetricObject object = new PCEPMetricObject(objectHeader, cFlag,
bFlag, type, metricValue);
return object;
}
public static PCEPExplicitRouteObject generatePCEPExplicitRouteObject(
String pFlag, String iFlag, ArrayList<EROSubobjects> subObjects) {
PCEPCommonObjectHeader objectHeader = new PCEPCommonObjectHeader(7, 1,
pFlag, iFlag);
PCEPExplicitRouteObject object = new PCEPGenericExplicitRouteObjectImpl(
objectHeader, subObjects);
return object;
}
public static PCEPReportedRouteObject generatePCEPReportedRouteObject(
String pFlag, String iFlag, int type, int length, String routerID,
String interfaceID) {
PCEPCommonObjectHeader objectHeader = new PCEPCommonObjectHeader(8, 1,
pFlag, iFlag);
PCEPReportedRouteObject object = new PCEPReportedRouteObject(
objectHeader, type, length, routerID, interfaceID);
return object;
}
public static PCEPLabelSwitchedPathAttributesObject generatePCEPLabelSwitchedPathAttributesObject(
String pFlag, String iFlag, String excludeAny, String includeAny,
String includeAll, int setupPrio, int holdingPrio, String lFlag) {
PCEPCommonObjectHeader objectHeader = new PCEPCommonObjectHeader(9, 1,
pFlag, iFlag);
PCEPLabelSwitchedPathAttributesObject object = new PCEPLabelSwitchedPathAttributesObject(
objectHeader, excludeAny, includeAny, includeAll, setupPrio,
holdingPrio, lFlag);
return object;
}
public static PCEPIncludeRouteObject generatePCEPIncludeRouteObject(
String pFlag, String iFlag, LinkedList<PCEPObjectFrame> subObjects) {
PCEPCommonObjectHeader objectHeader = new PCEPCommonObjectHeader(10, 1,
pFlag, iFlag);
PCEPIncludeRouteObject object = new PCEPIncludeRouteObject(
objectHeader, subObjects);
return object;
}
public static PCEPSynchronizationVectorObject generatePCEPSynchronizationVectorObject(
String pFlag, String iFlag, String sFlag, String nFlag,
String lFlag, LinkedList<String> requestIDNumbers) {
PCEPCommonObjectHeader objectHeader = new PCEPCommonObjectHeader(11, 1,
pFlag, iFlag);
PCEPSynchronizationVectorObject object = new PCEPSynchronizationVectorObject(
objectHeader, sFlag, nFlag, lFlag, requestIDNumbers);
return object;
}
public static PCEPErrorObject generatePCEPErrorObject(String pFlag,
String iFlag, int type, int value) {
PCEPCommonObjectHeader objectHeader = new PCEPCommonObjectHeader(13, 1,
pFlag, iFlag);
PCEPErrorObject object = new PCEPErrorObject(objectHeader, type, value);
return object;
}
public static PCEPLoadBalancingObject generatePCEPLoadBalancingObject(
String pFlag, String iFlag, int maxLSP, String minBandwidth) {
PCEPCommonObjectHeader objectHeader = new PCEPCommonObjectHeader(14, 1,
pFlag, iFlag);
PCEPLoadBalancingObject object = new PCEPLoadBalancingObject(
objectHeader, maxLSP, minBandwidth);
return object;
}
public static PCEPCloseObject generatePCEPCloseObject(String pFlag,
String iFlag, int reason) {
PCEPCommonObjectHeader objectHeader = new PCEPCommonObjectHeader(15, 1,
pFlag, iFlag);
PCEPCloseObject object = new PCEPCloseObject(objectHeader, reason);
return object;
}
public static PCEPObjectiveFunctionObject generatePCEPObjectiveFunctionObject(String pFlag, String iFlag, int ofCode) {
PCEPCommonObjectHeader objectHeader = new PCEPCommonObjectHeader(21, 1,
pFlag, iFlag);
PCEPObjectiveFunctionObject object = new PCEPObjectiveFunctionObject(objectHeader, ofCode);
return object;
}
public static LinkedList<PCEPObjectFrame> PCEPObjectFabrication(
String objectsRawString) {
LinkedList<String> objectStringList = splitObjectsRawString(objectsRawString);
LinkedList<PCEPObjectFrame> objectArray = new LinkedList<PCEPObjectFrame>();
for (int i = 0; i < objectStringList.size(); i++) {
String currentBinaryString = objectStringList.get(i);
PCEPObjectFrame currentObjectFrame = getPCEPObjectFrame(currentBinaryString);
objectArray.add(currentObjectFrame);
}
return objectArray;
}
public static void main(String[] args) {
String objectString = "00000000100000001000000000000000";
String length = objectString.substring(8, 16);
int decimalValue = (int) PCEPComputationFactory.getDecimalValue(length);
System.out.println(decimalValue);
}
/**
* @param objectString
* @return
*/
public static PCEPObjectFrame getPCEPObjectFrame(String objectString) {
String objectHeaderString = objectString.substring(0,
PCEPConstantValues.COMMON_OBJECT_HEADER_LENGTH);
objectString = objectString
.substring(PCEPConstantValues.COMMON_OBJECT_HEADER_LENGTH);
PCEPCommonObjectHeader objectHeader = new PCEPCommonObjectHeader(
objectHeaderString);
switch (objectHeader.getClassDecimalValue()) {
case 1:
return new PCEPOpenObject(objectHeader, objectString);
case 2:
return new PCEPRequestParametersObject(objectHeader, objectString);
case 3:
return new PCEPNoPathObject(objectHeader, objectString);
case 4:
return new PCEPEndPointsObject(objectHeader, objectString);
case 5:
return new PCEPBandwidthObject(objectHeader, objectString);
case 6:
return new PCEPMetricObject(objectHeader, objectString);
case 7:
return new PCEPGenericExplicitRouteObjectImpl(objectHeader,
objectString);
case 8:
return new PCEPReportedRouteObject(objectHeader, objectString);
case 9:
return new PCEPLabelSwitchedPathAttributesObject(objectHeader,
objectString);
case 10:
return new PCEPIncludeRouteObject(objectHeader, objectString);
case 13:
return new PCEPErrorObject(objectHeader, objectString);
case 14:
return new PCEPLoadBalancingObject(objectHeader, objectString);
case 15:
return new PCEPCloseObject(objectHeader, objectString);
case 21:
return new PCEPObjectiveFunctionObject(objectHeader, objectString);
default:
logger.error("Error at switch(objectHeader.getClassDecimalValue()). Value = "
+ objectHeader.getClassDecimalValue());
return null;
}
}
/**
* Splits the rawString by analysing the length Value of the objectHeader!
*/
public static LinkedList<String> splitObjectsRawString(
String objectsRawString) {
LinkedList<String> objectStringList = new LinkedList<String>();
while (objectsRawString.length() > 0) {
String objectHeaderString = objectsRawString.substring(0,
PCEPConstantValues.COMMON_OBJECT_HEADER_LENGTH);
PCEPCommonObjectHeader objectHeader = new PCEPCommonObjectHeader(
objectHeaderString);
int objectHeaderLength = (objectHeader.getLengthDecimalValue()) * 8;
String objectString = objectsRawString.substring(0,
objectHeaderLength);
objectStringList.add(objectString);
objectsRawString = objectsRawString.substring(objectHeaderLength);
}
return objectStringList;
}
}