public void MethodA(int A, int B);
public void MethodA(int A, int B, int AB);
public int MethodB(int C, String D[]);
- public String MethodC(String E, Map<String,Integer> F);
- public float MethodD(Set<String> G, float H);
+ public String MethodC(String E, List<Integer> F);
+ public float MethodD(List<String> G, float H);
public boolean MethodE(String I, boolean J);
public void MethodF(LightBulb K);
description = "Another description";
method = "MethodA(int A, int B)";
method = "MethodB(int C, String D[])";
- method = "MethodC(String E, Map<String,Integer> F)";
+ method = "MethodC(String E, List<Integer> F)";
}
capability VideoRecording {
description = "The quick brown fox jumps over the cool dog";
method = "MethodA(int A, int B)";
method = "MethodA(int A, int B, int AB)";
- method = "MethodD(Set<String> G, float H)";
+ method = "MethodD(List<String> G, float H)";
}
capability BackupData {
public void MethodA(int A, float B);
public void MethodA(int A, float B, int AB);
public int MethodB(String C, String D);
- public byte MethodC(String E, Map<String,Integer> F);
+ public byte MethodC(String E, List<Integer> F);
capability Flicker {
description = "The quick brown fox jumps over the smart dog";
description = "Another description";
method = "MethodA(int A, float B)";
method = "MethodB(String C, String D)";
- method = "MethodC(String E, Map<String,Integer> F)";
+ method = "MethodC(String E, List<Integer> F)";
}
capability AutoOnOff {
description = "The quick brown fox jumps over the cool dog";
method = "MethodA(int A, float B)";
method = "MethodA(int A, float B, int AB)";
- method = "MethodC(String E, Map<String,Integer> F)";
+ method = "MethodC(String E, List<Integer> F)";
}
}
PHONY += run-rmiserver
run-rmiserver:
- $(JAVA) -cp .:$(BIN_DIR) iotrmi.Java.IoTRMIObject
+ $(JAVA) -cp .:$(BIN_DIR) iotrmi.Java.sample.TestClass_Skeleton
PHONY += run-rmiclient
run-rmiclient:
- $(JAVA) -cp .:$(BIN_DIR) iotrmi.Java.IoTRMICall
+ $(JAVA) -cp .:$(BIN_DIR) iotrmi.Java.sample.TestClass_Stub
PHONY += doc
doc: iotruntime iotinstaller
import iotpolicy.tree.InterfaceDecl;
import iotpolicy.tree.RequiresDecl;
+import iotrmi.Java.IoTRMITypes;
+
/** Class IoTCompiler is the main interface/stub compiler for
* files generation. This class calls helper classes
*/
private final static String OUTPUT_DIRECTORY = "output_files";
- /**
- * Primitive data types
- */
- private final static String[] primitives = new String[] {
-
- "byte",
- "Byte",
- "short",
- "Short",
- "int",
- "Integer",
- "long",
- "Long",
- "float",
- "Float",
- "double",
- "Double",
- "boolean",
- "Boolean",
- "char",
- "Character",
- "string",
- "String",
- "void"
- };
-
- /**
- * Primitive data types in C++ to map the primitives list
- */
- private final static String[] primitivesCplus = new String[] {
-
- "char",
- "char",
- "short",
- "short",
- "int",
- "int",
- "long",
- "long",
- "float",
- "float",
- "double",
- "double",
- "bool",
- "bool",
- "char",
- "char",
- "string",
- "string",
- "void"
- };
-
- /**
- * Non-primitive data types supported by this compiler
- */
- private final static String[] nonPrimitives = new String[] {
-
- "Set",
- "HashSet",
- "Map",
- "HashMap",
- "List",
- "ArrayList"
- };
-
- /**
- * Non-primitive Java libraries based on the list above
- */
- private final static String[] nonPrimitiveJavaLibs = new String[] {
-
- "java.util.Set",
- "java.util.HashSet",
- "java.util.Map",
- "java.util.HashMap",
- "java.util.List",
- "java.util.ArrayList"
- };
-
- /**
- * Non-primitive C++ libraries based on the list above
- */
- private final static String[] nonPrimitiveCplusLibs = new String[] {
-
- "set",
- "unordered_set",
- "map",
- "unordered_map",
- "list",
- "list"
- };
-
private enum ParamCategory {
PRIMITIVES, // All the primitive types, e.g. byte, short, int, long, etc.
mapIntDeclHand = new HashMap<String,DeclarationHandler>();
mapInt2NewInts = new HashMap<String,Map<String,Set<String>>>();
mapPrimitives = new HashMap<String,String>();
- arraysToMap(mapPrimitives, primitives, primitivesCplus);
+ arraysToMap(mapPrimitives, IoTRMITypes.primitivesJava, IoTRMITypes.primitivesCplus);
mapNonPrimitivesJava = new HashMap<String,String>();
- arraysToMap(mapNonPrimitivesJava, nonPrimitives, nonPrimitiveJavaLibs);
+ arraysToMap(mapNonPrimitivesJava, IoTRMITypes.nonPrimitivesJava, IoTRMITypes.nonPrimitiveJavaLibs);
mapNonPrimitivesCplus = new HashMap<String,String>();
- arraysToMap(mapNonPrimitivesCplus, nonPrimitives, nonPrimitiveCplusLibs);
+ arraysToMap(mapNonPrimitivesCplus, IoTRMITypes.nonPrimitivesJava, IoTRMITypes.nonPrimitivesCplus);
pw = null;
dir = OUTPUT_DIRECTORY;
subdir = null;
// Check for params with driver class types and exchange it
// with its remote interface
String paramType = checkAndGetParamClass(methPrmTypes.get(i));
- print(paramType + " " + methParams.get(i));
+ String paramComplete = checkAndGetCplusArray(paramType, methParams.get(i));
+ //print(paramType + " " + methParams.get(i));
+ print(paramComplete);
// Check if this is the last element (don't print a comma)
if (i != methParams.size() - 1) {
print(", ");
// with its remote interface
String paramType = checkAndGetParamClass(methPrmTypes.get(i));
paramType = checkAndGetCplusType(paramType);
- print(paramType + " " + methParams.get(i));
+ // Check for arrays - translate into vector in C++
+ String paramComplete = checkAndGetCplusArray(paramType, methParams.get(i));
+ //print(paramType + " " + param);
+ print(paramComplete);
// Check if this is the last element (don't print a comma)
if (i != methParams.size() - 1) {
print(", ");
for (int i = 0; i < methParams.size(); i++) {
String methPrmType = checkAndGetCplusType(methPrmTypes.get(i));
- print(methPrmType + " " + methParams.get(i));
+ String methParamComplete = checkAndGetCplusArray(methPrmType, methParams.get(i));
+ //print(methPrmType + " " + methParam);
+ print(methParamComplete);
// Check if this is the last element (don't print a comma)
if (i != methParams.size() - 1) {
print(", ");
List<String> methParams = intDecl.getMethodParams(method);
List<String> methPrmTypes = intDecl.getMethodParamTypes(method);
+
+ //System.out.println("\n\nMethod param: " + intDecl.getMethodParams(method));
+ //System.out.println("\n\nMethod param type: " + intDecl.getMethodParamTypes(method));
+ //System.out.println("\n\n");
+
print(convertType(intDecl.getMethodType(method)) + " " +
intDecl.getMethodId(method) + "(");
for (int i = 0; i < methParams.size(); i++) {
-
String methPrmType = checkAndGetCplusType(methPrmTypes.get(i));
- print(methPrmType + " " + methParams.get(i));
+ String methParamComplete = checkAndGetCplusArray(methPrmType, methParams.get(i));
+ //print(methPrmType + " " + methParam);
+ print(methParamComplete);
// Check if this is the last element (don't print a comma)
if (i != methParams.size() - 1) {
print(", ");
}
+ // Detect array declaration, e.g. int A[],
+ // then generate "int A[]" in C++ as "vector<int> A"
+ private String checkAndGetCplusArray(String paramType, String param) {
+
+ String paramComplete = null;
+ // Check for array declaration
+ if (param.contains("[]")) {
+ paramComplete = "vector<" + paramType + "> " + param.replace("[]","");
+ } else
+ // Just return it as is if it's not an array
+ paramComplete = paramType + " " + param;
+
+ return paramComplete;
+ }
+
+
// Get simple types, e.g. HashSet for HashSet<...>
// Basically strip off the "<...>"
private String checkAndGetParamClass(String paramType) {
} else {
// NULL value - this means policy files missing
throw new Error("IoTCompiler: Parameter type lookup failed for " + intface +
- "... Please provide the necessary policy files for user-defined types.");
+ "... Please provide the necessary policy files for user-defined types." +
+ " If this is an array please type the brackets after the variable name," +
+ " e.g. \"String str[]\", not \"String[] str\"." +
+ " If this is a Collections (Java) / STL (C++) type, this compiler only" +
+ " supports List/ArrayList (Java) or list (C++).");
}
}
"short", // 2 bytes
"int", // 4 bytes
"int", // 4 bytes
- "long", // 4 bytes
- "long", // 4 bytes
+ "int64_t", // 8 bytes
+ "int64_t", // 8 bytes
"float", // 4 bytes
"float", // 4 bytes
"double", // 8 bytes
"double", // 8 bytes
"bool", // 1 byte
"bool", // 1 byte
- "char", // 1 byte
- "char", // 1 byte
+ "char", // 2 bytes - C++ is made to follow Java convention
+ "char", // 2 bytes - i.e. 2 bytes for a char
"string", // indefinite
"string", // indefinite
"void" // 0 byte
/**
* Primitive sizes in Java - Long is 8 bytes and char is 2 bytes
*/
- public final static Integer[] primitivesJavaSizes = new Integer[] {
+ public final static Integer[] primitivesSizes = new Integer[] {
1, 1, 2, 2, 4, 4, 8, 8, 4, 4, 8, 8, 1, 1, 2, 2, -1, -1, 0
};
/**
- * Primitive sizes in Cplus - Long is 4 bytes and char is 1 byte
+ * Non-primitive Java data types
*/
- public final static Integer[] primitivesCplusSizes = new Integer[] {
+ public final static String[] nonPrimitivesJava = new String[] {
- 1, 1, 2, 2, 4, 4, 4, 4, 4, 4, 8, 8, 1, 1, 1, 1, -1, -1, 0
+ //"Set",
+ //"HashSet",
+ //"Map",
+ //"HashMap",
+ "List",
+ "ArrayList"
};
/**
- * Non-primitive Java data types
+ * Non-primitive Java libraries based on the list above
*/
- public final static String[] nonPrimitivesJava = new String[] {
-
- "Set",
- "HashSet",
- "Map",
- "HashMap",
- "List",
- "ArrayList"
+ public final static String[] nonPrimitiveJavaLibs = new String[] {
+
+ //"java.util.Set",
+ //"java.util.HashSet",
+ //"java.util.Map",
+ //"java.util.HashMap",
+ "java.util.List",
+ "java.util.ArrayList"
};
*/
public final static String[] nonPrimitivesCplus = new String[] {
- "set",
- "unordered_set",
- "map",
- "unordered_map",
+ //"set",
+ //"unordered_set",
+ //"map",
+ //"unordered_map",
"list",
"list"
};
* Class Properties
*/
private Map<String,String> mapPrimitives;
- private Map<String,Integer> mapPrimitiveSizesJava;
- private Map<String,Integer> mapPrimitiveSizesCplus;
+ private Map<String,Integer> mapPrimitiveSizes;
private Map<String,String> mapNonPrimitives;
/**
mapPrimitives = new HashMap<String,String>();
IoTRMITypes.arraysToMap(mapPrimitives,
IoTRMITypes.primitivesJava, IoTRMITypes.primitivesCplus);
- mapPrimitiveSizesJava = new HashMap<String,Integer>();
- IoTRMITypes.arraysToMap(mapPrimitiveSizesJava,
- IoTRMITypes.primitivesJava, IoTRMITypes.primitivesJavaSizes);
- mapPrimitiveSizesCplus = new HashMap<String,Integer>();
- IoTRMITypes.arraysToMap(mapPrimitiveSizesCplus,
- IoTRMITypes.primitivesCplus, IoTRMITypes.primitivesCplusSizes);
+ mapPrimitiveSizes = new HashMap<String,Integer>();
+ IoTRMITypes.arraysToMap(mapPrimitiveSizes,
+ IoTRMITypes.primitivesJava, IoTRMITypes.primitivesSizes);
mapNonPrimitives = new HashMap<String,String>();
IoTRMITypes.arraysToMap(mapNonPrimitives,
IoTRMITypes.nonPrimitivesJava, IoTRMITypes.nonPrimitivesCplus);
*/
public int getTypeSize(String type) {
- if (mapPrimitiveSizesJava.containsKey(type))
- return mapPrimitiveSizesJava.get(type);
- else if (mapPrimitiveSizesCplus.containsKey(type))
- return mapPrimitiveSizesCplus.get(type);
+ if (mapPrimitiveSizes.containsKey(type))
+ return mapPrimitiveSizes.get(type);
else
- return -1; // Size is unknown
+ return -1; // Size is unknown (variable length)
}