/*******************************************************************************
* Copyright (c) 2014 Imperial College London
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Raul Castro Fernandez - initial API and implementation
******************************************************************************/
package uk.ac.imperial.lsds.java2sdg.codegenerator;
import javassist.CannotCompileException;
import javassist.ClassClassPath;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtField;
import javassist.CtMethod;
import javassist.CtNewMethod;
import javassist.NotFoundException;
public class OperatorBuilder {
private ClassPool cp = null;
public OperatorBuilder(){
cp = ClassPool.getDefault();
cp.importPackage("uk.ac.imperial.lsds.seep.api.QueryPlan");
cp.importPackage("uk.ac.imperial.lsds.seep.api.QueryBuilder");
cp.importPackage("uk.ac.imperial.lsds.seep.api.QueryComposer");
cp.importPackage("uk.ac.imperial.lsds.seep.operator.Connectable");
cp.importPackage("uk.ac.imperial.lsds.seep.operator.StatelessOperator");
cp.importPackage("uk.ac.imperial.lsds.seep.operator.StatefulOperator");
cp.importPackage("uk.ac.imperial.lsds.seep.infrastructure.master.Node");
cp.importPackage("uk.ac.imperial.lsds.seep.comm.serialization.DataTuple");
cp.importPackage("uk.ac.imperial.lsds.seep.comm.serialization.messages.TuplePayload");
cp.importPackage("java.util.ArrayList");
cp.importPackage("java.util.Map");
cp.importPackage("java.util.HashMap");
}
// public void includeClassPath(String path){
// try {
// cp.insertClassPath(path);
// }
// catch (NotFoundException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// }
public CtClass getStatefulOperatorClassTemplate(String opName){
CtClass cc = cp.makeClass(opName);
return cc;
}
public CtClass getStatelessOperatorClass_oneTupleAtATime(String opName, String code){
CtClass cc = cp.makeClass(opName);
CtClass[] implInterfaces = new CtClass[1];
try {
implInterfaces[0] = cp.get("uk.ac.imperial.lsds.seep.operator.StatelessOperator");
//cc.setSuperclass(cp.get("uk.ac.imperial.lsds.seep.operator.Operator"));
cc.setInterfaces(implInterfaces);
//Fields
CtField f = CtField.make("private static final long serialVersionUID = 1L;", cc);
cc.addField(f);
//Mandatory methods
CtMethod processDataSingle = CtNewMethod.make(
"public void processData(DataTuple data) {\n"+code+"\n }", cc);
System.out.println("NEW METHOD: ");
System.out.println(processDataSingle.toString());
cc.addMethod(processDataSingle);
CtMethod processDataBatch = CtNewMethod.make(
"public void processData(ArrayList data) { }", cc);
cc.addMethod(processDataBatch);
CtMethod setUp = CtNewMethod.make(
"public void setUp() { }", cc);
cc.addMethod(setUp);
}
catch (CannotCompileException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (NotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return cc;
}
public CtClass getStatelessOperatorClass_window(String opName, String code){
CtClass cc = cp.makeClass(opName);
CtClass[] implInterfaces = new CtClass[1];
try {
implInterfaces[0] = cp.get("uk.ac.imperial.lsds.seep.operator.StatelessOperator");
//cc.setSuperclass(cp.get("uk.ac.imperial.lsds.seep.operator.Operator"));
cc.setInterfaces(implInterfaces);
//Fields
CtField f = CtField.make("private static final long serialVersionUID = 1L;", cc);
cc.addField(f);
//Mandatory methods
CtMethod processDataSingle = CtNewMethod.make(
"public void processData(DataTuple data) { }", cc);
cc.addMethod(processDataSingle);
CtMethod processDataBatch = CtNewMethod.make(
"public void processData(ArrayList data) {\n"+code+"\n }", cc);
cc.addMethod(processDataBatch);
CtMethod setUp = CtNewMethod.make(
"public void setUp() { }", cc);
cc.addMethod(setUp);
}
catch (CannotCompileException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (NotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
cp.insertClassPath(new ClassClassPath(cc.getClass()));
return cc;
}
public CtClass getBaseIClass(String code){
CtClass cc = cp.makeClass("Base");
CtClass[] implInterfaces = new CtClass[1];
try{
implInterfaces[0] = cp.get("uk.ac.imperial.lsds.seep.api.QueryComposer");
cc.setInterfaces(implInterfaces);
CtMethod compose = CtNewMethod.make(
"public QueryPlan compose() {" +
code +
"}", cc);
cc.addMethod(compose);
}
catch (NotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (CannotCompileException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return cc;
}
}