package scs.demos.bigtable.app;
import java.util.ArrayList;
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 org.omg.PortableServer.POAManagerPackage.AdapterInactive;
import scs.container.ComponentAlreadyLoaded;
import scs.container.ComponentCollection;
import scs.container.ComponentCollectionHelper;
import scs.container.ComponentHandle;
import scs.container.ComponentLoader;
import scs.container.ComponentLoaderHelper;
import scs.container.ComponentNotFound;
import scs.container.LoadFailure;
import scs.core.AlreadyConnected;
import scs.core.ComponentId;
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.demos.bigtable.Sorter;
import scs.demos.bigtable.SorterHelper;
import scs.demos.bigtable.test.Reducer;
import scs.demos.bigtable.test.ReducerHelper;
import scs.execution_node.ContainerAlreadyExists;
import scs.execution_node.ExecutionNode;
import scs.execution_node.ExecutionNodeHelper;
import scs.execution_node.InvalidProperty;
import scs.execution_node.Property;
public class BigTableTester {
private static final String EXEC_NODE_NAME = "ExecutionNode";
private static final String EXEC_NODE_FACET = "scs::execution_node::ExecutionNode";
private static final String CONTAINER_NAME = "BigTableContainer";
private ExecutionNode execNode = null;
private ORB orb = null;
private POA poa = null;
private ComponentLoader loader = null;
private IComponent bigTableComponent = null;
private Sorter sorter;
private IComponent testComponent = null;
private Reducer reducer;
public BigTableTester(String[] args) {
if (!initialize(args))
System.err.println("Erro ao iniciar a aplicacao");
System.out.println("BigTableTester inciado");
}
/**
* Cria um container no ExecutionNode
*/
private boolean createContainer(String name, ExecutionNode execNode) {
try {
Property prop = new Property();
prop.name = "language";
prop.value = "java";
Property propSeq[] = { prop };
IComponent container = execNode.startContainer(name, propSeq);
if (container == null) {
return false;
}
} catch (ContainerAlreadyExists e) {
System.err.println("Ja existe um container com este nome.");
return false;
}
catch (InvalidProperty e) {
System.err.println("Propriedade invalida!");
return false;
}
return true;
}
/**
* @param args
*/
private boolean initialize(String[] args) {
String host= null;
String port = null;
String corbaname = null;
try {
orb = ORB.init(args, null);
poa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
poa.the_POAManager().activate();
} catch (org.omg.CORBA.ORBPackage.InvalidName e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (AdapterInactive e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println("BigTableTester: Initializing..");
// execNode = new ExecutionNode[1];
// for (int i = 0; i < execNode.length; i++) {
host = "localhost";
port = "1050";
corbaname = "corbaname::" + host + ":" + port + "#" + EXEC_NODE_NAME + "-127.0.1.1";
System.out.println("BigTableTester: Conectando ao execution node " + corbaname);
try {
org.omg.CORBA.Object obj = orb.string_to_object(corbaname);
System.out.println("BigTableTester: 1 Conectando ao execution node " + corbaname);
IComponent execNodeComp = IComponentHelper.narrow(obj);
System.out.println("BigTableTester: 2 Conectando ao execution node " + corbaname);
execNodeComp.startup();
System.out.println("BigTableTester: 3 Conectando ao execution node " + corbaname);
Object ob = execNodeComp.getFacet(EXEC_NODE_FACET);
System.out.println("BigTableTester: 4 Conectando ao execution node " + corbaname);
execNode = ExecutionNodeHelper.narrow(ob);
System.out.println("BigTableTester: 5 Conectando ao execution node " + corbaname);
} catch (SystemException ex) {
System.err.println("Erro ao conectar com o ExecutionNode " + corbaname);
System.exit(1);
} catch (StartupFailed e) {
System.err.println("Startup do ExecutionNode " + corbaname + "falhou.");
System.exit(1);
}
System.out.println("BigTableTester: Connected to execution node");
if (!this.createContainer(CONTAINER_NAME, execNode)) {
System.err.println("Erro criando o container em " + corbaname);
return false;
}
IComponent container;
container = execNode.getContainer(CONTAINER_NAME);
try {
container.startup();
} catch (StartupFailed e) {
System.out.println("Erro no startup do container em " + corbaname);
System.exit(1);
}
System.out.println("BigTableTester: Calling components..");
// Instanciacao dos componentes...
loader = ComponentLoaderHelper.narrow(container
.getFacet("scs::container::ComponentLoader"));
if (loader == null) {
System.out.println("Erro ao retornar faceta loader em " + corbaname);
return false;
}
Object componentCollection = container
.getFacet("scs::container::ComponentCollection");
ComponentCollection components = ComponentCollectionHelper
.narrow(componentCollection);
// Instantiate Big Table
ComponentId bigTableCompId = new ComponentId();
bigTableCompId.name = "BigTable";
bigTableCompId.version = 1;
ComponentHandle bigTableHandle = null;
bigTableHandle = createHandle(loader, bigTableCompId);
bigTableComponent = bigTableHandle.cmp;
sorter = SorterHelper.narrow(bigTableComponent.getFacetByName("Sorter"));
// Instantiate Test Component (future MapReduce reducer)
ComponentId testCompId = new ComponentId();
testCompId.name = "Test";
testCompId.version = 1;
ComponentHandle testHandle = null;
int i = 0;
while (i++ < 3) {
// Create and connect components
// Instanciando 3 reducers, por exemplo
testHandle = createHandle(loader, testCompId);
testComponent = testHandle.cmp;
reducer = ReducerHelper.narrow(testComponent.getFacetByName("Reducer"));
System.out.println("BigTableTester: Connecting components..");
// Conectando os componentes...
try {
IReceptacles bigTableReceptacles = IReceptaclesHelper.narrow(bigTableComponent.getFacetByName("infoReceptacle"));
bigTableReceptacles.connect("Reducer", reducer);
} catch (InvalidName e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidConnection e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (AlreadyConnected e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExceededConnectionLimit e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("BigTableTester initialized");
return true;
}
public static void main(String[] args) {
try {
long start = System.currentTimeMillis();
BigTableTester app = new BigTableTester(args);
app.run(args);
System.out.println("Digite c para parar os componentes");
System.out.print(">");
while (System.in.read() != (int)'c');
app.stop();
long end = System.currentTimeMillis();
System.out.println("Tempo total de execucao:" + (end - start));
} catch (SystemException ex) {
ex.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
}
/**
* * @throws InterruptedException
* *
* */
public void run(String[] args) throws InterruptedException {
System.out.println("iniciando aplicacao...");
// quem deve chamar esses sort sao os mappers, pela interface Sorter
// sorter.sort("a", "teste1table");
// sorter.sort("b", "teste2table");
// sorter.sort("c", "teste3table");
// sorter.sort("d", "teste4table");
// sorter.sort("e", "teste1table");
// sorter.sort("f", "teste2table");
// sorter.sort("g", "teste3table");
// sorter.sort("h", "teste4table");
// sorter.sort("i", "teste1table");
// sorter.sort("j", "teste2table");
// sorter.sort("k", "teste3table");
// sorter.sort("l", "teste4table");
// sorter.sort("m", "teste1table");
// sorter.sort("n", "teste2table");
// sorter.sort("o", "teste3table");
// sorter.sort("p", "teste4table");
// sorter.sort("q", "teste1table");
// sorter.sort("r", "teste2table");
// sorter.sort("s", "teste3table");
// sorter.sort("t", "teste4table");
// sorter.sort("u", "teste1table");
// sorter.sort("v", "teste2table");
// sorter.sort("w", "teste3table");
// sorter.sort("x", "teste4table");
// sorter.sort("y", "teste2table");
// sorter.sort("z", "teste3table");
// sorter.sort("0", "teste4table");
// sorter.sort("1", "teste1table");
// sorter.sort("2", "teste2table");
// sorter.sort("3", "teste3table");
// sorter.sort("4", "teste4table");
// sorter.sort("5", "teste4table");
// sorter.sort("6", "teste2table");
// sorter.sort("7", "teste3table");
// sorter.sort("8", "teste4table");
// sorter.sort("9", "teste1table");
}
public void stop() {
try{
// for(int i = 0; i < execNode.length; i++) {
execNode.stopContainer(CONTAINER_NAME);
// }
Thread.sleep(1000);
} catch (Exception e ) {
System.err.println("Erro ao finalizar container");
}
}
/**
* Cria um componente no container associado ao loader
*/
private ComponentHandle createHandle(ComponentLoader loader, ComponentId compId){
ComponentHandle handle = null;
try {
handle = loader.load(compId, new String[] { "" });
handle.cmp.startup();
} catch (ComponentNotFound e) {
e.printStackTrace();
System.err.println("LogApp::createHandle - Componente " + compId.name + " nao encontrado.");
} catch (ComponentAlreadyLoaded e) {
e.printStackTrace();
System.err.println("LogApp::createHandle - Componente " + compId.name + " ja foi criado.");
} catch (LoadFailure e) {
e.printStackTrace();
System.err.println("LogApp::createHandle - Erro ao carregar componente " + compId.name + ".\n");
} catch (StartupFailed e) {
e.printStackTrace();
System.err.println("LogApp::createHandle - Startup do componente " + compId.name + " falhou.\n" );
}
return handle;
}
}