diff options
author | 2016-07-11 19:55:04 +0000 | |
---|---|---|
committer | 2016-07-12 11:17:51 +0000 | |
commit | c41b10c728e9752beb65b7db5d997fb9d01b7640 (patch) | |
tree | 42f6d81d7d6991591ebbcd2a65563da6559a6bab /src/tools/android/java/com/google | |
parent | 84ecac51d43fe4dba262740f4ddb3826bea4bb17 (diff) |
Centralize the creation of the XmlInputFactory
Properly handle unary tags in AttrXmlResourceValue
Handle CData for string content.
--
MOS_MIGRATED_REVID=127118005
Diffstat (limited to 'src/tools/android/java/com/google')
4 files changed, 44 insertions, 14 deletions
diff --git a/src/tools/android/java/com/google/devtools/build/android/DataResourceXml.java b/src/tools/android/java/com/google/devtools/build/android/DataResourceXml.java index d1cc857dfa..242a74b881 100644 --- a/src/tools/android/java/com/google/devtools/build/android/DataResourceXml.java +++ b/src/tools/android/java/com/google/devtools/build/android/DataResourceXml.java @@ -105,8 +105,13 @@ public class DataResourceXml implements DataResource { // Of simple resources, only IDs are combining. KeyValueConsumer<DataKey, DataResource> consumer = resourceType == ID ? combiningConsumer : overwritingConsumer; - FullyQualifiedName key = - fqnFactory.create(resourceType, XmlResourceValues.getElementName(start)); + String elementName = XmlResourceValues.getElementName(start); + if (elementName == null) { + throw new XMLStreamException( + String.format("resource name is required for %s", resourceType), + start.getLocation()); + } + FullyQualifiedName key = fqnFactory.create(resourceType, elementName); consumer.consume( key, DataResourceXml.of(path, parseXmlElements(resourceType, eventReader, start))); } diff --git a/src/tools/android/java/com/google/devtools/build/android/ParsedAndroidData.java b/src/tools/android/java/com/google/devtools/build/android/ParsedAndroidData.java index 876e4afa30..a055d188ae 100644 --- a/src/tools/android/java/com/google/devtools/build/android/ParsedAndroidData.java +++ b/src/tools/android/java/com/google/devtools/build/android/ParsedAndroidData.java @@ -45,7 +45,6 @@ import java.util.logging.Logger; import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.NotThreadSafe; -import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamException; /** @@ -257,7 +256,6 @@ public class ParsedAndroidData { private final List<Exception> errors; private ResourceFolderType folderType; private FullyQualifiedName.Factory fqnFactory; - private final XMLInputFactory xmlInputFactory = XMLInputFactory.newFactory(); private final boolean parseIds; /** @@ -306,14 +304,23 @@ public class ParsedAndroidData { if (!Files.isDirectory(path) && !path.getFileName().toString().startsWith(".")) { if (folderType == ResourceFolderType.VALUES) { DataResourceXml.parse( - xmlInputFactory, path, fqnFactory, overwritingConsumer, combiningResources); + XmlResourceValues.getXmlInputFactory(), + path, + fqnFactory, + overwritingConsumer, + combiningResources); } else if (folderType != null) { FullyQualifiedName key = fqnFactory.parse(path); if (parseIds && ID_PROVIDING_RESOURCE_TYPES.contains(folderType) && path.getFileName().toString().endsWith(SdkConstants.DOT_XML)) { DataValueFileWithIds.parse( - xmlInputFactory, path, key, fqnFactory, overwritingConsumer, combiningResources); + XmlResourceValues.getXmlInputFactory(), + path, + key, + fqnFactory, + overwritingConsumer, + combiningResources); } else { overwritingConsumer.consume(key, DataValueFile.of(path)); } diff --git a/src/tools/android/java/com/google/devtools/build/android/XmlResourceValues.java b/src/tools/android/java/com/google/devtools/build/android/XmlResourceValues.java index 5876966239..c154a196ff 100644 --- a/src/tools/android/java/com/google/devtools/build/android/XmlResourceValues.java +++ b/src/tools/android/java/com/google/devtools/build/android/XmlResourceValues.java @@ -44,6 +44,7 @@ import javax.xml.namespace.QName; import javax.xml.stream.XMLEventFactory; import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLEventWriter; +import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.events.Attribute; @@ -84,6 +85,17 @@ public class XmlResourceValues { static final String XLIFF_NAMESPACE = "urn:oasis:names:tc:xliff:document:1.2"; static final String XLIFF_PREFIX = "xliff"; + + private static XMLInputFactory inputFactoryInstance = null; + public static XMLInputFactory getXmlInputFactory() { + if (inputFactoryInstance == null) { + inputFactoryInstance = XMLInputFactory.newInstance(); + inputFactoryInstance.setProperty( + "http://java.sun.com/xml/stream/properties/report-cdata-event", Boolean.TRUE); + } + return inputFactoryInstance; + } + static XmlResourceValue parsePlurals(XMLEventReader eventReader) throws XMLStreamException { ImmutableMap.Builder<String, String> values = ImmutableMap.builder(); for (XMLEvent element = nextTag(eventReader); @@ -239,7 +251,7 @@ public class XmlResourceValues { StringWriter contents = new StringWriter(); XMLEventWriter writer = XML_OUTPUT_FACTORY.createXMLEventWriter(contents); while (!isEndTag(eventReader.peek(), startTag)) { - XMLEvent xmlEvent = eventReader.nextEvent(); + XMLEvent xmlEvent = (XMLEvent) eventReader.next(); if (xmlEvent.isStartElement()) { // TODO(corysmith): Replace this with a proper representation of the contents that can be // serialized and reconstructed appropriately without modification. diff --git a/src/tools/android/java/com/google/devtools/build/android/xml/AttrXmlResourceValue.java b/src/tools/android/java/com/google/devtools/build/android/xml/AttrXmlResourceValue.java index 7984dc1097..5686b04e72 100644 --- a/src/tools/android/java/com/google/devtools/build/android/xml/AttrXmlResourceValue.java +++ b/src/tools/android/java/com/google/devtools/build/android/xml/AttrXmlResourceValue.java @@ -25,6 +25,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap.Builder; import com.google.common.collect.Ordering; import com.google.devtools.build.android.AndroidDataWritingVisitor; +import com.google.devtools.build.android.AndroidDataWritingVisitor.StartTag; import com.google.devtools.build.android.AndroidDataWritingVisitor.ValuesResourceDefinition; import com.google.devtools.build.android.FullyQualifiedName; import com.google.devtools.build.android.XmlResourceValue; @@ -304,7 +305,7 @@ public class AttrXmlResourceValue implements XmlResourceValue { .filter(not(equalTo(FLAGS))) .filter(not(equalTo(ENUM))) .toSortedList(Ordering.natural()); - ValuesResourceDefinition definition = + StartTag startTag = mergedDataWriter .define(key) .derivedFrom(source) @@ -313,13 +314,18 @@ public class AttrXmlResourceValue implements XmlResourceValue { .optional() .attribute("format") .setFrom(formatKeys) - .joinedBy("|") - .closeTag() - .addCharactersOf("\n"); - for (ResourceXmlAttrValue value : formats.values()) { - definition = value.writeTo(definition); + .joinedBy("|"); + ValuesResourceDefinition definition; + if (formats.keySet().contains(FLAGS) || formats.keySet().contains(ENUM)) { + definition = startTag.closeTag(); + for (ResourceXmlAttrValue value : formats.values()) { + definition = value.writeTo(definition); + } + definition = definition.addCharactersOf("\n").endTag(); + } else { + definition = startTag.closeUnaryTag(); } - definition.endTag().save(); + definition.save(); } } |