diff --git a/src/main/kotlin/app/termora/transfer/TransferTableModel.kt b/src/main/kotlin/app/termora/transfer/TransferTableModel.kt index 51e9c2e..e918c42 100644 --- a/src/main/kotlin/app/termora/transfer/TransferTableModel.kt +++ b/src/main/kotlin/app/termora/transfer/TransferTableModel.kt @@ -379,7 +379,11 @@ class TransferTableModel(private val coroutineScope: CoroutineScope) : } continue } else if (canTransfer(node)) { - doTransfer(node) + if (continueTransfer(node, false)) { + doTransfer(node) + } else { + changeState(node, State.Failed) + } } lock.withLock { condition.signalAll() } } catch (_: CancellationException) { @@ -407,8 +411,9 @@ class TransferTableModel(private val coroutineScope: CoroutineScope) : } } } catch (e: Exception) { - node.tryChangeState(State.Failed) + tryChangeState(node, State.Failed) if (e !is UserCanceledException) { + node.setException(e) throw e } } finally { @@ -444,6 +449,12 @@ class TransferTableModel(private val coroutineScope: CoroutineScope) : fireTransferChanged(node) } + private fun tryChangeState(node: TransferTreeTableNode, state: State) { + if (node.tryChangeState(state)) { + fireTransferChanged(node) + } + } + private fun removeCompleted(node: TransferTreeTableNode) { if (node == getRoot()) return diff --git a/src/main/kotlin/app/termora/transfer/TransferTreeTableNode.kt b/src/main/kotlin/app/termora/transfer/TransferTreeTableNode.kt index bb8dc36..dc3992b 100644 --- a/src/main/kotlin/app/termora/transfer/TransferTreeTableNode.kt +++ b/src/main/kotlin/app/termora/transfer/TransferTreeTableNode.kt @@ -5,6 +5,7 @@ import app.termora.formatBytes import app.termora.formatSeconds import app.termora.transfer.TransferTableModel.Companion.COLUMN_COUNT import org.apache.commons.lang3.StringUtils +import org.apache.commons.lang3.exception.ExceptionUtils import org.jdesktop.swingx.treetable.DefaultMutableTreeTableNode import java.nio.file.FileSystems import java.nio.file.Path @@ -43,6 +44,8 @@ class TransferTreeTableNode(transfer: Transfer) : DefaultMutableTreeTableNode(tr */ private var state = State.Ready + private var exception: Exception? = null + override fun getColumnCount(): Int { return COLUMN_COUNT @@ -96,6 +99,14 @@ class TransferTreeTableNode(transfer: Transfer) : DefaultMutableTreeTableNode(tr return I18n.getString("termora.transport.sftp.status.deleting") } + if (state == State.Failed) { + val e = exception + if (e != null) { + val message = ExceptionUtils.getRootCauseMessage(e) + return "${I18n.getString("termora.transport.sftp.status.failed")}: $message" + } + } + return when (state) { State.Processing -> I18n.getString("termora.transport.sftp.status.transporting") State.Ready -> I18n.getString("termora.transport.sftp.status.waiting") @@ -130,6 +141,9 @@ class TransferTreeTableNode(transfer: Transfer) : DefaultMutableTreeTableNode(tr this.state = state } + fun setException(e: Exception) { + this.exception = e + } fun tryChangeState(state: State): Boolean { if (this.state == State.Done || this.state == State.Failed) {