Skip to content

Commit f90622a

Browse files
Adds nullable support
1 parent adcaa28 commit f90622a

File tree

11 files changed

+73
-32
lines changed

11 files changed

+73
-32
lines changed

library/src/main/java/nl/elements/objectstore/Converter.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,24 +15,24 @@ interface Converter {
1515
* Convert the value into bytes that will be used for IO.
1616
*/
1717

18-
fun serialize(key: String, value: Any, output: OutputStream)
18+
fun serialize(key: String, value: Any?, output: OutputStream)
1919

2020
/**
2121
* Convert the bytes from IO into the desired object.
2222
*/
2323

24-
fun <T : Any> deserialize(key: String, input: InputStream): T
24+
fun <T : Any> deserialize(key: String, input: InputStream): T?
2525

2626
companion object {
2727

2828
val DEFAULT = object : Converter {
2929

30-
override fun serialize(key: String, value: Any, output: OutputStream) =
30+
override fun serialize(key: String, value: Any?, output: OutputStream) =
3131
ObjectOutputStream(output).writeObject(value)
3232

3333
@Suppress("UNCHECKED_CAST")
34-
override fun <T : Any> deserialize(key: String, input: InputStream): T =
35-
ObjectInputStream(input).readObject() as T
34+
override fun <T : Any> deserialize(key: String, input: InputStream): T? =
35+
ObjectInputStream(input).readObject() as T?
3636

3737
}
3838

library/src/main/java/nl/elements/objectstore/ObjectStore.kt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,18 @@ interface ObjectStore : ReadableObjectStore, ObservableSource<ObjectStore.Event>
1818
val converter: Converter
1919
val transformer: Transformer
2020

21-
operator fun set(key: String, value: Any)
21+
operator fun set(key: String, value: Any?)
2222

2323
fun remove(key: String)
2424

25-
fun OutputStream.write(key: String, value: Any) =
25+
fun OutputStream.write(key: String, value: Any?) =
2626
ByteArrayOutputStream()
2727
.also { converter.serialize(key, value, it) }
2828
.toByteArray()
2929
.inputStream()
3030
.let { transformer.write(key, it, this@write) }
3131

32-
fun <T : Any> InputStream.read(key: String): T =
32+
fun <T : Any> InputStream.read(key: String): T? =
3333
ByteArrayOutputStream()
3434
.also { transformer.read(key, this@read, it) }
3535
.toByteArray()
@@ -57,7 +57,7 @@ fun ObjectStore.toObservable(): Observable<ObjectStore.Event> = Observable.defer
5757

5858
fun ObjectStore.toReadableObjectStore(): ReadableObjectStore = this
5959

60-
fun ObjectStore.writeToBytes(key: String, value: Any): ByteArray =
60+
fun ObjectStore.writeToBytes(key: String, value: Any?): ByteArray =
6161
ByteArrayOutputStream()
6262
.also { it.write(key, value) }
6363
.toByteArray()
@@ -114,13 +114,13 @@ private fun ObjectStore.withNamespace(namespace: String, next: ObjectStore): Obj
114114
override val keys: Set<String>
115115
get() = store.keys.map { namespace + it }.toMutableSet().apply { addAll(next.keys) }
116116

117-
override fun <T : Any> get(key: String): T =
117+
override fun <T : Any> get(key: String): T? =
118118
key.removeNamespace()?.let(store::get) ?: next[key]
119119

120120
override fun contains(key: String): Boolean =
121121
key.removeNamespace()?.let(store::contains) ?: next.contains(key)
122122

123-
override fun set(key: String, value: Any) =
123+
override fun set(key: String, value: Any?) =
124124
key.removeNamespace()?.let { store[it] = value } ?: next.set(key, value)
125125

126126
override fun remove(key: String) = key.removeNamespace()?.let(store::remove) ?: next.remove(key)
@@ -148,7 +148,7 @@ private fun unknownNamespaceObjectStore(): ObjectStore = object : ObjectStore {
148148
override val transformer: Transformer = Transformer.DEFAULT
149149
override val keys: Set<String> = emptySet()
150150

151-
override fun set(key: String, value: Any) = throw UnknownNamespaceException(key)
151+
override fun set(key: String, value: Any?) = throw UnknownNamespaceException(key)
152152

153153
override fun remove(key: String) = throw UnknownNamespaceException(key)
154154

library/src/main/java/nl/elements/objectstore/ObjectStoreModel.kt

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package nl.elements.objectstore
22

33
import nl.elements.objectstore.model.StringItem
4+
import nl.elements.objectstore.model.StringNullableItem
45
import kotlin.properties.ReadWriteProperty
56

67
abstract class ObjectStoreModel(
@@ -14,12 +15,22 @@ abstract class ObjectStoreModel(
1415
}
1516

1617
/**
17-
* Delegate an item with type string
18+
* Delegate an item with string
1819
* @param default value
19-
* @param key custom key
20+
* @param key custom key (optional)
2021
*/
21-
protected fun stringPref(
22+
protected fun stringItem(
2223
default: String = "",
2324
key: String? = null
2425
): ReadWriteProperty<ObjectStoreModel, String> = StringItem(default, key)
26+
27+
/**
28+
* Delegate an item with nullable string
29+
* @param default value
30+
* @param key custom key (optional)
31+
*/
32+
protected fun nullableStringItem(
33+
default: String? = null,
34+
key: String? = null
35+
): ReadWriteProperty<ObjectStoreModel, String?> = StringNullableItem(default, key)
2536
}

library/src/main/java/nl/elements/objectstore/ReadableObjectStore.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ interface ReadableObjectStore {
44

55
val keys: Set<String>
66

7-
operator fun <T : Any> get(key: String): T
7+
operator fun <T : Any> get(key: String): T?
88

99
operator fun contains(key: String): Boolean
1010

@@ -39,7 +39,7 @@ private fun combine(l: ReadableObjectStore, r: ReadableObjectStore): ReadableObj
3939
override val keys: Set<String>
4040
get() = l.keys.toMutableSet().apply { addAll(r.keys) }
4141

42-
override fun <T : Any> get(key: String): T =
42+
override fun <T : Any> get(key: String): T? =
4343
when (key) {
4444
in l -> l[key]
4545
else -> r[key]

library/src/main/java/nl/elements/objectstore/model/StringItem.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,17 @@ internal class StringItem(
88
override val key: String?
99
) : AbstractItem<String>() {
1010

11-
override fun getValue(model: ObjectStoreModel, property: KProperty<*>): String {
11+
override fun getValue(thisRef: ObjectStoreModel, property: KProperty<*>): String {
1212
val realKey = key ?: property.name
1313

14-
return if (model.store.contains(realKey)) {
15-
model.store.get(realKey)
14+
return if (thisRef.store.contains(realKey)) {
15+
thisRef.store.get(realKey) ?: default
1616
} else {
1717
default
1818
}
1919
}
2020

21-
override fun setValue(model: ObjectStoreModel, property: KProperty<*>, value: String) {
22-
model.store[key ?: property.name] = value
21+
override fun setValue(thisRef: ObjectStoreModel, property: KProperty<*>, value: String) {
22+
thisRef.store[key ?: property.name] = value
2323
}
2424
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package nl.elements.objectstore.model
2+
3+
import nl.elements.objectstore.ObjectStoreModel
4+
import kotlin.reflect.KProperty
5+
6+
internal class StringNullableItem(
7+
val default: String?,
8+
override val key: String?
9+
) : AbstractItem<String?>() {
10+
11+
override fun getValue(thisRef: ObjectStoreModel, property: KProperty<*>): String? {
12+
val realKey = key ?: property.name
13+
14+
return if (thisRef.store.contains(realKey)) {
15+
thisRef.store.get(realKey)
16+
} else {
17+
default
18+
}
19+
}
20+
21+
override fun setValue(thisRef: ObjectStoreModel, property: KProperty<*>, value: String?) {
22+
thisRef.store[key ?: property.name] = value
23+
}
24+
}

library/src/main/java/nl/elements/objectstore/stores/DatabaseStore.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,14 @@ class DatabaseStore(
3636
"""
3737
CREATE TABLE IF NOT EXISTS $table (
3838
$_ID STRING PRIMARY KEY UNIQUE,
39-
$VALUE BLOB NOT NULL
39+
$VALUE BLOB
4040
)
4141
"""
4242

4343
database.rawQuery(query, null).close()
4444
}
4545

46-
override fun set(key: String, value: Any) {
46+
override fun set(key: String, value: Any?) {
4747
val bytes = writeToBytes(key, value)
4848
val values = ContentValues().apply {
4949
put(_ID, key)

library/src/main/java/nl/elements/objectstore/stores/DirectoryStore.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class DirectoryStore(
2424
override val keys: Set<String>
2525
get() = directory.list().toSet()
2626

27-
override fun set(key: String, value: Any) {
27+
override fun set(key: String, value: Any?) {
2828
fileOf(key)
2929
.ensure()
3030
.outputStream()
@@ -33,7 +33,7 @@ class DirectoryStore(
3333
emit(Updated(key))
3434
}
3535

36-
override fun <T : Any> get(key: String): T =
36+
override fun <T : Any> get(key: String): T? =
3737
fileOf(key)
3838
.ensure()
3939
.inputStream()

library/src/main/java/nl/elements/objectstore/stores/MemoryStore.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@ class MemoryStore(
1717
override val keys: Set<String>
1818
get() = synchronized { data.keys.toSet() }
1919

20-
override fun <T : Any> get(key: String): T =
20+
override fun <T : Any> get(key: String): T? =
2121
synchronized { data[key]!! }
2222
.inputStream()
2323
.read(key)
2424

25-
override fun set(key: String, value: Any) {
25+
override fun set(key: String, value: Any?) {
2626
val bytes = writeToBytes(key, value)
2727

2828
synchronized { data[key] = bytes }

library/src/main/java/nl/elements/objectstore/stores/PreferencesStore.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,15 @@ class PreferencesStore(
2424
override val keys: Set<String>
2525
get() = preferences.all.keys
2626

27-
override fun set(key: String, value: Any) {
27+
override fun set(key: String, value: Any?) {
2828
writeToBytes(key, value)
2929
.let { Base64.encodeToString(it, 0) }
3030
.let { preferences.edit().putString(key, it).apply() }
3131

3232
emit(Updated(key))
3333
}
3434

35-
override fun <T : Any> get(key: String): T =
35+
override fun <T : Any> get(key: String): T? =
3636
preferences
3737
.getString(key, null)!!
3838
.let { Base64.decode(it, 0) }

0 commit comments

Comments
 (0)