package com.neverwinterdp.tool.message;
import java.io.File;
import java.io.IOException;
import java.util.Map;
import java.util.TreeMap;
import org.tap4j.model.TestResult;
import org.tap4j.model.TestSet;
import org.tap4j.producer.TapProducer;
import org.tap4j.producer.TapProducerFactory;
import org.tap4j.util.StatusValues;
public class MessageTracker {
private TreeMap<Integer, PartitionMessageTracker> partitions = new TreeMap<>();
public int getLogCount() {
int logCount = 0;
for (PartitionMessageTracker sel : partitions.values()) {
logCount += sel.getLogCount();
}
return logCount;
}
public int getDuplicatedCount() {
int duplicatedCount = 0;
for (PartitionMessageTracker sel : partitions.values()) {
duplicatedCount += sel.getDuplicatedCount();
}
return duplicatedCount;
}
public boolean isInSequence() {
for (PartitionMessageTracker sel : partitions.values()) {
if (!sel.isInSequence())
return false;
}
return true;
}
public void log(Message message) {
log(message.getPartition(), message.getTrackId());
}
public void log(int partition, int trackId) {
PartitionMessageTracker partitionTracker = getPartitionMessageTracker(partition, true);
partitionTracker.log(trackId);
}
public PartitionMessageTracker getPartitionMessageTracker(int partition) {
return partitions.get(partition);
}
PartitionMessageTracker getPartitionMessageTracker(int partition, boolean create) {
PartitionMessageTracker partitionTracker = partitions.get(partition);
if (partitionTracker != null)
return partitionTracker;
if (!create)
return null;
synchronized (partitions) {
partitionTracker = partitions.get(partition);
if (partitionTracker != null)
return partitionTracker;
partitionTracker = new PartitionMessageTracker(partition);
partitions.put(partition, partitionTracker);
return partitionTracker;
}
}
public void optimize() {
for (PartitionMessageTracker sel : partitions.values()) {
sel.optimize();
}
}
public void dump(Appendable out) throws IOException {
out.append("\nMessage Tracker: \n\n");
for (Map.Entry<Integer, PartitionMessageTracker> entry : partitions.entrySet()) {
int partition = entry.getKey();
PartitionMessageTracker partitionTracker = entry.getValue();
partitionTracker.dump(out, "Tracking message for the partition " + partition);
}
out.append("\nLog Count: " + getLogCount() + "\n");
}
//prefer using details for each partitionTracker for a thorough report
public void junitReport(String junitReport) {
TestSet testSet = new TestSet();
int testNum = 0;
optimize();
for (Map.Entry<Integer, PartitionMessageTracker> entry : partitions.entrySet()) {
int partition = entry.getKey();
PartitionMessageTracker partitionTracker = entry.getValue();
testSet.addTestResult(newTestResult(++testNum,
"Partition: " + partition,
true));
testSet.addTestResult(newTestResult(++testNum,
"From: " + partitionTracker.getMinMessageId(),
partitionTracker.getMinMessageId() <= partitionTracker.getMaxMessageId()));
testSet.addTestResult(newTestResult(++testNum,
"To: " + partitionTracker.getMaxMessageId(),
partitionTracker.getMaxMessageId() >= partitionTracker.getMinMessageId()));
testSet.addTestResult(newTestResult(++testNum,
"Duplicates: " + partitionTracker.getDuplicatedCount(),
partitionTracker.getDuplicatedCount() >= 0));
testSet.addTestResult(newTestResult(++testNum,
"Num messages: " + partitionTracker.getLogCount(),
partitionTracker.getLogCount() > 0));
testSet.addTestResult(newTestResult(++testNum,
"In sequence: " + partitionTracker.isInSequence(),
partitionTracker.isInSequence()));
}
TapProducer tapProducer = TapProducerFactory.makeTapJunitProducer(junitReport);
tapProducer.dump(testSet, new File(junitReport));
}
private TestResult newTestResult(int testNum, String desc, boolean success) {
TestResult tr = null;
if (success) {
tr = new TestResult(StatusValues.OK, testNum);
} else {
tr = new TestResult(StatusValues.NOT_OK, testNum);
}
tr.setDescription(desc);
return tr;
}
}