| /* |
| * Copyright 2019 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.desugar.testing.junit; |
| |
| import com.google.auto.value.AutoValue; |
| import com.google.auto.value.extension.memoized.Memoized; |
| import com.google.common.collect.ImmutableList; |
| import com.google.common.collect.ImmutableListMultimap; |
| import com.google.common.collect.Iterables; |
| import com.google.devtools.build.android.desugar.Desugar.DesugarOptions; |
| import java.net.MalformedURLException; |
| import java.net.URL; |
| import java.net.URLClassLoader; |
| import java.nio.file.Path; |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| /** The transformation record that describes the desugaring of a jar. */ |
| @AutoValue |
| abstract class JarTransformationRecord { |
| |
| /** |
| * The full runtime path of a pre-transformationRecord jar. |
| * |
| * @see DesugarOptions#inputJars for details. |
| */ |
| abstract ImmutableList<Path> inputJars(); |
| |
| /** |
| * The full runtime path of a post-transformationRecord jar (deguared jar). |
| * |
| * @see DesugarOptions#inputJars for details. |
| */ |
| abstract ImmutableList<Path> outputJars(); |
| |
| /** @see DesugarOptions#classpath for details. */ |
| abstract ImmutableList<Path> classPathEntries(); |
| |
| /** @see DesugarOptions#bootclasspath for details. */ |
| abstract ImmutableList<Path> bootClassPathEntries(); |
| |
| /** The remaining command options used for desugaring. */ |
| abstract ImmutableListMultimap<String, String> extraCustomCommandOptions(); |
| |
| /** The factory method of this jar transformation record. */ |
| static JarTransformationRecord create( |
| ImmutableList<Path> inputJars, |
| ImmutableList<Path> outputJars, |
| ImmutableList<Path> classPathEntries, |
| ImmutableList<Path> bootClassPathEntries, |
| ImmutableListMultimap<String, String> extraCustomCommandOptions) { |
| return new AutoValue_JarTransformationRecord( |
| inputJars, outputJars, classPathEntries, bootClassPathEntries, extraCustomCommandOptions); |
| } |
| |
| final ImmutableList<String> getDesugarFlags() { |
| ImmutableList.Builder<String> args = ImmutableList.builder(); |
| inputJars().forEach(path -> args.add("--input=" + path)); |
| outputJars().forEach(path -> args.add("--output=" + path)); |
| classPathEntries().forEach(path -> args.add("--classpath_entry=" + path)); |
| bootClassPathEntries().forEach(path -> args.add("--bootclasspath_entry=" + path)); |
| extraCustomCommandOptions().forEach((k, v) -> args.add("--" + k + "=" + v)); |
| return args.build(); |
| } |
| |
| @Memoized |
| ClassLoader getOutputClassLoader() throws MalformedURLException { |
| List<URL> urls = new ArrayList<>(); |
| for (Path path : Iterables.concat(outputJars(), classPathEntries(), bootClassPathEntries())) { |
| urls.add(path.toUri().toURL()); |
| } |
| return URLClassLoader.newInstance(urls.toArray(new URL[0]), DesugarRule.BASE_CLASS_LOADER); |
| } |
| } |