com.google.devtools.build.android.aapt2.StaticLibrary.java Source code

Java tutorial

Introduction

Here is the source code for com.google.devtools.build.android.aapt2.StaticLibrary.java

Source

// 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.aapt2;

import static com.google.common.collect.ImmutableList.toImmutableList;

import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Predicates;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
import java.util.function.Function;
import javax.annotation.Nullable;

/** A static library generated by aapt2. */
public class StaticLibrary {

    private final Path library;
    private final Optional<Path> rTxt;
    private final Optional<List<Path>> assets;
    private final Optional<Path> sourceJar;

    private StaticLibrary(Path library, Optional<Path> rTxt, Optional<List<Path>> assets,
            Optional<Path> sourceJar) {
        this.library = library;
        this.rTxt = rTxt;
        this.assets = assets;
        this.sourceJar = sourceJar;
    }

    public static StaticLibrary from(Path library) {
        return of(library, Optional.empty(), Optional.empty(), Optional.empty());
    }

    public static StaticLibrary from(Path library, Path rTxt) {
        return of(library, Optional.of(rTxt), Optional.empty(), Optional.empty());
    }

    private static StaticLibrary of(Path library, Optional<Path> rTxt, Optional<List<Path>> assets,
            Optional<Path> sourceJar) {
        return new StaticLibrary(library, rTxt, assets, sourceJar);
    }

    public static StaticLibrary from(Path library, Path rTxt, ImmutableList<Path> assetDirs) {
        return of(library, Optional.ofNullable(rTxt), Optional.ofNullable(assetDirs), Optional.empty());
    }

    public static StaticLibrary from(Path library, Path rTxt, ImmutableList<Path> assetDirs, Path sourceJar) {
        return of(library, Optional.ofNullable(rTxt), Optional.ofNullable(assetDirs),
                Optional.ofNullable(sourceJar));
    }

    public static Collection<String> toPathStrings(List<StaticLibrary> libraries) {
        return Lists.transform(libraries, StaticLibrary::asLibraryPathString);
    }

    public StaticLibrary copyLibraryTo(Path target) throws IOException {
        return of(Files.copy(library, target), rTxt, assets, sourceJar);
    }

    public StaticLibrary copyRTxtTo(@Nullable final Path target) {
        return of(library, rTxt.map(copyTo(target)), assets, sourceJar);
    }

    public StaticLibrary copySourceJarTo(@Nullable final Path target) {
        return of(library, rTxt, assets, sourceJar.map(copyTo(target)));
    }

    private Function<Path, Path> copyTo(Path target) {
        return input -> {
            if (target == null) {
                return input;
            }
            try {
                return Files.copy(input, target);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        };
    }

    @VisibleForTesting
    public String asLibraryPathString() {
        return fixForAapt2(library).toString();
    }

    // TODO(b/64140845): aapt2 doesn't recognize .ap_ as a valid library.
    private static Path fixForAapt2(Path library) {
        if (library.getFileName().toString().endsWith(".ap_")) {
            Path fixed = library.resolveSibling(library.getFileName().toString().replace(".ap_", ".apk"));
            // The file has already been "fixed"
            if (Files.exists(fixed)) {
                return fixed;
            }
            try {

                return Files.copy(library, fixed);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
        return library;
    }

    private List<Path> asAssetPathStrings() {
        return assets.orElse(ImmutableList.of());
    }

    public static Collection<String> toAssetPaths(List<StaticLibrary> libraries) {
        return libraries.stream().map(StaticLibrary::asAssetPathStrings).filter(Predicates.isNull())
                .flatMap(List::stream).map(Object::toString).collect(toImmutableList());
    }
}