X-Git-Url: http://plrg.eecs.uci.edu/git/?p=iot2.git;a=blobdiff_plain;f=iotjava%2Fiotrmi%2FJava%2FIoTRMIObject.java;h=06a56ce5638a6e653411cffd373a00a6066da01e;hp=e801e44530bcf59de21bb1e8c147f20c474bcb5e;hb=d227810e27d0c63637497c4adaabc19dc67b186a;hpb=05b04153ef2ac0837c6b8ebda8402aee13a2b24b diff --git a/iotjava/iotrmi/Java/IoTRMIObject.java b/iotjava/iotrmi/Java/IoTRMIObject.java index e801e44..06a56ce 100644 --- a/iotjava/iotrmi/Java/IoTRMIObject.java +++ b/iotjava/iotrmi/Java/IoTRMIObject.java @@ -10,6 +10,9 @@ import java.util.Map; import java.util.Set; import java.lang.reflect.*; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + /** Class IoTRMIObject is a class that stores info of an object. *

@@ -23,7 +26,7 @@ import java.lang.reflect.*; * @version 1.0 * @since 2016-10-03 */ -public class IoTRMIObject { +public final class IoTRMIObject { /** * Class Properties @@ -32,6 +35,7 @@ public class IoTRMIObject { private IoTRMIUtil rmiUtil; private IoTSocketServer rmiServer; private byte[] methodBytes; + private Lock lock = new ReentrantLock(); /** @@ -54,8 +58,9 @@ public class IoTRMIObject { public byte[] getMethodBytes() throws IOException { // Receive method info + //System.out.println("Method RMIObj before: " + Arrays.toString(methodBytes)); methodBytes = rmiServer.receiveBytes(methodBytes); - System.out.println("Method: " + Arrays.toString(methodBytes)); + //System.out.println("Method RMIObj after: " + Arrays.toString(methodBytes)); return methodBytes; } @@ -114,6 +119,22 @@ public class IoTRMIObject { } + /** + * static version of getMethodId() + */ + public static int getMethodId(byte[] methodBytes) { + + // Get method Id bytes + byte[] methodIdBytes = new byte[IoTRMIUtil.METHOD_ID_LEN]; + // Method Id is positioned after object Id in the byte array + System.arraycopy(methodBytes, IoTRMIUtil.OBJECT_ID_LEN, methodIdBytes, 0, IoTRMIUtil.METHOD_ID_LEN); + // Get method Id + int methodId = IoTRMIUtil.byteArrayToInt(methodIdBytes); + // Get method Id + return methodId; + } + + /** * getMethodParams() gets method params based on byte array received *

@@ -132,7 +153,7 @@ public class IoTRMIObject { * | 32-bit object ID | 32-bit method ID | 32-bit length | n-bit actual data | ... * */ - public Object[] getMethodParams(Class[] arrCls, Class[] arrGenKeyCls, Class[] arrGenValCls) { + public Object[] getMethodParams(Class[] arrCls, Class[] arrGenValCls) { // Byte scanning position int pos = IoTRMIUtil.OBJECT_ID_LEN + IoTRMIUtil.METHOD_ID_LEN; @@ -152,8 +173,7 @@ public class IoTRMIObject { byte[] paramBytes = new byte[paramSize]; System.arraycopy(methodBytes, pos, paramBytes, 0, paramSize); pos = pos + paramSize; - paramObj[i] = IoTRMIUtil.getParamObject(arrCls[i], arrGenKeyCls[i], - arrGenValCls[i], paramBytes); + paramObj[i] = IoTRMIUtil.getParamObject(arrCls[i], arrGenValCls[i], paramBytes); } return paramObj; @@ -169,4 +189,56 @@ public class IoTRMIObject { byte[] retObjBytes = IoTRMIUtil.getObjectBytes(retObj); rmiServer.sendBytes(retObjBytes); } + + + /** + * sendReturnObj() overloaded to send multiple return objects for structs + */ + public void sendReturnObj(Class[] retCls, Object[] retObj) throws IOException { + + // Send back return value + byte[] retObjBytes = returnToBytes(retCls, retObj); + rmiServer.sendBytes(retObjBytes); + } + + + /** + * returnToBytes() takes array of objects and generates bytes + */ + public byte[] returnToBytes(Class[] retCls, Object[] retObj) { + + // Get byte arrays and calculate method bytes length + int numbRet = retObj.length; + int retLen = 0; + byte[][] objBytesArr = new byte[numbRet][]; + for (int i = 0; i < numbRet; i++) { + // Get byte arrays for the objects + objBytesArr[i] = IoTRMIUtil.getObjectBytes(retObj[i]); + String clsName = retCls[i].getSimpleName(); + int retObjLen = rmiUtil.getTypeSize(clsName); + if (retObjLen == -1) { // indefinite length - store the length first + retLen = retLen + IoTRMIUtil.RETURN_LEN; + } + retLen = retLen + objBytesArr[i].length; + } + // Construct return in byte array + byte[] retBytes = new byte[retLen]; + int pos = 0; + // Iteration for copying bytes + for (int i = 0; i < numbRet; i++) { + + String clsName = retCls[i].getSimpleName(); + int retObjLen = rmiUtil.getTypeSize(clsName); + if (retObjLen == -1) { // indefinite length + retObjLen = objBytesArr[i].length; + byte[] retLenBytes = IoTRMIUtil.intToByteArray(retObjLen); + System.arraycopy(retLenBytes, 0, retBytes, pos, IoTRMIUtil.RETURN_LEN); + pos = pos + IoTRMIUtil.RETURN_LEN; + } + System.arraycopy(objBytesArr[i], 0, retBytes, pos, retObjLen); + pos = pos + retObjLen; + } + + return retBytes; + } }