private static String STR_NUM_CALLBACK_PORTS;
private static String STR_JVM_INIT_HEAP_SIZE;
private static String STR_JVM_MAX_HEAP_SIZE;
- private static String STR_LANGUAGE;
+ private static String STR_LANGUAGE_CONTROLLER;
private static String STR_SKEL_CLASS_SUFFIX;
private static String STR_STUB_CLASS_SUFFIX;
private static boolean BOOL_VERBOSE;
private static final String STR_INTERFACE_CLS_CFG = "INTERFACE_CLASS";
private static final String STR_INT_STUB_CLS_CFG = "INTERFACE_STUB_CLASS";
private static final String STR_FILE_TRF_CFG = "ADDITIONAL_ZIP_FILE";
+ private static final String STR_LANGUAGE = "LANGUAGE";
private static final String STR_YES = "Yes";
private static final String STR_NO = "No";
private static final String STR_JAVA = "Java";
STR_NUM_CALLBACK_PORTS = null;
STR_JVM_INIT_HEAP_SIZE = null;
STR_JVM_MAX_HEAP_SIZE = null;
- STR_LANGUAGE = null;
+ STR_LANGUAGE_CONTROLLER = null;
BOOL_VERBOSE = false;
}
STR_NUM_CALLBACK_PORTS = prop.getProperty("NUMBER_CALLBACK_PORTS");
STR_JVM_INIT_HEAP_SIZE = prop.getProperty("JVM_INIT_HEAP_SIZE");
STR_JVM_MAX_HEAP_SIZE = prop.getProperty("JVM_MAX_HEAP_SIZE");
- STR_LANGUAGE = prop.getProperty("LANGUAGE");
+ //STR_LANGUAGE = prop.getProperty("LANGUAGE");
STR_SKEL_CLASS_SUFFIX = prop.getProperty("SKEL_CLASS_SUFFIX");
STR_STUB_CLASS_SUFFIX = prop.getProperty("STUB_CLASS_SUFFIX");
if(prop.getProperty("VERBOSE").equals(STR_YES)) {
RuntimeOutput.print("STR_NUM_CALLBACK_PORTS=" + STR_NUM_CALLBACK_PORTS, BOOL_VERBOSE);
RuntimeOutput.print("STR_JVM_INIT_HEAP_SIZE=" + STR_JVM_INIT_HEAP_SIZE, BOOL_VERBOSE);
RuntimeOutput.print("STR_JVM_MAX_HEAP_SIZE=" + STR_JVM_MAX_HEAP_SIZE, BOOL_VERBOSE);
- RuntimeOutput.print("STR_LANGUAGE=" + STR_LANGUAGE, BOOL_VERBOSE);
+ //RuntimeOutput.print("STR_LANGUAGE=" + STR_LANGUAGE, BOOL_VERBOSE);
RuntimeOutput.print("STR_SKEL_CLASS_SUFFIX=" + STR_SKEL_CLASS_SUFFIX, BOOL_VERBOSE);
RuntimeOutput.print("STR_STUB_CLASS_SUFFIX=" + STR_STUB_CLASS_SUFFIX, BOOL_VERBOSE);
RuntimeOutput.print("BOOL_VERBOSE=" + BOOL_VERBOSE, BOOL_VERBOSE);
* @return void
*/
private void instrumentIoTSetDevice(String strFieldIdentifier, String strObjName, String strFieldName, String strIoTSlaveObjectHostAdd,
- InputStream inStream, OutputStream outStream)
+ InputStream inStream, OutputStream outStream, String strLanguage)
throws IOException, ClassNotFoundException, InterruptedException {
// Get information from the set
List<Object[]> listObject = objAddInitHand.getFields(strFieldIdentifier);
// Create a new IoTSet
- if(STR_LANGUAGE.equals(STR_JAVA)) {
+ if(strLanguage.equals(STR_JAVA)) {
Message msgCrtIoTSet = new MessageCreateSetRelation(IoTCommCode.CREATE_NEW_IOTSET, strFieldName);
commMasterToSlave(msgCrtIoTSet, "Create new IoTSet for IoTDeviceAddress!", inStream, outStream);
} else
System.out.println("DEBUG: InstrumentSetDevice: Device address: " + strDeviceAddressKey + "\n\n");
// Send address one by one
- if(STR_LANGUAGE.equals(STR_JAVA)) {
+ if(strLanguage.equals(STR_JAVA)) {
Message msgGetIoTSetObj = null;
if (bDstPortWildCard) {
String strUniqueDev = strDeviceAddressKey + ":" + iRow;
bSrcPortWildCard, bDstPortWildCard);
}
// Reinitialize IoTSet on device object
- if(STR_LANGUAGE.equals(STR_JAVA))
+ if(strLanguage.equals(STR_JAVA))
commMasterToSlave(new MessageSimple(IoTCommCode.REINITIALIZE_IOTSET_FIELD), "Reinitialize IoTSet fields!", inStream, outStream);
else
reinitializeIoTSetFieldCpp(outStream, inStream);
* @return void
*/
private void instrumentIoTSetZBDevice(Map.Entry<String,Object> map, String strObjName, String strFieldName, String strIoTSlaveObjectHostAdd,
- InputStream inStream, OutputStream outStream)
+ InputStream inStream, OutputStream outStream, String strLanguage)
throws IOException, ClassNotFoundException, InterruptedException {
// Get information from the set
SetInstrumenter setInstrumenter = (SetInstrumenter) map.getValue();
// Create a new IoTSet
- if(STR_LANGUAGE.equals(STR_JAVA)) {
+ if(strLanguage.equals(STR_JAVA)) {
Message msgCrtIoTSet = new MessageCreateSetRelation(IoTCommCode.CREATE_NEW_IOTSET, strFieldName);
commMasterToSlave(msgCrtIoTSet, "Create new IoTSet for IoTZigbeeAddress!", inStream, outStream);
} else // TODO: will need to implement IoTSet Zigbee for C++ later
// Send policy to Zigbee gateway - TODO: Need to clear policy first?
zbConfig.setPolicy(strIoTSlaveObjectHostAdd, commHan.getComPort(strZigbeeGWAddressKey), strZBDevAddress);
// Send address one by one
- if(STR_LANGUAGE.equals(STR_JAVA)) {
+ if(strLanguage.equals(STR_JAVA)) {
Message msgGetIoTSetZBObj = new MessageGetSimpleDeviceObject(IoTCommCode.GET_ZB_DEV_IOTSET_OBJECT, strZBDevAddress);
commMasterToSlave(msgGetIoTSetZBObj, "Get IoTSet objects!", inStream, outStream);
} else // TODO: Implement IoTSet Zigbee for C++
* @return void
*/
private void instrumentIoTSetAddress(String strFieldIdentifier, String strFieldName,
- InputStream inStream, OutputStream outStream)
+ InputStream inStream, OutputStream outStream, String strLanguage)
throws IOException, ClassNotFoundException, InterruptedException {
// Get information from the set
List<Object[]> listObject = objAddInitHand.getFields(strFieldIdentifier);
// Create a new IoTSet
- if(STR_LANGUAGE.equals(STR_JAVA)) {
+ if(strLanguage.equals(STR_JAVA)) {
Message msgCrtIoTSet = new MessageCreateSetRelation(IoTCommCode.CREATE_NEW_IOTSET, strFieldName);
commMasterToSlave(msgCrtIoTSet, "Create new IoTSet for IoTAddress!", inStream, outStream);
} else
// Get device address
String strAddress = (String) arrFieldValues[0];
// Send address one by one
- if(STR_LANGUAGE.equals(STR_JAVA)) {
+ if(strLanguage.equals(STR_JAVA)) {
Message msgGetIoTSetAddObj = new MessageGetSimpleDeviceObject(IoTCommCode.GET_ADD_IOTSET_OBJECT, strAddress);
commMasterToSlave(msgGetIoTSetAddObj, "Get IoTSet objects!", inStream, outStream);
} else // TODO: Implement IoTSet Address for C++
String strIoTSlaveObjectHostAdd, String strFieldObjectID, Object[] arrFieldValues, Class[] arrFieldClasses)
throws IOException, FileNotFoundException, ClassNotFoundException, InterruptedException {
+ // Read config file
+ String sCfgFile = STR_IOT_CODE_PATH + strObjClassName + "/" + strObjClassName + STR_CFG_FILE_EXT;
+ String strLanguageDriver = parseConfigFile(sCfgFile, STR_LANGUAGE + "_" + strObjName);
+ if(strLanguageDriver == null) // Read just the field LANGUAGE if the first read is null
+ strLanguageDriver = parseConfigFile(sCfgFile, STR_LANGUAGE);
+ if(strLanguageDriver == null) // Check nullness for the second time - report if it is still null
+ throw new Error("IoTMaster: Language specification missing in config file: " + sCfgFile);
// PROFILING
long start = 0;
long result = 0;
-
// PROFILING
start = System.currentTimeMillis();
// iotruntime.IoTSlave dw-1.eecs.uci.edu 46151 23829 42874 &
// The In-Port for IoTMaster is the Out-Port for IoTSlave and vice versa
String strSSHCommand = null;
- if(STR_LANGUAGE.equals(STR_JAVA))
+ if(strLanguageDriver.equals(STR_JAVA))
strSSHCommand = getCmdJavaDriverIoTSlave(strIoTMasterHostAdd, strIoTSlaveObjectHostAdd, strObjName);
- else
+ else if(strLanguageDriver.equals(STR_CPP))
strSSHCommand = getCmdCppDriverIoTSlave(strIoTMasterHostAdd, strIoTSlaveObjectHostAdd, strObjName);
+ else
+ throw new Error("IoTMaster: Language specification not recognized: " + strLanguageDriver);
+ RuntimeOutput.print("IoTMaster: Language for " + strObjName + " is " + strLanguageDriver, BOOL_VERBOSE);
RuntimeOutput.print(strSSHCommand, BOOL_VERBOSE);
// Start a new thread to start a new JVM
//OutputStream outStream = new ObjectOutputStream(socket.getOutputStream());
InputStream inStream = null;
OutputStream outStream = null;
- if(STR_LANGUAGE.equals(STR_JAVA)) {
+ if(strLanguageDriver.equals(STR_JAVA)) {
inStream = new ObjectInputStream(socket.getInputStream());
outStream = new ObjectOutputStream(socket.getOutputStream());
} else { // At this point the language is certainly C++, otherwise would've complained above
// PROFILING
start = System.currentTimeMillis();
- if(STR_LANGUAGE.equals(STR_JAVA)) {
+ if(strLanguageDriver.equals(STR_JAVA)) {
sendFileToJavaSlaveDriver(serverSocket, inStream, outStream, strObjName,
strObjClassName, strObjClassInterfaceName, strObjStubClsIntfaceName,
strIoTSlaveObjectHostAdd, strFieldObjectID, arrFieldValues, arrFieldClasses);
if(setInstrumenter.getObjTableName().equals(STR_IOT_DEV_ADD_CLS)) {
// Instrument the normal IoTDeviceAddress
synchronized(this) {
- instrumentIoTSetDevice(strFieldIdentifier, strObjName, strFieldName, strIoTSlaveObjectHostAdd, inStream, outStream);
+ instrumentIoTSetDevice(strFieldIdentifier, strObjName, strFieldName, strIoTSlaveObjectHostAdd, inStream, outStream, strLanguageDriver);
}
} else if(setInstrumenter.getObjTableName().equals(STR_IOT_ZB_ADD_CLS)) {
// Instrument the IoTZigbeeAddress - special feature for Zigbee device support
synchronized(this) {
- instrumentIoTSetZBDevice(map, strObjName, strFieldName, strIoTSlaveObjectHostAdd, inStream, outStream);
+ instrumentIoTSetZBDevice(map, strObjName, strFieldName, strIoTSlaveObjectHostAdd, inStream, outStream, strLanguageDriver);
}
} else if(setInstrumenter.getObjTableName().equals(STR_IOT_ADD_CLS)) {
// Instrument the IoTAddress
synchronized(this) {
- instrumentIoTSetAddress(strFieldIdentifier, strFieldName, inStream, outStream);
+ instrumentIoTSetAddress(strFieldIdentifier, strFieldName, inStream, outStream, strLanguageDriver);
}
} else {
String strErrMsg = "IoTMaster: Device driver object can only have IoTSet<IoTAddress>, IoTSet<IoTDeviceAddress>," +
}
// End the session
// TODO: Change this later
-
- if(STR_LANGUAGE.equals(STR_JAVA)) {
+ if(strLanguageDriver.equals(STR_JAVA)) {
ObjectOutputStream oStream = (ObjectOutputStream) outStream;
oStream.writeObject(new MessageSimple(IoTCommCode.END_SESSION));
} else { // C++ side for now will be running continuously because it's an infinite loop (not in a separate thread)
*
* @return void
*/
- private void createControllerObjects() throws InterruptedException {
+ private void createDriverObjects() throws InterruptedException {
// Create a list of threads
List<Thread> threads = new ArrayList<Thread>();
/**
* Receive ACK
*/
- public boolean recvAck(InputStream inStream) throws IOException {
+ public synchronized boolean recvAck(InputStream inStream) throws IOException {
int intAck = recvInteger(inStream);
IoTCommCode codeAck = getCode(intAck);
strIoTSlaveControllerHostAdd, STR_TCP_PROTOCOL, commHan.getComPort(strObjControllerName));
routerConfig.configureHostMainPolicies(strIoTSlaveControllerHostAdd, strIoTMasterHostAdd,
strIoTSlaveControllerHostAdd, STR_TCP_PROTOCOL, commHan.getComPort(strObjControllerName));
-
+ // Read config file
+ String strControllerCfg = STR_CONT_PATH + strObjControllerName + "/" + strObjControllerName + STR_CFG_FILE_EXT;
+ STR_LANGUAGE_CONTROLLER = parseConfigFile(strControllerCfg, STR_LANGUAGE);
+ if(STR_LANGUAGE_CONTROLLER == null)
+ throw new Error("IoTMaster: Language specification missing in config file: " + strControllerCfg);
// Construct ssh command line and create a controller thread for e.g. AcmeProximity
String strSSHCommand = null;
- if(STR_LANGUAGE.equals(STR_JAVA))
+ if(STR_LANGUAGE_CONTROLLER.equals(STR_JAVA))
strSSHCommand = getCmdJavaIoTSlave(strObjControllerName);
- else if(STR_LANGUAGE.equals(STR_CPP))
+ else if(STR_LANGUAGE_CONTROLLER.equals(STR_CPP))
strSSHCommand = getCmdCppIoTSlave(strObjControllerName);
else
- throw new Error("IoTMaster: Language specification not recognized: " + STR_LANGUAGE);
+ throw new Error("IoTMaster: Language specification not recognized: " + STR_LANGUAGE_CONTROLLER);
RuntimeOutput.print(strSSHCommand, BOOL_VERBOSE);
createThread(strSSHCommand);
// Wait for connection
Socket socket = serverSocket.accept();
InputStream inStream = null;
OutputStream outStream = null;
- if(STR_LANGUAGE.equals(STR_JAVA)) {
+ if(STR_LANGUAGE_CONTROLLER.equals(STR_JAVA)) {
inStream = new ObjectInputStream(socket.getInputStream());
outStream = new ObjectOutputStream(socket.getOutputStream());
} else { // At this point the language is certainly C++, otherwise would've complained above
String strControllerClassNamePath = STR_CONT_PATH + strObjControllerName + "/" +
strControllerClassName;
- if(STR_LANGUAGE.equals(STR_JAVA)) {
+ if(STR_LANGUAGE_CONTROLLER.equals(STR_JAVA)) {
sendFileToJavaSlave(strObjControllerName, serverSocket, inStream, outStream);
// Create main controller/device object
commMasterToSlave(new MessageCreateMainObject(IoTCommCode.CREATE_MAIN_OBJECT, strObjControllerName),
RuntimeOutput.print("IoTMaster: Opening class file: " + strControllerClassName, BOOL_VERBOSE);
RuntimeOutput.print("IoTMaster: Class file path: " + strControllerClassNamePath, BOOL_VERBOSE);
HashMap<String,Object> hmControllerFieldObjects = null;
- if(STR_LANGUAGE.equals(STR_JAVA)) {
+ if(STR_LANGUAGE_CONTROLLER.equals(STR_JAVA)) {
FileInputStream fis = new FileInputStream(strControllerClassNamePath);
ClassReader cr = new ClassReader(fis);
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
} else if(setInstrumenter.getObjTableName().equals(STR_IOT_ADD_CLS)) {
// Instrument the IoTAddress
setRouterPolicyIoTSetAddress(strFieldName, map, strIoTSlaveControllerHostAdd);
- instrumentIoTSetAddress(strFieldName, strFieldName, inStream, outStream);
+ instrumentIoTSetAddress(strFieldName, strFieldName, inStream, outStream, STR_LANGUAGE_CONTROLLER);
} else {
// Any other cases
instrumentIoTSet(map, strFieldName);
start = System.currentTimeMillis();
// Separating object creations and Set/Relation initializations
- createControllerObjects();
+ createDriverObjects();
// PROFILING
result = System.currentTimeMillis()-start;
start = System.currentTimeMillis();
// Sets and relations initializations
- if(STR_LANGUAGE.equals(STR_JAVA))
+ if(STR_LANGUAGE_CONTROLLER.equals(STR_JAVA))
initializeSetsAndRelationsJava(inStream, outStream);
else
initializeSetsAndRelationsCpp(inStream, outStream);;
result = System.currentTimeMillis()-start;
System.out.println("\n\n ==> Time needed to initialize sets and relations: " + result + "\n\n");
- if(STR_LANGUAGE.equals(STR_JAVA))
+ if(STR_LANGUAGE_CONTROLLER.equals(STR_JAVA))
// == COMMUNICATION WITH IOTSLAVE CONTROLLER TO EXECUTE INIT METHOD
commMasterToSlave(new MessageSimple(IoTCommCode.INVOKE_INIT_METHOD), "Invoke init() method!", inStream, outStream);
else
invokeInitMethodCpp(outStream, inStream);
// == COMMUNICATION WITH IOTSLAVE CONTROLLER TO END PROCESS
- if(STR_LANGUAGE.equals(STR_JAVA)) {
+ if(STR_LANGUAGE_CONTROLLER.equals(STR_JAVA)) {
ObjectOutputStream oStream = (ObjectOutputStream) outStream;
oStream.writeObject(new MessageSimple(IoTCommCode.END_SESSION));
} else // C++ side will wait until the program finishes, it's not generating a separate thread for now