Skip to content

Commit

Permalink
IJMP-1673: improve implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
Dzianis Lisiankou committed May 16, 2024
1 parent 3d8d27c commit f3039ac
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,20 @@

package eu.ibagroup.formainframe.dataops.content.synchronizer

import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.application.runReadAction
import com.intellij.openapi.diagnostic.logger
import com.intellij.openapi.progress.ProgressIndicator
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.openapi.vfs.newvfs.events.VFileDeleteEvent
import com.intellij.openapi.vfs.newvfs.events.VFileEvent
import eu.ibagroup.formainframe.dataops.DataOpsManager
import eu.ibagroup.formainframe.dataops.attributes.FileAttributes
import eu.ibagroup.formainframe.dataops.attributes.RemoteUssAttributes
import eu.ibagroup.formainframe.editor.FileContentChangeListener
import eu.ibagroup.formainframe.utils.*
import eu.ibagroup.formainframe.vfs.MFBulkFileListener
import eu.ibagroup.formainframe.vfs.MFVirtualFileSystem
import java.io.IOException
import java.util.concurrent.ConcurrentHashMap

Expand All @@ -45,6 +50,17 @@ abstract class RemoteAttributedContentSynchronizer<FAttributes : FileAttributes>
}
}
)
subscribe(
componentManager = ApplicationManager.getApplication(),
topic = MFVirtualFileSystem.MF_VFS_CHANGES_TOPIC,
handler = object : MFBulkFileListener {
override fun after(events: List<VFileEvent>) {
events.filterIsInstance<VFileDeleteEvent>().forEach { event ->
fetchedAtLeastOnce.removeIf { it.file == event.file }
}
}
}
)
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,11 +89,6 @@ class RemoteToLocalFileMover(val dataOpsManager: DataOpsManager) : AbstractFileM
contentSynchronizer.synchronizeWithRemote(syncProvider, progressIndicator)
val sourceContent = contentSynchronizer.successfulContentStorage(syncProvider)

runWriteActionInEdtAndWait {
if (operation.forceOverwriting) {
destFile.children.filter { it.name == newFileName && !it.isDirectory }.forEach { it.delete(this) }
}
}
val createdFileJava = Paths.get(destFile.path, newFileName).toFile().apply { createNewFile() }
if (!sourceFile.fileType.isBinary) {
setCreatedFileParams(createdFileJava, sourceFile)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ import eu.ibagroup.formainframe.dataops.operations.mover.MoveCopyOperation
import eu.ibagroup.formainframe.explorer.FileExplorerContentProvider
import eu.ibagroup.formainframe.utils.castOrNull
import eu.ibagroup.formainframe.utils.getMinimalCommonParents
import eu.ibagroup.formainframe.utils.runWriteActionInEdt
import eu.ibagroup.formainframe.utils.runWriteActionInEdtAndWait
import eu.ibagroup.formainframe.vfs.MFVirtualFile
import kotlin.concurrent.withLock

Expand Down Expand Up @@ -204,6 +204,19 @@ class ExplorerPasteProvider : PasteProvider {
)
)
}
// this step is necessary to clean old file after force overwriting performed
if (op.forceOverwriting) {
val nameResolver = dataOpsManager.getNameResolver(op.source, op.destination)
op.destination.children
.filter { file ->
file == nameResolver.getConflictingChild(op.source, op.destination) && !file.isDirectory
}
.apply {
runWriteActionInEdtAndWait {
forEach { file -> file.delete(this) }
}
}
}
explorerView.ignoreVFSChangeEvents.compareAndSet(false, true)
it.text = "${op.source.name} to ${op.destination.name}"
runCatching {
Expand All @@ -216,14 +229,6 @@ class ExplorerPasteProvider : PasteProvider {
if (explorerView.isCut.get()) {
copyPasteSupport.removeFromBuffer { node -> node.file == op.source }
}

// this step is necessary to clean old file after force overwriting performed.
if (op.forceOverwriting) {
val nameResolver = dataOpsManager.getNameResolver(op.source, op.destination)
op.destination.children
.filter { file -> file == nameResolver.getConflictingChild(op.source, op.destination) }
.forEach { file -> runWriteActionInEdt { file.delete(this) } }
}
}
.onFailure { throwable ->
explorerView.explorer.reportThrowable(throwable, project)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -497,6 +497,8 @@ class ExplorerPasteProviderTestSpec : WithApplicationShouldSpec({
val childDestinationVirtualFile = mockk<MFVirtualFile>()
val childDestFileAttributes = mockk<RemoteUssAttributes>()
every { childDestinationVirtualFile.name } returns "test_folder_source"
every { childDestinationVirtualFile.isDirectory } returns false
every { childDestinationVirtualFile.delete(any()) } just Runs
every { childDestFileAttributes.isDirectory } returns false
every { mockedSourceFile.children } returns arrayOf(childDestinationVirtualFile)

Expand Down Expand Up @@ -1216,6 +1218,7 @@ class ExplorerPasteProviderTestSpec : WithApplicationShouldSpec({

every { childDestinationVirtualFile.isDirectory } returns isDirectory
every { childDestinationVirtualFile.name } returns fileName
every { childDestinationVirtualFile.delete(any()) } just Runs
every { childDestFileAttributes.isDirectory } returns isDirectory
every { dataOpsManagerService.testInstance.tryToGetAttributes(childDestinationVirtualFile) } returns childDestFileAttributes
destinationChildFiles.add(childDestinationVirtualFile)
Expand Down

0 comments on commit f3039ac

Please sign in to comment.