import java.io.IOException;
import java.util.Arrays;
-import java.util.Set;
-import java.util.Map;
-import java.util.HashMap;
+
+import java.util.List;
import iotrmi.Java.IoTRMIObject;
import iotrmi.Java.IoTRMICall;
/**
* Class Constants
*/
- private int objectId = 0; // Default value is 0
- 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",
- "handleStruct(StructJ[])",
- "structsize"
- };
-
private TestClassInterface tc;
private int port;
private IoTRMIObject rmiObj;
+
+ // Callback stuff
+ private static int objIdCnt = 0; // Counter for callback object Ids
private IoTRMICall rmiCall;
private CallBackInterface cbstub;
+ // Object permission
+ private int object0Id = 0;
+ private static Integer[] object0Permission = { 0, 1, 2, 3, 4, 5 };
+ private List<Integer> set0Allowed;
+
/**
* Constructors
tc = _tc;
port = _port;
- rmiObj = new IoTRMIObject(_port, methodSignatures);
+ rmiObj = new IoTRMIObject(_port);
+ set0Allowed = Arrays.asList(object0Permission);
___waitRequestInvokeMethod();
}
public void ___setA() {
Object[] paramObj = rmiObj.getMethodParams(new Class<?>[] { int.class },
- new Class<?>[] { null }, new Class<?>[] { null });
+ new Class<?>[] { null });
setA((int) paramObj[0]);
}
public void ___setB() {
Object[] paramObj = rmiObj.getMethodParams(new Class<?>[] { float.class },
- new Class<?>[] { null }, new Class<?>[] { null });
+ new Class<?>[] { null });
setB((float) paramObj[0]);
}
public void ___setC() {
Object[] paramObj = rmiObj.getMethodParams(new Class<?>[] { String.class },
- new Class<?>[] { null }, new Class<?>[] { null });
+ new Class<?>[] { null });
setC((String) paramObj[0]);
}
}
- public String ___sumArray() {
+ public void ___sumArray() throws IOException {
Object[] paramObj = rmiObj.getMethodParams(new Class<?>[] { String[].class },
- new Class<?>[] { null }, new Class<?>[] { null });
- return sumArray((String[]) paramObj[0]);
+ new Class<?>[] { null });
+ Object retObj = sumArray((String[]) paramObj[0]);
+ rmiObj.sendReturnObj(retObj);
}
}
- public int ___setAndGetA() {
+ public void ___setAndGetA() throws IOException {
Object[] paramObj = rmiObj.getMethodParams(new Class<?>[] { int.class },
- new Class<?>[] { null }, new Class<?>[] { null });
- return setAndGetA((int) paramObj[0]);
+ new Class<?>[] { null });
+ Object retObj = setAndGetA((int) paramObj[0]);
+ rmiObj.sendReturnObj(retObj);
}
}
- public int ___setACAndGetA() {
+ public void ___setACAndGetA() throws IOException {
Object[] paramObj = rmiObj.getMethodParams(new Class<?>[] { String.class, int.class },
- new Class<?>[] { null, null }, new Class<?>[] { null, null });
- return setACAndGetA((String) paramObj[0], (int) paramObj[1]);
+ new Class<?>[] { null, null });
+ Object retObj = setACAndGetA((String) paramObj[0], (int) paramObj[1]);
+ rmiObj.sendReturnObj(retObj);
}
public void ___registerCallback() throws IOException {
Object[] paramObj = rmiObj.getMethodParams(new Class<?>[] { int.class, String.class, int.class },
- new Class<?>[] { null, null, null }, new Class<?>[] { null, null, null });
+ new Class<?>[] { null, null, null });
CallBackInterface cbstub = new CallBack_Stub((int) paramObj[0], (String) paramObj[1], (int) paramObj[2]);
registerCallback((CallBackInterface) cbstub);
}
public void ____registerCallback() throws IOException {
Object[] paramObj = rmiObj.getMethodParams(new Class<?>[] { int.class },
- new Class<?>[] { null }, new Class<?>[] { null });
+ new Class<?>[] { null });
int numStubs = (int) paramObj[0];
CallBackInterface[] stub = new CallBackInterface[numStubs];
for (int objId = 0; objId < numStubs; objId++) {
public void ___regCB() throws IOException {
Object[] paramObj = rmiObj.getMethodParams(new Class<?>[] { int.class, String.class, int.class },
- new Class<?>[] { null, null, null }, new Class<?>[] { null, null, null });
- String[] methodSignatures = CallBack_CBStub.getMethodSignatures();
- rmiCall = new IoTRMICall((int) paramObj[0], (String) paramObj[1], (int) paramObj[2], methodSignatures);
+ new Class<?>[] { null, null, null });
+ //String[] methodSignatures = CallBack_CBStub.getMethodSignatures();
+ rmiCall = new IoTRMICall((int) paramObj[0], (String) paramObj[1], (int) paramObj[2]);
System.out.println("Creating a new IoTRMICall object");
}
}
- public int ___callBack() {
+ public void ___callBack() throws IOException {
- return callBack();
+ Object retObj = callBack();
+ rmiObj.sendReturnObj(retObj);
}
- public void handleStruct(StructJ[] data) {
+ public StructJ[] handleStruct(StructJ[] data) {
- tc.handleStruct(data);
+ return tc.handleStruct(data);
}
public int ___structSize() {
Object[] paramObj = rmiObj.getMethodParams(new Class<?>[] { int.class },
- new Class<?>[] { null }, new Class<?>[] { null });
- return (int) paramObj[0];
+ new Class<?>[] { null });
+ return (int) paramObj[0];
}
- public void ___handleStruct(int structsize1) {
+ public void ___handleStruct(int structsize1) throws IOException {
Class<?>[] paramCls = new Class<?>[3*structsize1];
- Class<?>[] paramClsTyp1 = new Class<?>[3*structsize1];
- Class<?>[] paramClsTyp2 = new Class<?>[3*structsize1];
+ Class<?>[] paramClsVal = new Class<?>[3*structsize1];
int pos = 0;
for(int i=0; i < structsize1; i++) {
paramCls[pos] = String.class;
- paramClsTyp1[pos] = null;
- paramClsTyp2[pos++] = null;
+ paramClsVal[pos++] = null;
paramCls[pos] = float.class;
- paramClsTyp1[pos] = null;
- paramClsTyp2[pos++] = null;
+ paramClsVal[pos++] = null;
paramCls[pos] = int.class;
- paramClsTyp1[pos] = null;
- paramClsTyp2[pos++] = null;
+ paramClsVal[pos++] = null;
}
Object[] paramObj = rmiObj.getMethodParams(paramCls,
- paramClsTyp1, paramClsTyp2);
+ paramClsVal);
StructJ[] data = new StructJ[structsize1];
for (int i=0; i < structsize1; i++) {
data[i] = new StructJ();
data[i].value = (float) paramObj[pos++];
data[i].year = (int) paramObj[pos++];
}
- tc.handleStruct(data);
+ // Just the following if there is no returned value
+ //tc.handleStruct(data);
+ StructJ[] retStruct = tc.handleStruct(data);
+ // Return length first
+ int structsize2 = retStruct.length;
+ Object retObj = structsize2;
+ rmiObj.sendReturnObj(retObj);
+ // Send the actual struct members
+ // Calculate the size of the array
+ Class<?>[] retCls = new Class<?>[3*structsize2];
+ Object[] retObj2 = new Object[3*structsize2];
+ // Handle with for loop
+ pos = 0;
+ for(int i = 0; i < structsize2; i++) {
+ retCls[pos] = String.class;
+ retObj2[pos++] = data[i].name;
+ retCls[pos] = float.class;
+ retObj2[pos++] = data[i].value;
+ retCls[pos] = int.class;
+ retObj2[pos++] = data[i].year;
+ }
+ rmiObj.sendReturnObj(retCls, retObj2);
+ }
+
+
+ public EnumJ[] handleEnum(EnumJ[] en) {
+
+ return tc.handleEnum(en);
+ }
+
+
+ public void ___handleEnum() throws IOException {
+
+ Object[] paramObj = rmiObj.getMethodParams(new Class<?>[] { int[].class },
+ new Class<?>[] { null });
+ // Encoder/decoder
+ int paramInt[] = (int[]) paramObj[0];
+ int enumSize1 = paramInt.length;
+ EnumJ[] enumJ = EnumJ.values();
+ EnumJ[] data = new EnumJ[enumSize1];
+ for (int i=0; i < enumSize1; i++) {
+ data[i] = enumJ[paramInt[i]];
+ }
+ // if void, just "handleEnum(data)"
+ // this is when we have return value EnumJ[]
+ EnumJ[] retEnum = handleEnum(data);
+ // Get length first
+ int enumSize2 = retEnum.length;
+ // Now send the array of integers
+ int[] retEnumInt = new int[enumSize2];
+ for (int i=0; i < enumSize2; i++) {
+ retEnumInt[i] = retEnum[i].ordinal();
+ }
+ Object retObj = retEnumInt;
+ rmiObj.sendReturnObj(retObj);
}
private void ___waitRequestInvokeMethod() throws IOException {
// Struct size
- int structsize1 = 0;
+ int structSize1 = 0;
+ int enumSize1 = 0;
// Loop continuously waiting for incoming bytes
while (true) {
rmiObj.getMethodBytes();
int _objectId = rmiObj.getObjectId();
- if (_objectId == objectId) {
+ int methodId = rmiObj.getMethodId();
+ if (_objectId == object0Id) {
// Multiplex based on object Id
- String methodSign = rmiObj.getSignature();
- Object retObj = null;
- if (methodSign.equals("voidsetA(int)")) {
- ___setA();
- } else if (methodSign.equals("voidsetB(float)")) {
- ___setB();
- } else if (methodSign.equals("voidsetC(string)")) {
- ___setC();
- } else if (methodSign.equals("sumArray(string[])")) {
- retObj = ___sumArray();
- } else if (methodSign.equals("intsetAndGetA(int)")) {
- retObj = ___setAndGetA();
- } else if (methodSign.equals("intsetACAndGetA(string,int)")) {
- retObj = ___setACAndGetA();
- } else if (methodSign.equals("voidregisterCallBack(CallBackInterface)")) {
- ___registerCallback();
- } else if (methodSign.equals("voidregisterCallBack(CallBackInterface[])")) {
- ____registerCallback();
- } else if (methodSign.equals("intcallBack()")) {
- retObj = ___callBack();
+ // Complain if the method is not allowed
+ if (!set0Allowed.contains(methodId))
+ throw new Error("TestClass_Skeleton: This object is not allowed to access method " + methodId);
+ // If we have more than 1 object Id...
+ //else if (_objectId == object1Id) {
+
+ } else
+ throw new Error("TestClass_Skeleton: Unrecognizable object Id: " + _objectId);
+
+ switch (methodId) {
+
+ case 0: ___setA(); break;
+ case 1: ___setB(); break;
+ case 2: ___setC(); break;
+ case 3: ___sumArray(); break;
+ case 4: ___setAndGetA(); break;
+ case 5: ___setACAndGetA(); break;
+ case 6: ___callBack(); break;
+ case 7: ___registerCallback(); break;
+ case 8: ____registerCallback(); break;
// Special option to register callback
- } else if (methodSign.equals("registercallback")) {
- ___regCB();
+ case 9: ___regCB(); break;
// Struct handling (3 is the size of the struct)
- } else if (methodSign.equals("structsize")) {
- structsize1 = ___structSize();
- } else if (methodSign.equals("handleStruct(StructJ[])")) {
- ___handleStruct(structsize1);
- } else
- throw new Error("Signature not recognized!");
-
- if (retObj != null) {
- rmiObj.sendReturnObj(retObj);
- }
- System.out.println("Servicing remote call for object: " + objectId + " - method: " + methodSign);
+ case 10: ___handleStruct(structSize1); break;
+ case 11: structSize1 = ___structSize(); break;
+ case 12: ___handleEnum(); break;
+ default:
+ throw new Error("Method Id " + methodId + " not recognized!");
}
- }
- }
-
-
- // Return method signatures
- public static String[] getMethodSignatures() {
- return methodSignatures;
+ }
}
TestClass tc = new TestClass(3, 5f, "7911");
TestClass_Skeleton tcSkel = new TestClass_Skeleton(tc, port);
-/* String[] methodSignatures = TestClass_CBSkeleton.getMethodSignatures();
- IoTRMIObject rmiObj = new IoTRMIObject(port, methodSignatures);
- Map<Integer,TestClassInterface> mapCBObject = new HashMap<Integer,TestClassInterface>();
-
- // Can replace for-loop with while-loop if necessary
- for (int i = 1; i < 3; i++) {
- TestClassInterface tcSkel = new TestClass_CBSkeleton(tc, i);
- mapCBObject.put(i, tcSkel);
- }
-
- Object retObj = null;
- while (true) {
- byte[] method = rmiObj.getMethodBytes();
- int objId = IoTRMIObject.getObjectId(method);
- TestClass_CBSkeleton tcSkel = (TestClass_CBSkeleton) mapCBObject.get(objId);
- if (tcSkel != null) {
- rmiObj.setMethodBytes(method);
- retObj = tcSkel.invokeMethod(rmiObj);
- }
- if (retObj != null) {
- rmiObj.sendReturnObj(retObj);
- }
- }
-*/
- //int objectId = 1;
- //System.out.println("Creating 0 object");
- //TestClass_Skeleton tcSkel1 = new TestClass_Skeleton(tc, rmiObj, objectId);
- //System.out.println("Creating 1 object");
- //objectId = 2;
- //TestClass_Skeleton tcSkel2 = new TestClass_Skeleton(tc, rmiObj, objectId);
- //System.out.println("Creating 2 object");
-
- /*for (int i = 1; i < 3; i++) {
- final int objectId = i;
- Thread thread = new Thread() {
- public void run() {
- try{
- TestClass_Skeleton tcSkel = new TestClass_Skeleton(tc, rmiObj, objectId);
- } catch (Exception ex){
- ex.printStackTrace();
- throw new Error("Error instantiating class CallBack_Skeleton!");
- }
- }
- };
- thread.start();
- }*/
}
}