// 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: SpanningTreeStoringObject.java
// Path: eventbase/routing
// Description: Temporary structure to store Spanning Tree Information

package eventbase.routing;

import java.util.*;
import eventbase.*;

public class SpanningTreeThread extends Thread {

    final static int BUFFER_QUEUE_TIME = 30; // in sec
    final static int THREAD_WAIT_TIME = 1000; // in msecond
    private SpanningTreeQueue buffer;
    private boolean stopThread;
    private EventBaseAgent dbAgent;
    private SpanningTreeGlobalConstruct sTreeGlobal;

    public SpanningTreeThread (EventBaseAgent agent, SpanningTreeQueue q, 
			       SpanningTreeGlobalConstruct stree) {
	buffer = q;
	dbAgent = agent;
	stopThread = false;
	sTreeGlobal = stree;
    }

    public void requestStop() {
	stopThread = true;
    }

    public void run () {
	Vector v;
	double time;
	int numEntries;
	int forwardingHostID;
	int sourceHostID;

	while (!stopThread) {
	    //	    System.out.println ("God Time:" + dbAgent.getCurrentGodTime());
	    v = buffer.getValidVector(dbAgent.getCurrentGodTime() - BUFFER_QUEUE_TIME);
	    for (int i = 0; i < v.size(); i++) {
		SpanningTreeStoringObject obj = (SpanningTreeStoringObject) v.elementAt(i);
		numEntries = (obj.numUniqueHosts() > dbAgent.getNumOfOverlayHosts())? obj.numUniqueHosts():dbAgent.getNumOfOverlayHosts();
		forwardingHostID = dbAgent.getHostID(obj.getForwardingHost().toLowerCase());
		if (!sTreeGlobal.isInit()) 
		    sTreeGlobal.init(numEntries, dbAgent);
		sTreeGlobal.VRTStart(obj.getTime(), numEntries, forwardingHostID);
		Vector entries = obj.getEntries();
		for (int j =0; j < entries.size(); j++) {
		    SpanningTreeStoringEntries entry = (SpanningTreeStoringEntries) entries.elementAt(j);
		    sourceHostID = dbAgent.getHostID(entry.getSource().toLowerCase());
		    sTreeGlobal.cleanRow(sourceHostID, forwardingHostID);
		    String [] childList = entry.getChildArray();
		    for (int k = 0; k < entry.getNumChild(); k++) {
			sTreeGlobal.setMatrixCoordinate(sourceHostID, 
							forwardingHostID, 
							dbAgent.getHostID(childList[k].toLowerCase()));
		    }
		}
		sTreeGlobal.VRTEnd();
	    }
	    try {
		sleep (THREAD_WAIT_TIME);
	    } catch (InterruptedException e) {

	    }
	}
    }
    

}
