package es.tid.pce.computingEngine.algorithms;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.jgrapht.graph.SimpleDirectedWeightedGraph;
import es.tid.of.DataPathID;
import es.tid.ospf.ospfv2.lsa.tlv.subtlv.AvailableLabels;
import es.tid.ospf.ospfv2.lsa.tlv.subtlv.complexFields.BitmapLabelSet;
import es.tid.pce.pcep.constructs.Path;
import es.tid.pce.pcep.constructs.Request;
import es.tid.pce.pcep.objects.Metric;
import es.tid.pce.pcep.objects.ObjectParameters;
import es.tid.tedb.IntraDomainEdge;
import es.tid.tedb.TE_Information;
/**
* Convenient class for useful methods used in different algorithms.
*
* @author ogondio
*
*/
public class PCEPUtils {
private Logger log=LoggerFactory.getLogger("PCEServer");
public static void completeMetric(Path path, Request req,List<IntraDomainEdge> edge_list){
for (int i=0;i<req.getMetricList().size();++i){
if (req.getMetricList().get(i).isComputedMetricBit()){
int metric_type=req.getMetricList().get(i).getMetricType();
switch (metric_type){
case ObjectParameters.PCEP_METRIC_TYPE_HOP_COUNT:
Metric metric=new Metric();
metric.setMetricType(ObjectParameters.PCEP_METRIC_TYPE_HOP_COUNT);
float metricValue=(float)edge_list.size();
metric.setMetricValue(metricValue);
path.getMetricList().add(metric);
break;
case ObjectParameters.PCEP_METRIC_TYPE_LATENCY_METRIC:
Metric metricLat=new Metric();
metricLat.setMetricType(ObjectParameters.PCEP_METRIC_TYPE_LATENCY_METRIC);
float metricValueLat=0;
for (int j=0;j<edge_list.size();++j){
metricValueLat+=edge_list.get(j).getDelay_ms();
}
metricLat.setMetricValue(metricValueLat);
path.getMetricList().add(metricLat);
break;
}
}
}
}
public static SimpleDirectedWeightedGraph<Object,IntraDomainEdge> duplicateTEDDB(SimpleDirectedWeightedGraph<Object,IntraDomainEdge> networkGraph){
SimpleDirectedWeightedGraph<Object,IntraDomainEdge> networkGraphDuplicated= new SimpleDirectedWeightedGraph<Object,IntraDomainEdge> (IntraDomainEdge.class);
Set<Object> nodes= networkGraph.vertexSet();
Iterator<Object> iter=nodes.iterator();
Set<IntraDomainEdge> fiberEdges= networkGraph.edgeSet();
DataPathID dpid = new DataPathID();
Iterator<IntraDomainEdge> iterFiberLink;
while (iter.hasNext()){
networkGraphDuplicated.addVertex( iter.next());
}
iterFiberLink=fiberEdges.iterator();
while (iterFiberLink.hasNext()){
IntraDomainEdge fiberEdge =iterFiberLink.next();
IntraDomainEdge edge=new IntraDomainEdge();
TE_Information informationTEDB=new TE_Information();
edge.setTE_info(informationTEDB);
informationTEDB.setAvailableLabels(new AvailableLabels());
BitmapLabelSet newBitmapLabelSet = new BitmapLabelSet();
int numLabels = fiberEdge.getTE_info().getAvailableLabels().getLabelSet().getNumLabels();
newBitmapLabelSet.createBytesBitMap(((BitmapLabelSet)fiberEdge.getTE_info().getAvailableLabels().getLabelSet()).getBytesBitMap());
int numberBytes = numLabels/8;
if ((numberBytes*8)<numLabels){
numberBytes++;
}
byte[] bytesBitMapReserved = new byte[numberBytes];
for (int i=0;i<numberBytes;i++)
bytesBitMapReserved[i]=0x00;
newBitmapLabelSet.setBytesBitmapReserved(bytesBitMapReserved);
newBitmapLabelSet.setNumLabels(numLabels);
informationTEDB.getAvailableLabels().setLabelSet(newBitmapLabelSet);
networkGraphDuplicated.addEdge(fiberEdge.getSource(),fiberEdge.getTarget(),edge);
}
return networkGraphDuplicated;
}
}