aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/tools/android/java/com/google/devtools/build/android/AndroidResourceProcessor.java
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2017-01-11 18:26:32 +0000
committerGravatar Marcel Hlopko <hlopko@google.com>2017-01-12 09:11:07 +0000
commitc7b0dd63520f311c8b1340df24e27cbd669cad14 (patch)
treec64b07d553f3c873c04c04b703d22f6e4c5e805e /src/tools/android/java/com/google/devtools/build/android/AndroidResourceProcessor.java
parentcdb6877fa490dca128a71614df442bc14f268dbe (diff)
Expose the ability to define a binary output to the merge call.
New method to deserialize parsed resources. Remove unthrown exceptions. RELNOTES:None -- PiperOrigin-RevId: 144221111 MOS_MIGRATED_REVID=144221111
Diffstat (limited to 'src/tools/android/java/com/google/devtools/build/android/AndroidResourceProcessor.java')
-rw-r--r--src/tools/android/java/com/google/devtools/build/android/AndroidResourceProcessor.java82
1 files changed, 68 insertions, 14 deletions
diff --git a/src/tools/android/java/com/google/devtools/build/android/AndroidResourceProcessor.java b/src/tools/android/java/com/google/devtools/build/android/AndroidResourceProcessor.java
index c01367fa3d..d631e7de88 100644
--- a/src/tools/android/java/com/google/devtools/build/android/AndroidResourceProcessor.java
+++ b/src/tools/android/java/com/google/devtools/build/android/AndroidResourceProcessor.java
@@ -62,6 +62,7 @@ import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.common.util.concurrent.MoreExecutors;
import com.google.devtools.build.android.Converters.ExistingPathConverter;
import com.google.devtools.build.android.Converters.RevisionConverter;
+import com.google.devtools.build.android.ParsedAndroidData.Builder;
import com.google.devtools.build.android.SplitConfigurationFilter.UnrecognizedSplitsException;
import com.google.devtools.build.android.resources.RClassGenerator;
import com.google.devtools.common.options.Converters.CommaSeparatedOptionListConverter;
@@ -105,7 +106,6 @@ import java.util.regex.Pattern;
import java.util.zip.CRC32;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
-import javax.xml.parsers.ParserConfigurationException;
import javax.xml.stream.FactoryConfigurationError;
import javax.xml.stream.XMLEventFactory;
import javax.xml.stream.XMLEventReader;
@@ -117,7 +117,6 @@ import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;
import javax.xml.xpath.XPathExpressionException;
-import org.xml.sax.SAXException;
/**
* Provides a wrapper around the AOSP build tools for resource processing.
@@ -901,10 +900,7 @@ public class AndroidResourceProcessor {
default:
throw new RuntimeException("Unhandled result type : " + mergingReport.getResult());
}
- } catch (IOException
- | SAXException
- | ParserConfigurationException
- | MergeFailureException e) {
+ } catch (IOException | MergeFailureException e) {
throw new RuntimeException(e);
}
return new MergedAndroidData(
@@ -1037,7 +1033,7 @@ public class AndroidResourceProcessor {
default:
throw new RuntimeException("Unhandled result type : " + mergingReport.getResult());
}
- } catch (SAXException | ParserConfigurationException | MergeFailureException e) {
+ } catch (MergeFailureException e) {
throw new RuntimeException(e);
}
@@ -1045,10 +1041,8 @@ public class AndroidResourceProcessor {
}
private void writeMergedManifest(
- MergedManifestKind mergedManifestKind,
- MergingReport mergingReport,
- Path manifestOut)
- throws IOException, SAXException, ParserConfigurationException {
+ MergedManifestKind mergedManifestKind, MergingReport mergingReport, Path manifestOut)
+ throws IOException {
String manifestContents = mergingReport.getMergedDocument(mergedManifestKind);
String annotatedDocument = mergingReport.getMergedDocument(MergedManifestKind.BLAME);
stdLogger.verbose(annotatedDocument);
@@ -1155,14 +1149,24 @@ public class AndroidResourceProcessor {
final Path assetsOut,
@Nullable final PngCruncher cruncher,
final VariantType type,
- @Nullable AndroidResourceClassWriter rclassWriter)
+ @Nullable final Path symbolsOut,
+ @Nullable final AndroidResourceClassWriter rclassWriter)
throws MergingException {
final ParsedAndroidData.Builder primaryBuilder = ParsedAndroidData.Builder.newBuilder();
final AndroidDataSerializer serializer = AndroidDataSerializer.create();
primary.deserialize(serializer, primaryBuilder.consumers());
ParsedAndroidData primaryData = primaryBuilder.build();
- return mergeData(primaryData, primaryManifest, direct, transitive,
- resourcesOut, assetsOut, cruncher, type, null /* symbolsOut */, rclassWriter);
+ return mergeData(
+ primaryData,
+ primaryManifest,
+ direct,
+ transitive,
+ resourcesOut,
+ assetsOut,
+ cruncher,
+ type,
+ symbolsOut,
+ rclassWriter);
}
/**
@@ -1238,6 +1242,28 @@ public class AndroidResourceProcessor {
return Files.createDirectories(out);
}
+ /** Deserializes a list of serialized resource paths to a {@link ParsedAndroidData}. */
+ public ParsedAndroidData deserializeSymbolsToData(List<Path> symbolPaths)
+ throws IOException, MergingException {
+ AndroidDataSerializer serializer = AndroidDataSerializer.create();
+ final ListeningExecutorService executorService =
+ MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(15));
+ final Builder deserializedDataBuilder = ParsedAndroidData.Builder.newBuilder();
+ try (Closeable closeable = ExecutorServiceCloser.createWith(executorService)) {
+ List<ListenableFuture<Boolean>> deserializing = new ArrayList<>();
+ for (final Path symbolPath : symbolPaths) {
+ deserializing.add(
+ executorService.submit(
+ new Deserialize(serializer, symbolPath, deserializedDataBuilder)));
+ }
+ FailedFutureAggregator<MergingException> aggregator =
+ FailedFutureAggregator.createForMergingExceptionWithMessage(
+ "Failure(s) during dependency parsing");
+ aggregator.aggregateAndMaybeThrow(deserializing);
+ }
+ return deserializedDataBuilder.build();
+ }
+
/**
* A FileVisitor that will add all files to be stored in a zip archive.
*/
@@ -1401,4 +1427,32 @@ public class AndroidResourceProcessor {
}
}
+ /** Task to deserialize resources from a path. */
+ private static final class Deserialize implements Callable<Boolean> {
+
+ private final Path symbolPath;
+
+ private final Builder finalDataBuilder;
+ private AndroidDataSerializer serializer;
+
+ private Deserialize(
+ AndroidDataSerializer serializer, Path symbolPath, Builder finalDataBuilder) {
+ this.serializer = serializer;
+ this.symbolPath = symbolPath;
+ this.finalDataBuilder = finalDataBuilder;
+ }
+
+ @Override
+ public Boolean call() throws Exception {
+ final Builder parsedDataBuilder = ParsedAndroidData.Builder.newBuilder();
+ serializer.read(symbolPath, parsedDataBuilder.consumers());
+ // The builder isn't threadsafe, so synchronize the copyTo call.
+ synchronized (finalDataBuilder) {
+ // All the resources are sorted before writing, so they can be aggregated in
+ // whatever order here.
+ parsedDataBuilder.copyTo(finalDataBuilder);
+ }
+ return Boolean.TRUE;
+ }
+ }
}