aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/tools/android/java/com/google/devtools/build/android/AndroidDataMerger.java
diff options
context:
space:
mode:
authorGravatar corysmith <corysmith@google.com>2017-05-23 17:19:14 +0200
committerGravatar Irina Iancu <elenairina@google.com>2017-05-23 17:41:32 +0200
commitf6c4d6d66118410b1139a84fe34ba8134661bfa2 (patch)
tree67ee24a40c88bea1a38807155806fb957a852b9a /src/tools/android/java/com/google/devtools/build/android/AndroidDataMerger.java
parent81316798806b274d84c4eb1131bab8c90b0c7ba1 (diff)
Add a new action for generating reconciled R classes for Robolectric.
This includes some refactoring: * Move the symbol deserialization our of the merger and into the ParsedAndroidData (probably move again.) * Change the FailedFutureAggregator generics to work more callables RELNOTES: None PiperOrigin-RevId: 156863698
Diffstat (limited to 'src/tools/android/java/com/google/devtools/build/android/AndroidDataMerger.java')
-rw-r--r--src/tools/android/java/com/google/devtools/build/android/AndroidDataMerger.java61
1 files changed, 2 insertions, 59 deletions
diff --git a/src/tools/android/java/com/google/devtools/build/android/AndroidDataMerger.java b/src/tools/android/java/com/google/devtools/build/android/AndroidDataMerger.java
index b9a372d32c..44967168b9 100644
--- a/src/tools/android/java/com/google/devtools/build/android/AndroidDataMerger.java
+++ b/src/tools/android/java/com/google/devtools/build/android/AndroidDataMerger.java
@@ -17,12 +17,9 @@ import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Joiner;
import com.google.common.base.Stopwatch;
import com.google.common.collect.Iterables;
-import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.common.util.concurrent.MoreExecutors;
import com.google.devtools.build.android.AndroidResourceMerger.MergingException;
-import com.google.devtools.build.android.ParsedAndroidData.Builder;
-import com.google.devtools.build.android.ParsedAndroidData.ParsedAndroidDataBuildingPathWalker;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Path;
@@ -32,7 +29,6 @@ import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
-import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;
@@ -42,44 +38,6 @@ class AndroidDataMerger {
private static final Logger logger = Logger.getLogger(AndroidDataMerger.class.getCanonicalName());
- private final class ParseDependencyDataTask implements Callable<Boolean> {
-
- private final SerializedAndroidData dependency;
-
- private final Builder targetBuilder;
-
- private ParseDependencyDataTask(SerializedAndroidData dependency, Builder targetBuilder) {
- this.dependency = dependency;
- this.targetBuilder = targetBuilder;
- }
-
- @Override
- public Boolean call() throws Exception {
- final Builder parsedDataBuilder = ParsedAndroidData.Builder.newBuilder();
- try {
- dependency.deserialize(deserializer, parsedDataBuilder.consumers());
- } catch (DeserializationException e) {
- if (!e.isLegacy()) {
- throw MergingException.wrapException(e);
- }
- logger.fine(
- String.format(
- "\u001B[31mDEPRECATION:\u001B[0m Legacy resources used for %s",
- dependency.getLabel()));
- // Legacy android resources -- treat them as direct dependencies.
- dependency.walk(ParsedAndroidDataBuildingPathWalker.create(parsedDataBuilder));
- }
- // The builder isn't threadsafe, so synchronize the copyTo call.
- synchronized (targetBuilder) {
- // All the resources are sorted before writing, so they can be aggregated in
- // whatever order here.
- parsedDataBuilder.copyTo(targetBuilder);
- }
- // Had to return something?
- return Boolean.TRUE;
- }
- }
-
/** Interface for comparing paths. */
interface SourceChecker {
boolean checkEquality(DataSource one, DataSource two) throws IOException;
@@ -184,27 +142,12 @@ class AndroidDataMerger {
throws MergingException {
Stopwatch timer = Stopwatch.createStarted();
try {
- final ParsedAndroidData.Builder directBuilder = ParsedAndroidData.Builder.newBuilder();
- final ParsedAndroidData.Builder transitiveBuilder = ParsedAndroidData.Builder.newBuilder();
- final List<ListenableFuture<Boolean>> tasks = new ArrayList<>();
- for (final SerializedAndroidData dependency : direct) {
- tasks.add(executorService.submit(new ParseDependencyDataTask(dependency, directBuilder)));
- }
- for (final SerializedAndroidData dependency : transitive) {
- tasks.add(
- executorService.submit(new ParseDependencyDataTask(dependency, transitiveBuilder)));
- }
- // Wait for all the parsing to complete.
- FailedFutureAggregator<MergingException> aggregator =
- FailedFutureAggregator.createForMergingExceptionWithMessage(
- "Failure(s) during dependency parsing");
- aggregator.aggregateAndMaybeThrow(tasks);
logger.fine(
String.format("Merged dependencies read in %sms", timer.elapsed(TimeUnit.MILLISECONDS)));
timer.reset().start();
return doMerge(
- transitiveBuilder.build(),
- directBuilder.build(),
+ ParsedAndroidData.loadedFrom(transitive, executorService, deserializer),
+ ParsedAndroidData.loadedFrom(direct, executorService, deserializer),
primary,
primaryManifest,
allowPrimaryOverrideAll);