package es.tid.tedb; import es.tid.ospf.ospfv2.lsa.tlv.subtlv.complexFields.BitmapLabelSet; import org.jgrapht.graph.SimpleDirectedWeightedGraph; import java.net.Inet4Address; import java.util.*; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class MultiLayerTEDB implements DomainTEDB { private ArrayList<TEDListener> registeredAlgorithms; /** * Graph of the Upper Layer Network */ /** * */ private SimpleDirectedWeightedGraph<Object,IntraDomainEdge> upperLayerGraph; /** * Graph of the Upper Layer Network */ private SimpleDirectedWeightedGraph<Object,IntraDomainEdge> lowerLayerGraph; /** * InterLayer Graph */ private SimpleDirectedWeightedGraph<Object,IntraDomainEdge> interLayerGraph; /** * Reachability information */ private ReachabilityEntry reachabilityEntry; /** * WSON Information of the lower Layer */ private WSONInformation WSONinfo=null; private Lock TEDBlock; /** * List of interdomain Links */ private LinkedList<InterDomainEdge> interDomainLinks; private Hashtable<Object,Object> RelationNodesInterlayer; public MultiLayerTEDB(){ registeredAlgorithms= new ArrayList<TEDListener>(); TEDBlock=new ReentrantLock(); } public SimpleDirectedWeightedGraph<Object, IntraDomainEdge> getUpperLayerGraph() { return upperLayerGraph; } public void setUpperLayerGraph( SimpleDirectedWeightedGraph<Object, IntraDomainEdge> upperLayerGraph) { this.upperLayerGraph = upperLayerGraph; } public SimpleDirectedWeightedGraph<Object, IntraDomainEdge> getLowerLayerGraph() { return lowerLayerGraph; } public void setLowerLayerGraph( SimpleDirectedWeightedGraph<Object, IntraDomainEdge> lowerLayerGraph) { this.lowerLayerGraph = lowerLayerGraph; } public SimpleDirectedWeightedGraph<Object, IntraDomainEdge> getInterLayerGraph() { return interLayerGraph; } public void setInterLayerGraph( SimpleDirectedWeightedGraph<Object, IntraDomainEdge> interLayerGraph) { this.interLayerGraph = interLayerGraph; } public SimpleDirectedWeightedGraph<Object,IntraDomainEdge> getDuplicatedUpperLayerkGraph(){ SimpleDirectedWeightedGraph<Object,IntraDomainEdge> graphCopy; TEDBlock.lock(); try{ graphCopy= (SimpleDirectedWeightedGraph<Object, IntraDomainEdge>) upperLayerGraph.clone(); } finally{ TEDBlock.unlock(); } return graphCopy; } public Hashtable<Object, Object> getRelationNodesInterlayer() { return RelationNodesInterlayer; } public SimpleDirectedWeightedGraph<Object,IntraDomainEdge> getDuplicatedLowerLayerkGraph(){ SimpleDirectedWeightedGraph<Object,IntraDomainEdge> graphCopy; TEDBlock.lock(); try{ graphCopy= (SimpleDirectedWeightedGraph<Object, IntraDomainEdge>) lowerLayerGraph.clone(); } finally{ TEDBlock.unlock(); } return graphCopy; } public SimpleDirectedWeightedGraph<Object,IntraDomainEdge> getDuplicatedInterLayerGraph(){ SimpleDirectedWeightedGraph<Object,IntraDomainEdge> graphCopy; TEDBlock.lock(); try{ graphCopy= (SimpleDirectedWeightedGraph<Object, IntraDomainEdge>) interLayerGraph.clone(); } finally{ TEDBlock.unlock(); } return graphCopy; } public void initializeFromFile(String file) { upperLayerGraph=FileTEDBUpdater.readNetwork(file, "mpls"); lowerLayerGraph=FileTEDBUpdater.readNetwork(file, "wson"); interLayerGraph=FileTEDBUpdater.readNetwork(file, "interlayer"); WSONinfo = FileTEDBUpdater.getWSONInformation(file, "wson"); interDomainLinks = FileTEDBUpdater.readInterDomainLinks(file); reachabilityEntry = new ReachabilityEntry(); //domainReachabilityIPv4Prefix=new byte[4]; FileTEDBUpdater.getDomainReachabilityFromFile(file,reachabilityEntry,"mpls"); } @Override public void initializeFromFile(String file, String learnFrom) { } @Override public boolean isITtedb() { // TODO Auto-generated method stub return false; } @Override public String printTopology() { String topoString; Set<Object> vetexSet= upperLayerGraph.vertexSet(); Iterator <Object> vertexIterator=vetexSet.iterator(); topoString="MPLS Nodes: \r\n"; while (vertexIterator.hasNext()){ Object vertex= vertexIterator.next(); topoString=topoString+"\t"+vertex.toString()+"\r\n"; } topoString=topoString+"MPLS Link list: \r\n"; Set<IntraDomainEdge> edgeSet= upperLayerGraph.edgeSet(); Iterator <IntraDomainEdge> edgeIterator=edgeSet.iterator(); while (edgeIterator.hasNext()){ IntraDomainEdge edge= edgeIterator.next(); topoString=topoString+"\t"+edge.toString()+"\r\n"; } vetexSet= lowerLayerGraph.vertexSet(); vertexIterator=vetexSet.iterator(); topoString="GMPLS Nodes: \r\n"; while (vertexIterator.hasNext()){ Object vertex= vertexIterator.next(); topoString=topoString+"\t"+vertex.toString()+"\r\n"; } topoString=topoString+"gmpls Link list: \r\n"; edgeSet= lowerLayerGraph.edgeSet(); edgeIterator=edgeSet.iterator(); while (edgeIterator.hasNext()){ IntraDomainEdge edge= edgeIterator.next(); topoString=topoString+"\t"+edge.toString()+"\r\n"; } topoString=topoString+"InterLayer list: \r\n"; edgeSet= interLayerGraph.edgeSet(); edgeIterator=edgeSet.iterator(); while (edgeIterator.hasNext()){ IntraDomainEdge edge= edgeIterator.next(); topoString=topoString+"\t"+edge.toString()+"\r\n"; } topoString=topoString+printInterDomainLinks(); return topoString; } @Override public boolean belongsToDomain(Object addr) { int i; byte[] addrbytes= ((Inet4Address)addr).getAddress(); for (i=0;i<4;++i){ addrbytes[i]=(byte) (addrbytes[i]&(reachabilityEntry.getMask())[i]); } return Arrays.equals(addrbytes,reachabilityEntry.getAggregatedIPRange().getAddress()); } public ReachabilityEntry getReachabilityEntry() { return reachabilityEntry; } public LinkedList<InterDomainEdge> getInterDomainLinks() { return interDomainLinks; } @Override public String printInterDomainLinks(){ String topoString=""; int size = interDomainLinks.size(); topoString="Interdomain Link list: \r\n"; for (int i=0;i<size;i++){ //por pantalla InterDomainEdge edge = interDomainLinks.get(i); topoString=topoString+"\t"+edge.toString()+"\r\n"; } return topoString; } public boolean containsVertex(Object vertex) { return upperLayerGraph.containsVertex(vertex); } public WSONInformation getWSONinfo() { return WSONinfo; } @Override public void notifyWavelengthReservation(LinkedList<Object> sourceVertexList, LinkedList<Object> targetVertexList, int wavelength, boolean bidirectional){ TEDBlock.lock(); try { for (int i=0;i<sourceVertexList.size();++i){ IntraDomainEdge edge=lowerLayerGraph.getEdge(sourceVertexList.get(i), targetVertexList.get(i)); edge.getTE_info().setWavelengthReserved(wavelength); if (bidirectional == true){ edge=lowerLayerGraph.getEdge(targetVertexList.get(i), sourceVertexList.get(i)); edge.getTE_info().setWavelengthReserved(wavelength); } } }finally{ TEDBlock.unlock(); } for (int i=0;i<registeredAlgorithms.size();++i){ registeredAlgorithms.get(i).notifyWavelengthReservation(sourceVertexList, targetVertexList, wavelength); if (bidirectional == true){ registeredAlgorithms.get(i).notifyWavelengthReservation(targetVertexList, sourceVertexList, wavelength); } } } @Override public void notifyWavelengthEndReservation(LinkedList<Object> sourceVertexList, LinkedList<Object> targetVertexList, int wavelength, boolean bidirectional){ // TODO Auto-generated method stub //Delete the resource reservation TEDBlock.lock(); try { for (int i=0;i<sourceVertexList.size();++i){ // SimpleDirectedWeightedGraph<Object,FiberLinkEdge> graph= ted.getNetworkGraph(); IntraDomainEdge edge=lowerLayerGraph.getEdge(sourceVertexList.get(i),targetVertexList.get(i) ); edge.getTE_info().setWavelengthUnReserved(wavelength); if (bidirectional == true) { edge=lowerLayerGraph.getEdge(targetVertexList.get(i), sourceVertexList.get(i)); edge.getTE_info().setWavelengthUnReserved(wavelength); } } }finally{ TEDBlock.unlock(); } for (int i=0;i<registeredAlgorithms.size();++i){ registeredAlgorithms.get(i).notifyWavelengthEndReservation(sourceVertexList, targetVertexList, wavelength); if (bidirectional == true) { registeredAlgorithms.get(i).notifyWavelengthEndReservation(targetVertexList, sourceVertexList, wavelength); } } //FIXME:TEMPORAL!!!!!! //requestDispatcher.moveRetryQueueToComputingRequestQueue(); //Call request dispatcher to pass requests to queue? } @Override public void notifyWavelengthChange(Object localInterfaceIPAddress, Object remoteInterfaceIPAddress, BitmapLabelSet previousBitmapLabelSet, BitmapLabelSet newBitmapLabelSet) { for (int i=0;i<registeredAlgorithms.size();++i){ registeredAlgorithms.get(i).notifyWavelengthStatusChange(localInterfaceIPAddress, remoteInterfaceIPAddress, previousBitmapLabelSet, newBitmapLabelSet); } } @Override public void register(TEDListener compAlgPreComp) { registeredAlgorithms.add(compAlgPreComp); } @Override public void notifyNewVertex(Object vertex) { for (int i=0;i<registeredAlgorithms.size();++i){ registeredAlgorithms.get(i).notifyNewVertex(vertex); } } @Override public void notifyNewEdge(Object source, Object destination) { for (int i=0;i<registeredAlgorithms.size();++i){ registeredAlgorithms.get(i).notifyNewEdge(source,destination); } } @Override public void clearAllReservations() { if (WSONinfo!=null){ TEDBlock.lock(); try{ Set<IntraDomainEdge> edgeSet= lowerLayerGraph.edgeSet(); Iterator <IntraDomainEdge> edgeIterator=edgeSet.iterator(); while (edgeIterator.hasNext()){ IntraDomainEdge edge= edgeIterator.next(); edge.TE_info.setAllWavelengtshUnReserved(); } }finally{ TEDBlock.unlock(); } for (int i=0;i<registeredAlgorithms.size();++i){ registeredAlgorithms.get(i).notifyTEDBFullUpdate(); } } } @Override public void notifyNewEdgeIP(Object source, Object destination, TE_Information informationTEDB) { for (int i=0;i<registeredAlgorithms.size();++i){ registeredAlgorithms.get(i).notifyNewEdgeIP(source,destination, informationTEDB); } } public void notificationEdgeIP_AuxGraph(Object src, Object dst, TE_Information informationTEDB) { for (int i=0;i<registeredAlgorithms.size();++i){ registeredAlgorithms.get(i).notificationEdgeIP_AuxGraph(src,dst, informationTEDB); } } public void notificationEdgeOPTICAL_AuxGraph(Object src, Object dst, int lambda) { for (int i=0;i<registeredAlgorithms.size();++i){ registeredAlgorithms.get(i).notificationEdgeOPTICAL_AuxGraph(src, dst, lambda); } } @Override public void notifyWavelengthEndReservationSSON( LinkedList<Object> sourceVertexList, LinkedList<Object> targetVertexList, int wavelength, boolean bidirectional, int m) { // TODO Auto-generated method stub } @Override public void notifyWavelengthReservationSSON( LinkedList<Object> sourceVertexList, LinkedList<Object> targetVertexList, int wavelength, boolean bidirectional, int m) { // TODO Auto-generated method stub } @Override public SSONInformation getSSONinfo() { // TODO Auto-generated method stub return null; } @Override public Set<IntraDomainEdge> getIntraDomainLinks() { // TODO Auto-generated method stub return null; } @Override public void notifyWavelengthReservationWLAN( LinkedList<Object> sourceVertexList, LinkedList<Object> targetVertexList, LinkedList<Integer> wlans, boolean bidirectional) { // TODO Auto-generated method stub } @Override public void registerSSON(SSONListener compAlgPreComp) { // TODO Auto-generated method stub } @Override public Inet4Address getDomainID() { // TODO Auto-generated method stub return null; } @Override public void setWSONinfo(WSONInformation wSONinfo) { // TODO Auto-generated method stub } @Override public void setSSONinfo(SSONInformation sSONinfo) { // TODO Auto-generated method stub } @Override public void createGraph() { // TODO Auto-generated method stub } @Override public Set<Object> getIntraDomainLinksvertexSet() { // TODO Auto-generated method stub return null; } @Override public Hashtable<Object, Node_Info> getNodeTable() { // TODO Auto-generated method stub return null; } @Override public IT_Resources getItResources() { // TODO Auto-generated method stub return null; } @Override public void setItResources(IT_Resources itResources) { // TODO Auto-generated method stub } }