Making classes final to make inheritance impossible
[iot2.git] / iotjava / iotrmi / Java / IoTRMIObject.java
index 42e778b849943373b8402aac3b2817494148fb66..06a56ce5638a6e653411cffd373a00a6066da01e 100644 (file)
@@ -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.
  *  <p>
@@ -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
         * <p>
@@ -168,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;
+       }
 }