Prefer primitive types than wrappers
am: 33703216c3
Change-Id: I2f56367a14b9f17fe3e4008af9b78b5cb2b62760
diff --git a/src/com/android/xsdc/java/JavaCodeGenerator.java b/src/com/android/xsdc/java/JavaCodeGenerator.java
index aee83b5..0ab6198 100644
--- a/src/com/android/xsdc/java/JavaCodeGenerator.java
+++ b/src/com/android/xsdc/java/JavaCodeGenerator.java
@@ -157,7 +157,7 @@
XsdElement element = complexType.getElements().get(i);
XsdElement elementValue = resolveElement(element);
String typeName = element.isMultiple() ? String.format("java.util.List<%s>",
- type.getName()) : type.getName();
+ type.getNullableName()) : type.getName();
out.printf("private %s %s;\n", typeName, Utils.toVariableName(elementValue.getName()));
}
for (int i = 0; i < attributeTypes.size(); ++i) {
@@ -175,17 +175,16 @@
JavaType type = elementTypes.get(i);
XsdElement element = complexType.getElements().get(i);
XsdElement elementValue = resolveElement(element);
- printGetterAndSetter(out, type.getName(), Utils.toVariableName(elementValue.getName()),
+ printGetterAndSetter(out, type, Utils.toVariableName(elementValue.getName()),
element.isMultiple());
}
for (int i = 0; i < attributeTypes.size(); ++i) {
JavaType type = attributeTypes.get(i);
XsdAttribute attribute = resolveAttribute(complexType.getAttributes().get(i));
- printGetterAndSetter(out, type.getName(), Utils.toVariableName(attribute.getName()),
- false);
+ printGetterAndSetter(out, type, Utils.toVariableName(attribute.getName()), false);
}
if (valueType != null) {
- printGetterAndSetter(out, valueType.getName(), "value", false);
+ printGetterAndSetter(out, valueType, "value", false);
}
out.println();
@@ -271,10 +270,10 @@
+ "}\n");
}
- private void printGetterAndSetter(CodeWriter out, String singleTypeName, String variableName,
+ private void printGetterAndSetter(CodeWriter out, JavaType type, String variableName,
boolean isMultiple) {
- String typeName = isMultiple ? String.format("java.util.List<%s>", singleTypeName)
- : singleTypeName;
+ String typeName = isMultiple ? String.format("java.util.List<%s>", type.getNullableName())
+ : type.getName();
out.println();
out.printf("public %s get%s() {\n", typeName, Utils.capitalize(variableName));
if (isMultiple) {
@@ -562,21 +561,26 @@
false);
case "long":
case "unsignedInt":
- return new JavaSimpleType("java.lang.Long", "Long.valueOf(%s)", false);
+ return new JavaSimpleType("long", "java.lang.Long", "Long.parseLong(%s)", false);
case "int":
case "unsignedShort":
- return new JavaSimpleType("java.lang.Integer", "Integer.valueOf(%s)", false);
+ return new JavaSimpleType("int", "java.lang.Integer", "Integer.parseInt(%s)",
+ false);
case "short":
case "unsignedByte":
- return new JavaSimpleType("java.lang.Short", "Short.valueOf(%s)", false);
+ return new JavaSimpleType("short", "java.lang.Short", "Short.parseShort(%s)",
+ false);
case "byte":
- return new JavaSimpleType("java.lang.Byte", "Byte.valueOf(%s)", false);
+ return new JavaSimpleType("byte", "java.lang.Byte", "Byte.parseByte(%s)", false);
case "boolean":
- return new JavaSimpleType("java.lang.Boolean", "Boolean.valueOf(%s)", false);
+ return new JavaSimpleType("boolean", "java.lang.Boolean",
+ "Boolean.parseBoolean(%s)", false);
case "double":
- return new JavaSimpleType("java.lang.Double", "Double.valueOf(%s)", false);
+ return new JavaSimpleType("double", "java.lang.Double", "Double.parseDouble(%s)",
+ false);
case "float":
- return new JavaSimpleType("java.lang.Float", "Float.valueOf(%s)", false);
+ return new JavaSimpleType("float", "java.lang.Float", "Float.parseFloat(%s)",
+ false);
case "base64Binary":
return new JavaSimpleType("byte[]", "java.util.Base64.getDecoder().decode(%s)",
false);
diff --git a/src/com/android/xsdc/java/JavaComplexType.java b/src/com/android/xsdc/java/JavaComplexType.java
index 6c52a45..c0c694a 100644
--- a/src/com/android/xsdc/java/JavaComplexType.java
+++ b/src/com/android/xsdc/java/JavaComplexType.java
@@ -29,6 +29,11 @@
}
@Override
+ public String getNullableName() {
+ return name;
+ }
+
+ @Override
public String getParsingExpression() {
return String.format("%s value = %s.read(parser);\n", name, name);
}
diff --git a/src/com/android/xsdc/java/JavaSimpleType.java b/src/com/android/xsdc/java/JavaSimpleType.java
index eb9be87..4aac0d1 100644
--- a/src/com/android/xsdc/java/JavaSimpleType.java
+++ b/src/com/android/xsdc/java/JavaSimpleType.java
@@ -18,13 +18,23 @@
class JavaSimpleType implements JavaType {
final private String name;
+ final private String nullableName;
final private String rawParsingExpression;
final private boolean list;
+ final private String fullName;
+ final private String nullableFullName;
- JavaSimpleType(String name, String rawParsingExpression, boolean list) {
+ JavaSimpleType(String name, String nullableName, String rawParsingExpression, boolean list) {
this.name = name;
+ this.nullableName = nullableName;
this.rawParsingExpression = rawParsingExpression;
this.list = list;
+ fullName = list ? String.format("java.util.List<%s>", nullableName) : name;
+ nullableFullName = list ? String.format("java.util.List<%s>", nullableName) : nullableName;
+ }
+
+ JavaSimpleType(String name, String rawParsingExpression, boolean list) {
+ this(name, name, rawParsingExpression, list);
}
boolean isList() {
@@ -33,12 +43,17 @@
JavaSimpleType newListType() throws JavaCodeGeneratorException {
if (list) throw new JavaCodeGeneratorException("list of list is not supported");
- return new JavaSimpleType(name, rawParsingExpression, true);
+ return new JavaSimpleType(name, nullableName, rawParsingExpression, true);
}
@Override
public String getName() {
- return list ? String.format("java.util.List<%s>", name) : name;
+ return fullName;
+ }
+
+ @Override
+ public String getNullableName() {
+ return nullableFullName;
}
@Override
diff --git a/src/com/android/xsdc/java/JavaType.java b/src/com/android/xsdc/java/JavaType.java
index fe85fd7..a0de172 100644
--- a/src/com/android/xsdc/java/JavaType.java
+++ b/src/com/android/xsdc/java/JavaType.java
@@ -19,5 +19,9 @@
interface JavaType {
String getName();
+ // It is used to make a list type. (List<?>)
+ // getName() can be a primitive type, but getNullableName() cannot be.
+ String getNullableName();
+
String getParsingExpression();
}
diff --git a/tests/resources/predefined_types.xml b/tests/resources/predefined_types.xml
index 37bc168..940a313 100644
--- a/tests/resources/predefined_types.xml
+++ b/tests/resources/predefined_types.xml
@@ -52,4 +52,13 @@
<IDREFS>abcd abcd</IDREFS>
<anyType>abcd</anyType>
</miscTypes>
+ <listPrimitiveTypes>
+ <listLong>-9223372036854775808 9223372036854775807</listLong>
+ <listInt>-2147483648 2147483647</listInt>
+ <listShort>-32768 32767</listShort>
+ <listByte>-128 127</listByte>
+ <listDouble>1234.5678 5678.1234</listDouble>
+ <listFloat>123.456 456.123</listFloat>
+ <listBoolean>true false</listBoolean>
+ </listPrimitiveTypes>
</types>
\ No newline at end of file
diff --git a/tests/resources/predefined_types.xsd b/tests/resources/predefined_types.xsd
index 35296c2..819f7fb 100644
--- a/tests/resources/predefined_types.xsd
+++ b/tests/resources/predefined_types.xsd
@@ -59,6 +59,45 @@
<xs:element name="anyType" type="xs:anyType"/>
</xs:sequence>
</xs:complexType>
+ <xs:complexType name="listPrimitiveTypes">
+ <xs:sequence>
+ <xs:element name="listLong">
+ <xs:simpleType>
+ <xs:list itemType="xs:long"/>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="listInt">
+ <xs:simpleType>
+ <xs:list itemType="xs:int"/>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="listShort">
+ <xs:simpleType>
+ <xs:list itemType="xs:short"/>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="listByte">
+ <xs:simpleType>
+ <xs:list itemType="xs:byte"/>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="listDouble">
+ <xs:simpleType>
+ <xs:list itemType="xs:double"/>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="listFloat">
+ <xs:simpleType>
+ <xs:list itemType="xs:float"/>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="listBoolean">
+ <xs:simpleType>
+ <xs:list itemType="xs:boolean"/>
+ </xs:simpleType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
<xs:element name="types">
<xs:complexType>
<xs:sequence>
@@ -66,6 +105,7 @@
<xs:element name="dateTypes" type="dateTypes"/>
<xs:element name="numericTypes" type="numericTypes"/>
<xs:element name="miscTypes" type="miscTypes"/>
+ <xs:element name="listPrimitiveTypes" type="listPrimitiveTypes"/>
</xs:sequence>
</xs:complexType>
</xs:element>
diff --git a/tests/src/com/android/xsdc/tests/XmlParserTest.java b/tests/src/com/android/xsdc/tests/XmlParserTest.java
index ba4f44e..29b02a0 100644
--- a/tests/src/com/android/xsdc/tests/XmlParserTest.java
+++ b/tests/src/com/android/xsdc/tests/XmlParserTest.java
@@ -165,6 +165,7 @@
Class<?> dateTypes = result.loadClass("DateTypes");
Class<?> numericTypes = result.loadClass("NumericTypes");
Class<?> miscTypes = result.loadClass("MiscTypes");
+ Class<?> listPrimitiveTypes = result.loadClass("ListPrimitiveTypes");
Object instance;
try (InputStream in = this.getClass().getClassLoader().getResourceAsStream(
@@ -306,6 +307,33 @@
assertThat(iDREFS, is(Arrays.asList("abcd", "abcd")));
assertThat(anyType, is("abcd"));
}
+
+ {
+ Object listPrimitiveTypesInstance = types.getMethod("getListPrimitiveTypes").invoke(
+ instance);
+ List listLong = (List) listPrimitiveTypes.getMethod("getListLong").invoke(
+ listPrimitiveTypesInstance);
+ List listInt = (List) listPrimitiveTypes.getMethod("getListInt").invoke(
+ listPrimitiveTypesInstance);
+ List listShort = (List) listPrimitiveTypes.getMethod("getListShort").invoke(
+ listPrimitiveTypesInstance);
+ List listByte = (List) listPrimitiveTypes.getMethod("getListByte").invoke(
+ listPrimitiveTypesInstance);
+ List listDouble = (List) listPrimitiveTypes.getMethod("getListDouble").invoke(
+ listPrimitiveTypesInstance);
+ List listFloat = (List) listPrimitiveTypes.getMethod("getListFloat").invoke(
+ listPrimitiveTypesInstance);
+ List listBoolean = (List) listPrimitiveTypes.getMethod("getListBoolean").invoke(
+ listPrimitiveTypesInstance);
+
+ assertThat(listLong, is(Arrays.asList(-9223372036854775808L, 9223372036854775807L)));
+ 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(listBoolean, is(Arrays.asList(true, false)));
+ }
}
@Test