package pl.edu.mimuw.cloudatlas.agent; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import java.rmi.server.UnicastRemoteObject; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import pl.edu.mimuw.cloudatlas.agent.messages.AgentMessage; import pl.edu.mimuw.cloudatlas.agent.modules.Module; import pl.edu.mimuw.cloudatlas.api.Api; import pl.edu.mimuw.cloudatlas.interpreter.Main; import pl.edu.mimuw.cloudatlas.model.ZMI; public class Agent { public static void runRegistry() { try { ZMI root = Main.createTestHierarchy2(); ApiImplementation api = new ApiImplementation(root); Api apiStub = (Api) UnicastRemoteObject.exportObject(api, 0); Registry registry = LocateRegistry.getRegistry(); registry.rebind("Api", apiStub); System.out.println("Agent: api bound"); } catch (Exception e) { System.err.println("Agent registry initialization exception:"); e.printStackTrace(); } } public static HashMap initializeModules() { HashMap modules = new HashMap(); // TODO add modules as we implement them return modules; } public static HashMap initializeExecutors( HashMap modules) { HashMap executors = new HashMap(); Iterator it = modules.entrySet().iterator(); while (it.hasNext()) { Map.Entry moduleEntry = (Map.Entry) it.next(); Module module = moduleEntry.getValue(); Executor executor = new Executor(module); executors.put(moduleEntry.getKey(), executor); } return executors; } public static ArrayList initializeExecutorThreads(HashMap executors) { ArrayList executorThreads = new ArrayList(); Iterator it = executors.entrySet().iterator(); while (it.hasNext()) { Map.Entry executorEntry = (Map.Entry) it.next(); Thread thread = new Thread(executorEntry.getValue()); thread.setDaemon(true); System.out.println("Initializing executor " + executorEntry.getKey()); thread.start(); executorThreads.add(thread); } return executorThreads; } public static void closeExecutors(ArrayList executorThreads) { for (Thread executorThread : executorThreads) { executorThread.interrupt(); } } public static void runModulesAsThreads() { HashMap modules = initializeModules(); HashMap executors = initializeExecutors(modules); ArrayList executorThreads = initializeExecutorThreads(executors); Thread eventBusThread = new Thread(new EventBus(executors)); System.out.println("Initializing event bus"); eventBusThread.start(); System.out.println("Closing executors"); closeExecutors(executorThreads); } public static void main(String[] args) { runRegistry(); runModulesAsThreads(); } }