// 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: SpanningTreeQueue.java
// Path: eventbase/routing
// Description: Global structure that queue up the SpanningTreePacket for later process

package eventbase.routing;

import java.util.*;
import eventbase.*;

public class SpanningTreeQueue {

    private Vector buffer;
    private SpanningTreeThread serviceThread;
    
    public SpanningTreeQueue() {
	buffer = new Vector();
	serviceThread = null;
    }
    
    // this function is being used in log file mode
    public Vector getQueue() {
	return buffer;
    }

    public void startThread(EventBaseAgent dbAgent, SpanningTreeGlobalConstruct stree) {
	serviceThread = new SpanningTreeThread(dbAgent, this, stree);
	serviceThread.start();
    }

    public void stopThread() {
	if (serviceThread != null)
	    serviceThread.requestStop();
    }

    public synchronized void insertPacket(SpanningTreeStoringObject obj) {
	double t = obj.getTime();
	double curTime;
	double nextTime;
	// sort according to time
	// add at beginning
	if (buffer.size() == 0 || 
            t < ((SpanningTreeStoringObject) buffer.firstElement()).getTime()) {
	    buffer.insertElementAt(obj, 0);
	    return;
	}

	// add at the end
	if (t > ((SpanningTreeStoringObject) buffer.lastElement()).getTime()) {
	    buffer.add(obj);  // append at the end
	    return;
	}
	
	for (int i = 0; i < buffer.size() - 1; i++) {
	    curTime = ((SpanningTreeStoringObject)buffer.elementAt(i)).getTime();
	    nextTime = ((SpanningTreeStoringObject)buffer.elementAt(i+1)).getTime();
	    if (curTime < t && t < nextTime) {
		buffer.insertElementAt(obj, i+1);
		return;
	    }
	}
    }

    // return Vector of SpanningTreeStoringObject that has time smaller than the valid time
    // assume sorted list in buffer
    public synchronized Vector getValidVector(double validTime) {
	//	System.out.println ("Valid Time " + validTime);
	Vector retVal = new Vector();
	for (int i = 0; i < buffer.size(); i++) {
	    SpanningTreeStoringObject obj = (SpanningTreeStoringObject) buffer.elementAt(i); 
	    if (obj.getTime() <= validTime) {
		retVal.add(obj);
		buffer.removeElementAt(i);
		i--;
	    }
	    else
		break;  // out of for loop
	}
	return retVal;
    }

    public synchronized void print() {
	System.out.println("************* SpanningTreeQueue************");
	for (int i = 0; i < buffer.size(); i++) {
	    ((SpanningTreeStoringObject) buffer.elementAt(i)).print();
	}
	System.out.println();
    }
}

