// Carnegie Mellon University
//   Information Networking Institute and
//   School of Computer Science
//
// Master Thesis: A Monitoring Tool for Overlay Network
// By: TungFai Chan and Annie Cheng
//
// File: FilesParser.java
// Path: monitor/parser/
// Description: abstract base class for varies file parsers


package parser;

import eventbase.*;
import userInterfaces.*;

import java.io.*;
import java.util.*;
import javax.swing.*;


public abstract class FilesParser extends Thread {

    final String OBJECT_NAME = "FilesParser";

    EventBaseAgent dbAgent;
    MainScreen mainScreen = null;
    File[] filesList = null;
    boolean frameSupport = false;

    public void getFrame(MainScreen mainscreen) {
      mainScreen = mainscreen;
      frameSupport = true;

    }

    public void getDBObject(EventBaseAgent agent) {
        dbAgent = agent;
    }

    public void parseFiles(File[] fileslist) {
        filesList = fileslist;
        start();

        if (!frameSupport)
          try {
            join();
          }
          catch (InterruptedException e) {
              System.err.println(e);
          }

    }

    public void run() {
	BufferedReader reader = null;

        if (frameSupport)
	    mainScreen.initProgressBar(0, filesList.length);

        for (int i = 0; i < filesList.length; i++) {
	    try {
                if (frameSupport)
		    mainScreen.statusBarMessage("Reading " + filesList[i].getName() + " ...");
	  	reader = new BufferedReader(new FileReader(filesList[i]));
		readFileIntoDB(reader, filesList[i].getName());

                if (frameSupport)
		    mainScreen.updateProgressBar(true, 1);

                yield();
	    }
	    catch (FileNotFoundException e) {
                if (frameSupport)
                    mainScreen.printConsoleError(OBJECT_NAME, "run",
                                                 "FileNotFoundException", e);
                else
                    System.err.println(e);

	    }
	    catch (IOException e) {
                if (frameSupport)
                    mainScreen.printConsoleError(OBJECT_NAME, "run",
                                                 "IOException", e);
                else
                    System.err.println(e);
	    }

	}

	// special processing after reading in all log files
	endOfParsingHandling();

        if (frameSupport) {
	    mainScreen.cancelProgressBar();
	    mainScreen.statusBarMessage(null);
            mainScreen.parserReady();
        }

    }

  abstract void endOfParsingHandling();
    abstract void readFileIntoDB(BufferedReader reader, String filename) throws IOException;

}
