aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/tools/android/java/com/google
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2016-07-11 19:55:04 +0000
committerGravatar Kristina Chodorow <kchodorow@google.com>2016-07-12 11:17:51 +0000
commitc41b10c728e9752beb65b7db5d997fb9d01b7640 (patch)
tree42f6d81d7d6991591ebbcd2a65563da6559a6bab /src/tools/android/java/com/google
parent84ecac51d43fe4dba262740f4ddb3826bea4bb17 (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')
-rw-r--r--src/tools/android/java/com/google/devtools/build/android/DataResourceXml.java9
-rw-r--r--src/tools/android/java/com/google/devtools/build/android/ParsedAndroidData.java15
-rw-r--r--src/tools/android/java/com/google/devtools/build/android/XmlResourceValues.java14
-rw-r--r--src/tools/android/java/com/google/devtools/build/android/xml/AttrXmlResourceValue.java20
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();
}
}