aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJooyung Han <jooyung@google.com>2023-01-31 03:36:15 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2023-01-31 03:36:15 +0000
commitdd4b11866adc8ac04ec65bc1c460c5c8891bd2c3 (patch)
treeced07775acbb5aa250c8eb1380c1aade06745882
parent75fc08582753e8c5f8bdc3846cb8080c2f323961 (diff)
parent1da17e8ed45748c16a5c2bade198ae22fb411949 (diff)
downloadxsdc-dd4b11866adc8ac04ec65bc1c460c5c8891bd2c3.tar.gz
Add -r option to specify root elements am: 1da17e8ed4android-u-beta-1-gpl
Original change: https://android-review.googlesource.com/c/platform/system/tools/xsdc/+/2407074 Change-Id: I2ade88e70eb5fb42992442bfda48c1d4bf6df80e Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r--build/xsdc.go11
-rw-r--r--src/main/java/com/android/xsdc/Main.java20
-rw-r--r--src/main/java/com/android/xsdc/cpp/CppCodeGenerator.java11
-rw-r--r--src/main/java/com/android/xsdc/java/JavaCodeGenerator.java12
-rw-r--r--src/test/java/com/android/xsdc/cpp/TestCppCodeGenerator.java33
5 files changed, 79 insertions, 8 deletions
diff --git a/build/xsdc.go b/build/xsdc.go
index 8fa4173..c5bc28d 100644
--- a/build/xsdc.go
+++ b/build/xsdc.go
@@ -93,6 +93,11 @@ type xsdConfigProperties struct {
// ENTITY_REFs.
// This can improve memory footprint. Default value is false.
Tinyxml *bool
+ // Specify root elements explicitly. If not set, XSDC generates parsers and
+ // writers for all elements which can be root element. When set, XSDC
+ // generates parsers and writers for specified root elements. This can be
+ // used to avoid unnecessary code.
+ Root_elements []string
}
type xsdConfig struct {
@@ -221,6 +226,10 @@ func (module *xsdConfig) GenerateAndroidBuildActions(ctx android.ModuleContext)
args = args + " -t "
}
+ for _, elem := range module.properties.Root_elements {
+ args = args + " -r " + elem
+ }
+
module.genOutputs_j = android.PathForModuleGen(ctx, "java", filenameStem+"_xsdcgen.srcjar")
ctx.Build(pctx, android.BuildParams{
@@ -346,4 +355,4 @@ func (module *xsdConfig) OutputFiles(tag string) (android.Paths, error) {
}
}
-var _ android.OutputFileProducer = (*xsdConfig)(nil);
+var _ android.OutputFileProducer = (*xsdConfig)(nil)
diff --git a/src/main/java/com/android/xsdc/Main.java b/src/main/java/com/android/xsdc/Main.java
index c85cdc1..90e0719 100644
--- a/src/main/java/com/android/xsdc/Main.java
+++ b/src/main/java/com/android/xsdc/Main.java
@@ -111,6 +111,11 @@ public class Main {
.withDescription("Generate depfile for ninja.")
.create("d");
options.addOption(genDepFile);
+ options.addOption(OptionBuilder
+ .withLongOpt("root")
+ .hasArgs(1)
+ .withDescription("Root element.")
+ .create("r"));
// "Only generate enums" and "Only generate parser" options are mutually exclusive.
OptionGroup genOnlyGroup = new OptionGroup();
@@ -140,6 +145,7 @@ public class Main {
boolean booleanGetter = cmd.hasOption('b');
boolean useTinyXml = cmd.hasOption('t');
String depFile = cmd.getOptionValue('d', null);
+ String[] rootElements = cmd.getOptionValues('r');
if (cmd.getArgs().length != 1 || packageName == null) {
System.err.println("Error: no xsd files or package name");
@@ -155,13 +161,23 @@ public class Main {
included.add(xsdFile);
XmlSchema xmlSchema = parse(xsdFile, included);
+ // When -r (root element) is specified, then validate if it's defined in schema.
+ if (rootElements != null) {
+ for (String rootElement : rootElements) {
+ if (!xmlSchema.getElementMap().containsKey(rootElement)) {
+ System.err.println("Invalid root element(-r): " + rootElement);
+ System.exit(1);
+ }
+ }
+ }
+
if (cmd.hasOption('j')) {
File packageDir = new File(Paths.get(outDir, packageName.replace(".", "/")).toString());
packageDir.mkdirs();
FileSystem fs = new FileSystem(packageDir);
JavaCodeGenerator javaCodeGenerator =
new JavaCodeGenerator(xmlSchema, packageName, writer, nullability, genHas,
- booleanGetter);
+ booleanGetter, rootElements);
javaCodeGenerator.print(fs);
} else if (cmd.hasOption('c')) {
File includeDir = new File(Paths.get(outDir, "include").toString());
@@ -172,7 +188,7 @@ public class Main {
CppCodeGenerator.GENERATE_ENUMS | CppCodeGenerator.GENERATE_PARSER);
CppCodeGenerator cppCodeGenerator =
new CppCodeGenerator(xmlSchema, packageName, writer, generators,
- booleanGetter, useTinyXml);
+ booleanGetter, useTinyXml, rootElements);
cppCodeGenerator.print(fs);
}
diff --git a/src/main/java/com/android/xsdc/cpp/CppCodeGenerator.java b/src/main/java/com/android/xsdc/cpp/CppCodeGenerator.java
index 3e971e7..9bfbe56 100644
--- a/src/main/java/com/android/xsdc/cpp/CppCodeGenerator.java
+++ b/src/main/java/com/android/xsdc/cpp/CppCodeGenerator.java
@@ -51,17 +51,20 @@ public class CppCodeGenerator {
private int generators;
private boolean booleanGetter;
private boolean useTinyXml;
+ private String[] rootElements;
private static final String UNKNOWN_ENUM = "UNKNOWN";
public CppCodeGenerator(XmlSchema xmlSchema, String pkgName, boolean writer, int generators,
- boolean booleanGetter, boolean useTinyXml) throws CppCodeGeneratorException {
+ boolean booleanGetter, boolean useTinyXml, String[] rootElements)
+ throws CppCodeGeneratorException {
this.xmlSchema = xmlSchema;
this.pkgName = pkgName;
this.writer = writer;
this.generators = generators;
this.booleanGetter = booleanGetter;
this.useTinyXml = useTinyXml;
+ this.rootElements = rootElements;
// class naming validation
{
@@ -987,6 +990,9 @@ public class CppCodeGenerator {
boolean isMultiRootElement = xmlSchema.getElementMap().values().size() > 1;
for (XsdElement element : xmlSchema.getElementMap().values()) {
+ // Skip parser if not specified as root.
+ if (rootElements != null
+ && Arrays.asList(rootElements).indexOf(element.getName()) == -1) continue;
printXmlParserFor(element, /*loadFile=*/true, isMultiRootElement);
printXmlParserFor(element, /*loadFile=*/false, isMultiRootElement);
}
@@ -1076,6 +1082,9 @@ public class CppCodeGenerator {
*/
private void printXmlWriter() throws CppCodeGeneratorException {
for (XsdElement element : xmlSchema.getElementMap().values()) {
+ // Skip writer if not specified as root.
+ if (rootElements != null
+ && Arrays.asList(rootElements).indexOf(element.getName()) == -1) continue;
CppType cppType = parseType(element.getType(), element.getName());
String elementName = element.getName();
String variableName = Utils.toVariableName(elementName);
diff --git a/src/main/java/com/android/xsdc/java/JavaCodeGenerator.java b/src/main/java/com/android/xsdc/java/JavaCodeGenerator.java
index c355d64..0fc2b7c 100644
--- a/src/main/java/com/android/xsdc/java/JavaCodeGenerator.java
+++ b/src/main/java/com/android/xsdc/java/JavaCodeGenerator.java
@@ -23,6 +23,7 @@ import com.android.xsdc.XsdConstants;
import com.android.xsdc.tag.*;
import java.io.IOException;
+import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
@@ -41,9 +42,11 @@ public class JavaCodeGenerator {
private boolean generateHasMethod;
private boolean useHexBinary;
private boolean booleanGetter;
+ private String[] rootElements;
public JavaCodeGenerator(XmlSchema xmlSchema, String packageName, boolean writer,
- boolean showNullability, boolean generateHasMethod, boolean booleanGetter)
+ boolean showNullability, boolean generateHasMethod, boolean booleanGetter,
+ String[] rootElements)
throws JavaCodeGeneratorException {
this.xmlSchema = xmlSchema;
this.packageName = packageName;
@@ -51,6 +54,7 @@ public class JavaCodeGenerator {
this.showNullability = showNullability;
this.generateHasMethod = generateHasMethod;
this.booleanGetter = booleanGetter;
+ this.rootElements = rootElements;
useHexBinary = false;
// class naming validation
@@ -509,6 +513,9 @@ public class JavaCodeGenerator {
boolean isMultiRootElement = xmlSchema.getElementMap().values().size() > 1;
for (XsdElement element : xmlSchema.getElementMap().values()) {
+ // Skip parser if not specified as root.
+ if (rootElements != null
+ && Arrays.asList(rootElements).indexOf(element.getName()) == -1) continue;
JavaType javaType = parseType(element.getType(), element.getName());
String elementName = element.getName();
String typeName = javaType.getName();
@@ -626,6 +633,9 @@ public class JavaCodeGenerator {
for (XsdElement element : xmlSchema.getElementMap().values()) {
+ // Skip writer if not specified as root.
+ if (rootElements != null
+ && Arrays.asList(rootElements).indexOf(element.getName()) == -1) continue;
JavaType javaType = parseType(element.getType(), element.getName());
String elementName = element.getName();
String variableName = Utils.toVariableName(elementName);
diff --git a/src/test/java/com/android/xsdc/cpp/TestCppCodeGenerator.java b/src/test/java/com/android/xsdc/cpp/TestCppCodeGenerator.java
index 20dca83..6106696 100644
--- a/src/test/java/com/android/xsdc/cpp/TestCppCodeGenerator.java
+++ b/src/test/java/com/android/xsdc/cpp/TestCppCodeGenerator.java
@@ -17,6 +17,7 @@
package com.android.xsdc.cpp;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import com.android.xsdc.FileSystem;
@@ -60,7 +61,8 @@ public class TestCppCodeGenerator {
/*writer=*/ true,
CppCodeGenerator.GENERATE_PARSER,
false,
- false);
+ false,
+ null);
FileSystem fs = new FileSystem(files);
gen.print(fs);
@@ -78,7 +80,8 @@ public class TestCppCodeGenerator {
false,
CppCodeGenerator.GENERATE_PARSER,
false,
- false);
+ false,
+ null);
FileSystem fs = new FileSystem(files);
gen.print(fs);
@@ -97,7 +100,8 @@ public class TestCppCodeGenerator {
false,
CppCodeGenerator.GENERATE_PARSER | CppCodeGenerator.GENERATE_ENUMS,
false,
- false);
+ false,
+ null);
FileSystem fs = new FileSystem(files);
gen.print(fs);
@@ -120,4 +124,27 @@ public class TestCppCodeGenerator {
parser.parse(new ByteArrayInputStream(bytes), xsdHandler);
return xsdHandler.getSchema();
}
+
+ @Test
+ public void generateParsersForSpecifiedRoot() throws Exception {
+ Map<String, StringBuffer> files = new TreeMap<>();
+ String schema = "<xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">\n"
+ + " <xs:element name=\"root1\" type=\"xs:string\" />\n"
+ + " <xs:element name=\"root2\" type=\"xs:string\" />\n"
+ + "</xs:schema>";
+ CppCodeGenerator gen =
+ new CppCodeGenerator(
+ parseSchema(schema),
+ "com.abc",
+ false,
+ CppCodeGenerator.GENERATE_PARSER | CppCodeGenerator.GENERATE_ENUMS,
+ false,
+ false,
+ new String[]{"root1"});
+
+ FileSystem fs = new FileSystem(files);
+ gen.print(fs);
+ assertTrue(files.get("com_abc.cpp").toString().contains("readRoot1"));
+ assertFalse(files.get("com_abc.cpp").toString().contains("readRoot2"));
+ }
}