From a86b0eaf1aadf1bd64a6ec707b03306a6ec25615 Mon Sep 17 00:00:00 2001
From: rtrimana <rtrimana@uci.edu>
Date: Thu, 5 Jan 2017 08:48:07 -0800
Subject: [PATCH] Adding missing files, completing driver config files with
 stub interface, completing build flow with .jks file for https

---
 .../CameraCallback_CallbackSkeleton.java      |  44 +++++
 .../CameraSmart_Stub.java                     | 184 ++++++++++++++++++
 benchmarks/drivers/AudioRoom/AudioRoom.config |   3 +
 .../drivers/EspSprinkler/EspSprinkler.config  |   3 +
 .../GPSPhoneGateway/GPSPhoneGateway.config    |   3 +
 benchmarks/drivers/GreenLawn/GreenLawn.config |   3 +
 benchmarks/drivers/IHome/IHome.config         |   5 +-
 benchmarks/drivers/Makefile                   |   2 +-
 .../drivers/SpruceSensor/SpruceSensor.config  |   3 +
 .../WeatherPhoneGateway.config                |   3 +
 iotjava/Makefile                              |   1 +
 iotjava/iotruntime/master/IoTMaster.java      |   3 +-
 12 files changed, 254 insertions(+), 3 deletions(-)
 create mode 100644 benchmarks/IrrigationController/CameraCallback_CallbackSkeleton.java
 create mode 100644 benchmarks/IrrigationController/CameraSmart_Stub.java

diff --git a/benchmarks/IrrigationController/CameraCallback_CallbackSkeleton.java b/benchmarks/IrrigationController/CameraCallback_CallbackSkeleton.java
new file mode 100644
index 0000000..afe1048
--- /dev/null
+++ b/benchmarks/IrrigationController/CameraCallback_CallbackSkeleton.java
@@ -0,0 +1,44 @@
+package IrrigationController;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Arrays;
+import iotrmi.Java.IoTRMICall;
+import iotrmi.Java.IoTRMIObject;
+
+import iotcode.interfaces.*;
+
+public class CameraCallback_CallbackSkeleton implements CameraCallback {
+
+	private CameraCallback mainObj;
+	private int objectId = 0;
+	private String callbackAddress;
+	
+
+	public CameraCallback_CallbackSkeleton(CameraCallback _mainObj, String _callbackAddress, int _objectId) throws Exception {
+		callbackAddress = _callbackAddress;
+		mainObj = _mainObj;
+		objectId = _objectId;
+	}
+
+	public void newCameraFrameAvailable(byte latestFrame[], long timeStamp) {
+		mainObj.newCameraFrameAvailable(latestFrame, timeStamp);
+	}
+
+	public void ___newCameraFrameAvailable(IoTRMIObject rmiObj) {
+		Object[] paramObj = rmiObj.getMethodParams(new Class<?>[] { byte[].class, long.class }, 
+		new Class<?>[] { null, null });
+		newCameraFrameAvailable((byte[]) paramObj[0], (long) paramObj[1]);
+	}
+
+	public void invokeMethod(IoTRMIObject rmiObj) throws IOException {
+		int methodId = rmiObj.getMethodId();
+		switch (methodId) {
+			case 0: ___newCameraFrameAvailable(rmiObj); break;
+			default: 
+			throw new Error("Method Id " + methodId + " not recognized!");
+		}
+	}
+
+}
diff --git a/benchmarks/IrrigationController/CameraSmart_Stub.java b/benchmarks/IrrigationController/CameraSmart_Stub.java
new file mode 100644
index 0000000..7c1783b
--- /dev/null
+++ b/benchmarks/IrrigationController/CameraSmart_Stub.java
@@ -0,0 +1,184 @@
+package IrrigationController;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Arrays;
+import iotrmi.Java.IoTRMICall;
+import iotrmi.Java.IoTRMIObject;
+
+import iotcode.interfaces.*;
+
+public class CameraSmart_Stub implements CameraSmart {
+
+	private IoTRMICall rmiCall;
+	private String callbackAddress;
+	private int[] ports;
+
+	private final static int objectId = 0;
+	// Callback properties
+	private IoTRMIObject rmiObj;
+	List<CameraCallback> listCallbackObj;
+	private static int objIdCnt = 0;
+	private final static int object0Id = 0;	//CameraSmartCallback
+	private static Integer[] object0Permission = { 0 };
+	private static List<Integer> set0Allowed;
+	
+
+	public CameraSmart_Stub(int _port, String _skeletonAddress, String _callbackAddress, int _rev, int[] _ports) throws Exception {
+		callbackAddress = _callbackAddress;
+		ports = _ports;
+		rmiCall = new IoTRMICall(_port, _skeletonAddress, _rev);
+		set0Allowed = new ArrayList<Integer>(Arrays.asList(object0Permission));
+		listCallbackObj = new ArrayList<CameraCallback>();
+		set0Allowed.add(-9999);
+		___initCallBack();
+	}
+
+	public int getMaxFPS() {
+		int methodId = 8;
+		Class<?> retType = int.class;
+		Class<?>[] paramCls = new Class<?>[] {  };
+		Object[] paramObj = new Object[] {  };
+		Object retObj = rmiCall.remoteCall(objectId, methodId, retType, null, paramCls, paramObj);
+		return (int)retObj;
+	}
+
+	public boolean setFPS(int _fps) {
+		int methodId = 7;
+		Class<?> retType = boolean.class;
+		Class<?>[] paramCls = new Class<?>[] { int.class };
+		Object[] paramObj = new Object[] { _fps };
+		Object retObj = rmiCall.remoteCall(objectId, methodId, retType, null, paramCls, paramObj);
+		return (boolean)retObj;
+	}
+
+	public int getMinFPS() {
+		int methodId = 9;
+		Class<?> retType = int.class;
+		Class<?>[] paramCls = new Class<?>[] {  };
+		Object[] paramObj = new Object[] {  };
+		Object retObj = rmiCall.remoteCall(objectId, methodId, retType, null, paramCls, paramObj);
+		return (int)retObj;
+	}
+
+	public boolean setResolution(Resolution _res) {
+		int methodId = 6;
+		Class<?> retType = boolean.class;
+		int paramEnum0[] = new int[1];
+		paramEnum0[0] = _res.ordinal();
+		Class<?>[] paramCls = new Class<?>[] { int[].class };
+		Object[] paramObj = new Object[] { paramEnum0 };
+		Object retObj = rmiCall.remoteCall(objectId, methodId, retType, null, paramCls, paramObj);
+		return (boolean)retObj;
+	}
+
+	public void stop() {
+		int methodId = 2;
+		Class<?> retType = void.class;
+		Class<?>[] paramCls = new Class<?>[] {  };
+		Object[] paramObj = new Object[] {  };
+		rmiCall.remoteCall(objectId, methodId, retType, null, paramCls, paramObj);
+	}
+
+	public void start() {
+		int methodId = 1;
+		Class<?> retType = void.class;
+		Class<?>[] paramCls = new Class<?>[] {  };
+		Object[] paramObj = new Object[] {  };
+		rmiCall.remoteCall(objectId, methodId, retType, null, paramCls, paramObj);
+	}
+
+	public long getTimestamp() {
+		int methodId = 4;
+		Class<?> retType = long.class;
+		Class<?>[] paramCls = new Class<?>[] {  };
+		Object[] paramObj = new Object[] {  };
+		Object retObj = rmiCall.remoteCall(objectId, methodId, retType, null, paramCls, paramObj);
+		return (long)retObj;
+	}
+
+	public byte[] getLatestFrame() {
+		int methodId = 3;
+		Class<?> retType = byte[].class;
+		Class<?>[] paramCls = new Class<?>[] {  };
+		Object[] paramObj = new Object[] {  };
+		Object retObj = rmiCall.remoteCall(objectId, methodId, retType, null, paramCls, paramObj);
+		return (byte[])retObj;
+	}
+
+	public void init() {
+		int methodId = 0;
+		Class<?> retType = void.class;
+		Class<?>[] paramCls = new Class<?>[] {  };
+		Object[] paramObj = new Object[] {  };
+		rmiCall.remoteCall(objectId, methodId, retType, null, paramCls, paramObj);
+	}
+
+	public void registerCallback(CameraCallback _callbackTo) {
+		try {
+			CameraCallback_CallbackSkeleton skel0 = new CameraCallback_CallbackSkeleton(_callbackTo, callbackAddress, objIdCnt++);
+			listCallbackObj.add(skel0);
+		} catch (Exception ex) {
+			ex.printStackTrace();
+			throw new Error("Exception when generating skeleton objects!");
+		}
+
+		int methodId = 10;
+		Class<?> retType = void.class;
+		Class<?>[] paramCls = new Class<?>[] { int.class };
+		Object[] paramObj = new Object[] { new Integer(1) };
+		rmiCall.remoteCall(objectId, methodId, retType, null, paramCls, paramObj);
+	}
+
+	public void ___initCallBack() {
+		Thread thread = new Thread() {
+			public void run() {
+				try {
+					rmiObj = new IoTRMIObject(ports[0]);
+					while (true) {
+						byte[] method = rmiObj.getMethodBytes();
+						int objId = IoTRMIObject.getObjectId(method);
+						CameraCallback_CallbackSkeleton skel = (CameraCallback_CallbackSkeleton) listCallbackObj.get(objId);
+						if (skel != null) {
+							int methodId = IoTRMIObject.getMethodId(method);
+							if (!set0Allowed.contains(methodId)) {
+								throw new Error("Callback object for CameraCallback is not allowed to access method: " + methodId);
+							}
+							skel.invokeMethod(rmiObj);
+						} else {
+							throw new Error("CameraCallback: Object with Id " + objId + " not found!");
+						}
+					}
+				} catch (Exception ex) {
+					ex.printStackTrace();
+					throw new Error("Error instantiating class CameraCallback_CallbackSkeleton!");
+				}
+			}
+		};
+		thread.start();
+
+		int methodId = -9998;
+		Class<?> retType = void.class;
+		Class<?>[] paramCls = new Class<?>[] { int[].class, String.class, int.class };
+		Object[] paramObj = new Object[] { ports, callbackAddress, 0 };
+		rmiCall.remoteCall(objectId, methodId, retType, null, paramCls, paramObj);
+	}
+
+	public List<Resolution> getSupportedResolutions() {
+		int methodId = 5;
+		Class<?> retType = int[].class;
+		Class<?>[] paramCls = new Class<?>[] {  };
+		Object[] paramObj = new Object[] {  };
+		Object retObj = rmiCall.remoteCall(objectId, methodId, retType, null, paramCls, paramObj);
+		int[] retEnum = (int[]) retObj;
+		Resolution[] enumVals = Resolution.values();
+		int retLen = retEnum.length;
+		List<Resolution> enumRetVal = new ArrayList<Resolution>();
+		for (int i = 0; i < retLen; i++) {
+			enumRetVal.add(enumVals[retEnum[i]]);
+		}
+		return enumRetVal;
+	}
+
+}
diff --git a/benchmarks/drivers/AudioRoom/AudioRoom.config b/benchmarks/drivers/AudioRoom/AudioRoom.config
index 6af9ab2..f10cb63 100644
--- a/benchmarks/drivers/AudioRoom/AudioRoom.config
+++ b/benchmarks/drivers/AudioRoom/AudioRoom.config
@@ -1 +1,4 @@
+# Skeleton/original interface
 INTERFACE_CLASS=Room
+# Stub
+INTERFACE_STUB_CLASS=RoomSmart
diff --git a/benchmarks/drivers/EspSprinkler/EspSprinkler.config b/benchmarks/drivers/EspSprinkler/EspSprinkler.config
index 55c4e0c..335a38a 100644
--- a/benchmarks/drivers/EspSprinkler/EspSprinkler.config
+++ b/benchmarks/drivers/EspSprinkler/EspSprinkler.config
@@ -1 +1,4 @@
+# Skeleton/original interface
 INTERFACE_CLASS=Sprinkler
+# Stub
+INTERFACE_STUB_CLASS=SprinklerSmart
diff --git a/benchmarks/drivers/GPSPhoneGateway/GPSPhoneGateway.config b/benchmarks/drivers/GPSPhoneGateway/GPSPhoneGateway.config
index 081970f..cce2a04 100644
--- a/benchmarks/drivers/GPSPhoneGateway/GPSPhoneGateway.config
+++ b/benchmarks/drivers/GPSPhoneGateway/GPSPhoneGateway.config
@@ -1 +1,4 @@
+# Skeleton/original interface
 INTERFACE_CLASS=GPSGateway
+# Stub
+INTERFACE_STUB_CLASS=GPSGatewaySmart
diff --git a/benchmarks/drivers/GreenLawn/GreenLawn.config b/benchmarks/drivers/GreenLawn/GreenLawn.config
index 779e2c7..77c2cf6 100644
--- a/benchmarks/drivers/GreenLawn/GreenLawn.config
+++ b/benchmarks/drivers/GreenLawn/GreenLawn.config
@@ -1 +1,4 @@
+# Skeleton/original interface
 INTERFACE_CLASS=Lawn
+# Stub
+INTERFACE_STUB_CLASS=LawnSmart
diff --git a/benchmarks/drivers/IHome/IHome.config b/benchmarks/drivers/IHome/IHome.config
index 276b02e..a1384ce 100644
--- a/benchmarks/drivers/IHome/IHome.config
+++ b/benchmarks/drivers/IHome/IHome.config
@@ -1 +1,4 @@
-INTERFACE_CLASS=Speaker
\ No newline at end of file
+# Skeleton/original interface
+INTERFACE_CLASS=Speaker
+# Stub
+INTERFACE_STUB_CLASS=SpeakerSmart
diff --git a/benchmarks/drivers/Makefile b/benchmarks/drivers/Makefile
index 5e6706b..08aca6d 100644
--- a/benchmarks/drivers/Makefile
+++ b/benchmarks/drivers/Makefile
@@ -48,7 +48,7 @@ PHONY += moisture
 moisture:
 	$(JAVAC) $(JFLAGS) SpruceSensor/*.java
 	cp SpruceSensor/SpruceSensor.config $(BIN_DIR)/iotcode/SpruceSensor
-	cd $(BIN_DIR)/iotcode/SpruceSensor; $(JAR) $(JARFLAGS) SpruceSensor.jar ../../iotcode/SpruceSensor/*.class ../../iotcode/interfaces/MoistureSensor*.class ../../iotcode/
+	cd $(BIN_DIR)/iotcode/SpruceSensor; $(JAR) $(JARFLAGS) SpruceSensor.jar ../../iotcode/SpruceSensor/*.class ../../iotcode/interfaces/MoistureSensor*.class ../../iotcode/interfaces/Camera*.class ../../IrrigationController/MotionDetection*.class
 
 PHONY += weathergateway
 weathergateway:
diff --git a/benchmarks/drivers/SpruceSensor/SpruceSensor.config b/benchmarks/drivers/SpruceSensor/SpruceSensor.config
index 2f0da8c..0ba4568 100644
--- a/benchmarks/drivers/SpruceSensor/SpruceSensor.config
+++ b/benchmarks/drivers/SpruceSensor/SpruceSensor.config
@@ -1 +1,4 @@
+# Skeleton/original interface
 INTERFACE_CLASS=MoistureSensor
+# Stub
+INTERFACE_STUB_CLASS=MoistureSensorSmart
diff --git a/benchmarks/drivers/WeatherPhoneGateway/WeatherPhoneGateway.config b/benchmarks/drivers/WeatherPhoneGateway/WeatherPhoneGateway.config
index 718a38b..b08e28f 100644
--- a/benchmarks/drivers/WeatherPhoneGateway/WeatherPhoneGateway.config
+++ b/benchmarks/drivers/WeatherPhoneGateway/WeatherPhoneGateway.config
@@ -1 +1,4 @@
+# Skeleton/original interface
 INTERFACE_CLASS=WeatherGateway
+# Stub
+INTERFACE_STUB_CLASS=WeatherGatewaySmart
diff --git a/iotjava/Makefile b/iotjava/Makefile
index f996ce5..c90044f 100644
--- a/iotjava/Makefile
+++ b/iotjava/Makefile
@@ -178,6 +178,7 @@ runtime:
 	$(JAVAC) -classpath .:$(RUNTIMEJARS):$(PHONEJARS):$(ZIPJARS) iotruntime/*.java iotruntime/master/*.java iotruntime/slave/*.java iotruntime/messages/*.java iotruntime/stub/*.java iotruntime/zigbee/*.java -d $(BIN_DIR)
 	cp ../localconfig/iotruntime/IoTMaster.config $(BIN_DIR)/iotruntime/
 	cp ../localconfig/iotruntime/IoTSlave.config $(BIN_DIR)/iotruntime/
+	cp ../sslkey/*.jks $(BIN_DIR)/iotruntime/
 	cp -r ../localconfig/mysql $(BIN_DIR)/iotruntime/
 
 PHONY += doc
diff --git a/iotjava/iotruntime/master/IoTMaster.java b/iotjava/iotruntime/master/IoTMaster.java
index e35d775..31f82e9 100644
--- a/iotjava/iotruntime/master/IoTMaster.java
+++ b/iotjava/iotruntime/master/IoTMaster.java
@@ -1017,7 +1017,8 @@ public class IoTMaster {
 					commMasterToSlave(new MessageGetObject(IoTCommCode.GET_IOTSET_OBJECT, objInitInfo.getIoTSlaveObjectHostAdd(),
 						objInitInfo.getObjectName(), objInitInfo.getObjectClassName(), objInitInfo.getObjectClassInterfaceName(), 
 						objInitInfo.getObjectStubClassInterfaceName(), objInitInfo.getRMIRegistryPort(), objInitInfo.getRMIStubPort(),
-						objInitInfo.getRMICallbackPorts()), "Get IoTSet object!", inStream, outStream);	
+						objInitInfo.getRMICallbackPorts()), "Get IoTSet object!", inStream, outStream);
+
 				}
 				// == COMMUNICATION WITH IOTSLAVE CONTROLLER TO REINITIALIZE IOTSET FIELD
 				commMasterToSlave(new MessageSimple(IoTCommCode.REINITIALIZE_IOTSET_FIELD),
-- 
2.34.1