package org.archive.cdxserver.processor;
import java.util.HashSet;
import org.archive.format.cdx.CDXLine;
import org.archive.format.cdx.FieldSplitFormat;
public class GroupCountProcessor extends WrappedProcessor {
public final static String groupcount = "groupcount";
public final static String endtimestamp = "endtimestamp";
public final static String uniqcount = "uniqcount";
protected CDXLine prevReadLine;
protected CDXLine lastReadLine;
protected CDXLine deferWriteLine;
protected boolean lastLineSkipped = false;
protected int skipCount = 0;
protected boolean writeLastTimestamp;
protected HashSet<Integer> uniqDigestSet;
public GroupCountProcessor(BaseProcessor base, boolean writeLastTimestamp, boolean writeUniqCount)
{
super(base);
this.writeLastTimestamp = writeLastTimestamp;
if (writeUniqCount) {
uniqDigestSet = new HashSet<Integer>();
}
}
@Override
public void trackLine(CDXLine cdxLine) {
prevReadLine = lastReadLine;
if (lastLineSkipped) {
skipCount++;
if (uniqDigestSet != null) {
uniqDigestSet.add(cdxLine.getDigest().hashCode());
}
}
lastReadLine = cdxLine;
lastLineSkipped = true;
}
protected int writeDeferredLine()
{
int written = 0;
if (deferWriteLine != null) {
deferWriteLine.setField(groupcount, "" + (skipCount + 1));
if (writeLastTimestamp) {
deferWriteLine.setField(endtimestamp, (prevReadLine != null ? prevReadLine.getTimestamp() : "-"));
}
if (uniqDigestSet != null) {
deferWriteLine.setField(uniqcount, "" + (uniqDigestSet.size() + 1));
}
written = inner.writeLine(deferWriteLine);
deferWriteLine = null;
}
return written;
}
@Override
public int writeLine(CDXLine cdxLine)
{
int written = writeDeferredLine();
lastLineSkipped = false;
skipCount = 0;
if (uniqDigestSet != null) {
uniqDigestSet.clear();
}
deferWriteLine = cdxLine;
return written;
}
@Override
public FieldSplitFormat modifyOutputFormat(FieldSplitFormat format)
{
format = super.modifyOutputFormat(format).addFieldNames(groupcount);
if (writeLastTimestamp) {
format = format.addFieldNames(endtimestamp);
}
if (uniqDigestSet != null) {
format = format.addFieldNames(uniqcount);
}
return format;
}
@Override
public void writeResumeKey(String resumeKey) {
this.writeDeferredLine();
super.writeResumeKey(resumeKey);
}
@Override
public void end() {
this.writeDeferredLine();
super.end();
}
}