CustomLibraryDescriptorWithDeferredConfig: J2K

This commit is contained in:
Dmitry Jemerov
2017-04-03 16:50:52 +02:00
parent ff985314cf
commit 2bb1b670f7
@@ -14,232 +14,188 @@
* limitations under the License.
*/
package org.jetbrains.kotlin.idea.framework;
package org.jetbrains.kotlin.idea.framework
import com.google.common.collect.Lists;
import com.intellij.framework.library.LibraryVersionProperties;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ModifiableRootModel;
import com.intellij.openapi.roots.OrderRootType;
import com.intellij.openapi.roots.libraries.Library;
import com.intellij.openapi.roots.libraries.LibraryKind;
import com.intellij.openapi.roots.libraries.NewLibraryConfiguration;
import com.intellij.openapi.roots.ui.configuration.libraries.CustomLibraryDescription;
import com.intellij.openapi.roots.ui.configuration.libraries.LibraryPresentationManager;
import com.intellij.openapi.roots.ui.configuration.libraryEditor.LibraryEditor;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import kotlin.jvm.functions.Function1;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.idea.configuration.*;
import org.jetbrains.kotlin.idea.framework.ui.CreateLibraryDialog;
import org.jetbrains.kotlin.idea.framework.ui.FileUIUtils;
import org.jetbrains.kotlin.idea.util.projectStructure.ProjectStructureUtilKt;
import com.google.common.collect.Lists
import com.intellij.framework.library.LibraryVersionProperties
import com.intellij.openapi.module.Module
import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.ModifiableRootModel
import com.intellij.openapi.roots.OrderRootType
import com.intellij.openapi.roots.libraries.Library
import com.intellij.openapi.roots.libraries.LibraryKind
import com.intellij.openapi.roots.libraries.NewLibraryConfiguration
import com.intellij.openapi.roots.ui.configuration.libraries.CustomLibraryDescription
import com.intellij.openapi.roots.ui.configuration.libraries.LibraryPresentationManager
import com.intellij.openapi.roots.ui.configuration.libraryEditor.LibraryEditor
import com.intellij.openapi.util.io.FileUtil
import com.intellij.openapi.vfs.VfsUtil
import com.intellij.openapi.vfs.VirtualFile
import org.jetbrains.kotlin.idea.configuration.KotlinWithLibraryConfigurator
import org.jetbrains.kotlin.idea.configuration.createConfigureKotlinNotificationCollector
import org.jetbrains.kotlin.idea.configuration.getConfiguratorByName
import org.jetbrains.kotlin.idea.framework.ui.CreateLibraryDialog
import org.jetbrains.kotlin.idea.framework.ui.FileUIUtils
import org.jetbrains.kotlin.idea.util.projectStructure.findLibrary
import org.jetbrains.kotlin.idea.util.projectStructure.getModuleDir
import org.jetbrains.kotlin.idea.util.projectStructure.replaceFileRoot
import java.io.File
import java.util.*
import javax.swing.JComponent
import javax.swing.*;
import java.io.File;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
/**
* @param project null when project doesn't exist yet (called from project wizard)
*/
abstract class CustomLibraryDescriptorWithDeferredConfig
(
project: Project?,
private val configuratorName: String,
private val libraryName: String,
private val dialogTitle: String,
private val modulesSeparatorCaption: String,
private val libraryKind: LibraryKind,
private val suitableLibraryKinds: Set<LibraryKind>
) : CustomLibraryDescription() {
private val projectBaseDir: VirtualFile?
public abstract class CustomLibraryDescriptorWithDeferredConfig extends CustomLibraryDescription {
var copyFileRequests: DeferredCopyFileRequests? = null
private set
private static final String DEFAULT_LIB_DIR_NAME = "lib";
private final String configuratorName;
private final String libraryName;
private final String dialogTitle;
private final String modulesSeparatorCaption;
private final LibraryKind libraryKind;
private final Set<? extends LibraryKind> suitableLibraryKinds;
private final VirtualFile projectBaseDir;
private DeferredCopyFileRequests deferredCopyFileRequests;
/**
* @param project null when project doesn't exist yet (called from project wizard)
*/
public CustomLibraryDescriptorWithDeferredConfig(
@Nullable Project project,
@NotNull String configuratorName,
@NotNull String libraryName,
@NotNull String dialogTitle,
@NotNull String modulesSeparatorCaption,
@NotNull LibraryKind libraryKind,
@NotNull Set<? extends LibraryKind> suitableLibraryKinds
) {
this.projectBaseDir = project != null ? project.getBaseDir() : null;
this.configuratorName = configuratorName;
this.libraryName = libraryName;
this.dialogTitle = dialogTitle;
this.modulesSeparatorCaption = modulesSeparatorCaption;
this.libraryKind = libraryKind;
this.suitableLibraryKinds = suitableLibraryKinds;
init {
this.projectBaseDir = project?.baseDir
}
@Nullable
public DeferredCopyFileRequests getCopyFileRequests() {
return deferredCopyFileRequests;
override fun getSuitableLibraryKinds(): Set<LibraryKind> {
return suitableLibraryKinds
}
@NotNull
@Override
public Set<? extends LibraryKind> getSuitableLibraryKinds() {
return suitableLibraryKinds;
}
fun finishLibConfiguration(module: Module, rootModel: ModifiableRootModel) {
val deferredCopyFileRequests = copyFileRequests ?: return
public void finishLibConfiguration(@NotNull Module module, @NotNull ModifiableRootModel rootModel) {
DeferredCopyFileRequests deferredCopyFileRequests = getCopyFileRequests();
if (deferredCopyFileRequests == null) return;
val library = rootModel.orderEntries().findLibrary { library ->
val libraryPresentationManager = LibraryPresentationManager.getInstance()
val classFiles = Arrays.asList(*library.getFiles(OrderRootType.CLASSES))
Library library = ProjectStructureUtilKt.findLibrary(rootModel.orderEntries(), new Function1<Library, Boolean>() {
@Override
public Boolean invoke(@NotNull Library library) {
LibraryPresentationManager libraryPresentationManager = LibraryPresentationManager.getInstance();
List<VirtualFile> classFiles = Arrays.asList(library.getFiles(OrderRootType.CLASSES));
libraryPresentationManager.isLibraryOfKind(classFiles, libraryKind)
} ?: return
return libraryPresentationManager.isLibraryOfKind(classFiles, libraryKind);
}
});
if (library == null) {
return;
}
Library.ModifiableModel model = library.getModifiableModel();
val model = library.modifiableModel
try {
deferredCopyFileRequests.performRequests(module.getProject(), ProjectStructureUtilKt.getModuleDir(module), model);
deferredCopyFileRequests.performRequests(module.project, module.getModuleDir(), model)
}
finally {
model.commit();
model.commit()
}
}
public static class DeferredCopyFileRequests {
private final List<CopyFileRequest> copyFilesRequests = Lists.newArrayList();
private final KotlinWithLibraryConfigurator configurator;
class DeferredCopyFileRequests(private val configurator: KotlinWithLibraryConfigurator) {
private val copyFilesRequests = Lists.newArrayList<CopyFileRequest>()
public DeferredCopyFileRequests(KotlinWithLibraryConfigurator configurator) {
this.configurator = configurator;
}
fun performRequests(project: Project, relativePath: String, model: Library.ModifiableModel) {
val collector = createConfigureKotlinNotificationCollector(project)
for (request in copyFilesRequests) {
val destinationPath = if (FileUtil.isAbsolute(request.toDir))
request.toDir
else
File(relativePath, request.toDir).path
public void performRequests(@NotNull Project project, @NotNull String relativePath, Library.ModifiableModel model) {
NotificationMessageCollector collector = NotificationMessageCollectorKt.createConfigureKotlinNotificationCollector(project);
for (CopyFileRequest request : copyFilesRequests) {
String destinationPath = FileUtil.isAbsolute(request.toDir) ?
request.toDir :
new File(relativePath, request.toDir).getPath();
val resultFile = configurator.copyFileToDir(request.file, destinationPath, collector)
File resultFile = configurator.copyFileToDir(request.file, destinationPath, collector);
if (request.replaceInLib) {
ProjectStructureUtilKt.replaceFileRoot(model, request.file, resultFile);
if (request.replaceInLib && resultFile != null) {
model.replaceFileRoot(request.file, resultFile)
}
}
collector.showNotification();
collector.showNotification()
}
public void addCopyWithReplaceRequest(@NotNull File file, @NotNull String copyIntoPath) {
copyFilesRequests.add(new CopyFileRequest(copyIntoPath, file, true));
fun addCopyWithReplaceRequest(file: File, copyIntoPath: String) {
copyFilesRequests.add(CopyFileRequest(copyIntoPath, file, true))
}
public static class CopyFileRequest {
private final String toDir;
private final File file;
private final boolean replaceInLib;
public CopyFileRequest(String dir, File file, boolean replaceInLib) {
toDir = dir;
this.file = file;
this.replaceInLib = replaceInLib;
}
}
class CopyFileRequest(val toDir: String, val file: File, val replaceInLib: Boolean)
}
@Nullable
@Override
public NewLibraryConfiguration createNewLibrary(@NotNull JComponent parentComponent, @Nullable VirtualFile contextDirectory) {
KotlinWithLibraryConfigurator configurator = getConfigurator();
override fun createNewLibrary(parentComponent: JComponent, contextDirectory: VirtualFile?): NewLibraryConfiguration? {
val configurator = configurator
deferredCopyFileRequests = new DeferredCopyFileRequests(configurator);
copyFileRequests = DeferredCopyFileRequests(configurator)
String defaultPathToJarFile = projectBaseDir == null ? DEFAULT_LIB_DIR_NAME
: FileUIUtils.createRelativePath(null, projectBaseDir, DEFAULT_LIB_DIR_NAME);
val defaultPathToJarFile = if (projectBaseDir == null)
DEFAULT_LIB_DIR_NAME
else
FileUIUtils.createRelativePath(null, projectBaseDir, DEFAULT_LIB_DIR_NAME)
RuntimeLibraryFiles files = configurator.getExistingJarFiles();
val files = configurator.existingJarFiles
File runtimeJar;
File reflectJar;
File runtimeSrcJar;
val runtimeJar: File
var reflectJar: File?
var runtimeSrcJar: File
File stdJarInDefaultPath = files.getRuntimeDestination(defaultPathToJarFile);
val stdJarInDefaultPath = files.getRuntimeDestination(defaultPathToJarFile)
if (projectBaseDir != null && stdJarInDefaultPath.exists()) {
runtimeJar = stdJarInDefaultPath;
runtimeJar = stdJarInDefaultPath
reflectJar = files.getReflectDestination(defaultPathToJarFile);
reflectJar = files.getReflectDestination(defaultPathToJarFile)
if (reflectJar != null && !reflectJar.exists()) {
reflectJar = files.getReflectJar();
assert reflectJar != null : "getReflectDestination != null, but getReflectJar == null";
deferredCopyFileRequests.addCopyWithReplaceRequest(reflectJar, runtimeJar.getParent());
reflectJar = files.reflectJar
assert(reflectJar != null) { "getReflectDestination != null, but getReflectJar == null" }
copyFileRequests!!.addCopyWithReplaceRequest(reflectJar!!, runtimeJar.parent)
}
runtimeSrcJar = files.getRuntimeSourcesDestination(defaultPathToJarFile);
runtimeSrcJar = files.getRuntimeSourcesDestination(defaultPathToJarFile)
if (!runtimeSrcJar.exists()) {
runtimeSrcJar = files.getRuntimeSourcesJar();
deferredCopyFileRequests.addCopyWithReplaceRequest(runtimeSrcJar, runtimeJar.getParent());
runtimeSrcJar = files.runtimeSourcesJar
copyFileRequests!!.addCopyWithReplaceRequest(runtimeSrcJar, runtimeJar.parent)
}
}
else {
CreateLibraryDialog dialog = new CreateLibraryDialog(defaultPathToJarFile, dialogTitle, modulesSeparatorCaption);
dialog.show();
val dialog = CreateLibraryDialog(defaultPathToJarFile, dialogTitle, modulesSeparatorCaption)
dialog.show()
if (!dialog.isOK()) return null;
if (!dialog.isOK) return null
String copyIntoPath = dialog.getCopyIntoPath();
val copyIntoPath = dialog.copyIntoPath
if (copyIntoPath != null) {
for (File file : files.getAllJars()) {
deferredCopyFileRequests.addCopyWithReplaceRequest(file, copyIntoPath);
for (file in files.getAllJars()) {
copyFileRequests!!.addCopyWithReplaceRequest(file, copyIntoPath)
}
}
runtimeJar = files.getRuntimeJar();
reflectJar = files.getReflectJar();
runtimeSrcJar = files.getRuntimeSourcesJar();
runtimeJar = files.runtimeJar
reflectJar = files.reflectJar
runtimeSrcJar = files.runtimeSourcesJar
}
return createConfiguration(Arrays.asList(runtimeJar, reflectJar), runtimeSrcJar);
return createConfiguration(Arrays.asList<File>(runtimeJar, reflectJar), runtimeSrcJar)
}
@NotNull
private KotlinWithLibraryConfigurator getConfigurator() {
KotlinWithLibraryConfigurator configurator =
(KotlinWithLibraryConfigurator) ConfigureKotlinInProjectUtilsKt.getConfiguratorByName(configuratorName);
assert configurator != null : "Configurator with name " + configuratorName + " should exists";
return configurator;
}
private val configurator: KotlinWithLibraryConfigurator
get() {
val configurator = getConfiguratorByName(configuratorName) as KotlinWithLibraryConfigurator? ?: error("Configurator with name $configuratorName should exists")
return configurator
}
// Implements an API added in IDEA 16
@Nullable
public NewLibraryConfiguration createNewLibraryWithDefaultSettings(@Nullable VirtualFile contextDirectory) {
RuntimeLibraryFiles files = getConfigurator().getExistingJarFiles();
return createConfiguration(Arrays.asList(files.getRuntimeJar(), files.getReflectJar()), files.getRuntimeSourcesJar());
override fun createNewLibraryWithDefaultSettings(contextDirectory: VirtualFile?): NewLibraryConfiguration? {
val files = configurator.existingJarFiles
return createConfiguration(Arrays.asList<File>(files.runtimeJar, files.reflectJar), files.runtimeSourcesJar)
}
@NotNull
protected NewLibraryConfiguration createConfiguration(@NotNull final List<File> libraryFiles, @NotNull final File librarySrcFile) {
return new NewLibraryConfiguration(libraryName, null, new LibraryVersionProperties()) {
@Override
public void addRoots(@NotNull LibraryEditor editor) {
for (File libraryFile : libraryFiles) {
protected fun createConfiguration(libraryFiles: List<File>, librarySrcFile: File): NewLibraryConfiguration {
return object : NewLibraryConfiguration(libraryName, null, LibraryVersionProperties()) {
override fun addRoots(editor: LibraryEditor) {
for (libraryFile in libraryFiles) {
if (libraryFile != null) {
editor.addRoot(VfsUtil.getUrlForLibraryRoot(libraryFile), OrderRootType.CLASSES);
editor.addRoot(VfsUtil.getUrlForLibraryRoot(libraryFile), OrderRootType.CLASSES)
}
}
editor.addRoot(VfsUtil.getUrlForLibraryRoot(librarySrcFile), OrderRootType.SOURCES);
editor.addRoot(VfsUtil.getUrlForLibraryRoot(librarySrcFile), OrderRootType.SOURCES)
}
};
}
}
companion object {
private val DEFAULT_LIB_DIR_NAME = "lib"
}
}