aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSundong Ahn <sundongahn@google.com>2019-03-20 05:13:50 -0700
committerandroid-build-merger <android-build-merger@google.com>2019-03-20 05:13:50 -0700
commitdd45a8746e5c361f7fc8474985f06c05f60398fd (patch)
treea722924c8b1dbd55a5c45d2c1af1d9bcbdf86722
parentbc6ae7d8f5a9d4c00a4c439a59e326d3852c4ba6 (diff)
parent292c9b7f1fea2191f0541c18f97d9fffe1909423 (diff)
downloadxsdc-dd45a8746e5c361f7fc8474985f06c05f60398fd.tar.gz
Support multi root elements am: d4bc1bd97d
am: 292c9b7f1f Change-Id: I2aacbf06316ad614c1f0f5c43ea5ba5a74a12154
-rw-r--r--src/com/android/xsdc/Main.java5
-rw-r--r--src/com/android/xsdc/cpp/CppCodeGenerator.java11
-rw-r--r--src/com/android/xsdc/java/JavaCodeGenerator.java15
-rw-r--r--tests/Android.bp2
-rw-r--r--tests/main.cpp2
-rw-r--r--tests/resources/simple_complex_content/api/current.txt15
-rw-r--r--tests/resources/simple_complex_content/simple_complex_content.xsd11
-rw-r--r--tests/src/com/android/xsdc/tests/XmlParserTest.java28
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")));