diff options
author | Andrew Pellegrini <apell@google.com> | 2017-03-13 18:02:16 +0000 |
---|---|---|
committer | Yun Peng <pcloudy@google.com> | 2017-03-14 08:53:14 +0000 |
commit | 82122525effd106e551503f70050bac18d0f85cb (patch) | |
tree | 878a3e8f44945f292e450e19f075f61e70c737eb /src/tools/android/java/com/google/devtools/build/android/xml | |
parent | 3a26d6924bf3a6e35d3718eb498def3693155ac6 (diff) |
Add <resources> attribute processing to the Android resource processing toolchain.
--
PiperOrigin-RevId: 149963021
MOS_MIGRATED_REVID=149963021
Diffstat (limited to 'src/tools/android/java/com/google/devtools/build/android/xml')
-rw-r--r-- | src/tools/android/java/com/google/devtools/build/android/xml/Namespaces.java | 11 | ||||
-rw-r--r-- | src/tools/android/java/com/google/devtools/build/android/xml/ResourcesAttribute.java | 117 |
2 files changed, 128 insertions, 0 deletions
diff --git a/src/tools/android/java/com/google/devtools/build/android/xml/Namespaces.java b/src/tools/android/java/com/google/devtools/build/android/xml/Namespaces.java index 27947d6e01..82e8810139 100644 --- a/src/tools/android/java/com/google/devtools/build/android/xml/Namespaces.java +++ b/src/tools/android/java/com/google/devtools/build/android/xml/Namespaces.java @@ -97,6 +97,17 @@ public class Namespaces implements Iterable<Entry<String, String>> { return new Namespaces(ImmutableMap.copyOf(prefixToUri)); } + /** + * Create a {@link Namespaces} containing the singular namespace used by the name, or an empty + * one. + */ + public static Namespaces from(QName name) { + if (name.getPrefix().isEmpty()) { + return empty(); + } + return new Namespaces(ImmutableMap.of(name.getPrefix(), name.getNamespaceURI())); + } + public static Namespaces empty() { return EMPTY_INSTANCE; } diff --git a/src/tools/android/java/com/google/devtools/build/android/xml/ResourcesAttribute.java b/src/tools/android/java/com/google/devtools/build/android/xml/ResourcesAttribute.java new file mode 100644 index 0000000000..b1d97407b8 --- /dev/null +++ b/src/tools/android/java/com/google/devtools/build/android/xml/ResourcesAttribute.java @@ -0,0 +1,117 @@ +// Copyright 2017 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +package com.google.devtools.build.android.xml; + +import com.google.common.base.Joiner; +import com.google.common.base.MoreObjects; +import com.google.common.collect.Iterables; +import com.google.devtools.build.android.AndroidDataWritingVisitor; +import com.google.devtools.build.android.AndroidResourceClassWriter; +import com.google.devtools.build.android.DataSource; +import com.google.devtools.build.android.FullyQualifiedName; +import com.google.devtools.build.android.XmlResourceValue; +import com.google.devtools.build.android.XmlResourceValues; +import com.google.devtools.build.android.proto.SerializeFormat; +import com.google.devtools.build.android.proto.SerializeFormat.DataValueXml.Builder; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Map; +import java.util.Objects; + +/** + * An attribute associated with the root <resources> tag of an xml file in a values folder. + */ +public class ResourcesAttribute implements XmlResourceValue { + + public static ResourcesAttribute of(String name, String value) { + return new ResourcesAttribute(name, value); + } + + public static ResourcesAttribute from(SerializeFormat.DataValueXml proto) { + Map.Entry<String, String> attribute = + Iterables.getOnlyElement(proto.getAttributeMap().entrySet()); + return of(attribute.getKey(), attribute.getValue()); + } + + private final String name; + private final String value; + + private ResourcesAttribute(String name, String value) { + this.name = name; + this.value = value; + } + + @Override + public void write( + FullyQualifiedName key, DataSource source, AndroidDataWritingVisitor mergedDataWriter) { + mergedDataWriter.defineAttribute(key, value); + } + + @Override + public int serializeTo(int sourceId, Namespaces namespaces, OutputStream output) + throws IOException { + SerializeFormat.DataValue.Builder builder = + XmlResourceValues.newSerializableDataValueBuilder(sourceId); + Builder xmlValueBuilder = + builder + .getXmlValueBuilder() + .putAllNamespace(namespaces.asMap()) + .setType(SerializeFormat.DataValueXml.XmlType.RESOURCES_ATTRIBUTE) + .putAttribute(name, value); + builder.setXmlValue(xmlValueBuilder); + return XmlResourceValues.serializeProtoDataValue(output, builder); + } + + @Override + public int hashCode() { + return Objects.hash(name, value); + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof ResourcesAttribute)) { + return false; + } + ResourcesAttribute other = (ResourcesAttribute) obj; + return Objects.equals(name, other.name) + && Objects.equals(value, other.value); + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(getClass()) + .add("name", name) + .add("value", value) + .toString(); + } + + @Override + public XmlResourceValue combineWith(XmlResourceValue value) { + if (!(value instanceof ResourcesAttribute)) { + throw new IllegalArgumentException(value + "is not combinable with " + this); + } + ResourcesAttribute other = (ResourcesAttribute) value; + if ((name.startsWith("tools:keep") && other.name.startsWith("tools:keep")) + || (name.startsWith("tools:discard") && other.name.startsWith("tools:discard"))) { + return of(name, Joiner.on(',').join(value, other.value)); + } + throw new IllegalArgumentException(value + "is not combinable with " + this); + } + + @Override + public void writeResourceToClass( + FullyQualifiedName key, AndroidResourceClassWriter resourceClassWriter) { + // This is an xml attribute and does not have any java representation. + } +} |