/** * 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; import java.util.StringTokenizer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Super class for all header and objects * * @author Marek Drogon */ public class PCEPComputationFactory { private static Logger logger = LoggerFactory.getLogger(PCEPComputationFactory.class); public static byte[] rawMessageToByteArray(String rawMessage) { int byteArrayLength = rawMessage.length() / 8; byte[] byteArray = new byte[byteArrayLength]; String rawMessageString = rawMessage; for (int i = 0; i < byteArrayLength; i++) { String bits = rawMessageString.substring(0, 8); rawMessageString = rawMessageString.substring(8); byteArray[i] = binaryStringToByteConverter(bits); } return byteArray; } public static String byteArrayToRawMessage(byte[] byteArray) { String rawMessageString = new String(); for (int i = 0; i < byteArray.length; i++) { rawMessageString = rawMessageString + byteToBinaryStringConverter(byteArray[i]); } return rawMessageString; } public static byte binaryStringToByteConverter(String rawString) { char[] bitArray = rawString.toCharArray(); int x = 0x00; for (int i = 0; i < 8; i++) { if (bitArray[i] == '1') { x = x << 1; x = x + 0x0001; } else x = x << 1; } return (byte) x; } public static String byteToBinaryStringConverter(byte bits) { char[] bitArray = new char[8]; int y = (int) bits; for (int i = 0; i < 8; i++) { if ((y & 0x0001) == 0x0001) { bitArray[7 - i] = '1'; } else bitArray[7 - i] = '0'; y = y >>> 1; } return new String(bitArray); } public static byte binaryStringToByteConverter2(String rawString) { char[] bitArray = rawString.toCharArray(); int x = 0; for (int i = 0; i < 7; i++) { if (bitArray[i] == '1') x += 1 << i; } if (bitArray[7] == '1') x = x - 128; return (byte) x; } public static String byteToBinaryStringConverter2(byte bits) { char[] bitArray = { '0', '0', '0', '0', '0', '0', '0', '0' }; int x = 0; int i = 0; if (bits < 0) { bitArray[7] = '1'; x = 128 + bits; } else { bitArray[7] = '0'; x = bits; } while (x != 0) { if (x % 2 == 1) bitArray[i] = '1'; else bitArray[i] = '0'; x /= 2; i++; } return new String(bitArray); } public static long getDecimalValue(String headerMember) { long x = 0; for (int i = 0; i < headerMember.length(); i++) { x += Integer.parseInt(headerMember.substring(headerMember.length() - 1 - i, headerMember.length() - i)) * Math.pow(2, i); } return x; } public static String getBinaryString(String headerMember, int headerMemberBitIndex) { return Character.toString(headerMember.charAt(headerMemberBitIndex)); } public static String setDecimalValue(long decimalValue, long headerMemberMaxValue, int headerMemberLength) { long checkedDecimalValue = checkInputDecimalValue(decimalValue, headerMemberMaxValue); String binaryString = Long.toString(checkedDecimalValue, 2); return checkInputBinaryString(binaryString, headerMemberLength); } public static String setBinaryString(String binaryString, int headerMemberLength) { return checkInputBinaryString(binaryString, headerMemberLength); } public static String setBinaryString(String headerMember, int startingBit, String binaryString, int headerMemberLength) { int checkedStartingBit = checkInputStartingBit(startingBit, headerMemberLength); int binaryStringLength = binaryString.length(); int correctBinaryStringLength = headerMemberLength - (checkedStartingBit); if (binaryStringLength + (startingBit + 1) > headerMemberLength) { binaryString = checkInputBinaryString(binaryString, correctBinaryStringLength); } else { binaryString = checkInputBinaryString(binaryString, binaryStringLength); } String headerMemberFrontString = headerMember.substring(0, startingBit); String headerMemberChangedBitsString = binaryString; String headerMemberRearString = headerMember.substring(startingBit + binaryString.length()); return headerMemberFrontString + headerMemberChangedBitsString + headerMemberRearString; } public static String checkInputBinaryString(String binaryString, int headerMemberLength) { try { // TODO: Workaround Hack for String longer than 32 bit..... if (binaryString.length() < 32) { Integer.valueOf(binaryString, 2); } } catch (Exception ex) { logger.error("Error at: binaryString malformed! Filled binaryString with zeros!"); return appendZerosToBinaryString("", headerMemberLength); } if (binaryString.length() == headerMemberLength) { return binaryString; } else if (binaryString.length() > headerMemberLength) { logger.warn("Error at: binaryString too long, corrected by cutting of bits!"); return binaryString.substring(0, headerMemberLength); //what's the logic behind this code? /*return binaryString.substring(0, binaryString.length() */// - (binaryString.length() - headerMemberLength)); } else if (binaryString.length() < headerMemberLength) { logger.warn("Error at: binaryString too short, corrected by appending zeros!"); return appendZerosToBinaryString(binaryString, headerMemberLength); } else { logger.warn("Error at: binaryString malformed! Filled binaryString with zeros!"); return appendZerosToBinaryString("", headerMemberLength); } } public static int checkInputDecimalValue(int decimalValue, int headerMaxValue) { if (decimalValue >= 0 && decimalValue <= headerMaxValue) { return decimalValue; } else { logger.error("Error at: Wrong decimalValue! Set Value to 0"); return decimalValue = 0; } } public static long checkInputDecimalValue(long decimalValue, long headerMaxValue) { if (decimalValue >= 0 && decimalValue <= headerMaxValue) { return decimalValue; } else { logger.error("Error at: Wrong decimalValue! Set Value to 0"); return decimalValue = 0; } } public static int checkInputStartingBit(int inputStartingBit, int headerMemberLength) { if (inputStartingBit >= 0 && inputStartingBit < headerMemberLength) { return inputStartingBit; } else { logger.error("Error at: startingBit out of Bounds! Set to 0!"); return 0; } } public static String appendZerosToBinaryString(String binaryString, int headerMemberLength) { String temp = binaryString; for (int i = 0; i < (headerMemberLength - binaryString.length()); i++) { temp = "0" + temp; } return temp; } public static String reverseBinaryString(String binaryString) { String reversedBinaryString = new StringBuffer(binaryString).reverse() .toString(); return reversedBinaryString; } public static String generateZeroString(int length) { StringBuffer temp = new StringBuffer(); for (int i = 0; i < length; i++) { temp.append("0"); } return temp.toString(); } public static long MaxValueFabrication(int bitLength) { long sum = 0; for (short i = 0; i < bitLength; i++) { sum += 1 << i; } return sum; } /** * Transforms x.x.x.x schema in binaryAddress * * @param x * .x.x.x schema will be transformed in binaryAddress */ public static String convertAddressToBinaryAddress(String input) { StringBuffer addressBuffer = new StringBuffer(); StringTokenizer addressTokenizer = new StringTokenizer(input, "."); int tokenLength = 8; while (addressTokenizer.hasMoreTokens()) { String currentAddressToken = addressTokenizer.nextToken(); String nonRevertedbinaryString = Integer.toBinaryString(Integer .valueOf(currentAddressToken).intValue()); String completeBinaryString = PCEPComputationFactory .appendZerosToBinaryString(nonRevertedbinaryString, tokenLength); addressBuffer.append(completeBinaryString); } return addressBuffer.toString(); } public static String convertBinaryAddressToAddress(String binaryAddress) { StringBuffer addressStringBuffer = new StringBuffer(); while (!binaryAddress.isEmpty()) { addressStringBuffer.append("."); String token = binaryAddress.substring(0, 8); binaryAddress = binaryAddress.substring(8); String reversedToken = token; int intToken = Integer.valueOf(reversedToken, 2).intValue(); String stringToken = Integer.toString(intToken); addressStringBuffer.append(stringToken); } // removes the first dot! String addressString = addressStringBuffer.toString().substring(1); return addressString; } }