public class

Simulator

extends Object
/*
 * Copyright (C) 2010 Stanford University
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


package edu.stanford.junction.simulator;

import org.json.JSONException;
import org.json.JSONObject;

import edu.stanford.junction.JunctionMaker;
import edu.stanford.junction.api.activity.ActivityScript;
import edu.stanford.junction.api.activity.JunctionActor;
import edu.stanford.junction.api.messaging.MessageHeader;
import edu.stanford.junction.provider.xmpp.XMPPSwitchboardConfig;

class simThread extends Thread{
	private int NumOfMessage;
	private int NumOfParticipant;
	private int sessionID;
	simThread(int NumMsg, int NumP, int id){
		NumOfMessage = NumMsg;
		NumOfParticipant = NumP;
		sessionID = id;
	}
	public void run(){
		ActivityScript desc = new ActivityScript();
		//String ad = "SimSession_" + sessionID;
		//desc.setSessionID(ad);
		JSONObject platform = new JSONObject();
		try{
			platform.put("android", "http://my.realsitic.url/for_android");
			desc.addRolePlatform("simulator", "android", platform);
		} catch (Exception e) {}
		XMPPSwitchboardConfig config = new XMPPSwitchboardConfig("prpl.stanford.edu");
		JunctionMaker maker = JunctionMaker.getInstance(config);
		for(int actor_i = NumOfParticipant-1 ; actor_i >=0; actor_i --){
			try{
				maker.newJunction(desc, new SimActor(NumOfMessage, actor_i));
			}
			catch(Exception e){
				e.printStackTrace(System.err);
			}
			//maker.newJunction(desc, new SimActor(NumOfMessage, 0));
		}
	}
}

public class Simulator {
	static int NumOfActivity = 1;
	static int NumOfMessage = 5;
	static int NumOfParticipant = 2;
	public static void main(String[] argv){
		for(int i = 0; i< NumOfActivity; i++){
			simThread st = new simThread(NumOfMessage, NumOfParticipant, i);
			st.start();
		}
		while(true) {
			try {
				Thread.sleep(500000);
			} catch (Exception e) {}
		}
	}
}

class SimActor extends JunctionActor{
	static Integer TotalMessage = 0;
	private int NumOfMessage;
	private int NumOfBouncedMessage = 0;
	private int ID;
	public SimActor(int numMsg, int _ID) {
		super("SimActor"+_ID);
		NumOfMessage = numMsg;
		if(NumOfMessage <= 0)
			NumOfMessage = 1;
		NumOfBouncedMessage = 0;
		ID = _ID;
	}
	@Override
	public void onActivityStart() {
		
	}
	@Override
	public void onActivityJoin() {
		if(ID == 0){
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			JSONObject simMsg = new JSONObject();
			try {
				simMsg.put("service","simulation");
				simMsg.put("switchboard", "prpl.stanford.edu");
				simMsg.put("session", this.getJunction().getSessionID());
			} catch (JSONException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			this.getJunction().sendMessageToSession(simMsg);
		}
	}
	
	public  void onMessageReceived(MessageHeader arg0, JSONObject arg1) {
		synchronized (TotalMessage){
			NumOfBouncedMessage++;
			TotalMessage++;
			System.out.println("TotalMessage: " + TotalMessage);
			if((NumOfBouncedMessage-1) < NumOfMessage){
				//System.out.print(ID + " received" + arg1+ " " + NumOfBouncedMessage + "\n");
				//this.getJunction().sendMessageToSession(arg1);
				this.sendMessageToSession(arg1);
				try {
					Thread.sleep(300);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}else{
				//this.leave();
			}
		}
	}
}