/**
* 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.impl;
import com.pcee.protocol.message.PCEPComputationFactory;
import com.pcee.protocol.message.PCEPConstantValues;
import com.pcee.protocol.message.objectframe.PCEPCommonObjectHeader;
import com.pcee.protocol.message.objectframe.PCEPObjectFrame;
/**
* <pre>
* 0 1 2 3
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | Ver | Flags | Keepalive | DeadTimer | SID |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | |
* // Optional TLVs //
* | |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* </pre>
*/
public class PCEPOpenObject implements PCEPObjectFrame {
private final String NAME = "Open";
private String version;
private String keepAlive;
private String deadTimer;
private String sessionID;
private String flags;
private PCEPCommonObjectHeader objectHeader;
// private LinkedList<PCEPTLVObject> tlvList;
private int versionStartBit = PCEPConstantValues.OPEN_OBJECT_VERSION_START_BIT;
private int versionEndBit = PCEPConstantValues.OPEN_OBJECT_VERSION_END_BIT;
private int versionLength = PCEPConstantValues.OPEN_OBJECT_VERSION_LENGTH;
private int keepAliveStartBit = PCEPConstantValues.OPEN_OBJECT_KEEPALIVE_START_BIT;
private int keepAliveEndBit = PCEPConstantValues.OPEN_OBJECT_KEEPALIVE_END_BIT;
private int keepAliveLength = PCEPConstantValues.OPEN_OBJECT_KEEPALIVE_LENGTH;
private int deadTimerStartBit = PCEPConstantValues.OPEN_OBJECT_DEADTIMER_START_BIT;
private int deadTimerEndBit = PCEPConstantValues.OPEN_OBJECT_DEADTIMER_END_BIT;
private int deadTimerLength = PCEPConstantValues.OPEN_OBJECT_DEADTIMER_LENGTH;
private int sessionIDStartBit = PCEPConstantValues.OPEN_OBJECT_SESSIONID_START_BIT;
private int sessionIDEndBit = PCEPConstantValues.OPEN_OBJECT_SESSIONID_END_BIT;
private int sessionIDLength = PCEPConstantValues.OPEN_OBJECT_SESSIONID_LENGTH;
private int flagsStartBit = PCEPConstantValues.OPEN_OBJECT_FLAGS_START_BIT;
private int flagsEndBit = PCEPConstantValues.OPEN_OBJECT_FLAGS_END_BIT;
private int flagsLength = PCEPConstantValues.OPEN_OBJECT_FLAGS_LENGTH;
public PCEPOpenObject(PCEPCommonObjectHeader objectHeader, String binaryString) {
this.setObjectHeader(objectHeader);
this.setObjectBinaryString(binaryString);
this.updateHeaderLength();
}
public PCEPOpenObject(PCEPCommonObjectHeader objectHeader, int version, int keepAlive, int deadTimer, int sessionID) {
this.setObjectHeader(objectHeader);
this.setVersionDecimalValue(version);
this.setFlagsBinaryString(PCEPComputationFactory.generateZeroString(flagsLength));
this.setKeepAliveDecimalValue(keepAlive);
this.setDeadTimerDecimalValue(deadTimer);
this.setSessionIDDecimalValue(sessionID);
this.updateHeaderLength();
}
private void updateHeaderLength() {
int objectFrameByteLength = this.getObjectFrameByteLength();
this.getObjectHeader().setLengthDecimalValue(objectFrameByteLength);
}
/**
* Object
*/
public PCEPCommonObjectHeader getObjectHeader() {
return objectHeader;
}
public void setObjectHeader(PCEPCommonObjectHeader objectHeader) {
this.objectHeader = objectHeader;
}
public String getObjectBinaryString() {
String binaryString = version + flags + keepAlive + deadTimer + sessionID;
return binaryString;
}
public void setObjectBinaryString(String binaryString) {
String versionBinaryString = binaryString.substring(versionStartBit, versionEndBit + 1);
String flagsBinaryString = binaryString.substring(flagsStartBit, flagsEndBit + 1);
String keepAliveBinaryString = binaryString.substring(keepAliveStartBit, keepAliveEndBit + 1);
String deadTimerBinaryString = binaryString.substring(deadTimerStartBit, deadTimerEndBit + 1);
String sessionIDBinaryString = binaryString.substring(sessionIDStartBit, sessionIDEndBit + 1);
this.setVersionBinaryString(versionBinaryString);
this.setFlagsBinaryString(flagsBinaryString);
this.setKeepAliveBinaryString(keepAliveBinaryString);
this.setDeadTimerBinaryString(deadTimerBinaryString);
this.setSessionIDBinaryString(sessionIDBinaryString);
}
public int getObjectFrameByteLength() {
int objectLength = version.length() + flags.length() + keepAlive.length() + deadTimer.length() + sessionID.length();
int headerLength = PCEPConstantValues.COMMON_OBJECT_HEADER_LENGTH;
int objectFrameByteLength = (objectLength + headerLength) / 8;
return objectFrameByteLength;
}
public String getObjectFrameBinaryString() {
String headerBinaryString = this.getObjectHeader().getHeaderBinaryString();
String objectBinaryString = this.getObjectBinaryString();
return headerBinaryString + objectBinaryString;
}
/**
* version
*/
public int getVersionDecimalValue() {
int decimalValue = (int) PCEPComputationFactory.getDecimalValue(version);
return decimalValue;
}
public String getVersionBinaryString() {
return this.version;
}
public void setVersionDecimalValue(int decimalValue) {
int binaryLength = versionLength;
int maxValue = (int) PCEPComputationFactory.MaxValueFabrication(binaryLength);
this.version = PCEPComputationFactory.setDecimalValue(decimalValue, maxValue, binaryLength);
}
public void setVersionBinaryString(String binaryString) {
String checkedBinaryString = PCEPComputationFactory.setBinaryString(binaryString, versionLength);
this.version = checkedBinaryString;
}
public void setVersionBinaryString(int startingBit, String binaryString) {
String checkedBinaryString = PCEPComputationFactory.setBinaryString(version, startingBit, binaryString, versionLength);
this.version = checkedBinaryString;
}
/**
* keepAlive
*/
public int getKeepAliveDecimalValue() {
int decimalValue = (int) PCEPComputationFactory.getDecimalValue(keepAlive);
return decimalValue;
}
public String getKeepAliveBinaryString() {
return this.keepAlive;
}
public void setKeepAliveDecimalValue(int decimalValue) {
int binaryLength = keepAliveLength;
int maxValue = (int) PCEPComputationFactory.MaxValueFabrication(binaryLength);
this.keepAlive = PCEPComputationFactory.setDecimalValue(decimalValue, maxValue, binaryLength);
}
public void setKeepAliveBinaryString(String binaryString) {
String checkedBinaryString = PCEPComputationFactory.setBinaryString(binaryString, keepAliveLength);
this.keepAlive = checkedBinaryString;
}
public void setKeepAliveBinaryString(int startingBit, String binaryString) {
String checkedBinaryString = PCEPComputationFactory.setBinaryString(keepAlive, startingBit, binaryString, keepAliveLength);
this.keepAlive = checkedBinaryString;
}
/**
* deadTimer
*/
public int getDeadTimerDecimalValue() {
int decimalValue = (int) PCEPComputationFactory.getDecimalValue(deadTimer);
return decimalValue;
}
public String getDeadTimerBinaryString() {
return this.deadTimer;
}
public void setDeadTimerDecimalValue(int decimalValue) {
int binaryLength = deadTimerLength;
int maxValue = (int) PCEPComputationFactory.MaxValueFabrication(binaryLength);
this.deadTimer = PCEPComputationFactory.setDecimalValue(decimalValue, maxValue, binaryLength);
}
public void setDeadTimerBinaryString(String binaryString) {
String checkedBinaryString = PCEPComputationFactory.setBinaryString(binaryString, deadTimerLength);
this.deadTimer = checkedBinaryString;
}
public void setDeadTimerBinaryString(int startingBit, String binaryString) {
String checkedBinaryString = PCEPComputationFactory.setBinaryString(deadTimer, startingBit, binaryString, deadTimerLength);
this.deadTimer = checkedBinaryString;
}
/**
* sessionID
*/
public int getSessionIDDecimalValue() {
int decimalValue = (int) PCEPComputationFactory.getDecimalValue(sessionID);
return decimalValue;
}
public String getSessionIDBinaryString() {
return this.sessionID;
}
public void setSessionIDDecimalValue(int decimalValue) {
int binaryLength = sessionIDLength;
int maxValue = (int) PCEPComputationFactory.MaxValueFabrication(binaryLength);
this.sessionID = PCEPComputationFactory.setDecimalValue(decimalValue, maxValue, binaryLength);
}
public void setSessionIDBinaryString(String binaryString) {
String checkedBinaryString = PCEPComputationFactory.setBinaryString(binaryString, sessionIDLength);
this.sessionID = checkedBinaryString;
}
public void setSessionIDBinaryString(int startingBit, String binaryString) {
String checkedBinaryString = PCEPComputationFactory.setBinaryString(sessionID, startingBit, binaryString, sessionIDLength);
this.sessionID = checkedBinaryString;
}
/**
* flags
*/
public int getFlagsDecimalValue() {
int decimalValue = (int) PCEPComputationFactory.getDecimalValue(flags);
return decimalValue;
}
public String getFlagsBinaryString() {
return this.flags;
}
public void setFlagsDecimalValue(int decimalValue) {
int binaryLength = flagsLength;
int maxValue = (int) PCEPComputationFactory.MaxValueFabrication(binaryLength);
this.flags = PCEPComputationFactory.setDecimalValue(decimalValue, maxValue, binaryLength);
}
public void setFlagsBinaryString(String binaryString) {
String checkedBinaryString = PCEPComputationFactory.setBinaryString(binaryString, flagsLength);
this.flags = checkedBinaryString;
}
public void setFlagsBinaryString(int startingBit, String binaryString) {
String checkedBinaryString = PCEPComputationFactory.setBinaryString(flags, startingBit, binaryString, flagsLength);
this.flags = checkedBinaryString;
}
public String toString() {
String versionInfo = "Version=" + this.getVersionDecimalValue();
String flagsInfo = ",Flags=" + this.getFlagsBinaryString();
String keepAliveInfo = ",KeepAlive=" + this.getKeepAliveDecimalValue();
String deadTimerInfo = ",DeadTimer=" + this.getDeadTimerDecimalValue();
String sessionIDInfo = ",SessionID=" + this.getSessionIDDecimalValue();
String headerInfo = this.getObjectHeader().toString();
String objectInfo = NAME + ":" + versionInfo + flagsInfo + keepAliveInfo + deadTimerInfo + sessionIDInfo + ">";
return headerInfo + objectInfo;
}
public String binaryInformation() {
String versionBinaryInfo = getVersionBinaryString();
String flagsInfo = "'" + this.getFlagsBinaryString();
String keepAliveBinaryInfo = "'" + getKeepAliveBinaryString();
String deadTimerBinaryInfo = "'" + getDeadTimerBinaryString();
String sessionIDBinaryInfo = "'" + getSessionIDBinaryString();
String headerInfo = this.getObjectHeader().binaryInformation();
String objectInfo = "[" + versionBinaryInfo + flagsInfo + keepAliveBinaryInfo + deadTimerBinaryInfo + sessionIDBinaryInfo + "]";
return headerInfo + objectInfo;
}
public String contentInformation() {
return "[" + NAME + "]";
}
}