summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
Diffstat (limited to 'libs')
-rw-r--r--libs/documents/src/androidTest/java/org/the_jk/cleversync/documents/DocumentTreeAndroidTest.kt30
-rw-r--r--libs/documents/src/main/java/org/the_jk/cleversync/io/documents/DocumentDirectory.kt50
-rw-r--r--libs/test-utils/src/main/java/org/the_jk/cleversync/TreeAbstractTest.kt51
3 files changed, 129 insertions, 2 deletions
diff --git a/libs/documents/src/androidTest/java/org/the_jk/cleversync/documents/DocumentTreeAndroidTest.kt b/libs/documents/src/androidTest/java/org/the_jk/cleversync/documents/DocumentTreeAndroidTest.kt
index c9e0782..accd0db 100644
--- a/libs/documents/src/androidTest/java/org/the_jk/cleversync/documents/DocumentTreeAndroidTest.kt
+++ b/libs/documents/src/androidTest/java/org/the_jk/cleversync/documents/DocumentTreeAndroidTest.kt
@@ -148,6 +148,36 @@ class DocumentTreeAndroidTest : TreeAbstractTest() {
runTest { super.unicodeFilename() }
}
+ @Test
+ override fun openDirInDir() {
+ runTest { super.openDirInDir() }
+ }
+
+ @Test
+ override fun openFileInDir() {
+ runTest { super.openFileInDir() }
+ }
+
+ @Test
+ override fun createDirInDir() {
+ runTest { super.createDirInDir() }
+ }
+
+ @Test
+ override fun createFileInDir() {
+ runTest { super.createFileInDir() }
+ }
+
+ @Test
+ override fun removeDirInDir() {
+ runTest { super.removeDirInDir() }
+ }
+
+ @Test
+ override fun removeFileInDir() {
+ runTest { super.removeFileInDir() }
+ }
+
override fun supportSymlinks() = false
override fun idle() {
diff --git a/libs/documents/src/main/java/org/the_jk/cleversync/io/documents/DocumentDirectory.kt b/libs/documents/src/main/java/org/the_jk/cleversync/io/documents/DocumentDirectory.kt
index 23ffad9..613118d 100644
--- a/libs/documents/src/main/java/org/the_jk/cleversync/io/documents/DocumentDirectory.kt
+++ b/libs/documents/src/main/java/org/the_jk/cleversync/io/documents/DocumentDirectory.kt
@@ -62,13 +62,27 @@ internal open class DocumentDirectory(
}
override fun modifiableOpenDir(name: String): ModifiableDirectory? {
- val childMetadata = findChild(name) ?: return null
+ val parts = name.split('/')
+ val childMetadata = findChild(parts[0]) ?: return null
if (!childMetadata.isDir()) return null
val childTreeUri = DocumentsContract.buildChildDocumentsUriUsingTree(treeUri, childMetadata.documentId)
- return DocumentDirectory(contentResolver, childTreeUri, childMetadata, liveUpdateInterval)
+ var dir: ModifiableDirectory =
+ DocumentDirectory(contentResolver, childTreeUri, childMetadata, liveUpdateInterval)
+ for (i in 1..<parts.size) {
+ dir = dir.modifiableOpenDir(parts[i]) ?: return null
+ }
+ return dir
}
override fun modifiableOpenFile(name: String): ModifiableFile? {
+ val parts = name.split('/')
+ if (parts.size > 1) {
+ var dir: ModifiableDirectory = this
+ for (i in 0..<parts.size-1) {
+ dir = dir.modifiableOpenDir(parts[i]) ?: return null
+ }
+ return dir.modifiableOpenFile(parts.last())
+ }
val childMetadata = findChild(name) ?: return null
if (childMetadata.isDir()) return null
val documentUri = DocumentsContract.buildDocumentUriUsingTree(treeUri, childMetadata.documentId)
@@ -104,6 +118,14 @@ internal open class DocumentDirectory(
override fun createDirectory(name: String): ModifiableDirectory {
if (!metadata.supportsCreate()) throw IOException("Directory doesn't support creation")
+ val parts = name.split('/')
+ if (parts.size > 1) {
+ var dir: ModifiableDirectory = this
+ for (i in 0..<parts.size-1) {
+ dir = dir.modifiableOpenDir(parts[i]) ?: throw IOException("Path does not exist")
+ }
+ return dir.createDirectory(parts.last())
+ }
if (findChild(name) != null) throw FileAlreadyExistsException(name)
val documentUri = DocumentsContract.createDocument(
contentResolver,
@@ -120,6 +142,14 @@ internal open class DocumentDirectory(
override fun createFile(name: String): ModifiableFile {
if (!metadata.supportsCreate()) throw IOException("Directory doesn't support creation")
+ val parts = name.split('/')
+ if (parts.size > 1) {
+ var dir: ModifiableDirectory = this
+ for (i in 0..<parts.size-1) {
+ dir = dir.modifiableOpenDir(parts[i]) ?: throw IOException("Path does not exist")
+ }
+ return dir.createFile(parts.last())
+ }
if (findChild(name) != null) throw FileAlreadyExistsException(name)
// TODO: Handle .tar.gz and such? Is it worth it (will android find them anyway)
val dotIndex = name.lastIndexOf('.')
@@ -211,6 +241,14 @@ internal open class DocumentDirectory(
}
override fun removeDirectory(name: String): Boolean {
+ val parts = name.split('/')
+ if (parts.size > 1) {
+ var dir: ModifiableDirectory = this
+ for (i in 0..<parts.size - 1) {
+ dir = dir.modifiableOpenDir(parts[i]) ?: return false
+ }
+ return dir.removeDirectory(parts.last())
+ }
val childMetadata = findChild(name) ?: return false
if (!childMetadata.isDir()) return false
val childUri = DocumentsContract.buildDocumentUriUsingTree(treeUri, childMetadata.documentId)
@@ -220,6 +258,14 @@ internal open class DocumentDirectory(
}
override fun removeFile(name: String): Boolean {
+ val parts = name.split('/')
+ if (parts.size > 1) {
+ var dir: ModifiableDirectory = this
+ for (i in 0..<parts.size - 1) {
+ dir = dir.modifiableOpenDir(parts[i]) ?: return false
+ }
+ return dir.removeFile(parts.last())
+ }
val childMetadata = findChild(name) ?: return false
if (childMetadata.isDir()) return false
val documentUri = DocumentsContract.buildDocumentUriUsingTree(
diff --git a/libs/test-utils/src/main/java/org/the_jk/cleversync/TreeAbstractTest.kt b/libs/test-utils/src/main/java/org/the_jk/cleversync/TreeAbstractTest.kt
index a82001c..0a0b32d 100644
--- a/libs/test-utils/src/main/java/org/the_jk/cleversync/TreeAbstractTest.kt
+++ b/libs/test-utils/src/main/java/org/the_jk/cleversync/TreeAbstractTest.kt
@@ -439,6 +439,57 @@ abstract class TreeAbstractTest {
assertThat(content.files[0].name).isEqualTo(file.name)
}
+ @Test
+ open fun openDirInDir() {
+ val foo = tree.createDirectory("foo")
+ val bar = foo.createDirectory("bar")
+ val fooBar = tree.openDir("foo/bar")
+ assertThat(fooBar).isEqualTo(bar)
+ }
+
+ @Test
+ open fun openFileInDir() {
+ val foo = tree.createDirectory("foo")
+ val bar = foo.createFile("bar")
+ bar.write().use { it.write(1) }
+ val fooBar = tree.openFile("foo/bar")
+ assertThat(fooBar).isEqualTo(bar)
+ }
+
+ @Test
+ open fun createDirInDir() {
+ val foo = tree.createDirectory("foo")
+ val fooBar = tree.createDirectory("foo/bar")
+ val bar = foo.openDir("bar")
+ assertThat(bar).isEqualTo(fooBar)
+ }
+
+ @Test
+ open fun createFileInDir() {
+ val foo = tree.createDirectory("foo")
+ val fooBar = tree.createFile("foo/bar")
+ fooBar.write().use { it.write(1) }
+ val bar = foo.openFile("bar")
+ assertThat(bar).isEqualTo(fooBar)
+ }
+
+ @Test
+ open fun removeDirInDir() {
+ val foo = tree.createDirectory("foo")
+ foo.createDirectory("bar")
+ assertThat(tree.removeDirectory("foo/bar")).isTrue()
+ assertThat(foo.list().directories).isEmpty()
+ }
+
+ @Test
+ open fun removeFileInDir() {
+ val foo = tree.createDirectory("foo")
+ val bar = foo.createFile("bar")
+ bar.write().use { it.write(1) }
+ assertThat(tree.removeFile("foo/bar")).isTrue()
+ assertThat(foo.list().files).isEmpty()
+ }
+
protected abstract fun supportSymlinks(): Boolean
protected abstract fun idle()