package pl.edu.agh.logic;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import pl.edu.agh.model.TrafficData;
import pl.edu.agh.model.TrafficInfo;
public class TrafficDataBuffer {
private Map<Long, TrafficDataCollector> collectedData = new HashMap<Long, TrafficDataCollector>();
private List<TrafficData> fullData = new ArrayList<TrafficData>();
public boolean appendChunk(TrafficData data, long sender, int seq, boolean lastChunk) {
TrafficDataCollector collector = collectedData.get(sender);
if(collector == null) {
collector = new TrafficDataCollector();
collectedData.put(sender, collector);
}
collector.appendChunk(data, seq, lastChunk);
if(collector.collectedAll()) {
fullData.add(collector.getData());
return true;
}
return false;
}
public List<TrafficData> getCollectedData() {
return fullData;
}
public void discard() {
collectedData.clear();
fullData.clear();
}
private static class TrafficDataCollector {
private int chunksTotal = 0;
private Map<Integer, TrafficData> chunks = new TreeMap<Integer, TrafficData>();
public void appendChunk(TrafficData data, int seq, boolean last) {
chunks.put(seq, data);
if(last) {
chunksTotal = seq+1;
}
}
public boolean collectedAll() {
return chunksTotal > 0 && chunks.size() == chunksTotal;
}
public TrafficData getData() {
if(!collectedAll()) {
return null;
}
List<TrafficInfo> infos = new ArrayList<TrafficInfo>();
for(TrafficData data : chunks.values()) {
infos.addAll(data.getTrafficInfos());
}
return new TrafficData(infos);
}
}
}