blob: bdb0c72bf3f9dee4e36524f3cb23f6461b2e402e [file] [log] [blame]
/*
* 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);
}
}