package scs.demos.mapreduce.app;
import org.omg.CORBA.ORB;
import org.omg.CORBA.Object;
import org.omg.CORBA.SystemException;
import org.omg.PortableServer.POA;
import org.omg.PortableServer.POAHelper;
import scs.container.ComponentAlreadyLoaded;
import scs.container.ComponentCollection;
import scs.container.ComponentCollectionHelper;
import scs.container.ComponentHandle;
import scs.core.ComponentId;
import scs.container.ComponentLoader;
import scs.container.ComponentLoaderHelper;
import scs.container.ComponentNotFound;
import scs.container.LoadFailure;
import scs.core.AlreadyConnected;
import scs.core.ExceededConnectionLimit;
import scs.core.IComponent;
import scs.core.IComponentHelper;
import scs.core.IReceptacles;
import scs.core.IReceptaclesHelper;
import scs.core.InvalidConnection;
import scs.core.InvalidName;
import scs.core.StartupFailed;
import scs.execution_node.ContainerAlreadyExists;
import scs.execution_node.ExecutionNode;
import scs.execution_node.ExecutionNodeHelper;
import scs.execution_node.Property;
import scs.demos.mapreduce.Master;
import scs.demos.mapreduce.MasterHelper;
import scs.demos.mapreduce.PropertiesException;
import scs.demos.mapreduce.ConectionToExecNodesException;
import scs.demos.mapreduce.ChannelException;
import scs.demos.mapreduce.StartFailureException;
import scs.demos.mapreduce.WorkerInstantiationException;
import scs.demos.mapreduce.TaskInstantiationException;
import scs.demos.mapreduce.Reporter;
import scs.demos.mapreduce.ReporterHelper;
import scs.demos.mapreduce.schedule.ReporterServant;
import scs.execution_node.InvalidProperty;
import java.util.Properties;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.*;
public class MapReduceApp {
private Properties config;
private static final String EXEC_NODE_NAME = "ExecutionNode";
private static final String EXEC_NODE_FACET = "scs::execution_node::ExecutionNode";
private ExecutionNode execNode = null;
static ORB orb;
private static Master master = null;
private static Reporter reporter = null;
private String containerName = null;
private String logName = null;
private int logLevel;
private String execName = null;
private boolean readConfiguration( String filename ) {
Properties properties = new Properties();
try {
properties.load(new FileInputStream(filename));
} catch (IOException e) {
e.printStackTrace();
return false;
}
config = properties;
return true;
}
private String getContainerName(){
return containerName;
}
private ExecutionNode getExecutionNode(){
return execNode;
}
private boolean initialize(String[] args) {
if (args.length < 1){
System.out.println("MapReduceApp::initialize - Informe o arquivo de configuracao da aplicacao.");
return false;
}
if(!readConfiguration(args[0]))
{
System.out.println("MapReduceApp::initialize - Arquivo " + args[0] + " nao encontrado.");
return false;
}
containerName = config.getProperty("mapred.Master.container-name", "MasterContainer");
String host = config.getProperty("mapred.Master.corbaloc-host");
if (host == null) {
System.out.println("MapReduceApp::initialize - Host onde master executara nao foi informado");
return false;
}
String port = config.getProperty("mapred.Master.corbaloc-port");
if (port == null) {
System.out.println("MapReduceApp::Initialize - Port onde master executara nao foi informado");
return false;
}
logName = config.getProperty("mapred.Reporter.file-name", "report.debug");
logLevel = Integer.parseInt(config.getProperty("mapred.Reporter.level", "0"));
try {
InetAddress localAddr = InetAddress.getByName(host);
String addrString = localAddr.toString();
String[] ipAddress = new String[2];
ipAddress = addrString.split("/");
execName = EXEC_NODE_NAME + "-" + ipAddress[1];
} catch (Exception e) {
System.out.println("MapReduceApp::initialize - Erro convertendo nome de ExecutionNode para IP");
return false;
}
String corbaname = "corbaname::" + host + ":" + port + "#"
+ execName;
orb = ORB.init(args, null);
System.out.println("MapReduceApp::initialize - Conectando ao execution node master: " + corbaname);
try {
org.omg.CORBA.Object obj = orb.string_to_object(corbaname);
IComponent execNodeComp = IComponentHelper.narrow(obj);
execNodeComp.startup();
Object ob = execNodeComp.getFacet(EXEC_NODE_FACET);
execNode = ExecutionNodeHelper.narrow(ob);
} catch (SystemException ex) {
System.out.println("MapReduceApp::initialize - Erro ao conectar com o ExecutionNode master CORBANAME:" + corbaname);
return false;
} catch (StartupFailed e) {
System.out.println("MapReduceApp::initialize - Startup do ExecutionNode master falhou.");
return false;
}
System.out.println("MapReduceApp::initialize - Criando container master " + containerName);
if (!this.createContainer()) {
System.out.println("MapReduceApp::initialize - Erro criando o container master " + containerName);
return false;
}
IComponent container;
container = execNode.getContainer(containerName);
try {
container.startup();
} catch (StartupFailed e1) {
System.out.println("MapReduceApp::initialize - Erro no startup do container master " + containerName);
return false;
}
ComponentLoader loader = ComponentLoaderHelper.narrow(container
.getFacet("scs::container::ComponentLoader"));
if (loader == null) {
System.out.println("MapReduceApp::initialize - Erro ao obter faceta loarder do container master " + containerName);
return false;
}
Object componentCollection = container
.getFacet("scs::container::ComponentCollection");
ComponentCollection components = ComponentCollectionHelper
.narrow(componentCollection);
ComponentId compId = new ComponentId();
compId.name = "Master";
compId.version = 1;
System.out.println("MapReduceApp::initialize - Criando master" );
ComponentHandle handle = null;
try {
handle = loader.load(compId, new String[] { "" });
handle.cmp.startup();
} catch (ComponentNotFound e) {
System.out.println("MapReduceApp::initialize - Componente Master nao encontrado.");
e.printStackTrace();
return false;
} catch (ComponentAlreadyLoaded e) {
ComponentHandle handles[] = components.getComponent(compId);
handle = handles[0];
} catch (LoadFailure e) {
e.printStackTrace();
return false;
} catch (StartupFailed e) {
e.printStackTrace();
return false;
}
master = MasterHelper.narrow(handle.cmp
.getFacetByName("Master"));
System.out.println("MapReduceApp::initialize - Criando logger da aplicacao");
try {
POA poa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
poa.the_POAManager().activate();
reporter = ReporterHelper.narrow(poa.servant_to_reference(new ReporterServant(logName,logLevel)));
} catch (Exception e) {
System.out.println("Erro ao criar logger da aplicacao");
e.printStackTrace();
return false;
}
return true;
}
/**
* Cria um container no ExecutionNode corrente
*/
private boolean createContainer() {
try {
Property prop = new Property();
prop.name = "language";
prop.value = "java";
Property propSeq[] = { prop };
IComponent container = execNode.startContainer(containerName, propSeq);
if (container == null) {
return false;
}
} catch (ContainerAlreadyExists e) {
System.out.println("MapReduceApp::createContainer - Ja existe um container com este nome " + containerName);
return false;
} catch (InvalidProperty e) {
System.out.println("MapReduceApp::createContainer - Erro ao setar propriedades de container " + containerName);
return false;
}
return true;
}
public static void main(String[] args) {
MapReduceApp app = null;
try {
long startTime = System.currentTimeMillis();
app = new MapReduceApp();
if (!app.initialize(args)){
System.exit(1);
}
reporter.open();
System.out.println("MapReduceApp::main - Executando master");
master.start(args[0], reporter);
long totalTime = (System.currentTimeMillis() - startTime)/1000;
System.out.println("MapReduceApp::main - MapReduce foi executado com sucesso.");
System.out.println("MapReduceApp::main - Tempo Total de Execucao em s: " + totalTime);
System.out.println("MapReduceApp::main - Finalizando container Master " + app.getContainerName());
ExecutionNode execNode = app.getExecutionNode();
//execNode.stopContainer(app.getContainerName());
} catch (PropertiesException ex) {
System.out.println("MapReduceApp::main - Erro ao ler arquivo de configuracao.");
System.out.println("MapReduceApp::main - Para maiores informacoes consulte arquivo de log");
System.exit(1);
} catch (ConectionToExecNodesException ex) {
System.out.println("MapReduceApp::main - Erro ao conectar com os execution nodes workers.");
System.out.println("MapReduceApp::main - Para maiores informacoes consulte arquivo de log");
System.exit(1);
} catch (ChannelException ex) {
System.out.println("MapReduceApp::main - Erro ao criar canal de evento.");
System.out.println("MapReduceApp::main - Para maiores informacoes consulte arquivo de log");
System.exit(1);
} catch (WorkerInstantiationException ex) {
System.out.println("MapReduceApp::main - Erro ao instanciar workers.");
System.out.println("MapReduceApp::main - Para maiores informacoes consulte arquivo de log");
System.exit(1);
} catch (TaskInstantiationException ex) {
System.out.println("MapReduceApp::main - Erro ao instanciar tarefas.");
System.out.println("MapReduceApp::main - Para maiores informacoes consulte arquivo de log");
System.exit(1);
} catch (StartFailureException ex) {
System.out.println("MapReduceApp::main - Erro ao executar operacoes map-reduce.");
System.out.println("MapReduceApp::main - Para maiores informacoes consulte arquivo de log");
System.exit(1);
/*} catch (InvalidName e) {
System.out.println("MapReduceApp::main - Erro ao parar container.");
System.out.println("MapReduceApp::main - Para maiores informacoes consulte arquivo de log");
System.exit(1);*/
}
}
}