Adding #include<vector> declaration when array is translated as vector in C++
[iot2.git] / iotjava / iotpolicy / IoTCompiler.java
index acd0a62602240c74e5e577316ec2a5d38d034a01..4bbeb6a8c023917a4a42cf19e0112f754428dec4 100644 (file)
@@ -23,6 +23,8 @@ import iotpolicy.tree.CapabilityDecl;
 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
@@ -55,97 +57,6 @@ public class IoTCompiler {
         */
        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.
@@ -162,11 +73,11 @@ public class IoTCompiler {
                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;
@@ -245,21 +156,6 @@ public class IoTCompiler {
                }
                // Map the map of interface-methods to the original interface
                mapInt2NewInts.put(origInt, mapNewIntMethods);
-
-/*             for (String origint : mapInt2NewInts.keySet()) {
-
-                       System.out.println("Original Interface: " + origint);
-                       Map<String,Set<String>> mapNewInt = mapInt2NewInts.get(origint);
-                       for (String intf : mapNewInt.keySet()) {
-
-                               System.out.println("\tNew Interface: " + intf);
-                               Set<String> methods = mapNewInt.get(intf);
-                               for (String meth : methods) {
-
-                                       System.out.println("\t\tMethod: " + meth);
-                               }
-                       }
-               }*/
        }
 
 
@@ -299,7 +195,9 @@ public class IoTCompiler {
                                        // 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(", ");
@@ -356,7 +254,10 @@ public class IoTCompiler {
                                        //              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(", ");
@@ -462,7 +363,9 @@ public class IoTCompiler {
                                        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(", ");
@@ -568,12 +471,18 @@ public class IoTCompiler {
 
                                        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(", ");
@@ -679,9 +588,9 @@ public class IoTCompiler {
        }
 
 
-       /**================================================
-        * Helper functions to write stub codes into files
-        **================================================
+       /**================
+        * Helper functions
+        **================
         */
        boolean newline=true;
        int tablevel=0;
@@ -844,11 +753,16 @@ public class IoTCompiler {
                for (String method : methods) {
 
                        List<String> methPrmTypes = intDecl.getMethodParamTypes(method);
-                       for (String paramType : methPrmTypes) {
+                       List<String> methParams = intDecl.getMethodParams(method);
+                       for (int i = 0; i < methPrmTypes.size(); i++) {
 
-                               String simpleType = getSimpleType(paramType);
+                               String simpleType = getSimpleType(methPrmTypes.get(i));
+                               String param = methParams.get(i);
                                if (getParamCategory(simpleType) == ParamCategory.NONPRIMITIVES) {
                                        includeClasses.add(getNonPrimitiveCplusClass(simpleType));
+                               } else if (param.contains("[]")) {
+                               // Check if this is array for C++; translate into vector
+                                       includeClasses.add("vector");
                                }
                        }
                }
@@ -910,6 +824,22 @@ public class IoTCompiler {
        }
 
 
+       // 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) {
@@ -945,7 +875,11 @@ public class IoTCompiler {
                } 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++).");
                }
        }