From 334ffbf5e9644cae73305425fce3ec652d21c513 Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Mon, 12 Mar 2018 21:40:55 +0100 Subject: [PATCH] Make persistent storage per server base. Signed-off-by: Yahor Berdnikau --- .../moire/ultrasonic/cache/PermanentFileStorage.kt | 11 +++++++++-- .../org/moire/ultrasonic/cache/BaseStorageTest.kt | 4 +++- .../ultrasonic/cache/PermanentFileStorageTest.kt | 11 +++++++++-- .../moire/ultrasonic/service/MusicServiceFactory.java | 8 +++++++- 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/cache/src/main/kotlin/org/moire/ultrasonic/cache/PermanentFileStorage.kt b/cache/src/main/kotlin/org/moire/ultrasonic/cache/PermanentFileStorage.kt index 92404bcb..043e1fcc 100644 --- a/cache/src/main/kotlin/org/moire/ultrasonic/cache/PermanentFileStorage.kt +++ b/cache/src/main/kotlin/org/moire/ultrasonic/cache/PermanentFileStorage.kt @@ -11,10 +11,14 @@ internal const val STORAGE_DIR_NAME = "persistent_storage" /** * Provides access to permanent file based storage. * + * [serverId] is currently active server. Should be unique per server so stored data will not + * interfere with other server data. + * * Look at [org.moire.ultrasonic.cache.serializers] package for available [Serializer]s. */ class PermanentFileStorage( private val directories: Directories, + private val serverId: String, private val debug: Boolean = false ) { private val serializationContext = object : SerializationContext { @@ -60,7 +64,10 @@ class PermanentFileStorage( private fun getFile(name: String) = File(getStorageDir(), "$name.ser") - private fun getStorageDir() = File(directories.getInternalDataDir(), STORAGE_DIR_NAME).apply { - if (!exists()) mkdirs() + private fun getStorageDir(): File { + val mainDir = File(directories.getInternalDataDir(), STORAGE_DIR_NAME) + val serverDir = File(mainDir, serverId) + if (!serverDir.exists()) serverDir.mkdirs() + return serverDir } } diff --git a/cache/src/test/kotlin/org/moire/ultrasonic/cache/BaseStorageTest.kt b/cache/src/test/kotlin/org/moire/ultrasonic/cache/BaseStorageTest.kt index dd4a3ae7..bc06f483 100644 --- a/cache/src/test/kotlin/org/moire/ultrasonic/cache/BaseStorageTest.kt +++ b/cache/src/test/kotlin/org/moire/ultrasonic/cache/BaseStorageTest.kt @@ -21,6 +21,8 @@ abstract class BaseStorageTest { protected lateinit var mockDirectories: Directories protected lateinit var storage: PermanentFileStorage + open val serverId: String = "" + @Before fun setUp() { mockDirectories = mock { @@ -28,7 +30,7 @@ abstract class BaseStorageTest { on { getInternalCacheDir() } `it returns` tempFileRule.newFolder(INTERNAL_CACHE_FOLDER) on { getExternalCacheDir() } `it returns` tempFileRule.newFolder(EXTERNAL_CACHE_FOLDER) } - storage = PermanentFileStorage(mockDirectories, true) + storage = PermanentFileStorage(mockDirectories, serverId, true) } protected val storageDir get() = File(mockDirectories.getInternalDataDir(), STORAGE_DIR_NAME) diff --git a/cache/src/test/kotlin/org/moire/ultrasonic/cache/PermanentFileStorageTest.kt b/cache/src/test/kotlin/org/moire/ultrasonic/cache/PermanentFileStorageTest.kt index d000c562..0c22e946 100644 --- a/cache/src/test/kotlin/org/moire/ultrasonic/cache/PermanentFileStorageTest.kt +++ b/cache/src/test/kotlin/org/moire/ultrasonic/cache/PermanentFileStorageTest.kt @@ -6,17 +6,22 @@ import org.amshove.kluent.`should equal` import org.junit.Test import org.moire.ultrasonic.cache.serializers.musicFolderSerializer import org.moire.ultrasonic.domain.MusicFolder +import java.io.File /** * Integration test for [PermanentFileStorage]. */ class PermanentFileStorageTest : BaseStorageTest() { + override val serverId: String + get() = "some-server-id" + @Test fun `Should create storage dir if it is not exist`() { val item = MusicFolder("1", "2") storage.store("test", item, musicFolderSerializer) storageDir.exists() `should equal to` true + getServerStorageDir().exists() `should equal to` true } @Test @@ -26,7 +31,7 @@ class PermanentFileStorageTest : BaseStorageTest() { storage.store(name, item, musicFolderSerializer) - val storageFiles = storageDir.listFiles() + val storageFiles = getServerStorageDir().listFiles() storageFiles.size `should equal to` 1 storageFiles[0].name `should contain` name } @@ -62,7 +67,7 @@ class PermanentFileStorageTest : BaseStorageTest() { storage.clearAll() - storageDir.listFiles().size `should equal to` 0 + getServerStorageDir().listFiles().size `should equal to` 0 } @Test @@ -71,4 +76,6 @@ class PermanentFileStorageTest : BaseStorageTest() { loadedItem `should equal` null } + + private fun getServerStorageDir() = File(storageDir, serverId) } diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/service/MusicServiceFactory.java b/ultrasonic/src/main/java/org/moire/ultrasonic/service/MusicServiceFactory.java index c9bbea1d..3c29a6b5 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/service/MusicServiceFactory.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/service/MusicServiceFactory.java @@ -114,7 +114,13 @@ public class MusicServiceFactory { } private static PermanentFileStorage getPermanentFileStorage(final Context context) { - return new PermanentFileStorage(getDirectories(context), BuildConfig.DEBUG); + final SharedPreferences preferences = Util.getPreferences(context); + int instance = preferences.getInt(Constants.PREFERENCES_KEY_SERVER_INSTANCE, 1); + String serverUrl = preferences.getString( + Constants.PREFERENCES_KEY_SERVER_URL + instance, null); + String serverId = String.valueOf(Math.abs((serverUrl + instance).hashCode())); + + return new PermanentFileStorage(getDirectories(context), serverId, BuildConfig.DEBUG); } private static Directories getDirectories(final Context context) {