isi.pasco2.poller.DifferenceHandler.java Source code

Java tutorial

Introduction

Here is the source code for isi.pasco2.poller.DifferenceHandler.java

Source

/*
 * 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;
    }
}