diff options
author | 2017-01-11 18:26:32 +0000 | |
---|---|---|
committer | 2017-01-12 09:11:07 +0000 | |
commit | c7b0dd63520f311c8b1340df24e27cbd669cad14 (patch) | |
tree | c64b07d553f3c873c04c04b703d22f6e4c5e805e /src/tools/android/java/com/google/devtools/build/android/AndroidResourceProcessor.java | |
parent | cdb6877fa490dca128a71614df442bc14f268dbe (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.java | 82 |
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; + } + } } |