/*
* Copyright 2016-present Facebook, Inc.
*
* 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.facebook.buck.jvm.java;
import com.facebook.buck.io.ProjectFilesystem;
import com.facebook.buck.jvm.core.JavaPackageFinder;
import com.facebook.buck.rules.CellPathResolver;
import com.facebook.buck.rules.CellPathResolverSerializer;
import com.facebook.buck.util.ClassLoaderCache;
import com.facebook.buck.util.Console;
import com.facebook.buck.util.ProcessExecutor;
import com.facebook.buck.util.ProcessExecutorSerializer;
import com.facebook.buck.util.Verbosity;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import java.io.PrintStream;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map;
import java.util.Optional;
public class JavacExecutionContextSerializer {
private JavacExecutionContextSerializer() {}
private static final String VERBOSITY = "verbosity";
private static final String CELL_PATH_RESOLVER = "cell_path_resolver";
private static final String JAVA_PACKAGE_FINDER = "java_package_finder";
private static final String PROJECT_FILE_SYSTEM_ROOT = "project_file_system_root";
private static final String CLASS_USAGE_FILE_WRITER = "class_usage_file_writer";
private static final String ENVIRONMENT = "env";
private static final String PROCESS_EXECUTOR = "process_executor";
private static final String ABSOLUTE_PATHS_FOR_INPUTS = "absolute_paths_for_inputs";
private static final String DIRECT_TO_JAR_SETTINGS = "direct_to_jar_settings";
public static ImmutableMap<String, Object> serialize(JavacExecutionContext context) {
ImmutableMap.Builder<String, Object> builder = ImmutableMap.builder();
builder.put(VERBOSITY, context.getVerbosity().toString());
builder.put(
CELL_PATH_RESOLVER, CellPathResolverSerializer.serialize(context.getCellPathResolver()));
builder.put(
JAVA_PACKAGE_FINDER, JavaPackageFinderSerializer.serialize(context.getJavaPackageFinder()));
builder.put(PROJECT_FILE_SYSTEM_ROOT, context.getProjectFilesystem().getRootPath().toString());
builder.put(
CLASS_USAGE_FILE_WRITER,
ClassUsageFileWriterSerializer.serialize(context.getUsedClassesFileWriter()));
builder.put(ENVIRONMENT, context.getEnvironment());
builder.put(
PROCESS_EXECUTOR, ProcessExecutorSerializer.serialize(context.getProcessExecutor()));
builder.put(
ABSOLUTE_PATHS_FOR_INPUTS,
ImmutableList.copyOf(
context.getAbsolutePathsForInputs().stream().map(Path::toString).iterator()));
if (context.getDirectToJarOutputSettings().isPresent()) {
builder.put(
DIRECT_TO_JAR_SETTINGS,
DirectToJarOutputSettingsSerializer.serialize(
context.getDirectToJarOutputSettings().get()));
}
return builder.build();
}
@SuppressWarnings("unchecked")
public static JavacExecutionContext deserialize(
Map<String, Object> data,
JavacEventSink eventSink,
PrintStream stdErr,
ClassLoaderCache classLoaderCache,
Console console)
throws InterruptedException {
Verbosity verbosity =
Verbosity.valueOf((String) Preconditions.checkNotNull(data.get(VERBOSITY)));
CellPathResolver cellPathResolver =
CellPathResolverSerializer.deserialize(
(Map<String, Object>) Preconditions.checkNotNull(data.get(CELL_PATH_RESOLVER)));
JavaPackageFinder javaPackageFinder =
JavaPackageFinderSerializer.deserialize(
(Map<String, Object>) Preconditions.checkNotNull(data.get(JAVA_PACKAGE_FINDER)));
ProjectFilesystem projectFilesystem =
new ProjectFilesystem(
Paths.get((String) Preconditions.checkNotNull(data.get(PROJECT_FILE_SYSTEM_ROOT))));
ClassUsageFileWriter classUsageFileWriter =
ClassUsageFileWriterSerializer.deserialize(
(Map<String, Object>) Preconditions.checkNotNull(data.get(CLASS_USAGE_FILE_WRITER)));
ProcessExecutor processExecutor =
ProcessExecutorSerializer.deserialize(
(Map<String, Object>) Preconditions.checkNotNull(data.get(PROCESS_EXECUTOR)), console);
ImmutableList<Path> absolutePathsForInputs =
ImmutableList.copyOf(
((List<String>) Preconditions.checkNotNull(data.get(ABSOLUTE_PATHS_FOR_INPUTS)))
.stream()
.map(s -> Paths.get(s))
.iterator());
Optional<DirectToJarOutputSettings> directToJarOutputSettings = Optional.empty();
if (data.containsKey(DIRECT_TO_JAR_SETTINGS)) {
directToJarOutputSettings =
Optional.of(
DirectToJarOutputSettingsSerializer.deserialize(
(Map<String, Object>)
Preconditions.checkNotNull(data.get(DIRECT_TO_JAR_SETTINGS))));
}
return JavacExecutionContext.of(
eventSink,
stdErr,
classLoaderCache,
verbosity,
cellPathResolver,
javaPackageFinder,
projectFilesystem,
classUsageFileWriter,
(Map<String, String>)
Preconditions.checkNotNull(
data.get(ENVIRONMENT),
"Missing environment when deserializing JavacExectionContext"),
processExecutor,
absolutePathsForInputs,
directToJarOutputSettings);
}
}