From da59188963e739fe3d00e096ae2f1d88546422e3 Mon Sep 17 00:00:00 2001 From: Googler Date: Tue, 16 Jan 2018 14:19:51 -0800 Subject: Fix parsing for public.xml file when using aapt2. RELNOTES: none PiperOrigin-RevId: 182110722 --- .../android/AndroidCompiledDataDeserializer.java | 40 +++++++++++++------ .../devtools/build/android/DataResourceXml.java | 45 ++++++++++++---------- .../build/android/xml/PublicXmlResourceValue.java | 6 +++ .../build/android/xml/SimpleXmlResourceValue.java | 20 +++++++++- 4 files changed, 77 insertions(+), 34 deletions(-) (limited to 'src/tools/android/java/com/google/devtools/build') diff --git a/src/tools/android/java/com/google/devtools/build/android/AndroidCompiledDataDeserializer.java b/src/tools/android/java/com/google/devtools/build/android/AndroidCompiledDataDeserializer.java index 232eaa5576..3bf3407ae6 100644 --- a/src/tools/android/java/com/google/devtools/build/android/AndroidCompiledDataDeserializer.java +++ b/src/tools/android/java/com/google/devtools/build/android/AndroidCompiledDataDeserializer.java @@ -21,6 +21,7 @@ import com.android.aapt.Resources.Package; import com.android.aapt.Resources.ResourceTable; import com.android.aapt.Resources.Type; import com.android.aapt.Resources.Value; +import com.android.aapt.Resources.Visibility.Level; import com.android.resources.ResourceType; import com.google.common.base.Preconditions; import com.google.common.base.Stopwatch; @@ -104,26 +105,41 @@ public class AndroidCompiledDataDeserializer implements AndroidDataDeserializer ResourceType resourceType = ResourceType.getEnum(resourceFormatType.getName()); for (Resources.Entry resource : resourceFormatType.getEntryList()) { - Value resourceValue = resource.getConfigValue(0).getValue(); String resourceName = packageName + resource.getName(); - List configValues = resource.getConfigValueList(); - - Preconditions.checkArgument(configValues.size() == 1); - int sourceIndex = configValues.get(0).getValue().getSource().getPathIdx(); - - String source = sourcePool.get(sourceIndex); - DataSource dataSource = DataSource.of(Paths.get(source)); FullyQualifiedName fqn = fqnFactory.create(resourceType, resourceName); fullyQualifiedNames.put( - packageName + resourceType + "/" + resource.getName(), + String.format("%s%s/%s", packageName, resourceType, resource.getName()), new SimpleEntry(fqn, packageName.isEmpty())); - if (packageName.isEmpty()) { + List configValues = resource.getConfigValueList(); + if (configValues.isEmpty() + && resource.getVisibility().getLevel() == Level.PUBLIC) { + int sourceIndex = resource.getVisibility().getSource().getPathIdx(); + + String source = sourcePool.get(sourceIndex); + DataSource dataSource = DataSource.of(Paths.get(source)); + + DataResourceXml dataResourceXml = DataResourceXml + .fromPublic(dataSource, resourceType, resource.getEntryId().getId()); + consumers.combiningConsumer.accept(fqn, dataResourceXml); + } else if (packageName.isEmpty()) {// This means this resource is not in the android sdk + Preconditions.checkArgument(configValues.size() == 1); + int sourceIndex = + configValues.get(0) + .getValue() + .getSource() + .getPathIdx(); + + String source = sourcePool.get(sourceIndex); + DataSource dataSource = DataSource.of(Paths.get(source)); + + Value resourceValue = resource.getConfigValue(0).getValue(); DataResourceXml dataResourceXml = - DataResourceXml.from(resourceValue, dataSource, resourceType, fullyQualifiedNames); + DataResourceXml + .from(resourceValue, dataSource, resourceType, fullyQualifiedNames); + if (resourceType == ResourceType.ID - || resourceType == ResourceType.PUBLIC || resourceType == ResourceType.STYLEABLE) { consumers.combiningConsumer.accept(fqn, dataResourceXml); } else { 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 e26a7a87bd..62993e35c6 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 @@ -170,6 +170,20 @@ public class DataResourceXml implements DataResource { source, valueFromProto(xmlValue), Namespaces.from(xmlValue.getNamespace())); } + public static DataResourceXml from( + Value protoValue, + DataSource source, + ResourceType resourceType, + Map> fullyQualifiedNames) + throws InvalidProtocolBufferException { + DataResourceXml dataResourceXml = + createWithNamespaces( + source, + valueFromProto(protoValue, resourceType, fullyQualifiedNames), + Namespaces.empty()); + return dataResourceXml; + } + private static XmlResourceValue valueFromProto(SerializeFormat.DataValueXml proto) throws InvalidProtocolBufferException { Preconditions.checkArgument(proto.hasType()); @@ -197,20 +211,6 @@ public class DataResourceXml implements DataResource { } } - public static DataResourceXml from( - Value protoValue, - DataSource source, - ResourceType resourceType, - Map> fullyQualifiedNames) - throws InvalidProtocolBufferException { - DataResourceXml dataResourceXml = - createWithNamespaces( - source, - valueFromProto(protoValue, resourceType, fullyQualifiedNames), - Namespaces.empty()); - return dataResourceXml; - } - private static XmlResourceValue valueFromProto( Value proto, ResourceType resourceType, @@ -225,8 +225,6 @@ public class DataResourceXml implements DataResource { return PluralXmlResourceValue.from(proto); case ATTR: return AttrXmlResourceValue.from(proto); - case PUBLIC: - throw new RuntimeException(); case STYLEABLE: return StyleableXmlResourceValue.from(proto, fullyQualifiedNames); case ID: @@ -254,6 +252,13 @@ public class DataResourceXml implements DataResource { } } + public static DataResourceXml fromPublic(DataSource source, ResourceType resourceType, int id) { + DataResourceXml dataResourceXml = + createWithNamespaces( + source, PublicXmlResourceValue.from(resourceType, id), Namespaces.empty()); + return dataResourceXml; + } + private static XmlResourceValue parseXmlElements( ResourceType resourceType, XMLEventReader eventReader, @@ -325,15 +330,15 @@ public class DataResourceXml implements DataResource { return createWithNamespaces(sourcePath, xml, ImmutableMap.of()); } + public static DataResourceXml createWithNoNamespace(DataSource source, XmlResourceValue xml) { + return new DataResourceXml(source, xml, Namespaces.empty()); + } + public static DataResourceXml createWithNamespaces( Path sourcePath, XmlResourceValue xml, ImmutableMap prefixToUri) { return createWithNamespaces(sourcePath, xml, Namespaces.from(prefixToUri)); } - public static DataResourceXml createWithNoNamespace(DataSource source, XmlResourceValue xml) { - return new DataResourceXml(source, xml, Namespaces.empty()); - } - public static DataResourceXml createWithNamespaces( DataSource source, XmlResourceValue xml, Namespaces namespaces) { return new DataResourceXml(source, xml, namespaces); diff --git a/src/tools/android/java/com/google/devtools/build/android/xml/PublicXmlResourceValue.java b/src/tools/android/java/com/google/devtools/build/android/xml/PublicXmlResourceValue.java index b513cf4beb..af4184d88a 100644 --- a/src/tools/android/java/com/google/devtools/build/android/xml/PublicXmlResourceValue.java +++ b/src/tools/android/java/com/google/devtools/build/android/xml/PublicXmlResourceValue.java @@ -132,6 +132,12 @@ public class PublicXmlResourceValue implements XmlResourceValue { return of(typeToId.build()); } + public static XmlResourceValue from(ResourceType resourceType, int id) { + ImmutableMap.Builder> typeToId = ImmutableMap.builder(); + typeToId.put(resourceType, Optional.of(id)); + return of(typeToId.build()); + } + @Override public int serializeTo(int sourceId, Namespaces namespaces, OutputStream output) throws IOException { diff --git a/src/tools/android/java/com/google/devtools/build/android/xml/SimpleXmlResourceValue.java b/src/tools/android/java/com/google/devtools/build/android/xml/SimpleXmlResourceValue.java index cab46c7186..32147cd49c 100644 --- a/src/tools/android/java/com/google/devtools/build/android/xml/SimpleXmlResourceValue.java +++ b/src/tools/android/java/com/google/devtools/build/android/xml/SimpleXmlResourceValue.java @@ -60,8 +60,10 @@ public class SimpleXmlResourceValue implements XmlResourceValue { static final QName TAG_INTEGER = QName.valueOf("integer"); static final QName TAG_ITEM = QName.valueOf("item"); static final QName TAG_LAYOUT = QName.valueOf("layout"); + static final QName TAG_MENU = QName.valueOf("menu"); static final QName TAG_MIPMAP = QName.valueOf("mipmap"); static final QName TAG_PUBLIC = QName.valueOf("public"); + static final QName TAG_RAW = QName.valueOf("raw"); static final QName TAG_STRING = QName.valueOf("string"); /** Provides an enumeration resource type and simple value validation. */ @@ -118,14 +120,21 @@ public class SimpleXmlResourceValue implements XmlResourceValue { LAYOUT(TAG_LAYOUT) { @Override public boolean validate(String value) { - // TODO(corysmith): Validate the item type. + // TODO(corysmith): Validate the layout type. + return true; + } + }, + MENU(TAG_MENU) { + @Override + public boolean validate(String value) { + // TODO(corysmith): Validate the menu type. return true; } }, MIPMAP(TAG_MIPMAP) { @Override public boolean validate(String value) { - // TODO(corysmith): Validate the item type. + // TODO(corysmith): Validate the mipmap type. return true; } }, @@ -136,6 +145,13 @@ public class SimpleXmlResourceValue implements XmlResourceValue { return true; } }, + RAW(TAG_RAW) { + @Override + public boolean validate(String value) { + // TODO(corysmith): Validate the raw type. + return true; + } + }, STRING(TAG_STRING) { @Override public boolean validate(String value) { -- cgit v1.2.3