package net.decix.jipfix.detector;
import java.net.DatagramPacket;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.decix.jipfix.header.DataRecord;
import net.decix.jipfix.header.L2IPDataRecord;
import net.decix.jipfix.header.MessageHeader;
import net.decix.jipfix.header.SetHeader;
public class SubsequentMissingDataRecordDetector implements MissingDataRecordDetector {
private final static Logger LOGGER = Logger.getLogger(SubsequentMissingDataRecordDetector.class.getName());
private HashMap<IPObservationDomain, Long> sequenceNumbers = new HashMap<IPObservationDomain, Long>(5000);
public synchronized void detectMissing(DatagramPacket dp, MessageHeader mh) {
// handle sequence number check
IPObservationDomain currentIPObservationDomain = new IPObservationDomain(dp.getAddress(), mh.getObservationDomainID());
long expectedSequenceNumber = -1l;
if (sequenceNumbers.containsKey(currentIPObservationDomain)) {
expectedSequenceNumber = sequenceNumbers.get(currentIPObservationDomain);
}
if (expectedSequenceNumber != -1l) {
long currentSequenceNumber = mh.getSequenceNumber();
if (currentSequenceNumber != expectedSequenceNumber) {
LOGGER.log(Level.INFO, "Missing data record: " + currentIPObservationDomain + ": received sequence number " + currentSequenceNumber + " but expected " + expectedSequenceNumber);
}
}
long numberDataRecords = 0;
for (SetHeader sh : mh.getSetHeaders()) {
for (DataRecord dr : sh.getDataRecords()) {
if (dr instanceof L2IPDataRecord) numberDataRecords++;
}
}
sequenceNumbers.put(currentIPObservationDomain, new Long(mh.getSequenceNumber() + numberDataRecords));
}
}