/*
* Copyright 2006 Bradley Schatz. All rights reserved.
*
* This file is part of pasco2, the next generation Internet Explorer cache
* and history record parser.
*
* pasco2 is free software; you can redistribute it and/or modify
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* pasco2 is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with pasco2; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA
*/
package isi.pasco2.poller;
import isi.pasco2.handler.HistoryAccessHandler;
import isi.pasco2.io.IndexFile;
import isi.pasco2.model.REDRRecord;
import isi.pasco2.model.Record;
import isi.pasco2.model.URLLEAKRecord;
import isi.pasco2.model.UnknownRecord;
import isi.pasco2.parser.DateTime;
import java.io.StringWriter;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Collection;
import java.util.TimeZone;
import java.util.Vector;
import org.apache.commons.collections.CollectionUtils;
public class DifferenceHandler implements HistoryAccessHandler {
SimpleDateFormat xsdDateFormat;
{
xsdDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
xsdDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
}
Vector<Record> currentUrlRecords = new Vector<Record>();
Vector<Record> newUrlRecords = new Vector<Record>();
boolean initialized = false;
String name;
int offset;
int length;
byte[] rec;
IndexFile indexFile;
public DifferenceHandler(String name) {
this.name = name;
}
public void URLRecord(DateTime localAccessTime, DateTime accessTime, DateTime modTime, String url,
String file, String directory, String httpHeaders) {
URLLEAKRecord u = new URLLEAKRecord("URL", localAccessTime, accessTime, modTime, url, file,
directory, httpHeaders, offset, rec);
if (initialized) {
if (!newUrlRecords.contains(u)) {
newUrlRecords.add(u);
}
} else {
if (!currentUrlRecords.contains(u)) {
currentUrlRecords.add(u);
}
}
}
public void URLRecord(DateTime localAccessTime, DateTime accessTime, DateTime modTime, String url, int count) {
URLLEAKRecord u = new URLLEAKRecord("URL", localAccessTime, accessTime, modTime, url, null, null, null, offset, rec);
u.accessedCount = count;
if (initialized) {
if (!newUrlRecords.contains(u)) {
newUrlRecords.add(u);
}
} else {
if (!currentUrlRecords.contains(u)) {
currentUrlRecords.add(u);
}
}
}
public void URLRecord(DateTime localAccessTime, DateTime accessTime, DateTime modTime, String url) {
URLLEAKRecord u = new URLLEAKRecord("URL", localAccessTime, accessTime, modTime, url, null, null, null, offset, rec);
if (initialized) {
if (!newUrlRecords.contains(u)) {
newUrlRecords.add(u);
}
} else {
if (!currentUrlRecords.contains(u)) {
currentUrlRecords.add(u);
}
}
}
public void URLRecord(DateTime accessTime, DateTime modTime, String url,
String file, String directory, String httpHeaders) {
URLLEAKRecord u = new URLLEAKRecord("URL", accessTime, modTime, url, file,
directory, httpHeaders, offset, rec);
if (initialized) {
if (!newUrlRecords.contains(u)) {
newUrlRecords.add(u);
}
} else {
if (!currentUrlRecords.contains(u)) {
currentUrlRecords.add(u);
}
}
}
public void startDocument(String fileName, float version) {
}
public void endDocument() {
if (!initialized) {
// it is now
initialized = true;
} else {
Collection<Record> deletedRecords = CollectionUtils.subtract(
currentUrlRecords, newUrlRecords);
Collection<Record> newRecords = CollectionUtils.subtract(newUrlRecords,
currentUrlRecords);
if (deletedRecords.size() > 0 || newRecords.size() > 0) {
StringWriter outWriter = new StringWriter();
outWriter.write(name + "\r\n");
for (Record rec : newRecords) {
Calendar c = Calendar.getInstance();
outWriter.write("New record: (" + xsdDateFormat.format(c.getTime()) + rec.toString() + "\r\n");
}
for (Record rec : deletedRecords) {
outWriter.write("Deleted record: " + rec.toString() + "\r\n");
}
System.out.println(outWriter.toString());
}
currentUrlRecords = newUrlRecords;
newUrlRecords = new Vector<Record>();
}
}
public void invalidRecord(int offset) {
}
public void LEAKRecord(DateTime accessTime, DateTime modTime, String url,
String file, String directory, String httpHeaders) {
URLLEAKRecord u = new URLLEAKRecord("LEAK", accessTime, modTime, url, file,
directory, httpHeaders, offset, rec);
if (initialized) {
if (!newUrlRecords.contains(u)) {
newUrlRecords.add(u);
}
} else {
if (!currentUrlRecords.contains(u)) {
currentUrlRecords.add(u);
}
}
}
public void REDRRecord(String url) {
REDRRecord u = new REDRRecord(url, offset);
if (initialized) {
if (!newUrlRecords.contains(u)) {
newUrlRecords.add(u);
}
} else {
if (!currentUrlRecords.contains(u)) {
currentUrlRecords.add(u);
}
}
}
public void unknownRecord(String type, int offset, byte[] record) {
UnknownRecord u = new UnknownRecord(record, offset);
if (initialized) {
if (!newUrlRecords.contains(u)) {
newUrlRecords.add(u);
}
} else {
if (!currentUrlRecords.contains(u)) {
currentUrlRecords.add(u);
}
}
}
public void unusedRecord(int offset) {
}
public void record(int currentOffset, byte[] rec) {
this.offset = offset;
this.rec = rec;
this.length = length;
}
}