mirror of
https://github.com/TermoraDev/termora.git
synced 2026-01-16 02:12:58 +08:00
chore: transfer supports custom type
This commit is contained in:
@@ -3,7 +3,7 @@ plugins {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
project.version = "0.0.3"
|
project.version = "0.0.4"
|
||||||
|
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import java.nio.channels.SeekableByteChannel
|
|||||||
import java.nio.file.*
|
import java.nio.file.*
|
||||||
import java.nio.file.attribute.*
|
import java.nio.file.attribute.*
|
||||||
import java.nio.file.spi.FileSystemProvider
|
import java.nio.file.spi.FileSystemProvider
|
||||||
|
import java.util.concurrent.atomic.AtomicReference
|
||||||
import kotlin.io.path.absolutePathString
|
import kotlin.io.path.absolutePathString
|
||||||
import kotlin.io.path.name
|
import kotlin.io.path.name
|
||||||
|
|
||||||
@@ -63,25 +64,33 @@ class S3FileSystemProvider(private val minioClient: MinioClient) : FileSystemPro
|
|||||||
private fun createStreamer(path: S3Path): OutputStream {
|
private fun createStreamer(path: S3Path): OutputStream {
|
||||||
val pis = PipedInputStream()
|
val pis = PipedInputStream()
|
||||||
val pos = PipedOutputStream(pis)
|
val pos = PipedOutputStream(pis)
|
||||||
|
val exception = AtomicReference<Throwable>()
|
||||||
|
|
||||||
val thread = Thread.ofVirtual().start {
|
val thread = Thread.ofVirtual().start {
|
||||||
minioClient.putObject(
|
try {
|
||||||
PutObjectArgs.builder()
|
minioClient.putObject(
|
||||||
.bucket(path.bucketName)
|
PutObjectArgs.builder()
|
||||||
.stream(pis, -1, 32 * 1024 * 1024)
|
.bucket(path.bucketName)
|
||||||
.`object`(path.objectName).build()
|
.stream(pis, -1, 32 * 1024 * 1024)
|
||||||
)
|
.`object`(path.objectName).build()
|
||||||
IOUtils.closeQuietly(pis)
|
)
|
||||||
|
} catch (e: Exception) {
|
||||||
|
exception.set(e)
|
||||||
|
} finally {
|
||||||
|
IOUtils.closeQuietly(pis)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return object : OutputStream() {
|
return object : OutputStream() {
|
||||||
override fun write(b: Int) {
|
override fun write(b: Int) {
|
||||||
|
val exception = exception.get()
|
||||||
|
if (exception != null) throw exception
|
||||||
pos.write(b)
|
pos.write(b)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun close() {
|
override fun close() {
|
||||||
pos.close()
|
pos.close()
|
||||||
thread.join()
|
if (thread.isAlive) thread.join()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package app.termora.plugins.s3
|
package app.termora.plugins.s3
|
||||||
|
|
||||||
|
import app.termora.transfer.WithPathAttributes
|
||||||
import org.apache.sshd.common.file.util.BasePath
|
import org.apache.sshd.common.file.util.BasePath
|
||||||
import java.nio.file.LinkOption
|
import java.nio.file.LinkOption
|
||||||
import java.nio.file.Path
|
import java.nio.file.Path
|
||||||
@@ -9,7 +10,7 @@ class S3Path(
|
|||||||
fileSystem: S3FileSystem,
|
fileSystem: S3FileSystem,
|
||||||
root: String?,
|
root: String?,
|
||||||
names: List<String>,
|
names: List<String>,
|
||||||
) : BasePath<S3Path, S3FileSystem>(fileSystem, root, names) {
|
) : BasePath<S3Path, S3FileSystem>(fileSystem, root, names), WithPathAttributes {
|
||||||
|
|
||||||
|
|
||||||
private val separator get() = fileSystem.separator
|
private val separator get() = fileSystem.separator
|
||||||
@@ -41,6 +42,11 @@ class S3Path(
|
|||||||
*/
|
*/
|
||||||
val objectName: String get() = names.subList(1, names.size).joinToString(separator)
|
val objectName: String get() = names.subList(1, names.size).joinToString(separator)
|
||||||
|
|
||||||
|
override fun getCustomType(): String? {
|
||||||
|
if (isBucket) return "Bucket"
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
override fun toRealPath(vararg options: LinkOption): Path {
|
override fun toRealPath(vararg options: LinkOption): Path {
|
||||||
return toAbsolutePath()
|
return toAbsolutePath()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,5 @@
|
|||||||
package app.termora.plugins.s3
|
package app.termora.plugins.s3
|
||||||
|
|
||||||
import app.termora.DynamicIcon
|
|
||||||
import app.termora.I18n
|
|
||||||
import app.termora.Icons
|
|
||||||
import app.termora.plugin.Extension
|
import app.termora.plugin.Extension
|
||||||
import app.termora.plugin.ExtensionSupport
|
import app.termora.plugin.ExtensionSupport
|
||||||
import app.termora.plugin.PaidPlugin
|
import app.termora.plugin.PaidPlugin
|
||||||
|
|||||||
@@ -1115,7 +1115,7 @@ class TransportPanel(
|
|||||||
|
|
||||||
var text = when (column) {
|
var text = when (column) {
|
||||||
TransportTableModel.COLUMN_NAME -> attributes.name
|
TransportTableModel.COLUMN_NAME -> attributes.name
|
||||||
TransportTableModel.COLUMN_TYPE -> attributes.type
|
TransportTableModel.COLUMN_TYPE -> getType(row, attributes)
|
||||||
TransportTableModel.COLUMN_FILE_SIZE -> formatBytes(attributes.fileSize)
|
TransportTableModel.COLUMN_FILE_SIZE -> formatBytes(attributes.fileSize)
|
||||||
// @formatter:off
|
// @formatter:off
|
||||||
TransportTableModel.COLUMN_LAST_MODIFIED_TIME -> DateFormatUtils.format(Date(attributes.lastModifiedTime), I18n.getString("termora.date-format"))
|
TransportTableModel.COLUMN_LAST_MODIFIED_TIME -> DateFormatUtils.format(Date(attributes.lastModifiedTime), I18n.getString("termora.date-format"))
|
||||||
@@ -1164,6 +1164,15 @@ class TransportPanel(
|
|||||||
|
|
||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun getType(row: Int, attributes: Attributes): String {
|
||||||
|
val path = model.getPath(sorter.convertRowIndexToModel(row))
|
||||||
|
if (path is WithPathAttributes) {
|
||||||
|
val type = path.getCustomType()
|
||||||
|
if (type != null) return type
|
||||||
|
}
|
||||||
|
return attributes.type
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private inner class MyUndoManager : UndoManager() {
|
private inner class MyUndoManager : UndoManager() {
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package app.termora.transfer
|
||||||
|
|
||||||
|
interface WithPathAttributes {
|
||||||
|
/**
|
||||||
|
* 获取类型
|
||||||
|
*/
|
||||||
|
fun getCustomType(): String? = null
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user