Snap for 7272808 from a53b68d26d040cac7c98a464750f1fc06e388c83 to sc-v2-release

Change-Id: I82d936f3e33efa29b3e8d50526ea745959e8f684
diff --git a/build/xsdc.go b/build/xsdc.go
index 492d68e..3a09d71 100644
--- a/build/xsdc.go
+++ b/build/xsdc.go
@@ -77,6 +77,9 @@
 	// Only generate complementary code for XML parser. Applies to C++ only.
 	// The code being generated depends on the enum converters module.
 	Parser_only *bool
+	// Whether getter name of boolean element or attribute is getX or isX.
+	// Default value is false. If the property is true, getter name is isX.
+	Boolean_getter *bool
 }
 
 type xsdConfig struct {
@@ -194,6 +197,10 @@
 		args = args + " -x "
 	}
 
+	if proptools.Bool(module.properties.Boolean_getter) {
+		args = args + " -b "
+	}
+
 	module.genOutputs_j = android.PathForModuleGen(ctx, "java", filenameStem+"_xsdcgen.srcjar")
 
 	ctx.Build(pctx, android.BuildParams{
diff --git a/src/com/android/xsdc/Main.java b/src/com/android/xsdc/Main.java
index caac98b..0358f08 100644
--- a/src/com/android/xsdc/Main.java
+++ b/src/com/android/xsdc/Main.java
@@ -77,6 +77,11 @@
                 .hasArgs(0)
                 .withDescription("Generate public hasX() method")
                 .create("g"));
+        options.addOption(OptionBuilder
+                .withLongOpt("booleanGetter")
+                .hasArgs(0)
+                .withDescription("Generate isX() for boolean element or attribute.")
+                .create("b"));
         Option genEnumsOnly = OptionBuilder
                 .withLongOpt("genEnumsOnly")
                 .hasArgs(0)
@@ -115,6 +120,7 @@
         boolean genHas = cmd.hasOption('g');
         boolean enumsOnly = cmd.hasOption('e');
         boolean parserOnly = cmd.hasOption('x');
+        boolean booleanGetter = cmd.hasOption('b');
 
         if (xsdFile.length != 1 || packageName == null) {
             System.err.println("Error: no xsd files or package name");
@@ -132,7 +138,8 @@
             packageDir.mkdirs();
             FileSystem fs = new FileSystem(packageDir);
             JavaCodeGenerator javaCodeGenerator =
-                    new JavaCodeGenerator(xmlSchema, packageName, writer, nullability, genHas);
+                    new JavaCodeGenerator(xmlSchema, packageName, writer, nullability, genHas,
+                                          booleanGetter);
             javaCodeGenerator.print(fs);
         } else if (cmd.hasOption('c')) {
             File includeDir = new File(Paths.get(outDir, "include").toString());
@@ -142,7 +149,7 @@
                     (parserOnly ? CppCodeGenerator.GENERATE_PARSER :
                             CppCodeGenerator.GENERATE_ENUMS | CppCodeGenerator.GENERATE_PARSER);
             CppCodeGenerator cppCodeGenerator =
-                    new CppCodeGenerator(xmlSchema, packageName, writer, generators);
+                    new CppCodeGenerator(xmlSchema, packageName, writer, generators, booleanGetter);
             cppCodeGenerator.print(fs);
         }
     }
diff --git a/src/com/android/xsdc/cpp/CppCodeGenerator.java b/src/com/android/xsdc/cpp/CppCodeGenerator.java
index 432d510..3f4b844 100644
--- a/src/com/android/xsdc/cpp/CppCodeGenerator.java
+++ b/src/com/android/xsdc/cpp/CppCodeGenerator.java
@@ -47,15 +47,17 @@
     private boolean hasAttr;
     private boolean writer;
     private int generators;
+    private boolean booleanGetter;
 
     private static final String UNKNOWN_ENUM = "UNKNOWN";
 
-    public CppCodeGenerator(XmlSchema xmlSchema, String pkgName, boolean writer, int generators)
-            throws CppCodeGeneratorException {
+    public CppCodeGenerator(XmlSchema xmlSchema, String pkgName, boolean writer, int generators,
+            boolean booleanGetter) throws CppCodeGeneratorException {
         this.xmlSchema = xmlSchema;
         this.pkgName = pkgName;
         this.writer = writer;
         this.generators = generators;
+        this.booleanGetter = booleanGetter;
 
         // class naming validation
         {
@@ -563,8 +565,9 @@
             String variableName = Utils.toVariableName(attribute.getName());
             parserCppFile.printf("if (has%s()) {\n", Utils.capitalize(variableName));
             parserCppFile.printf("out << \" %s=\\\"\";\n", attribute.getName());
-            parserCppFile.print(type.getWritingExpression(String.format("get%s()",
-                    Utils.capitalize(variableName)), attribute.getName()));
+            parserCppFile.print(type.getWritingExpression(String.format("%s%s()",
+                    getterName(type.getName()), Utils.capitalize(variableName)),
+                    attribute.getName()));
             parserCppFile.printf("out << \"\\\"\";\n}\n");
         }
         parserCppFile.print("out << \">\" << std::endl;\n");
@@ -598,8 +601,9 @@
                         parserCppFile.printf("out << printIndent() << \"<%s>\";\n",
                                 elementValue.getName());
                     }
-                    parserCppFile.print(type.getWritingExpression(String.format("get%s()",
-                              Utils.capitalize(variableName)), elementValue.getName()));
+                    parserCppFile.print(type.getWritingExpression(String.format("%s%s()",
+                              getterName(type.getName()), Utils.capitalize(variableName)),
+                              elementValue.getName()));
                     if (type instanceof CppSimpleType) {
                         parserCppFile.printf("out << \"</%s>\" << std::endl;\n",
                                 elementValue.getName());
@@ -618,13 +622,14 @@
         String typeName = isMultiple ? String.format("std::vector<%s>",
                 type.getName()) : type.getName();
 
-        parserHeaderFile.printf("const %s& get%s() const;\n", typeName,
+        parserHeaderFile.printf("const %s& %s%s() const;\n", typeName, getterName(typeName),
                 Utils.capitalize(variableName));
 
         parserCppFile.println();
-        parserCppFile.printf("const %s& %s::get%s() const {\n"
+        parserCppFile.printf("const %s& %s::%s%s() const {\n"
                 + "return %s;\n}\n\n",
-                typeName, name, Utils.capitalize(variableName), isMultiple || isRequired ?
+                typeName, name, getterName(typeName), Utils.capitalize(variableName),
+                isMultiple || isRequired ?
                 variableName + "_" : String.format("%s_.value()", variableName));
 
         parserHeaderFile.printf("bool has%s() const;\n", Utils.capitalize(variableName));
@@ -860,6 +865,13 @@
         return element.getName();
     }
 
+    private String getterName(String type) {
+        if (type.equals("bool") && booleanGetter) {
+            return "is";
+        }
+        return "get";
+    }
+
     private void stackComponents(XsdComplexType complexType, List<XsdElement> elements,
             List<XsdAttribute> attributes) throws CppCodeGeneratorException {
         if (complexType.getBase() != null) {
diff --git a/src/com/android/xsdc/java/JavaCodeGenerator.java b/src/com/android/xsdc/java/JavaCodeGenerator.java
index d55c230..7ab90e0 100644
--- a/src/com/android/xsdc/java/JavaCodeGenerator.java
+++ b/src/com/android/xsdc/java/JavaCodeGenerator.java
@@ -40,14 +40,17 @@
     private boolean showNullability;
     private boolean generateHasMethod;
     private boolean useHexBinary;
+    private boolean booleanGetter;
 
     public JavaCodeGenerator(XmlSchema xmlSchema, String packageName, boolean writer,
-            boolean showNullability, boolean generateHasMethod) throws JavaCodeGeneratorException {
+            boolean showNullability, boolean generateHasMethod, boolean booleanGetter)
+            throws JavaCodeGeneratorException {
         this.xmlSchema = xmlSchema;
         this.packageName = packageName;
         this.writer = writer;
         this.showNullability = showNullability;
         this.generateHasMethod = generateHasMethod;
+        this.booleanGetter = booleanGetter;
         useHexBinary = false;
 
         // class naming validation
@@ -401,7 +404,7 @@
             String variableName = Utils.toVariableName(attribute.getName());
             out.printf("if (has%s()) {\n", Utils.capitalize(variableName));
             out.printf("out.printf(\" %s=\\\"\");\n", attribute.getName());
-            out.print(type.getWritingExpression(String.format("get%s()",
+            out.print(type.getWritingExpression(String.format("%s%s()", getterName(type.getName()),
                     Utils.capitalize(variableName)), attribute.getName()));
             out.printf("out.printf(\"\\\"\");\n}\n");
         }
@@ -432,8 +435,9 @@
                     if (type instanceof JavaSimpleType) {
                         out.printf("out.printf(\"<%s>\");\n", elementValue.getName());
                     }
-                    out.print(type.getWritingExpression(String.format("get%s()",
-                              Utils.capitalize(variableName)), elementValue.getName()));
+                    out.print(type.getWritingExpression(String.format("%s%s()",
+                              getterName(type.getName()), Utils.capitalize(variableName)),
+                              elementValue.getName()));
                     if (type instanceof JavaSimpleType) {
                         out.printf("out.printf(\"</%s>\\n\");\n", elementValue.getName());
                     }
@@ -458,8 +462,9 @@
         if (deprecated) {
             out.printf("@java.lang.Deprecated\n");
         }
-        out.printf("public%s %s%s get%s() {\n", getFinalString(finalValue),
-                getNullabilityString(nullability), typeName, Utils.capitalize(variableName));
+        out.printf("public%s %s%s %s%s() {\n", getFinalString(finalValue),
+                getNullabilityString(nullability), typeName, getterName(typeName),
+                Utils.capitalize(variableName));
         if ((type instanceof JavaSimpleType && ((JavaSimpleType)type).isList()) || isMultiple) {
             out.printf("if (%s == null) {\n"
                     + "%s = new java.util.ArrayList<>();\n"
@@ -689,6 +694,13 @@
         return "";
     }
 
+    private String getterName(String type) {
+        if (type.equals("boolean") && booleanGetter) {
+            return "is";
+        }
+        return "get";
+    }
+
     private void stackComponents(XsdComplexType complexType, List<XsdElement> elements,
             List<XsdAttribute> attributes) throws JavaCodeGeneratorException {
         if (complexType.getBase() != null) {
diff --git a/tests/resources/simple_type/Android.bp b/tests/resources/simple_type/Android.bp
index b6a681d..b4be8d4 100644
--- a/tests/resources/simple_type/Android.bp
+++ b/tests/resources/simple_type/Android.bp
@@ -8,6 +8,7 @@
     srcs: ["simple_type.xsd"],
     package_name: "simple.type",
     gen_writer: true,
+    boolean_getter: true,
 }
 
 xsd_config {
@@ -16,6 +17,7 @@
     package_name: "simple.type",
     enums_only: true,
     gen_writer: true,
+    boolean_getter: true,
 }
 
 xsd_config {
@@ -24,4 +26,5 @@
     package_name: "simple.type",
     parser_only: true,
     gen_writer: true,
+    boolean_getter: true,
 }
diff --git a/tests/resources/simple_type/api/current.txt b/tests/resources/simple_type/api/current.txt
index 426a90d..0b163a5 100644
--- a/tests/resources/simple_type/api/current.txt
+++ b/tests/resources/simple_type/api/current.txt
@@ -20,6 +20,12 @@
     method public java.util.List<java.lang.Integer> getListInt();
     method public java.util.List<java.lang.String> getUnionTest();
     method public java.util.List<simple.type.EnumType> getYesOrNo();
+    method public boolean isExample1();
+    method public boolean isExample2();
+    method public boolean isExample3();
+    method public void setExample1(boolean);
+    method public void setExample2(boolean);
+    method public void setExample3(boolean);
     method public void setListInt(java.util.List<java.lang.Integer>);
     method public void setUnionTest(java.util.List<java.lang.String>);
   }
diff --git a/tests/resources/simple_type/simple_type.xsd b/tests/resources/simple_type/simple_type.xsd
index 23a46b4..481c476 100644
--- a/tests/resources/simple_type/simple_type.xsd
+++ b/tests/resources/simple_type/simple_type.xsd
@@ -31,7 +31,10 @@
                 <xs:element name="listInt" type="restrictedInts"/>
                 <xs:element name="union-test" type="unionOfListAndInteger"/>
                 <xs:element name="yesOrNo" type="enumType" maxOccurs="2"/>
+                <xs:element name="example1" type="xs:boolean"/>
+                <xs:element name="example2" type="xs:boolean"/>
             </xs:sequence>
+            <xs:attribute name="example3" type="xs:boolean"/>
         </xs:complexType>
     </xs:element>
     <xs:element name="multi-choice">