diff options
author | Jooyung Han <jooyung@google.com> | 2023-01-31 03:36:15 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2023-01-31 03:36:15 +0000 |
commit | dd4b11866adc8ac04ec65bc1c460c5c8891bd2c3 (patch) | |
tree | ced07775acbb5aa250c8eb1380c1aade06745882 | |
parent | 75fc08582753e8c5f8bdc3846cb8080c2f323961 (diff) | |
parent | 1da17e8ed45748c16a5c2bade198ae22fb411949 (diff) | |
download | xsdc-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.go | 11 | ||||
-rw-r--r-- | src/main/java/com/android/xsdc/Main.java | 20 | ||||
-rw-r--r-- | src/main/java/com/android/xsdc/cpp/CppCodeGenerator.java | 11 | ||||
-rw-r--r-- | src/main/java/com/android/xsdc/java/JavaCodeGenerator.java | 12 | ||||
-rw-r--r-- | src/test/java/com/android/xsdc/cpp/TestCppCodeGenerator.java | 33 |
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")); + } } |