diff --git a/idea/src/org/jetbrains/kotlin/idea/framework/CustomLibraryDescriptorWithDeferredConfig.kt b/idea/src/org/jetbrains/kotlin/idea/framework/CustomLibraryDescriptorWithDeferredConfig.kt index 51eb3e917bd..ebbe39d56de 100644 --- a/idea/src/org/jetbrains/kotlin/idea/framework/CustomLibraryDescriptorWithDeferredConfig.kt +++ b/idea/src/org/jetbrains/kotlin/idea/framework/CustomLibraryDescriptorWithDeferredConfig.kt @@ -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 +) : 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 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 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 { + return suitableLibraryKinds } - @NotNull - @Override - public Set 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() { - @Override - public Boolean invoke(@NotNull Library library) { - LibraryPresentationManager libraryPresentationManager = LibraryPresentationManager.getInstance(); - List 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 copyFilesRequests = Lists.newArrayList(); - private final KotlinWithLibraryConfigurator configurator; + class DeferredCopyFileRequests(private val configurator: KotlinWithLibraryConfigurator) { + private val copyFilesRequests = Lists.newArrayList() - 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(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(files.runtimeJar, files.reflectJar), files.runtimeSourcesJar) } - @NotNull - protected NewLibraryConfiguration createConfiguration(@NotNull final List 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, 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" } }