aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesInfo.java14
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java11
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/CompiledMergableAndroidData.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/LibraryRGeneratorActionBuilder.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidResources.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ParsedAndroidResources.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/RClassGeneratorActionBuilder.java16
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ResourceApk.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ResourceContainer.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ResourceContainerConverter.java19
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ResourceDependencies.java39
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ResourceFilter.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ResourceShrinkerActionBuilder.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ValidatedAndroidData.java50
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ValidatedAndroidResources.java17
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/android/AarImportTest.java8
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/android/AndroidBuildViewTestCase.java7
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/android/AndroidLibraryTest.java10
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/android/AndroidResourcesTest.java4
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/android/ResourceFilterFactoryTest.java18
21 files changed, 166 insertions, 91 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesInfo.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesInfo.java
index 1963fa7ad9..4af26bff72 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesInfo.java
@@ -37,8 +37,8 @@ public class AndroidResourcesInfo extends NativeInfo {
new NativeProvider<AndroidResourcesInfo>(AndroidResourcesInfo.class, SKYLARK_NAME) {};
private final Label label;
- private final NestedSet<ResourceContainer> transitiveAndroidResources;
- private final NestedSet<ResourceContainer> directAndroidResources;
+ private final NestedSet<ValidatedAndroidData> transitiveAndroidResources;
+ private final NestedSet<ValidatedAndroidData> directAndroidResources;
private final NestedSet<Artifact> transitiveResources;
private final NestedSet<Artifact> transitiveAssets;
private final NestedSet<Artifact> transitiveManifests;
@@ -50,8 +50,8 @@ public class AndroidResourcesInfo extends NativeInfo {
AndroidResourcesInfo(
Label label,
- NestedSet<ResourceContainer> transitiveAndroidResources,
- NestedSet<ResourceContainer> directAndroidResources,
+ NestedSet<ValidatedAndroidData> transitiveAndroidResources,
+ NestedSet<ValidatedAndroidData> directAndroidResources,
NestedSet<Artifact> transitiveResources,
NestedSet<Artifact> transitiveAssets,
NestedSet<Artifact> transitiveManifests,
@@ -86,7 +86,7 @@ public class AndroidResourcesInfo extends NativeInfo {
doc = "Returns the transitive android resources for the label.",
structField = true
)
- public NestedSet<ResourceContainer> getTransitiveAndroidResources() {
+ public NestedSet<ValidatedAndroidData> getTransitiveAndroidResources() {
return transitiveAndroidResources;
}
@@ -96,7 +96,7 @@ public class AndroidResourcesInfo extends NativeInfo {
doc = "Returns the immediate android resources for the label.",
structField = true
)
- public NestedSet<ResourceContainer> getDirectAndroidResources() {
+ public NestedSet<ValidatedAndroidData> getDirectAndroidResources() {
return directAndroidResources;
}
@@ -104,6 +104,8 @@ public class AndroidResourcesInfo extends NativeInfo {
return transitiveResources;
}
+ /** @deprecated Assets are being decoupled from resources */
+ @Deprecated
public NestedSet<Artifact> getTransitiveAssets() {
return transitiveAssets;
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java
index 23c500825e..c69902f324 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java
@@ -23,12 +23,12 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.collect.nestedset.Order;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
-import com.google.devtools.build.lib.rules.android.ResourceContainer.ResourceType;
import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider;
import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider.OutputJar;
import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import java.util.function.Function;
import javax.annotation.Nullable;
/**
@@ -155,7 +155,7 @@ public class AndroidSkylarkApiProvider extends SkylarkApiProvider {
doc = "Returns resources defined by this target."
)
public NestedSet<Artifact> getResources() {
- return collectDirectArtifacts(ResourceType.RESOURCES);
+ return collectDirectArtifacts(ValidatedAndroidData::getResources);
}
@SkylarkCallable(
@@ -179,7 +179,8 @@ public class AndroidSkylarkApiProvider extends SkylarkApiProvider {
return getIdeInfoProvider().getAar();
}
- private NestedSet<Artifact> collectDirectArtifacts(final ResourceType resources) {
+ private NestedSet<Artifact> collectDirectArtifacts(
+ final Function<ValidatedAndroidData, Iterable<Artifact>> artifactFunction) {
if (resourceInfo == null) {
return NestedSetBuilder.emptySet(Order.STABLE_ORDER);
}
@@ -189,9 +190,7 @@ public class AndroidSkylarkApiProvider extends SkylarkApiProvider {
Order.STABLE_ORDER,
Iterables.concat(
Iterables.transform(
- resourceInfo.getDirectAndroidResources(),
- (ResourceContainer resourceContainer) ->
- resourceContainer.getArtifacts(resources))));
+ resourceInfo.getDirectAndroidResources(), data -> artifactFunction.apply(data))));
}
/** Helper class to provide information about IDLs related to this rule. */
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java b/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java
index 2f3ff356b0..848a0d3477 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java
@@ -255,12 +255,12 @@ public final class ApplicationManifest {
}
private static Map<Artifact, Label> getMergeeManifests(
- Iterable<ResourceContainer> resourceContainers) {
+ Iterable<ValidatedAndroidData> transitiveData) {
ImmutableSortedMap.Builder<Artifact, Label> builder =
ImmutableSortedMap.orderedBy(Artifact.EXEC_PATH_COMPARATOR);
- for (ResourceContainer r : resourceContainers) {
- if (r.isManifestExported()) {
- builder.put(r.getManifest(), r.getLabel());
+ for (ValidatedAndroidData d : transitiveData) {
+ if (d.isManifestExported()) {
+ builder.put(d.getManifest(), d.getLabel());
}
}
return builder.build();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/CompiledMergableAndroidData.java b/src/main/java/com/google/devtools/build/lib/rules/android/CompiledMergableAndroidData.java
index a32fbf389a..56c9f8085b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/CompiledMergableAndroidData.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/CompiledMergableAndroidData.java
@@ -29,4 +29,6 @@ public interface CompiledMergableAndroidData extends MergableAndroidData {
Iterable<Artifact> getArtifacts();
Artifact getManifest();
+
+ boolean isManifestExported();
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/LibraryRGeneratorActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/LibraryRGeneratorActionBuilder.java
index 14dfa203f9..3a23bcc5e8 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/LibraryRGeneratorActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/LibraryRGeneratorActionBuilder.java
@@ -32,7 +32,7 @@ import com.google.devtools.build.lib.collect.nestedset.Order;
/** Builder for the action that generates the R class for libraries. */
public class LibraryRGeneratorActionBuilder {
private String javaPackage;
- private Iterable<ResourceContainer> deps = ImmutableList.<ResourceContainer>of();
+ private Iterable<ValidatedAndroidData> deps = ImmutableList.of();
private ResourceContainer resourceContainer;
private Artifact rJavaClassJar;
@@ -71,12 +71,12 @@ public class LibraryRGeneratorActionBuilder {
builder.add("--packageForR", javaPackage);
}
- FluentIterable<ResourceContainer> symbolProviders =
+ FluentIterable<ValidatedAndroidData> symbolProviders =
FluentIterable.from(deps).append(resourceContainer);
if (!symbolProviders.isEmpty()) {
ImmutableList<Artifact> symbols =
- symbolProviders.stream().map(ResourceContainer::getSymbols).collect(toImmutableList());
+ symbolProviders.stream().map(ValidatedAndroidData::getSymbols).collect(toImmutableList());
builder.addExecPaths("--symbols", symbols);
inputs.addTransitive(NestedSetBuilder.wrap(Order.NAIVE_LINK_ORDER, symbols));
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidResources.java b/src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidResources.java
index 8b7fc72481..be896110ff 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidResources.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidResources.java
@@ -121,6 +121,10 @@ public class MergedAndroidResources extends ParsedAndroidResources {
return dataBindingInfoZip;
}
+ public Artifact getJavaClassJar() {
+ return classJar;
+ }
+
@Override
public ProcessedAndroidManifest getStampedManifest() {
return manifest;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ParsedAndroidResources.java b/src/main/java/com/google/devtools/build/lib/rules/android/ParsedAndroidResources.java
index d308d656a9..d5f73af10d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/ParsedAndroidResources.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/ParsedAndroidResources.java
@@ -105,6 +105,11 @@ public class ParsedAndroidResources extends AndroidResources
}
@Override
+ public boolean isManifestExported() {
+ return manifest.isExported();
+ }
+
+ @Override
public Label getLabel() {
return label;
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/RClassGeneratorActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/RClassGeneratorActionBuilder.java
index c4f1559998..9c68d10f85 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/RClassGeneratorActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/RClassGeneratorActionBuilder.java
@@ -97,7 +97,7 @@ public class RClassGeneratorActionBuilder {
}
if (dependencies != null) {
// TODO(corysmith): Remove NestedSet as we are already flattening it.
- Iterable<ResourceContainer> depResources = dependencies.getResourceContainers();
+ Iterable<ValidatedAndroidData> depResources = dependencies.getResourceContainers();
if (!Iterables.isEmpty(depResources)) {
builder.addAll(
VectorArg.addBefore("--library")
@@ -132,15 +132,15 @@ public class RClassGeneratorActionBuilder {
.build(ruleContext));
}
- private static Artifact chooseRTxt(ResourceContainer container, AndroidAaptVersion version) {
+ private static Artifact chooseRTxt(ValidatedAndroidData container, AndroidAaptVersion version) {
return version == AndroidAaptVersion.AAPT2 ? container.getAapt2RTxt() : container.getRTxt();
}
- private static Function<ResourceContainer, NestedSet<Artifact>> chooseDepsToArtifacts(
+ private static Function<ValidatedAndroidData, NestedSet<Artifact>> chooseDepsToArtifacts(
final AndroidAaptVersion version) {
- return new Function<ResourceContainer, NestedSet<Artifact>>() {
+ return new Function<ValidatedAndroidData, NestedSet<Artifact>>() {
@Override
- public NestedSet<Artifact> apply(ResourceContainer container) {
+ public NestedSet<Artifact> apply(ValidatedAndroidData container) {
NestedSetBuilder<Artifact> artifacts = NestedSetBuilder.naiveLinkOrder();
addIfNotNull(chooseRTxt(container, version), artifacts);
addIfNotNull(container.getManifest(), artifacts);
@@ -155,11 +155,11 @@ public class RClassGeneratorActionBuilder {
};
}
- private static Function<ResourceContainer, String> chooseDepsToArg(
+ private static Function<ValidatedAndroidData, String> chooseDepsToArg(
final AndroidAaptVersion version) {
- return new Function<ResourceContainer, String>() {
+ return new Function<ValidatedAndroidData, String>() {
@Override
- public String apply(ResourceContainer container) {
+ public String apply(ValidatedAndroidData container) {
Artifact rTxt = chooseRTxt(container, version);
return (rTxt != null ? rTxt.getExecPath() : "")
+ ","
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceApk.java b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceApk.java
index 24943b7950..b2b73a2aa6 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceApk.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceApk.java
@@ -105,6 +105,6 @@ public final class ResourceApk {
if (primaryResource == null) {
return resourceDeps.toInfo(label);
}
- return resourceDeps.toInfo(label, primaryResource);
+ return resourceDeps.toInfo(primaryResource);
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceContainer.java b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceContainer.java
index 47cea1a2c0..6a7a6fa599 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceContainer.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceContainer.java
@@ -42,7 +42,7 @@ import javax.annotation.Nullable;
category = SkylarkModuleCategory.NONE,
doc = "The Android resources contributed by a single target."
)
-public abstract class ResourceContainer implements CompiledMergableAndroidData {
+public abstract class ResourceContainer implements ValidatedAndroidData {
/** The type of resource in question: either asset or a resource. */
public enum ResourceType {
ASSETS("assets"),
@@ -65,6 +65,7 @@ public abstract class ResourceContainer implements CompiledMergableAndroidData {
@Nullable
public abstract String getJavaPackage();
+ @Override
@Nullable
public abstract Artifact getApk();
@@ -76,6 +77,7 @@ public abstract class ResourceContainer implements CompiledMergableAndroidData {
@Override
public abstract Artifact getManifest();
+ @Override
@Nullable
public abstract Artifact getJavaSourceJar();
@@ -133,6 +135,7 @@ public abstract class ResourceContainer implements CompiledMergableAndroidData {
return resourceType == ResourceType.ASSETS ? getAssetRoots() : getResourceRoots();
}
+ @Override
public abstract boolean isManifestExported();
@Nullable
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceContainerConverter.java b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceContainerConverter.java
index df15063d50..899340f67a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceContainerConverter.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceContainerConverter.java
@@ -25,8 +25,8 @@ import com.google.common.collect.Sets;
import com.google.devtools.build.lib.actions.CommandLineItem;
import com.google.devtools.build.lib.analysis.actions.CustomCommandLine;
import com.google.devtools.build.lib.analysis.actions.CustomCommandLine.VectorArg;
-import com.google.devtools.build.lib.rules.android.ResourceContainer.ResourceType;
import com.google.devtools.build.lib.rules.android.ResourceContainerConverter.ToArg.Includes;
+import com.google.devtools.build.lib.vfs.PathFragment;
import java.util.HashSet;
import java.util.Set;
import java.util.function.Consumer;
@@ -46,7 +46,7 @@ public class ResourceContainerConverter {
return new Builder();
}
- static class ToArg extends CommandLineItem.ParametrizedMapFn<ResourceContainer> {
+ static class ToArg extends CommandLineItem.ParametrizedMapFn<ValidatedAndroidData> {
private final Set<Includes> includes;
private final SeparatorType separatorType;
@@ -95,15 +95,15 @@ public class ResourceContainerConverter {
}
@Override
- public void expandToCommandLine(ResourceContainer container, Consumer<String> args) {
+ public void expandToCommandLine(ValidatedAndroidData container, Consumer<String> args) {
args.accept(map(container));
}
- String map(ResourceContainer container) {
+ String map(ValidatedAndroidData container) {
ImmutableList.Builder<String> cmdPieces = ImmutableList.builder();
if (includes.contains(Includes.ResourceRoots)) {
- cmdPieces.add(convertRoots(container, ResourceType.RESOURCES));
- cmdPieces.add(convertRoots(container, ResourceType.ASSETS));
+ cmdPieces.add(convertRoots(container.getResourceRoots()));
+ cmdPieces.add(convertRoots(container.getAssetRoots()));
}
if (includes.contains(Includes.Label)) {
cmdPieces.add(escaper.apply(container.getLabel().toString()));
@@ -198,11 +198,8 @@ public class ResourceContainerConverter {
}
@VisibleForTesting
- public static String convertRoots(ResourceContainer container, ResourceType resourceType) {
- return Joiner.on("#")
- .join(
- Iterators.transform(
- container.getRoots(resourceType).iterator(), Functions.toStringFunction()));
+ public static String convertRoots(Iterable<PathFragment> roots) {
+ return Joiner.on("#").join(Iterators.transform(roots.iterator(), Functions.toStringFunction()));
}
/**
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceDependencies.java b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceDependencies.java
index 4740fb1f2b..cacae74343 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceDependencies.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceDependencies.java
@@ -53,8 +53,7 @@ public final class ResourceDependencies {
* This should allow greater efficiency since we don't need to unroll this NestedSet to get a
* particular input. TODO (b/67996945): Complete this migration.
*/
- @Deprecated
- private final NestedSet<ResourceContainer> transitiveResourceContainers;
+ @Deprecated private final NestedSet<ValidatedAndroidData> transitiveResourceContainers;
/**
* Contains all the direct dependencies of the current target. Since a given direct dependency can
@@ -65,8 +64,7 @@ public final class ResourceDependencies {
* @deprecated Similarly to {@link #transitiveResourceContainers}, we are moving away from storing
* ResourceContainer objects here. TODO (b/67996945): Complete this migration.
*/
- @Deprecated
- private final NestedSet<ResourceContainer> directResourceContainers;
+ @Deprecated private final NestedSet<ValidatedAndroidData> directResourceContainers;
/**
* Transitive resource files for this target.
@@ -94,8 +92,10 @@ public final class ResourceDependencies {
private final boolean neverlink;
public static ResourceDependencies fromRuleDeps(RuleContext ruleContext, boolean neverlink) {
- NestedSetBuilder<ResourceContainer> transitiveDependencies = NestedSetBuilder.naiveLinkOrder();
- NestedSetBuilder<ResourceContainer> directDependencies = NestedSetBuilder.naiveLinkOrder();
+ NestedSetBuilder<ValidatedAndroidData> transitiveDependencies =
+ NestedSetBuilder.naiveLinkOrder();
+ NestedSetBuilder<ValidatedAndroidData> directDependencies =
+ NestedSetBuilder.naiveLinkOrder();
NestedSetBuilder<Artifact> transitiveResources = NestedSetBuilder.naiveLinkOrder();
NestedSetBuilder<Artifact> transitiveAssets = NestedSetBuilder.naiveLinkOrder();
NestedSetBuilder<Artifact> transitiveManifests = NestedSetBuilder.naiveLinkOrder();
@@ -177,8 +177,8 @@ public final class ResourceDependencies {
private ResourceDependencies(
boolean neverlink,
- NestedSet<ResourceContainer> transitiveResourceContainers,
- NestedSet<ResourceContainer> directResourceContainers,
+ NestedSet<ValidatedAndroidData> transitiveResourceContainers,
+ NestedSet<ValidatedAndroidData> directResourceContainers,
NestedSet<Artifact> transitiveResources,
NestedSet<Artifact> transitiveAssets,
NestedSet<Artifact> transitiveManifests,
@@ -222,8 +222,8 @@ public final class ResourceDependencies {
@VisibleForTesting
ResourceDependencies withResources(
- NestedSet<ResourceContainer> transitiveResourceContainers,
- NestedSet<ResourceContainer> directResourceContainers,
+ NestedSet<ValidatedAndroidData> transitiveResourceContainers,
+ NestedSet<ValidatedAndroidData> directResourceContainers,
NestedSet<Artifact> transitiveResources) {
return new ResourceDependencies(
neverlink,
@@ -247,21 +247,20 @@ public final class ResourceDependencies {
* identify the new container and merge appropriately. The previous direct dependencies are then
* added to the transitive dependencies.
*
- * @param label The label of the library exporting this provider.
* @param newDirectResource The new direct dependency for AndroidResourcesInfo
* @return A provider with the current resources and label.
*/
- public AndroidResourcesInfo toInfo(Label label, ResourceContainer newDirectResource) {
+ public AndroidResourcesInfo toInfo(ValidatedAndroidData newDirectResource) {
if (neverlink) {
- return ResourceDependencies.empty().toInfo(label);
+ return ResourceDependencies.empty().toInfo(newDirectResource.getLabel());
}
return new AndroidResourcesInfo(
- label,
- NestedSetBuilder.<ResourceContainer>naiveLinkOrder()
+ newDirectResource.getLabel(),
+ NestedSetBuilder.<ValidatedAndroidData>naiveLinkOrder()
.addTransitive(transitiveResourceContainers)
.addTransitive(directResourceContainers)
.build(),
- NestedSetBuilder.<ResourceContainer>naiveLinkOrder().add(newDirectResource).build(),
+ NestedSetBuilder.<ValidatedAndroidData>naiveLinkOrder().add(newDirectResource).build(),
NestedSetBuilder.<Artifact>naiveLinkOrder()
.addTransitive(transitiveResources)
.addAll(newDirectResource.getResources())
@@ -324,8 +323,8 @@ public final class ResourceDependencies {
* get the specific Artifacts you need instead.
*/
@Deprecated
- public NestedSet<ResourceContainer> getResourceContainers() {
- return NestedSetBuilder.<ResourceContainer>naiveLinkOrder()
+ public NestedSet<ValidatedAndroidData> getResourceContainers() {
+ return NestedSetBuilder.<ValidatedAndroidData>naiveLinkOrder()
.addTransitive(directResourceContainers)
.addTransitive(transitiveResourceContainers)
.build();
@@ -336,7 +335,7 @@ public final class ResourceDependencies {
* get the specific Artifacts you need instead.
*/
@Deprecated
- public NestedSet<ResourceContainer> getTransitiveResourceContainers() {
+ public NestedSet<ValidatedAndroidData> getTransitiveResourceContainers() {
return transitiveResourceContainers;
}
@@ -345,7 +344,7 @@ public final class ResourceDependencies {
* get the specific Artifacts you need instead.
*/
@Deprecated
- public NestedSet<ResourceContainer> getDirectResourceContainers() {
+ public NestedSet<ValidatedAndroidData> getDirectResourceContainers() {
return directResourceContainers;
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceFilter.java b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceFilter.java
index ff8c8112d6..15ef00a243 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceFilter.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceFilter.java
@@ -65,17 +65,17 @@ public class ResourceFilter {
return Optional.of(NestedSetBuilder.wrap(artifacts.getOrder(), filtered));
}
- public NestedSet<ResourceContainer> filterDependencyContainers(
- RuleErrorConsumer errorConsumer, NestedSet<ResourceContainer> resourceContainers)
+ public NestedSet<ValidatedAndroidData> filterDependencyContainers(
+ RuleErrorConsumer errorConsumer, NestedSet<ValidatedAndroidData> resourceContainers)
throws RuleErrorException {
if (isEmpty) {
return resourceContainers;
}
- NestedSetBuilder<ResourceContainer> builder =
+ NestedSetBuilder<ValidatedAndroidData> builder =
new NestedSetBuilder<>(resourceContainers.getOrder());
- for (ResourceContainer container : resourceContainers) {
+ for (ValidatedAndroidData container : resourceContainers) {
builder.add(container.filter(errorConsumer, this, /* isDependency = */ true));
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceShrinkerActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceShrinkerActionBuilder.java
index 207a729efd..6864d1ab68 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceShrinkerActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceShrinkerActionBuilder.java
@@ -236,7 +236,7 @@ public class ResourceShrinkerActionBuilder {
private ImmutableList<Artifact> getManifests(ResourceDependencies resourceDependencies) {
ImmutableList.Builder<Artifact> manifests = ImmutableList.builder();
- for (ResourceContainer resources : resourceDependencies.getResourceContainers()) {
+ for (ValidatedAndroidData resources : resourceDependencies.getResourceContainers()) {
if (resources.getManifest() != null) {
manifests.add(resources.getManifest());
}
@@ -248,7 +248,7 @@ public class ResourceShrinkerActionBuilder {
ResourceContainer primaryResources, ResourceDependencies resourceDependencies) {
ImmutableList.Builder<String> resourcePackages = ImmutableList.builder();
resourcePackages.add(primaryResources.getJavaPackage());
- for (ResourceContainer resources : resourceDependencies.getResourceContainers()) {
+ for (ValidatedAndroidData resources : resourceDependencies.getResourceContainers()) {
resourcePackages.add(resources.getJavaPackage());
}
return resourcePackages.build();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ValidatedAndroidData.java b/src/main/java/com/google/devtools/build/lib/rules/android/ValidatedAndroidData.java
new file mode 100644
index 0000000000..a6b6490f76
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/ValidatedAndroidData.java
@@ -0,0 +1,50 @@
+// Copyright 2018 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.lib.rules.android;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.devtools.build.lib.actions.Artifact;
+import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
+import com.google.devtools.build.lib.packages.RuleErrorConsumer;
+
+/**
+ * A {@link CompiledMergableAndroidData} that has been fully processed, validated, and packaged.
+ *
+ * <p>It contains resources and, depending on implementation, possibly assets and manifest.
+ *
+ * <p>TODO(b/76418178): Once resources and assets are completely decoupled and {@link
+ * ResourceContainer} is removed, this interface can be replaced with {@link
+ * ValidatedAndroidResources}
+ */
+public interface ValidatedAndroidData extends CompiledMergableAndroidData {
+
+ Artifact getRTxt();
+
+ Artifact getAapt2RTxt();
+
+ Artifact getStaticLibrary();
+
+ ValidatedAndroidData filter(
+ RuleErrorConsumer errorConsumer, ResourceFilter resourceFilter, boolean isDependency)
+ throws RuleErrorException;
+
+ Artifact getJavaClassJar();
+
+ String getJavaPackage();
+
+ Artifact getJavaSourceJar();
+
+ @VisibleForTesting
+ Artifact getApk();
+}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ValidatedAndroidResources.java b/src/main/java/com/google/devtools/build/lib/rules/android/ValidatedAndroidResources.java
index d8c86865af..c6158b5d43 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/ValidatedAndroidResources.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/ValidatedAndroidResources.java
@@ -23,8 +23,9 @@ import java.util.Objects;
import java.util.Optional;
import javax.annotation.Nullable;
-/** Wraps {@link AndroidResources} that have been validated, processed, and packaged. */
-public class ValidatedAndroidResources extends MergedAndroidResources {
+/** Wraps validated and packaged Android resource information */
+public class ValidatedAndroidResources extends MergedAndroidResources
+ implements ValidatedAndroidData {
private final Artifact rTxt;
private final Artifact sourceJar;
private final Artifact apk;
@@ -117,18 +118,26 @@ public class ValidatedAndroidResources extends MergedAndroidResources {
this.staticLibrary = staticLibrary;
}
+ public AndroidResourcesInfo toProvider() {
+ return getResourceDependencies().toInfo(this);
+ }
+
+ @Override
public Artifact getRTxt() {
return rTxt;
}
- public Artifact getSourceJar() {
+ @Override
+ public Artifact getJavaSourceJar() {
return sourceJar;
}
+ @Override
public Artifact getApk() {
return apk;
}
+ @Override
@Nullable
public Artifact getAapt2RTxt() {
return aapt2RTxt;
@@ -139,11 +148,13 @@ public class ValidatedAndroidResources extends MergedAndroidResources {
return aapt2SourceJar;
}
+ @Override
@Nullable
public Artifact getStaticLibrary() {
return staticLibrary;
}
+ @Override
public ValidatedAndroidResources filter(
RuleErrorConsumer errorConsumer, ResourceFilter resourceFilter, boolean isDependency)
throws RuleErrorException {
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AarImportTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AarImportTest.java
index 387270df7d..0707611329 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AarImportTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AarImportTest.java
@@ -82,11 +82,11 @@ public class AarImportTest extends BuildViewTestCase {
public void testResourcesProvided() throws Exception {
ConfiguredTarget aarImportTarget = getConfiguredTarget("//a:foo");
- NestedSet<ResourceContainer> directResources =
+ NestedSet<ValidatedAndroidData> directResources =
aarImportTarget.get(AndroidResourcesInfo.PROVIDER).getDirectAndroidResources();
assertThat(directResources).hasSize(1);
- ResourceContainer resourceContainer = directResources.iterator().next();
+ ValidatedAndroidData resourceContainer = directResources.iterator().next();
assertThat(resourceContainer.getManifest()).isNotNull();
Artifact resourceTreeArtifact =
@@ -102,7 +102,7 @@ public class AarImportTest extends BuildViewTestCase {
@Test
public void testResourcesExtractor() throws Exception {
- ResourceContainer resourceContainer =
+ ValidatedAndroidData resourceContainer =
getConfiguredTarget("//a:foo")
.get(AndroidResourcesInfo.PROVIDER)
.getDirectAndroidResources()
@@ -203,7 +203,7 @@ public class AarImportTest extends BuildViewTestCase {
@Test
public void testNoCustomJavaPackage() throws Exception {
- ResourceContainer resourceContainer =
+ ValidatedAndroidData resourceContainer =
getConfiguredTarget("//a:foo")
.get(AndroidResourcesInfo.PROVIDER)
.getDirectAndroidResources()
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBuildViewTestCase.java
index 48accc2d5c..e85c1c1bcf 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBuildViewTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBuildViewTestCase.java
@@ -134,8 +134,11 @@ public abstract class AndroidBuildViewTestCase extends BuildViewTestCase {
Preconditions.checkNotNull(target);
final AndroidResourcesInfo info = target.get(AndroidResourcesInfo.PROVIDER);
assertThat(info).named("No android resources exported from the target.").isNotNull();
- return getOnlyElement(
- transitive ? info.getTransitiveAndroidResources() : info.getDirectAndroidResources());
+ ValidatedAndroidData validated =
+ getOnlyElement(
+ transitive ? info.getTransitiveAndroidResources() : info.getDirectAndroidResources());
+ assertThat(validated).isInstanceOf(ResourceContainer.class);
+ return (ResourceContainer) validated;
}
protected Artifact getResourceClassJar(final ConfiguredTargetAndData target) {
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLibraryTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLibraryTest.java
index dac91324e2..3fa82b319a 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLibraryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLibraryTest.java
@@ -940,7 +940,7 @@ public class AndroidLibraryTest extends AndroidBuildViewTestCase {
" deps = [':bar'])",
"android_library(name = 'bar',",
" manifest = 'AndroidManifest.xml')");
- Function<ResourceContainer, Label> getLabel = ResourceContainer::getLabel;
+ Function<ValidatedAndroidData, Label> getLabel = ValidatedAndroidData::getLabel;
ConfiguredTarget foo = getConfiguredTarget("//java/apps/android:foo");
assertThat(
Iterables.transform(
@@ -1030,7 +1030,7 @@ public class AndroidLibraryTest extends AndroidBuildViewTestCase {
NestedSet<Artifact> filesToBuild = getFilesToBuild(target);
Set<Artifact> artifacts = actionsTestUtil().artifactClosureOf(filesToBuild);
- ResourceContainer resources =
+ ValidatedAndroidData resources =
Iterables.getOnlyElement(
target.get(AndroidResourcesInfo.PROVIDER).getDirectAndroidResources());
@@ -1147,7 +1147,7 @@ public class AndroidLibraryTest extends AndroidBuildViewTestCase {
.isEqualTo(
ActionsTestUtil.getFirstArtifactEndingWith(
artifactClosure, "java/android/AndroidManifest.xml"));
- ResourceContainer resources =
+ ValidatedAndroidData resources =
getOnlyElement(
getConfiguredTarget("//java/android:r")
.get(AndroidResourcesInfo.PROVIDER)
@@ -1179,7 +1179,7 @@ public class AndroidLibraryTest extends AndroidBuildViewTestCase {
.isEqualTo(
ActionsTestUtil.getFirstArtifactEndingWith(
artifactClosure, "handwriting/AndroidManifest.xml"));
- ResourceContainer resources =
+ ValidatedAndroidData resources =
getOnlyElement(
getConfiguredTarget("//research/handwriting/java/com/google/research/handwriting:r")
.get(AndroidResourcesInfo.PROVIDER)
@@ -1213,7 +1213,7 @@ public class AndroidLibraryTest extends AndroidBuildViewTestCase {
.isEqualTo(
ActionsTestUtil.getFirstArtifactEndingWith(
artifactClosure, "java/android/AndroidManifest.xml"));
- ResourceContainer resources =
+ ValidatedAndroidData resources =
getOnlyElement(
getConfiguredTarget("//java/android:r")
.get(AndroidResourcesInfo.PROVIDER)
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidResourcesTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidResourcesTest.java
index 042c677062..113847fb60 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidResourcesTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidResourcesTest.java
@@ -385,7 +385,7 @@ public class AndroidResourcesTest extends ResourceTestBase {
ruleContext,
/* inputs = */ ImmutableList.of(validated.getMergedResources(), validated.getManifest()),
/* outputs = */ ImmutableList.of(
- validated.getRTxt(), validated.getSourceJar(), validated.getApk()));
+ validated.getRTxt(), validated.getJavaSourceJar(), validated.getApk()));
// aapt2 artifacts should not be generated
assertThat(validated.getCompiledSymbols()).isNull();
@@ -411,7 +411,7 @@ public class AndroidResourcesTest extends ResourceTestBase {
ruleContext,
/* inputs = */ ImmutableList.of(validated.getMergedResources(), validated.getManifest()),
/* outputs = */ ImmutableList.of(
- validated.getRTxt(), validated.getSourceJar(), validated.getApk()));
+ validated.getRTxt(), validated.getJavaSourceJar(), validated.getApk()));
// aapt2 artifacts should be recorded
assertThat(validated.getCompiledSymbols()).isNotNull();
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/ResourceFilterFactoryTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/ResourceFilterFactoryTest.java
index 6829c396be..6b47a0adde 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/ResourceFilterFactoryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/ResourceFilterFactoryTest.java
@@ -38,9 +38,9 @@ import org.junit.runners.JUnit4;
@RunWith(JUnit4.class)
public class ResourceFilterFactoryTest extends ResourceTestBase {
- private NestedSet<ResourceContainer> getResourceContainers(ImmutableList<Artifact>... resources)
- throws Exception {
- NestedSetBuilder<ResourceContainer> builder = NestedSetBuilder.naiveLinkOrder();
+ private NestedSet<ValidatedAndroidData> getResourceContainers(
+ ImmutableList<Artifact>... resources) throws Exception {
+ NestedSetBuilder<ValidatedAndroidData> builder = NestedSetBuilder.naiveLinkOrder();
for (ImmutableList<Artifact> resourceList : resources) {
builder.add(getResourceContainer(resourceList));
}
@@ -398,29 +398,29 @@ public class ResourceFilterFactoryTest extends ResourceTestBase {
.containsExactly(directResourceToKeep, transitiveResourceToKeep)
.inOrder();
- List<ResourceContainer> directContainers =
+ List<ValidatedAndroidData> directContainers =
filteredResourceDeps.getDirectResourceContainers().toList();
assertThat(directContainers).hasSize(2);
- AndroidResources directToDiscard = directContainers.get(0).getAndroidResources();
+ ValidatedAndroidData directToDiscard = directContainers.get(0);
assertThat(directToDiscard.getResources()).isEmpty();
assertThat(directToDiscard.getResourceRoots()).isEmpty();
- AndroidResources directToKeep = directContainers.get(1).getAndroidResources();
+ ValidatedAndroidData directToKeep = directContainers.get(1);
assertThat(directToKeep.getResources()).containsExactly(directResourceToKeep);
assertThat(directToKeep.getResourceRoots())
.containsExactly(
directResourceToKeep.getExecPath().getParentDirectory().getParentDirectory());
- List<ResourceContainer> transitiveContainers =
+ List<ValidatedAndroidData> transitiveContainers =
filteredResourceDeps.getTransitiveResourceContainers().toList();
assertThat(transitiveContainers).hasSize(2);
- AndroidResources transitiveToDiscard = transitiveContainers.get(0).getAndroidResources();
+ ValidatedAndroidData transitiveToDiscard = transitiveContainers.get(0);
assertThat(transitiveToDiscard.getResources()).isEmpty();
assertThat(transitiveToDiscard.getResourceRoots()).isEmpty();
- AndroidResources transitiveToKeep = transitiveContainers.get(1).getAndroidResources();
+ ValidatedAndroidData transitiveToKeep = transitiveContainers.get(1);
assertThat(transitiveToKeep.getResources()).containsExactly(transitiveResourceToKeep);
assertThat(transitiveToKeep.getResourceRoots())
.containsExactly(