From f3458ebcab089a1812049809b32a3f29be011b0a Mon Sep 17 00:00:00 2001 From: rtrimana Date: Mon, 2 Apr 2018 16:25:20 -0700 Subject: [PATCH] Cleaning up compiler; Adding import statements and package headers appropriately for stub/skeleton and callback stub/skeleton. --- iotjava/Makefile | 25 ++----- iotjava/iotpolicy/IoTCompiler.java | 103 +++++++++++++++++++++++------ 2 files changed, 86 insertions(+), 42 deletions(-) diff --git a/iotjava/Makefile b/iotjava/Makefile index 44237a7..a54c835 100644 --- a/iotjava/Makefile +++ b/iotjava/Makefile @@ -29,24 +29,6 @@ PHONY += compiler compiler: $(JAVAC) -cp .:$(PARSERJARS) -d $(BIN_DIR) iotpolicy/*.java -PHONY += run-compiler-dev -run-compiler-dev: - cp ../localconfig/iotpolicy/development/*.pol $(BIN_DIR)/iotpolicy/ - #cd $(BIN_DIR)/iotpolicy; $(JAVA) -cp .:..:../$(PARSERJARS):../$(BIN_DIR) iotpolicy.IoTCompiler testclasspolicy_profiling.pol testclassrequires_profiling.pol -cplus Cplus -java Java - cd $(BIN_DIR)/iotpolicy; $(JAVA) -cp .:..:../$(PARSERJARS):../$(BIN_DIR) iotpolicy.IoTCompiler testclasspolicy.pol testclassrequires.pol callbackpolicy.pol callbackrequires.pol -cplus Cplus -java Java - #cd $(BIN_DIR)/iotpolicy; $(JAVA) -cp .:..:../$(PARSERJARS):../$(BIN_DIR) iotpolicy.IoTCompiler callbackpolicy.pol callbackrequires.pol testclasspolicy_advanced.pol testclassrequires_advanced.pol -cplus Cplus -java Java - #cd $(BIN_DIR)/iotpolicy; $(JAVA) -cp .:..:../$(PARSERJARS):../$(BIN_DIR) iotpolicy.IoTCompiler callbackpolicy.pol callbackrequires.pol testclasspolicy_callbacks.pol testclassrequires_callbacks.pol -cplus Cplus -java Java - #cd $(BIN_DIR)/iotpolicy; $(JAVA) -cp .:..:../$(PARSERJARS):../$(BIN_DIR) iotpolicy.IoTCompiler testclasspolicy_callbacks.pol testclassrequires_callbacks.pol callbackpolicy.pol callbackrequires.pol -cplus Cplus -java Java - #cd $(BIN_DIR)/iotpolicy; $(JAVA) -cp .:..:../$(PARSERJARS):../$(BIN_DIR) iotpolicy.IoTCompiler testclasspolicy_callbacks_three.pol testclassrequires_callbacks_three.pol callbackpolicy.pol callbackrequires.pol callbackpolicy_two.pol callbackrequires_two.pol -cplus Cplus -java Java - -# TODO: Can remove this later - just to test-compile the resulted files from the compiler -PHONY += compile -compile: - cp ./iotrmi/Java/basics/* $(BIN_DIR)/iotpolicy/output_files/Java - #cp ./iotrmi/C++/basics/* $(BIN_DIR)/iotpolicy/output_files/Cplus - #cd $(BIN_DIR)/iotpolicy/output_files; cp *.java ./Java - #cd $(BIN_DIR)/iotpolicy/output_files; cp *.hpp ./Cplus - # Cleaning the compiler output PHONY += output-clean output-clean: @@ -113,14 +95,15 @@ PHONY += run-compiler-room run-compiler-room: cp ../localconfig/iotpolicy/Room/*.pol $(BIN_DIR)/iotpolicy/ cp ../localconfig/iotpolicy/Room/*.req $(BIN_DIR)/iotpolicy/ - #cd $(BIN_DIR)/iotpolicy; $(JAVA) -cp .:..:../$(PARSERJARS):../$(BIN_DIR) iotpolicy.IoTCompiler room.pol roomsmart.req -java Java - cd $(BIN_DIR)/iotpolicy; $(JAVA) -cp .:..:../$(PARSERJARS):../$(BIN_DIR) iotpolicy.IoTCompiler room.pol roomsmart.req -cplus C++ + cd $(BIN_DIR)/iotpolicy; $(JAVA) -cp .:..:../$(PARSERJARS):../$(BIN_DIR) iotpolicy.IoTCompiler room.pol roomsmart.req -java Java + #cd $(BIN_DIR)/iotpolicy; $(JAVA) -cp .:..:../$(PARSERJARS):../$(BIN_DIR) iotpolicy.IoTCompiler room.pol roomsmart.req -cplus C++ PHONY += run-compiler-cam run-compiler-cam: cp ../localconfig/iotpolicy/AmcrestCamera/*.pol $(BIN_DIR)/iotpolicy/ cp ../localconfig/iotpolicy/AmcrestCamera/*.req $(BIN_DIR)/iotpolicy/ - cd $(BIN_DIR)/iotpolicy; $(JAVA) -cp .:..:../$(PARSERJARS):../$(BIN_DIR) iotpolicy.IoTCompiler amcrestcamera.pol smartlightscam.req motiondetection.pol motiondetection.req -java Java + cd $(BIN_DIR)/iotpolicy; $(JAVA) -cp .:..:../$(PARSERJARS):../$(BIN_DIR) iotpolicy.IoTCompiler amcrestcamera.pol smartlightscam.req motiondetection.pol motiondetection.req -drv AmcrestCamera -cont SmartLightsController -java Java + #cd $(BIN_DIR)/iotpolicy; $(JAVA) -cp .:..:../$(PARSERJARS):../$(BIN_DIR) iotpolicy.IoTCompiler # IrrigationController PHONY += run-compiler-irrigation diff --git a/iotjava/iotpolicy/IoTCompiler.java b/iotjava/iotpolicy/IoTCompiler.java index 58538c9..a5825a9 100644 --- a/iotjava/iotpolicy/IoTCompiler.java +++ b/iotjava/iotpolicy/IoTCompiler.java @@ -63,12 +63,17 @@ public class IoTCompiler { private static int portCount = 0; private static int countObjId = 1; // Always increment object Id for a new stub/skeleton private String mainClass; + private String driverClass; + private String controllerClass; /** * Class constants */ private final static String OUTPUT_DIRECTORY = "output_files"; + private final static String CODE_PREFIX = "iotcode"; + private final static String INTERFACE_PACKAGE = "iotcode.interfaces"; + private enum ParamCategory { @@ -102,6 +107,26 @@ public class IoTCompiler { dir = OUTPUT_DIRECTORY; subdir = null; mainClass = null; + driverClass = null; + controllerClass = null; + } + + + /** + * setDriverClass() sets the name of the driver class. + */ + public void setDriverClass(String _driverClass) { + + driverClass = _driverClass; + } + + + /** + * setControllerClass() sets the name of the controller class. + */ + public void setControllerClass(String _controllerClass) { + + controllerClass = _controllerClass; } @@ -346,6 +371,7 @@ public class IoTCompiler { Set importClasses = getImportClasses(methods, intDecl); List stdImportClasses = getStandardJavaIntfaceImportClasses(); List allImportClasses = getAllLibClasses(stdImportClasses, importClasses); + println("package " + INTERFACE_PACKAGE + ";\n"); printImportStatements(allImportClasses); // Write interface header println(""); @@ -393,6 +419,7 @@ public class IoTCompiler { Set importClasses = getImportClasses(methods, intDecl); List stdImportClasses = getStandardJavaIntfaceImportClasses(); List allImportClasses = getAllLibClasses(stdImportClasses, importClasses); + println("package " + INTERFACE_PACKAGE + ";\n"); printImportStatements(allImportClasses); // Write interface header println(""); @@ -1124,10 +1151,15 @@ public class IoTCompiler { Set importClasses = getImportClasses(methods, intDecl); List stdImportClasses = getStandardJavaImportClasses(); List allImportClasses = getAllLibClasses(stdImportClasses, importClasses); - printImportStatements(allImportClasses); println(""); // Find out if there are callback objects Set callbackClasses = getCallbackClasses(methods, intDecl); boolean callbackExist = !callbackClasses.isEmpty(); + if (callbackExist) + println("package " + controllerClass + ";\n"); + else + println("package " + CODE_PREFIX + "." + driverClass + ";\n"); + printImportStatements(allImportClasses); + println("\nimport " + INTERFACE_PACKAGE + ".*;\n"); // Write class header println("public class " + newStubClass + " implements " + newIntface + " {\n"); // Write properties @@ -2235,12 +2267,16 @@ public class IoTCompiler { Set importClasses = getImportClasses(methods, intDecl); List stdImportClasses = getStandardJavaImportClasses(); List allImportClasses = getAllLibClasses(stdImportClasses, importClasses); - printImportStatements(allImportClasses); // Find out if there are callback objects Set callbackClasses = getCallbackClasses(methods, intDecl); boolean callbackExist = !callbackClasses.isEmpty(); + if (callbackExist) + println("package " + CODE_PREFIX + "." + driverClass + ";\n"); + else + println("package " + controllerClass + ";\n"); + printImportStatements(allImportClasses); + println("\nimport " + INTERFACE_PACKAGE + ".*;\n"); // Write class header - println(""); println("public class " + newSkelClass + " implements " + intface + " {\n"); // Write properties writePropertiesJavaSkeleton(intface, intDecl); @@ -2610,8 +2646,8 @@ public class IoTCompiler { println(callbackType + "_Skeleton* skel" + counter + " = new " + callbackType + "_Skeleton(" + paramIdent + ", rmiComm, newObjIdSent);"); println("IoTRMIUtil::mapSkel->insert(make_pair(" + paramIdent + ", skel" + counter + "));"); println("IoTRMIUtil::mapSkelId->insert(make_pair(" + paramIdent + ", newObjIdSent));"); - println("thread th" + counter + " (&" + callbackType + "_Skeleton::___waitRequestInvokeMethod, std::ref(skel" + counter + - "), std::ref(skel" + counter +"));"); + println("thread th" + counter + " (&" + callbackType + "_Skeleton::___waitRequestInvokeMethod, skel" + counter + + ", skel" + counter +");"); println("th" + counter + ".detach();"); println("while(!skel" + counter + "->didInitWaitInvoke());"); println("}"); @@ -4175,7 +4211,7 @@ public class IoTCompiler { helperMethod = helperMethod + methodNumId; else uniqueMethodIds.add(methodId); - print(helperMethod + ", std::ref(skel), "); + print(helperMethod + ", skel, "); boolean structExists = writeInputCountVarStructCplusSkeleton(method, intDecl); if (structExists) print(", "); @@ -4388,8 +4424,11 @@ public class IoTCompiler { System.out.println("\tjava IoTCompiler [ ] [options]\n"); System.out.println("\t\tTake one or more pairs of main-req policy files, and generate Java and/or C++ files\n"); System.out.println("Options:"); - System.out.println("\t-java\t\tGenerate Java stub files"); - System.out.println("\t-cplus\t\tGenerate C++ stub files"); + System.out.println("\t-cont\t\tSpecify controller class name"); + System.out.println("\t-drv\t\t\tSpecify driver class name"); + System.out.println("\t-cplus\t\t\tGenerate C++ stub files"); + System.out.println("\t-java\t\t\tGenerate Java stub files\n"); + System.out.println("\t\tNote: The options -cont and -drv have to be defined before -cplus and -java"); System.out.println(); } @@ -5169,33 +5208,55 @@ public class IoTCompiler { public static void main(String[] args) throws Exception { // If there is no argument or just "--help" or "-h", then invoke printUsage() - if ((args[0].equals("-help") || + if ((args.length == 0 || + args[0].equals("-help") || args[0].equals("--help")|| - args[0].equals("-h")) || - (args.length == 0)) { + args[0].equals("-h"))) { IoTCompiler.printUsage(); } else if (args.length > 1) { IoTCompiler comp = new IoTCompiler(); - int i = 0; + int i = 0; + boolean driverDefined = false; + boolean controllerDefined = false; do { - // Parse main policy file - ParseNode pnPol = IoTCompiler.parseFile(args[i]); - // Parse "requires" policy file - ParseNode pnReq = IoTCompiler.parseFile(args[i+1]); - // Get interface name - String intface = ParseTreeHandler.getOrigIntface(pnPol); - comp.setDataStructures(intface, pnPol, pnReq); - comp.getMethodsForIntface(intface); + // Look for "-drv" and "-cont" + // These two need to be defined to complete the stub/skeleton generation + // with the appropriate headers + if (args[i].equals("-drv")) { + comp.setDriverClass(args[i+1]); + driverDefined = true; + } else if (args[i].equals("-cont")) { + System.out.println("DEBUG: Controller: " + args[i+1]); + comp.setControllerClass(args[i+1]); + controllerDefined = true; + } else { + // Parse main policy file + ParseNode pnPol = IoTCompiler.parseFile(args[i]); + // Parse "requires" policy file + ParseNode pnReq = IoTCompiler.parseFile(args[i+1]); + // Get interface name + String intface = ParseTreeHandler.getOrigIntface(pnPol); + comp.setDataStructures(intface, pnPol, pnReq); + comp.getMethodsForIntface(intface); + } i = i + 2; // 1) Check if this is the last option before "-java" or "-cplus" - // 2) Check if this is really the last option (no "-java" or "-cplus") + // 2) Check if this is really the last option } while(!args[i].equals("-java") && !args[i].equals("-cplus") && (i < args.length)); + // Generate error if we haven't seen -drv and -cont at this point + if (!driverDefined || !controllerDefined) { + String error = "IoTCompiler: ERROR - please provide arguments -drv and -cont " + + "to specify both driver and controller class names.\n" + + "Note: The two options have to come before -java and -cplus.\n"; + throw new Error(error); + } + // Generate everything if we don't see "-java" or "-cplus" if (i == args.length) { comp.generateEnumJava(); -- 2.34.1