/** * 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 java.util.ArrayList; 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.impl.erosubobjects.EROSubobjects; import com.pcee.protocol.message.objectframe.impl.erosubobjects.EROUnnumberedInterface; import com.pcee.protocol.message.objectframe.impl.erosubobjects.LabelEROSubobject; import com.pcee.protocol.message.objectframe.impl.erosubobjects.MLDelimiter; import com.pcee.protocol.message.objectframe.impl.erosubobjects.PCEPAddress; /** * <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 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | | * // (Subobjects) // * | | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * </pre> */ // TODO Generate methods to split and identify objects public class PCEPGenericExplicitRouteObjectImpl extends PCEPExplicitRouteObject { private final String NAME = "Explicit Route Object"; private PCEPCommonObjectHeader objectHeader; // private LinkedList<PCEPTLVObject> tlvList; private ArrayList<EROSubobjects> traversedVertexList = new ArrayList<EROSubobjects>(); // private String subObjectsString; public PCEPGenericExplicitRouteObjectImpl(PCEPCommonObjectHeader objectHeader, String binaryString) { this.setObjectHeader(objectHeader); this.setObjectBinaryString(binaryString); this.updateHeaderLength(); } public PCEPGenericExplicitRouteObjectImpl(PCEPCommonObjectHeader objectHeader, ArrayList<EROSubobjects> traversedVertexList) { this.setObjectHeader(objectHeader); this.setTraversedVertexList(traversedVertexList); 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() { StringBuffer subObjectsStringBuffer = new StringBuffer(); for (int i = 0; i < traversedVertexList.size(); i++) { EROSubobjects address = traversedVertexList.get(i); subObjectsStringBuffer.append(address.getObjectBinaryString()); } return subObjectsStringBuffer.toString(); } public void setObjectBinaryString(String binaryString) { ArrayList<EROSubobjects> vertexList = new ArrayList<EROSubobjects>(); while (binaryString.length() > 0) { String lengthBinaryString = binaryString.substring(8, 16); int length = (int) PCEPComputationFactory.getDecimalValue(lengthBinaryString); length = length * 8; String tempString = binaryString.substring(0, length); int type = (int) PCEPComputationFactory.getDecimalValue(tempString.substring(1, 8)); EROSubobjects temp = null; if (type==EROSubobjects.PCEPIPv4AddressType) { temp=new PCEPAddress(tempString, true); } else if (type==EROSubobjects.PCEPUnnumberedInterfaceType) { temp = new EROUnnumberedInterface(tempString); } else if (type==EROSubobjects.PCEPMLDelimiterType) { temp = new MLDelimiter(tempString); } else if (type==EROSubobjects.PCEPLabelEROSubobjectType) { temp = LabelEROSubobject.getObjectFromBinaryString(tempString); } if (temp==null) System.out.println("[" + NAME + "] Problem in parsing the ERO Subobject in the setObjectBinaryString Function"); vertexList.add(temp); binaryString = binaryString.substring(length); } setTraversedVertexList(vertexList); } public int getObjectFrameByteLength() { int objectsBinaryLength = this.getTraversedVertexListBinaryLength(); int headerLength = PCEPConstantValues.COMMON_OBJECT_HEADER_LENGTH / 8; int objectFrameByteLength = objectsBinaryLength + headerLength; return objectFrameByteLength; } public String getObjectFrameBinaryString() { String headerBinaryString = this.getObjectHeader().getHeaderBinaryString(); String objectBinaryString = this.getObjectBinaryString(); return headerBinaryString + objectBinaryString; } public void setTraversedVertexList(ArrayList<EROSubobjects> subObjects) { this.traversedVertexList = subObjects; } public ArrayList<EROSubobjects> getTraversedVertexList() { return this.traversedVertexList; } private int getTraversedVertexListBinaryLength() { int length = 0; for (int i = 0; i < traversedVertexList.size(); i++) { length += ((traversedVertexList.get(i).getByteLength())); } return length; } public String printPath() { String traversedVertexesList = new String(); for (EROSubobjects address : traversedVertexList) { if (address instanceof PCEPAddress) traversedVertexesList = traversedVertexesList + ((PCEPAddress)address).getIPv4Address(false) + "-"; else if (address instanceof EROUnnumberedInterface){ traversedVertexesList = traversedVertexesList + "UI-" + ((EROUnnumberedInterface)address).getRouterIDDecimalValue() + ":" + ((EROUnnumberedInterface)address).getInterfaceIDDecimalValue() + "-"; } else if (address instanceof MLDelimiter){ traversedVertexesList = traversedVertexesList + "ML-"; } } return traversedVertexesList; } // public String getTraversedVertexes() { // String traversedVertexesList = new String(); // // for (int i = 0; i < traversedVertexList.size(); i++) { // // traversedVertexesList = traversedVertexesList + // traversedVertexList.get(i).getAddress() + "-->"; // // if (i != traversedVertexList.size()) { // traversedVertexesList = traversedVertexesList + "--"; // } // } // // return traversedVertexesList; // } public String toString() { String headerInfo = this.getObjectHeader().toString(); StringBuffer objectInfo = new StringBuffer(); objectInfo.append("<Include Route Object:"); for (int i = 0; i < traversedVertexList.size(); i++) { objectInfo.append(traversedVertexList.get(i).toString()); } objectInfo.append(">"); return headerInfo + objectInfo; } public String binaryInformation() { String headerInfo = this.getObjectHeader().binaryInformation(); StringBuffer objectInfo = new StringBuffer(); for (int i = 0; i < traversedVertexList.size(); i++) { objectInfo.append(traversedVertexList.get(i).binaryInformation()); } return headerInfo + objectInfo; } public String contentInformation() { String EROName = "[" + NAME; String subObjectsName = new String(); for (EROSubobjects address : traversedVertexList) { subObjectsName = subObjectsName + address.contentInformation(); } return EROName + subObjectsName + "]"; } public static void main(String[] args){ PCEPCommonObjectHeader objectHeader = new PCEPCommonObjectHeader(7, 1, "1", "0"); ArrayList<EROSubobjects> temp= new ArrayList<EROSubobjects>(); temp.add(new PCEPAddress("192.168.1.2", false)); temp.add(new PCEPAddress("192.168.1.3", false)); temp.add(new MLDelimiter()); PCEPGenericExplicitRouteObjectImpl a = new PCEPGenericExplicitRouteObjectImpl (objectHeader, temp); System.out.println(a.getObjectFrameBinaryString()); String header = a.getObjectFrameBinaryString().substring(0, 32); PCEPCommonObjectHeader newHeader = new PCEPCommonObjectHeader(header); System.out.println(a.getObjectFrameBinaryString().substring(32).length()); PCEPGenericExplicitRouteObjectImpl b = new PCEPGenericExplicitRouteObjectImpl (newHeader, a.getObjectFrameBinaryString().substring(32)); System.out.println(b); } }