package ds.controller;
import java.io.FileInputStream;
import java.io.InputStream;
import java.rmi.Naming;
import java.rmi.Remote;
import java.util.Properties;
import java.util.Vector;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import asg.cliche.Shell;
import asg.cliche.ShellFactory;
import ds.controller.helper.NodeInfo;
import ds.controller.helper.NodeSelecter;
import ds.controller.local.TunnelActionImpl;
import ds.controller.rmi.ControllerFileServerImpl;
import ds.shared.socket.ServerSocketHandler;
/**
* Startup code for the node.
*
* @author save
*/
public class Main {
// Define a static logger variable
private final static Logger LOGGER = Logger.getLogger(Main.class);
/**
* @param args
*/
public static void main(String[] args) {
// Initialise logging
// BasicConfigurator replaced with PropertyConfigurator.
PropertyConfigurator.configure("config/logging.conf");
LOGGER.info("Starting Controller");
// Read general config file
Properties conf = new Properties();
try {
InputStream is = new FileInputStream("config/general.conf");
conf.load(is);
} catch (Exception e) {
e.printStackTrace();
LOGGER.warn("Could not read config file");
return;
}
// Shared list of registered nodes
Vector<NodeInfo> nodes = new Vector<NodeInfo>();
// Determine the actions during file operations
TunnelActionImpl fileAction = new TunnelActionImpl(nodes);
// Initialize the node selector
NodeSelecter.set_nodes(nodes);
// Create but don't start the server socket handler
ServerSocketHandler handler = new ServerSocketHandler(fileAction);
LOGGER.info("ServerSocket created");
// Register remote object
String name = "Controller";
try {
Remote object = new ControllerFileServerImpl(handler, conf, nodes);
Naming.rebind (name, object);
LOGGER.info("Registered remote object");
// Create a command line
Commands c = new Commands(name, object, nodes);
Shell s = ShellFactory.createConsoleShell("controller", "", c);
s.commandLoop();
} catch (Exception e) {
e.printStackTrace();
}
LOGGER.debug("Main thread halted");
}
}