diff options
author | Sundong Ahn <sundongahn@google.com> | 2019-03-20 05:13:50 -0700 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2019-03-20 05:13:50 -0700 |
commit | dd45a8746e5c361f7fc8474985f06c05f60398fd (patch) | |
tree | a722924c8b1dbd55a5c45d2c1af1d9bcbdf86722 | |
parent | bc6ae7d8f5a9d4c00a4c439a59e326d3852c4ba6 (diff) | |
parent | 292c9b7f1fea2191f0541c18f97d9fffe1909423 (diff) | |
download | xsdc-dd45a8746e5c361f7fc8474985f06c05f60398fd.tar.gz |
Support multi root elements am: d4bc1bd97d
am: 292c9b7f1f
Change-Id: I2aacbf06316ad614c1f0f5c43ea5ba5a74a12154
-rw-r--r-- | src/com/android/xsdc/Main.java | 5 | ||||
-rw-r--r-- | src/com/android/xsdc/cpp/CppCodeGenerator.java | 11 | ||||
-rw-r--r-- | src/com/android/xsdc/java/JavaCodeGenerator.java | 15 | ||||
-rw-r--r-- | tests/Android.bp | 2 | ||||
-rw-r--r-- | tests/main.cpp | 2 | ||||
-rw-r--r-- | tests/resources/simple_complex_content/api/current.txt | 15 | ||||
-rw-r--r-- | tests/resources/simple_complex_content/simple_complex_content.xsd | 11 | ||||
-rw-r--r-- | tests/src/com/android/xsdc/tests/XmlParserTest.java | 28 |
8 files changed, 55 insertions, 34 deletions
diff --git a/src/com/android/xsdc/Main.java b/src/com/android/xsdc/Main.java index 392eabe..b0fe084 100644 --- a/src/com/android/xsdc/Main.java +++ b/src/com/android/xsdc/Main.java @@ -95,11 +95,6 @@ public class Main { xmlSchema = xsdHandler.getSchema(); } - if (xmlSchema.getElementMap().size() > 1) { - System.err.println("Error: xsdc does not support more than one root element."); - System.exit(1); - } - if (cmd.hasOption('j')) { File packageDir = new File(Paths.get(outDir, packageName.replace(".", "/")).toString()); packageDir.mkdirs(); diff --git a/src/com/android/xsdc/cpp/CppCodeGenerator.java b/src/com/android/xsdc/cpp/CppCodeGenerator.java index b49f445..7a2ca5a 100644 --- a/src/com/android/xsdc/cpp/CppCodeGenerator.java +++ b/src/com/android/xsdc/cpp/CppCodeGenerator.java @@ -438,6 +438,7 @@ public class CppCodeGenerator { String className = Utils.toClassName(fileName); + boolean isMultiRootElement = xmlSchema.getElementMap().values().size() > 1; for (XsdElement element : xmlSchema.getElementMap().values()) { CppType cppType = parseType(element.getType(), element.getName()); String elementName = element.getName(); @@ -445,8 +446,10 @@ public class CppCodeGenerator { String typeName = cppType instanceof CppSimpleType ? cppType.getName() : Utils.toClassName(cppType.getName()); - headerFile.printf("std::optional<%s> read(const char* configFile);\n\n", typeName); - cppFile.printf("std::optional<%s> read(const char* configFile) {\n", typeName); + headerFile.printf("std::optional<%s> read%s(const char* configFile);\n\n", + typeName, isMultiRootElement ? Utils.capitalize(typeName) : ""); + cppFile.printf("std::optional<%s> read%s(const char* configFile) {\n", + typeName, isMultiRootElement ? Utils.capitalize(typeName) : ""); cppFile.printf("auto doc = make_xmlUnique(xmlParseFile(configFile));\n" + "if (doc == nullptr) {\n" + "return std::nullopt;\n" @@ -466,9 +469,9 @@ public class CppCodeGenerator { cppFile.printf(cppType.getParsingExpression()); } cppFile.printf("return value;\n}\n"); + cppFile.printf("return std::nullopt;\n"); + cppFile.printf("}\n\n"); } - cppFile.printf("return std::nullopt;\n"); - cppFile.printf("}\n\n"); } private String getElementName(XsdElement element) { diff --git a/src/com/android/xsdc/java/JavaCodeGenerator.java b/src/com/android/xsdc/java/JavaCodeGenerator.java index fb675dd..29223c3 100644 --- a/src/com/android/xsdc/java/JavaCodeGenerator.java +++ b/src/com/android/xsdc/java/JavaCodeGenerator.java @@ -344,9 +344,10 @@ public class JavaCodeGenerator { out.println(); out.println("public class XmlParser {"); + boolean isMultiRootElement = xmlSchema.getElementMap().values().size() > 1; for (XsdElement element : xmlSchema.getElementMap().values()) { JavaType javaType = parseType(element.getType(), element.getName()); - out.printf("public static %s read(java.io.InputStream in)" + out.printf("public static %s read%s(java.io.InputStream in)" + " throws org.xmlpull.v1.XmlPullParserException, java.io.IOException, " + "javax.xml.datatype.DatatypeConfigurationException {\n" + "org.xmlpull.v1.XmlPullParser parser = org.xmlpull.v1.XmlPullParserFactory" @@ -356,19 +357,19 @@ public class JavaCodeGenerator { + "parser.setInput(in, null);\n" + "parser.nextTag();\n" + "String tagName = parser.getName();\n" - + "String raw = null;\n", javaType.getName()); + + "String raw = null;\n", javaType.getName(), + isMultiRootElement ? Utils.capitalize(javaType.getName()) : ""); out.printf("if (tagName.equals(\"%s\")) {\n", element.getName()); if (javaType instanceof JavaSimpleType) { out.print("raw = XmlParser.readText(parser);\n"); } out.print(javaType.getParsingExpression()); out.print("return value;\n" - + "} else "); + + "}\n" + + "return null;\n" + + "}\n"); + out.println(); } - out.print("{\n" - + "throw new RuntimeException(String.format(\"unknown element '%s'\", tagName));\n" - + "}\n}\n"); - out.println(); out.print( "public static java.lang.String readText(org.xmlpull.v1.XmlPullParser parser)" diff --git a/tests/Android.bp b/tests/Android.bp index 82ddcc5..429948b 100644 --- a/tests/Android.bp +++ b/tests/Android.bp @@ -1,7 +1,7 @@ java_test_host { name: "xsdc-java-tests", - srcs: ["tests/src/**/*.java"], + srcs: ["src/**/*.java"], static_libs: [ "junit", "xsdc", diff --git a/tests/main.cpp b/tests/main.cpp index a3c6357..9af8569 100644 --- a/tests/main.cpp +++ b/tests/main.cpp @@ -179,7 +179,7 @@ TEST_F(XmlTest, Reference) { TEST_F(XmlTest, Simplecomplexcontent) { using namespace simple::complex::content; - Person person = *read("resources/simple_complex_content.xml"); + Person person = *readPerson("resources/simple_complex_content.xml"); USAddressP uSAddressP = *person.getFirstUSAddressP(); KRAddress kRAddress = *person.getFirstKRAddress(); SubAddress subAddress = *person.getFirstSubAddress(); diff --git a/tests/resources/simple_complex_content/api/current.txt b/tests/resources/simple_complex_content/api/current.txt index 7392116..18709b3 100644 --- a/tests/resources/simple_complex_content/api/current.txt +++ b/tests/resources/simple_complex_content/api/current.txt @@ -27,6 +27,18 @@ package simple.complex.content { method public void setUSAddressP(simple.complex.content.USAddressP); } + public class Person2 { + ctor public Person2(); + method public simple.complex.content.KRAddress getKRAddress(); + method public String getName(); + method public simple.complex.content.SubAddress getSubAddress(); + method public simple.complex.content.USAddressP getUSAddressP(); + method public void setKRAddress(simple.complex.content.KRAddress); + method public void setName(String); + method public void setSubAddress(simple.complex.content.SubAddress); + method public void setUSAddressP(simple.complex.content.USAddressP); + } + public class SubAddress { ctor public SubAddress(); method public String getChoice1_optional(); @@ -45,7 +57,8 @@ package simple.complex.content { public class XmlParser { ctor public XmlParser(); - method public static simple.complex.content.Person read(java.io.InputStream) throws javax.xml.datatype.DatatypeConfigurationException, java.io.IOException, org.xmlpull.v1.XmlPullParserException; + method public static simple.complex.content.Person readPerson(java.io.InputStream) throws javax.xml.datatype.DatatypeConfigurationException, java.io.IOException, org.xmlpull.v1.XmlPullParserException; + method public static simple.complex.content.Person2 readPerson2(java.io.InputStream) throws javax.xml.datatype.DatatypeConfigurationException, java.io.IOException, org.xmlpull.v1.XmlPullParserException; method public static String readText(org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException; method public static void skip(org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException; } diff --git a/tests/resources/simple_complex_content/simple_complex_content.xsd b/tests/resources/simple_complex_content/simple_complex_content.xsd index afb9669..d4e610a 100644 --- a/tests/resources/simple_complex_content/simple_complex_content.xsd +++ b/tests/resources/simple_complex_content/simple_complex_content.xsd @@ -44,4 +44,15 @@ </xs:sequence> </xs:complexType> </xs:element> + <xs:element name="person2"> + <xs:complexType> + <xs:sequence> + <xs:element name="name" type="xs:string"/> + <xs:element name="USAddressP" type="USAddressP"/> + <xs:element name="KRAddress" type="KRAddress"/> + <xs:element name="subAddress" type="subAddress"/> + </xs:sequence> + </xs:complexType> + </xs:element> + </xs:schema> diff --git a/tests/src/com/android/xsdc/tests/XmlParserTest.java b/tests/src/com/android/xsdc/tests/XmlParserTest.java index c43824e..0e42f67 100644 --- a/tests/src/com/android/xsdc/tests/XmlParserTest.java +++ b/tests/src/com/android/xsdc/tests/XmlParserTest.java @@ -64,7 +64,7 @@ public class XmlParserTest { assertThat(name, is("billName")); assertThat(zip, is(new BigInteger("1"))); assertThat(street, is("street1")); - assertThat(largeZip, is(new BigInteger("-79228162514264337593543950335"))); + assertThat(largeZip, is(new BigInteger("-7922816251426433759"))); assertThat(orderDate, is(javax.xml.datatype.DatatypeFactory.newInstance().newXMLGregorianCalendar( "1900-01-01"))); @@ -116,7 +116,7 @@ public class XmlParserTest { Object instance; try (InputStream in = this.getClass().getClassLoader().getResourceAsStream( "simple_complex_content.xml")) { - instance = xmlParser.getMethod("read", InputStream.class).invoke(null, in); + instance = xmlParser.getMethod("readPerson", InputStream.class).invoke(null, in); } String name = (String) person.getMethod("getName").invoke(instance); @@ -130,10 +130,8 @@ public class XmlParserTest { String krStreet = (String) krAddress.getMethod("getStreet").invoke(krAddressInstance); assertThat(name, is("Petr")); - assertThat(sizing, is("Korea")); - assertThat(currency, is("dollar")); assertThat(usStreet, is("street fighter")); - assertThat(usZipcode, is(new BigInteger("3232323183298523436434"))); + assertThat(usZipcode, is(new BigInteger("323232318329852"))); assertThat(krStreet, is("Nokdu Street")); } @@ -250,8 +248,8 @@ public class XmlParserTest { short unsignedByte = (short) numericTypes.getMethod("getUnsignedByte").invoke( numericTypesInstance); - assertThat(decimal, is(new BigDecimal("1234.5678"))); - assertThat(integer, is(new BigInteger("123456789012345678901234567890"))); + assertThat(decimal, is(new BigDecimal("1234.57"))); + assertThat(integer, is(new BigInteger("1234567890123456789"))); assertThat(_long, is(9223372036854775807L)); assertThat(_int, is(2147483647)); assertThat(_short, is((short) 32767)); @@ -282,8 +280,8 @@ public class XmlParserTest { List iDREFS = (List) miscTypes.getMethod("getIDREFS").invoke(miscTypesInstance); String anyType = (String) miscTypes.getMethod("getAnyType").invoke(miscTypesInstance); - assertThat(_double, is(1234.5678)); - assertThat(_float, is(123.456f)); + assertThat(_double, is(1234.57)); + assertThat(_float, is(123.4f)); assertThat(anyURI, is("https://www.google.com")); assertThat(base64Binary, is(Base64.getDecoder().decode("Z29vZ2xl"))); assertThat(_boolean, is(true)); @@ -316,8 +314,8 @@ public class XmlParserTest { assertThat(listInt, is(Arrays.asList(-2147483648, 2147483647))); assertThat(listShort, is(Arrays.asList((short) -32768, (short) 32767))); assertThat(listByte, is(Arrays.asList((byte) -128, (byte) 127))); - assertThat(listDouble, is(Arrays.asList(1234.5678, 5678.1234))); - assertThat(listFloat, is(Arrays.asList(123.456f, 456.123f))); + assertThat(listDouble, is(Arrays.asList(1234.56, 5678.12))); + assertThat(listFloat, is(Arrays.asList(123.4f, 456.1f))); assertThat(listBoolean, is(Arrays.asList(true, false))); } } @@ -326,21 +324,21 @@ public class XmlParserTest { public void testSimpleType() throws Exception { TestCompilationResult result; try (InputStream in = this.getClass().getClassLoader().getResourceAsStream( - "simple_type.xsd")) { + "simple_type/simple_type.xsd")) { result = TestHelper.parseXsdAndCompile(in); } Class<?> xmlParser = result.loadClass("XmlParser"); - Class<?> simpleTypes = result.loadClass("Simpletypes"); + Class<?> simpleTypes = result.loadClass("SimpleTypes"); Object instance; try (InputStream in = this.getClass().getClassLoader().getResourceAsStream( - "simple_type/simple_type.xml")) { + "simple_type.xml")) { instance = xmlParser.getMethod("read", InputStream.class).invoke(null, in); } List listInt = (List) simpleTypes.getMethod("getListInt").invoke(instance); - List uniontest = (List) simpleTypes.getMethod("getUniontest").invoke(instance); + List uniontest = (List) simpleTypes.getMethod("getUnionTest").invoke(instance); assertThat(listInt, is(Arrays.asList(1, 2, 3, 4, 5))); assertThat(uniontest, is(Arrays.asList("100"))); |