aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/tools/android/java/com/google/devtools/build/android/aapt2/ResourceCompiler.java
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2018-01-22 12:50:21 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2018-01-22 12:52:06 -0800
commitbac5fc382c56d7b231686b228db192a78caed3ec (patch)
treef7ed9093e78b9faf6b680db22b447ca66fe88dc9 /src/tools/android/java/com/google/devtools/build/android/aapt2/ResourceCompiler.java
parent454485877e7456ffe4831633333ae533fd57d3e9 (diff)
Support DTD when processing resource files in the aapt2 pipeline
Unfortunately, the getTag() function explicitly fails when it encounters a DTD item, so we need to do a bit of custom handling instead. RELNOTES: none PiperOrigin-RevId: 182821046
Diffstat (limited to 'src/tools/android/java/com/google/devtools/build/android/aapt2/ResourceCompiler.java')
-rw-r--r--src/tools/android/java/com/google/devtools/build/android/aapt2/ResourceCompiler.java25
1 files changed, 24 insertions, 1 deletions
diff --git a/src/tools/android/java/com/google/devtools/build/android/aapt2/ResourceCompiler.java b/src/tools/android/java/com/google/devtools/build/android/aapt2/ResourceCompiler.java
index 02542a25bc..e6fc4c074d 100644
--- a/src/tools/android/java/com/google/devtools/build/android/aapt2/ResourceCompiler.java
+++ b/src/tools/android/java/com/google/devtools/build/android/aapt2/ResourceCompiler.java
@@ -48,8 +48,10 @@ import java.util.logging.Logger;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.StartElement;
+import javax.xml.stream.events.XMLEvent;
/** Invokes aapt2 to compile resources. */
public class ResourceCompiler {
@@ -122,7 +124,28 @@ public class ResourceCompiler {
XMLInputFactory.newInstance()
.createXMLEventReader(new FileInputStream(file.toString()));
- StartElement rootElement = xmlEventReader.nextTag().asStartElement();
+ // Iterate through the XML until we find a start element.
+ // This should mimic xmlEventReader.nextTag() except that it also skips DTD elements.
+ StartElement rootElement = null;
+ while (xmlEventReader.hasNext()) {
+ XMLEvent event = xmlEventReader.nextEvent();
+ if (event.getEventType() != XMLStreamConstants.COMMENT
+ && event.getEventType() != XMLStreamConstants.DTD
+ && event.getEventType() != XMLStreamConstants.PROCESSING_INSTRUCTION
+ && event.getEventType() != XMLStreamConstants.SPACE
+ && event.getEventType() != XMLStreamConstants.START_DOCUMENT) {
+
+ // If the event should not be skipped, try parsing it as a start element here.
+ // If the event is not a start element, an appropriate exception will be thrown.
+ rootElement = event.asStartElement();
+ break;
+ }
+ }
+
+ if (rootElement == null) {
+ throw new Exception("No start element found in resource XML file: " + file.toString());
+ }
+
Iterator<Attribute> attributeIterator =
XmlResourceValues.iterateAttributesFrom(rootElement);