// Copyright 2015 Pants project contributors (see CONTRIBUTORS.md).
// Licensed under the Apache License, Version 2.0 (see LICENSE).
package com.twitter.intellij.pants.service.project.resolver;
import com.intellij.openapi.externalSystem.model.DataNode;
import com.intellij.openapi.externalSystem.model.ProjectKeys;
import com.intellij.openapi.externalSystem.model.project.LibraryData;
import com.intellij.openapi.externalSystem.model.project.LibraryDependencyData;
import com.intellij.openapi.externalSystem.model.project.LibraryLevel;
import com.intellij.openapi.externalSystem.model.project.LibraryPathType;
import com.intellij.openapi.externalSystem.model.project.ModuleData;
import com.intellij.openapi.externalSystem.model.project.ProjectData;
import com.intellij.openapi.util.io.FileUtil;
import com.twitter.intellij.pants.service.PantsCompileOptionsExecutor;
import com.twitter.intellij.pants.service.project.model.graph.BuildGraph;
import com.twitter.intellij.pants.service.project.PantsResolverExtension;
import com.twitter.intellij.pants.service.project.model.LibraryInfo;
import com.twitter.intellij.pants.service.project.model.ProjectInfo;
import com.twitter.intellij.pants.service.project.model.TargetInfo;
import com.twitter.intellij.pants.util.PantsConstants;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.util.Map;
import java.util.Optional;
public class PantsLibrariesExtension implements PantsResolverExtension {
@Override
public void resolve(
@NotNull ProjectInfo projectInfo,
@NotNull PantsCompileOptionsExecutor executor,
@NotNull DataNode<ProjectData> projectDataNode,
@NotNull Map<String, DataNode<ModuleData>> modules,
@NotNull Optional<BuildGraph> buildGraph
) {
for (Map.Entry<String, TargetInfo> entry : projectInfo.getSortedTargets()) {
final TargetInfo targetInfo = entry.getValue();
if (!targetInfo.isJarLibrary()) {
continue;
}
final String jarTarget = entry.getKey();
final LibraryData libraryData = new LibraryData(PantsConstants.SYSTEM_ID, jarTarget);
for (String libraryId : targetInfo.getLibraries()) {
final LibraryInfo libraryInfo = projectInfo.getLibraries(libraryId);
if (libraryInfo == null) {
LOG.debug("Couldn't find library " + libraryId);
continue;
}
addPathLoLibrary(libraryData, executor, LibraryPathType.BINARY, libraryInfo.getDefault());
addPathLoLibrary(libraryData, executor, LibraryPathType.SOURCE, libraryInfo.getSources());
addPathLoLibrary(libraryData, executor, LibraryPathType.DOC, libraryInfo.getJavadoc());
for (String otherLibraryInfo : libraryInfo.getJarsWithCustomClassifiers()) {
addPathLoLibrary(libraryData, executor, LibraryPathType.BINARY, otherLibraryInfo);
}
}
projectDataNode.createChild(ProjectKeys.LIBRARY, libraryData);
final DataNode<ModuleData> moduleDataNode = modules.get(jarTarget);
if (moduleDataNode == null) {
continue;
}
final LibraryDependencyData library = new LibraryDependencyData(
moduleDataNode.getData(),
libraryData,
LibraryLevel.PROJECT
);
library.setExported(true);
moduleDataNode.createChild(ProjectKeys.LIBRARY_DEPENDENCY, library);
}
}
private void addPathLoLibrary(
@NotNull LibraryData libraryData,
@NotNull PantsCompileOptionsExecutor executor,
@NotNull LibraryPathType binary,
@Nullable String path
) {
if (path == null) {
return;
}
path = FileUtil.isAbsolute(path) ? path : executor.getAbsolutePathFromWorkingDir(path);
if (new File(path).exists()) {
libraryData.addPath(binary, path);
}
}
}