Initial commit of Java backend to hidl-gen.

Change-Id: I38b62637df74d3e5daf702a8996502d0d5726033
diff --git a/main.cpp b/main.cpp
index 752e5f8..9b0bfab 100644
--- a/main.cpp
+++ b/main.cpp
@@ -31,7 +31,8 @@
         const FQName &fqName,
         const char *,
         Coordinator *coordinator,
-        const std::string &outputDir) {
+        const std::string &outputDir,
+        bool java = false) {
 
     CHECK(fqName.isFullyQualified());
 
@@ -45,7 +46,8 @@
         return UNKNOWN_ERROR;
     }
 
-    status_t err = ast->generateCpp(outputDir);
+    status_t err =
+        java ? ast->generateJava(outputDir) : ast->generateCpp(outputDir);
 
     return err;
 }
@@ -54,7 +56,8 @@
         const FQName &packageFQName,
         const char *hidl_gen,
         Coordinator *coordinator,
-        const std::string &outputDir) {
+        const std::string &outputDir,
+        bool java = false) {
 
     CHECK(packageFQName.isValid() &&
           !packageFQName.isFullyQualified() &&
@@ -71,7 +74,9 @@
     }
 
     for (const auto &fqName : packageInterfaces) {
-        err = generateSourcesForFile(fqName, hidl_gen, coordinator, outputDir);
+        err = generateSourcesForFile(
+                fqName, hidl_gen, coordinator, outputDir, java);
+
         if (err != OK) {
             return err;
         }
@@ -222,7 +227,7 @@
     return OutputHandler::PASS_PACKAGE;
 }
 
-OutputHandler::ValRes validateForCpp(const FQName &fqName) {
+OutputHandler::ValRes validateForCppOrJava(const FQName &fqName) {
     if (fqName.package().empty()) {
         fprintf(stderr, "Expecting package name\n");
         return OutputHandler::FAILED;
@@ -240,8 +245,8 @@
 
 static std::vector<OutputHandler> formats = {
     {"c++",
-     true,
-     validateForCpp,
+     true /* mNeedsOutputDir */,
+     validateForCppOrJava,
      [](const FQName &fqName,
         const char *hidl_gen, Coordinator *coordinator,
         const std::string &outputDir) -> status_t {
@@ -260,8 +265,31 @@
         }
     },
 
+    {"java",
+     true /* mNeedsOutputDir */,
+     validateForCppOrJava,
+     [](const FQName &fqName,
+        const char *hidl_gen, Coordinator *coordinator,
+        const std::string &outputDir) -> status_t {
+            if (fqName.isFullyQualified()) {
+                return generateSourcesForFile(fqName,
+                                              hidl_gen,
+                                              coordinator,
+                                              outputDir,
+                                              true /* java */);
+            }
+            else {
+                return generateSourcesForPackage(fqName,
+                                                 hidl_gen,
+                                                 coordinator,
+                                                 outputDir,
+                                                 true /* java */);
+            }
+        }
+    },
+
     {"makefile",
-     false,
+     false /* mNeedsOutputDir */,
      validateForMakefile,
      generateMakefileForPackage,
     },