package edu.iit.cs553;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
public class Main {
/**
* @param args
* @throws IOException
* @throws InterruptedException
*/
public static void main(String[] args) throws IOException, InterruptedException, IncorrectArgumentsException
{
// Arguments retrieval
// int portNumber;
// String workersType;
// int numberOfLocalWorkers = 0;
// try
// {
// if (args.length > 4 || !args[0].equals("-s") ||
// !(args[2].equals("-rw") || args[2].equals("-lw")))
// {
// throw new IncorrectArgumentsException();
// }
// portNumber = Integer.parseInt(args[1]);
// workersType = new String();
// String option = args[2];
// if (option.equals("-lw"))
// {
// workersType = "local";
// numberOfLocalWorkers = Integer.parseInt(args[3]);
// System.out.println("Type of workers: local");
// System.out.println("Number of local workers: " +
// numberOfLocalWorkers);
// } else if (option.equals("-rw"))
// {
// workersType = "remote";
// System.out.println("Type of workers: remote");
// } else
// {
// throw new IncorrectArgumentsException();
// }
// } catch (ArrayIndexOutOfBoundsException e)
// {
// throw new IncorrectArgumentsException();
// }
// Paragraphe � effacer par la suite, utilis� pour faire des tests au
// sein d'Eclipse
int portNumber = 1111;
String workersType = "remote";
int numberOfLocalWorkers = 32;
try
{
ServerSocket serverSocket = new ServerSocket(portNumber);
System.out.println("The server is listening to port: " + portNumber + ".\n");
LocalExecutionManager localExecutionManager = new LocalExecutionManager();
Socket socket = serverSocket.accept();
System.out.println("A connection has been established.");
DataInputStream in = new DataInputStream(socket.getInputStream());
List<Map<Integer, Long>> workload = new ArrayList<Map<Integer, Long>>();
int numberOfTasks = in.readInt();
System.out.println("Number of tasks: " + numberOfTasks + "\n");
byte[] buffer = new byte[20];
for (int i = 0; i < numberOfTasks; i++)
{
in.readFully(buffer);
String taskInString = new String(buffer);
addToWorkload(workload, taskInString);
}
if (workersType.equals("local"))
{
double totalExecutionTime = localExecutionManager.executeTasks(workload, numberOfLocalWorkers);
System.out.println("\nTotal execution time: " + totalExecutionTime + "ms" + " i.e. " + totalExecutionTime / 1000 + "s");
} else if (workersType.equals("remote"))
{
Dispatcher dispatcher = new Dispatcher();
Provisioner provisioner = new Provisioner();
dispatcher.sendTasksToSQSQueue(workload);
// System.out.println("\nSleeping for 8 minutes giving Cloud Watch time to refresh its results.");
// Thread.sleep(8 * 60 * 1000);
// System.out.println("Sleep finished.");
// provisioner.allocateNeededWorkersUsingCloudWatchMonitor();
provisioner.allocateNeededWorkersWithoutCloudWatch(workload.size());
// provisioner.displayInstancesStates();
}
// Displaying workload
// for (Map<Integer, Long> task : workload)
// {
// Set<Integer> keySet = task.keySet();
// Iterator iterator = keySet.iterator();
// int key = (Integer) iterator.next();
// System.out.println(key + " " + task.get(key));
// }
} catch (IOException e)
{
System.err.println("Could not listen to port: " + portNumber + ". Please try another one.");
System.exit(-1);
}
}
private static void addToWorkload(List<Map<Integer, Long>> workload, String taskInString)
{
Map<Integer, Long> task = getTaskFromString(taskInString);
workload.add(task);
}
private static Map<Integer, Long> getTaskFromString(String taskInString)
{
Map<Integer, Long> task = new HashMap<Integer, Long>();
int key = Integer.parseInt(StringUtils.substringBefore(taskInString, " "));
double sleepDurationInDouble = Double.parseDouble(StringUtils.substringAfter(taskInString, " "));
long sleepDuration = (long) sleepDurationInDouble;
task.put(key, sleepDuration);
return task;
}
}