X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=iotjava%2Fiotrmi%2FJava%2Fsample%2FTestClass_Stub.java;h=a08ce6282871d19f54a61fa19aa80db801b3e3b4;hb=8e565033fd19c4696f67862ade27f0ebbacf5682;hp=90e2264b965d8443ca142e1f2955534559fd4884;hpb=5b5142548aabbcea7859766d4a58dfa979ce4928;p=iot2.git diff --git a/iotjava/iotrmi/Java/sample/TestClass_Stub.java b/iotjava/iotrmi/Java/sample/TestClass_Stub.java index 90e2264..a08ce62 100644 --- a/iotjava/iotrmi/Java/sample/TestClass_Stub.java +++ b/iotjava/iotrmi/Java/sample/TestClass_Stub.java @@ -16,30 +16,25 @@ public class TestClass_Stub implements TestClassInterface { * Class Properties */ private IoTRMICall rmiCall; + private IoTRMIObject rmiObj; private String address; private int[] ports; - private List listCBObj; - private IoTRMIObject rmiObj; /** * Class Constants */ - private final static int NUM_CB_OBJ = 1; private int objectId = 0; // Default value is 0 + // This is permission system for callback objects + private static Integer[] object0Permission = { 0, 1 }; // object0 is the callback object + private List set0Allowed; + + /** + * Properties and constants for Callbacks! + */ + private List listCBObj; + private final static int NUM_CB_OBJ = 1; private static int objIdCnt = 0; // Counter for callback object Ids - private final static String[] methodSignatures = { - - "voidsetA(int)", - "voidsetB(float)", - "voidsetC(string)", - "sumArray(string[])", - "intsetAndGetA(int)", - "intsetACAndGetA(string,int)", - "intcallBack()", - "voidregisterCallBack(CallBackInterface)", - "voidregisterCallBack(CallBackInterface[])", - "registercallback" - }; + /** * Constructors @@ -48,9 +43,13 @@ public class TestClass_Stub implements TestClassInterface { address = _address; ports = _ports; - rmiCall = new IoTRMICall(_port, _address, _rev, methodSignatures); + rmiCall = new IoTRMICall(_port, _address, _rev); + + set0Allowed = Arrays.asList(object0Permission); + + // Only for callbacks!!! listCBObj = new ArrayList(); - init_CallBack(); + ___initCallBack(); } @@ -63,32 +62,25 @@ public class TestClass_Stub implements TestClassInterface { } - // Return method signatures - public static String[] getMethodSignatures() { - - return methodSignatures; - } - - // Initialize callback - public void init_CallBack() { + public void ___initCallBack() { Thread thread = new Thread() { public void run() { try{ - String[] methodSignatures = CallBack_CBSkeleton.getMethodSignatures(); - rmiObj = new IoTRMIObject(ports[0], methodSignatures); - Object retObj = null; + rmiObj = new IoTRMIObject(ports[0]); while (true) { byte[] method = rmiObj.getMethodBytes(); + // Permission checking + int methId = IoTRMIObject.getMethodId(method); + if (!set0Allowed.contains(methId)) + throw new Error("CallBack_CBSkeleton: This object is not allowed to access method " + methId); + int objId = IoTRMIObject.getObjectId(method); CallBack_CBSkeleton skel = (CallBack_CBSkeleton) listCBObj.get(objId); if (skel != null) { - rmiObj.setMethodBytes(method); - retObj = skel.invokeMethod(rmiObj); - } - if (retObj != null) { - rmiObj.sendReturnObj(retObj); + //rmiObj.setMethodBytes(method); + skel.invokeMethod(rmiObj); } } } catch (Exception ex){ @@ -99,23 +91,23 @@ public class TestClass_Stub implements TestClassInterface { }; thread.start(); - String sign = "registercallback"; // can be any string + //String sign = "registercallback"; // can be any string + int methodId = 9; Class retType = void.class; - // port, address, rev, and number of objects + // port, address, rev Class[] paramCls = new Class[] { int.class, String.class, int.class }; Object[] paramObj = new Object[] { ports[0], address, 0 }; - rmiCall.remoteCall(objectId, sign, retType, null, null, paramCls, paramObj); + rmiCall.remoteCall(objectId, methodId, retType, null, paramCls, paramObj); } // Single callback handling public void registerCallback(CallBackInterface _cb) { - Thread thread = new Thread() { + /*Thread thread = new Thread() { public void run() { try{ CallBack_Skeleton cbskel = new CallBack_Skeleton(_cb, ports[0]); - cbskel.waitRequestInvokeMethod(); } catch (Exception ex){ ex.printStackTrace(); throw new Error("Error instantiating class CallBack_Skeleton!"); @@ -129,7 +121,7 @@ public class TestClass_Stub implements TestClassInterface { // port, address, and rev Class[] paramCls = new Class[] { int.class, String.class, int.class }; Object[] paramObj = new Object[] { ports[0], address, 0 }; - rmiCall.remoteCall(objectId, sign, retType, null, null, paramCls, paramObj); + rmiCall.remoteCall(objectId, sign, retType, null, null, paramCls, paramObj);*/ } @@ -146,90 +138,180 @@ public class TestClass_Stub implements TestClassInterface { throw new Error("Class not found / instantiation / illegal access / IO error!"); } - String sign = "voidregisterCallBack(CallBackInterface[])"; + //String sign = "voidregisterCallBack(CallBackInterface[])"; + int methodId = 8; Class retType = void.class; // port, address, rev, and number of objects Class[] paramCls = new Class[] { int.class }; Object[] paramObj = new Object[] { _cb.length }; - rmiCall.remoteCall(objectId, sign, retType, null, null, paramCls, paramObj); + //rmiCall.remoteCall(objectId, sign, retType, null, null, paramCls, paramObj); + rmiCall.remoteCall(objectId, methodId, retType, null, paramCls, paramObj); } public void setA(int _int) { - String sign = "voidsetA(int)"; + //String sign = "voidsetA(int)"; + int methodId = 0; Class retType = void.class; Class[] paramCls = new Class[] { int.class }; Object[] paramObj = new Object[] { _int }; - rmiCall.remoteCall(objectId, sign, retType, null, null, paramCls, paramObj); + rmiCall.remoteCall(objectId, methodId, retType, null, paramCls, paramObj); } public void setB(float _float) { - String sign = "voidsetB(float)"; + int methodId = 1; Class retType = void.class; Class[] paramCls = new Class[] { float.class }; Object[] paramObj = new Object[] { _float }; - rmiCall.remoteCall(objectId, sign, retType, null, null, paramCls, paramObj); + rmiCall.remoteCall(objectId, methodId, retType, null, paramCls, paramObj); } public void setC(String _string) { - String sign = "voidsetC(string)"; + int methodId = 2; Class retType = void.class; Class[] paramCls = new Class[] { String.class }; Object[] paramObj = new Object[] { _string }; - rmiCall.remoteCall(objectId, sign, retType, null, null, paramCls, paramObj); + rmiCall.remoteCall(objectId, methodId, retType, null, paramCls, paramObj); } // Getters public String sumArray(String[] newA) { - String sign = "sumArray(string[])"; + int methodId = 3; Class retType = String.class; Class[] paramCls = new Class[] { String[].class }; Object[] paramObj = new Object[] { newA }; - Object retObj = rmiCall.remoteCall(objectId, sign, retType, null, null, paramCls, paramObj); + Object retObj = rmiCall.remoteCall(objectId, methodId, retType, null, paramCls, paramObj); return (String)retObj; } public int setAndGetA(int newA) { - String sign = "intsetAndGetA(int)"; + int methodId = 4; Class retType = int.class; Class[] paramCls = new Class[] { int.class }; Object[] paramObj = new Object[] { newA }; - Object retObj = rmiCall.remoteCall(objectId, sign, retType, null, null, paramCls, paramObj); + Object retObj = rmiCall.remoteCall(objectId, methodId, retType, null, paramCls, paramObj); return (int)retObj; } public int setACAndGetA(String newC, int newA) { - String sign = "intsetACAndGetA(string,int)"; + int methodId = 5; Class retType = int.class; Class[] paramCls = new Class[] { String.class, int.class }; Object[] paramObj = new Object[] { newC, newA }; - Object retObj = rmiCall.remoteCall(objectId, sign, retType, null, null, paramCls, paramObj); + Object retObj = rmiCall.remoteCall(objectId, methodId, retType, null, paramCls, paramObj); return (int)retObj; } public int callBack() { - String sign = "intcallBack()"; + int methodId = 6; Class retType = int.class; Class[] paramCls = new Class[] { }; Object[] paramObj = new Object[] { }; - Object retObj = rmiCall.remoteCall(objectId, sign, retType, null, null, paramCls, paramObj); + Object retObj = rmiCall.remoteCall(objectId, methodId, retType, null, paramCls, paramObj); return (int)retObj; } + public StructJ[] handleStruct(StructJ[] data) { + + int methodId = 11; + Class retType = void.class; + Class[] paramCls = new Class[] { int.class }; + Object[] paramObj = new Object[] { data.length }; + rmiCall.remoteCall(objectId, methodId, retType, null, paramCls, paramObj); + + int methodId2 = 10; + Class retType2 = int.class; // return type is integer if it is a struct!!! + // Calculate the size of the array + Class[] paramCls2 = new Class[3*data.length]; + Object[] paramObj2 = new Object[3*data.length]; + // Handle with for loop + int pos = 0; + for(int i = 0; i < data.length; i++) { + paramCls2[pos] = String.class; + paramObj2[pos++] = data[i].name; + paramCls2[pos] = float.class; + paramObj2[pos++] = data[i].value; + paramCls2[pos] = int.class; + paramObj2[pos++] = data[i].year; + } + //System.out.println(Arrays.toString(paramObj2)); + Object retObj = rmiCall.remoteCall(objectId, methodId2, retType2, null, paramCls2, paramObj2); + // RETURN STRUCT + // Get the length of the struct first + int structsize1 = (int) retObj; + // Construct the struct + Class[] retCls = new Class[3*structsize1]; + Class[] retClsVal = new Class[3*structsize1]; + pos = 0; + for(int i=0; i < structsize1; i++) { + retCls[pos] = String.class; + retClsVal[pos++] = null; + retCls[pos] = float.class; + retClsVal[pos++] = null; + retCls[pos] = int.class; + retClsVal[pos++] = null; + } + Object[] retObj2 = rmiCall.getStructObjects(retCls, + retClsVal); + StructJ[] dataRet = new StructJ[structsize1]; + for (int i=0; i < structsize1; i++) { + dataRet[i] = new StructJ(); + } + pos = 0; + for(int i=0; i < structsize1; i++) { + dataRet[i].name = (String) retObj2[pos++]; + dataRet[i].value = (float) retObj2[pos++]; + dataRet[i].year = (int) retObj2[pos++]; + } + + return dataRet; + } + + + public EnumJ[] handleEnum(EnumJ[] en) { + + int methodId = 12; + Class retType = int[].class; + // Handle with for loop + int paramInt[] = new int[en.length]; + for(int i = 0; i < en.length; i++) { + paramInt[i] = en[i].ordinal(); + } + + Class[] paramCls = new Class[] { int[].class }; + Object[] paramObj = new Object[] { paramInt }; + + // if no return value just + // rmiCall.remoteCall(objectId, methodId, retType, null, paramCls, paramObj); + // This is with return value: + Object retObj = + rmiCall.remoteCall(objectId, methodId, retType, null, paramCls, paramObj); + int[] retEnumInt = (int[]) retObj; + int enumsize1 = retEnumInt.length; + // Encoder/decoder + EnumJ[] enumJ = EnumJ.values(); + EnumJ[] enRetVal = new EnumJ[enumsize1]; + for(int i = 0; i < enumsize1; i++) { + enRetVal[i] = enumJ[retEnumInt[i]]; + } + return enRetVal; + } + + public static void main(String[] args) throws Exception { CommunicationHandler comHan = new CommunicationHandler(true); @@ -247,7 +329,7 @@ public class TestClass_Stub implements TestClassInterface { System.out.println("Return value: " + tcstub.setACAndGetA("string", 123)); System.out.println("Return value: " + tcstub.sumArray(new String[] { "123", "456", "987" })); - CallBackInterface cb1 = new CallBack(23); + /*CallBackInterface cb1 = new CallBack(23); CallBackInterface cb2 = new CallBack(33); CallBackInterface cb3 = new CallBack(43); CallBackInterface[] cb = { cb1, cb2, cb3 }; @@ -258,7 +340,35 @@ public class TestClass_Stub implements TestClassInterface { CallBackInterface cb6 = new CallBack(12); CallBackInterface[] cbt = { cb4, cb5, cb6 }; tcstub.registerCallback(cbt); - System.out.println("Return value from callback: " + tcstub.callBack()); + System.out.println("Return value from callback: " + tcstub.callBack());*/ + + StructJ[] data = new StructJ[2]; + for (int i=0; i<2; i++) { + data[i] = new StructJ(); + } + data[0].name = "Rahmadi"; + data[0].value = 0.123f; + data[0].year = 2016; + //data[1].name = "Trimananda"; + //data[1].value = 0.223f; + //data[1].year = 2017; + + for (StructJ str : data) { + System.out.println("Name: " + str.name); + System.out.println("Value: " + str.value); + System.out.println("Year: " + str.year); + } + StructJ[] strj = tcstub.handleStruct(data); + for (StructJ str : strj) { + System.out.println("Name: " + str.name); + System.out.println("Value: " + str.value); + System.out.println("Year: " + str.year); + } + + + EnumJ[] en = { EnumJ.APPLE, EnumJ.ORANGE, EnumJ.APPLE, EnumJ.GRAPE }; + EnumJ[] res = tcstub.handleEnum(en); + System.out.println("Enum members: " + Arrays.toString(res)); } }