Skip to content

Commit 782681c

Browse files
author
Eric Fenderbosch
committed
KotlinFeature no longer implements JacksonFeature; ABI compatibility cleanup
1 parent 19e7ea6 commit 782681c

File tree

5 files changed

+108
-35
lines changed

5 files changed

+108
-35
lines changed

src/main/kotlin/com/fasterxml/jackson/module/kotlin/Extensions.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ inline fun <reified T : Any> SimpleModule.addDeserializer(kClass: KClass<T>, des
6767
addDeserializer(kClass.javaObjectType, deserializer)
6868
}
6969

70-
fun Int.toBitSet(): BitSet {
70+
internal fun Int.toBitSet(): BitSet {
7171
var i = this
7272
var index = 0
7373
val bits = BitSet(32)
Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,15 @@
11
package com.fasterxml.jackson.module.kotlin
22

3-
import com.fasterxml.jackson.core.util.JacksonFeature
43
import java.util.*
4+
import kotlin.math.pow
55

6-
enum class KotlinFeature(private val enabledByDefault: Boolean, private val mask: Int) : JacksonFeature {
6+
enum class KotlinFeature(val enabledByDefault: Boolean) {
77

8-
NullToEmptyCollection(enabledByDefault = false, mask = 1),
9-
NullToEmptyMap(enabledByDefault = false, mask = 2),
10-
NullIsSameAsDefault(enabledByDefault = false, mask = 4),
11-
SingletonSupport(enabledByDefault = false, mask = 8),
12-
StrictNullChecks(enabledByDefault = false, mask = 16);
8+
NullToEmptyCollection(enabledByDefault = false),
9+
NullToEmptyMap(enabledByDefault = false),
10+
NullIsSameAsDefault(enabledByDefault = false),
11+
SingletonSupport(enabledByDefault = false),
12+
StrictNullChecks(enabledByDefault = false);
1313

14-
val bitSet: BitSet = mask.toBitSet()
15-
16-
override fun enabledByDefault() = enabledByDefault
17-
override fun getMask() = mask
18-
override fun enabledIn(flags: Int) = bitSet.intersects(flags.toBitSet())
14+
val bitSet: BitSet = 2.0.pow(ordinal).toInt().toBitSet()
1915
}

src/main/kotlin/com/fasterxml/jackson/module/kotlin/KotlinModule.kt

Lines changed: 93 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -32,28 +32,28 @@ fun Class<*>.isKotlinClass(): Boolean {
3232
* (e.g. List<String>) may contain null values after deserialization. Enabling it
3333
* protects against this but has significant performance impact.
3434
*/
35-
class KotlinModule private constructor(
36-
val reflectionCacheSize: Int,
37-
val nullToEmptyCollection: Boolean,
38-
val nullToEmptyMap: Boolean,
39-
val nullIsSameAsDefault: Boolean,
40-
val singletonSupport: SingletonSupport,
41-
val strictNullChecks: Boolean
35+
class KotlinModule @Deprecated(level = DeprecationLevel.WARNING, message = "Use KotlinModule.Builder") constructor(
36+
val reflectionCacheSize: Int = 512,
37+
val nullToEmptyCollection: Boolean = false,
38+
val nullToEmptyMap: Boolean = false,
39+
val nullIsSameAsDefault: Boolean = false,
40+
val singletonSupport: SingletonSupport = DISABLED,
41+
val strictNullChecks: Boolean = false
4242
) : SimpleModule(PackageVersion.VERSION) {
43-
@Deprecated(level = DeprecationLevel.WARNING, message = "Use KotlinModule.Builder")
43+
@Deprecated(level = DeprecationLevel.HIDDEN, message = "For ABI compatibility")
4444
constructor(
4545
reflectionCacheSize: Int,
4646
nullToEmptyCollection: Boolean,
4747
nullToEmptyMap: Boolean
4848
) : this(
4949
Builder()
5050
.withReflectionCacheSize(reflectionCacheSize)
51-
.set(NullToEmptyCollection, nullToEmptyCollection)
52-
.set(NullToEmptyMap, nullToEmptyMap)
51+
.configure(NullToEmptyCollection, nullToEmptyCollection)
52+
.configure(NullToEmptyMap, nullToEmptyMap)
5353
.disable(NullIsSameAsDefault)
5454
)
5555

56-
@Deprecated(level = DeprecationLevel.WARNING, message = "Use KotlinModule.Builder")
56+
@Deprecated(level = DeprecationLevel.HIDDEN, message = "For ABI compatibility")
5757
constructor(
5858
reflectionCacheSize: Int,
5959
nullToEmptyCollection: Boolean,
@@ -62,11 +62,12 @@ class KotlinModule private constructor(
6262
) : this(
6363
Builder()
6464
.withReflectionCacheSize(reflectionCacheSize)
65-
.set(NullToEmptyCollection, nullToEmptyCollection)
66-
.set(NullToEmptyMap, nullToEmptyMap)
67-
.set(NullIsSameAsDefault, nullIsSameAsDefault)
65+
.configure(NullToEmptyCollection, nullToEmptyCollection)
66+
.configure(NullToEmptyMap, nullToEmptyMap)
67+
.configure(NullIsSameAsDefault, nullIsSameAsDefault)
6868
)
6969

70+
@Suppress("DEPRECATION")
7071
private constructor(builder: Builder) : this(
7172
builder.reflectionCacheSize,
7273
builder.isEnabled(NullToEmptyCollection),
@@ -125,7 +126,7 @@ class KotlinModule private constructor(
125126
private set
126127

127128
private val bitSet: BitSet = 0.toBitSet().apply {
128-
KotlinFeature.values().filter { it.enabledByDefault() }.forEach { or(it.bitSet) }
129+
KotlinFeature.values().filter { it.enabledByDefault }.forEach { or(it.bitSet) }
129130
}
130131

131132
fun withReflectionCacheSize(reflectionCacheSize: Int) = apply {
@@ -140,13 +141,89 @@ class KotlinModule private constructor(
140141
bitSet.andNot(feature.bitSet)
141142
}
142143

143-
fun set(feature: KotlinFeature, enabled: Boolean) = when {
144+
fun configure(feature: KotlinFeature, enabled: Boolean) = when {
144145
enabled -> enable(feature)
145146
else -> disable(feature)
146147
}
147148

148149
fun isEnabled(feature: KotlinFeature): Boolean = bitSet.intersects(feature.bitSet)
149150

151+
@Deprecated(
152+
message = "Deprecated, use withReflectionCacheSize(reflectionCacheSize) instead.",
153+
replaceWith = ReplaceWith("isEnabled(reflectionCacheSize)")
154+
)
155+
fun reflectionCacheSize(reflectionCacheSize: Int) = apply {
156+
this.reflectionCacheSize = reflectionCacheSize
157+
}
158+
159+
@Deprecated(
160+
message = "Deprecated, use isEnabled(NullToEmptyCollection) instead.",
161+
replaceWith = ReplaceWith("isEnabled(NullToEmptyCollection)")
162+
)
163+
fun getNullToEmptyCollection() = isEnabled(NullToEmptyCollection)
164+
165+
@Deprecated(
166+
message = "Deprecated, use configure(NullToEmptyCollection, enabled) instead.",
167+
replaceWith = ReplaceWith("configure(NullToEmptyCollection, enabled)")
168+
)
169+
fun nullToEmptyCollection(nullToEmptyCollection: Boolean) =
170+
configure(NullToEmptyCollection, nullToEmptyCollection)
171+
172+
@Deprecated(
173+
message = "Deprecated, use isEnabled(NullToEmptyMap) instead.",
174+
replaceWith = ReplaceWith("isEnabled(NullToEmptyMap)")
175+
)
176+
177+
fun getNullToEmptyMap() = isEnabled(NullToEmptyMap)
178+
179+
@Deprecated(
180+
message = "Deprecated, use configure(NullToEmptyMap, enabled) instead.",
181+
replaceWith = ReplaceWith("configure(NullToEmptyMap, enabled)")
182+
)
183+
fun nullToEmptyMap(nullToEmptyMap: Boolean) = configure(NullToEmptyMap, nullToEmptyMap)
184+
185+
@Deprecated(
186+
message = "Deprecated, use isEnabled(NullIsSameAsDefault) instead.",
187+
replaceWith = ReplaceWith("isEnabled(NullIsSameAsDefault)")
188+
)
189+
fun getNullIsSameAsDefault() = isEnabled(NullIsSameAsDefault)
190+
191+
@Deprecated(
192+
message = "Deprecated, use configure(NullIsSameAsDefault, enabled) instead.",
193+
replaceWith = ReplaceWith("configure(NullIsSameAsDefault, enabled)")
194+
)
195+
fun nullIsSameAsDefault(nullIsSameAsDefault: Boolean) = configure(NullIsSameAsDefault, nullIsSameAsDefault)
196+
197+
@Deprecated(
198+
message = "Deprecated, use isEnabled(SingletonSupport) instead.",
199+
replaceWith = ReplaceWith("isEnabled(SingletonSupport)")
200+
)
201+
fun getSingletonSupport() = when {
202+
isEnabled(KotlinFeature.SingletonSupport) -> CANONICALIZE
203+
else -> DISABLED
204+
}
205+
206+
@Deprecated(
207+
message = "Deprecated, use configure(SingletonSupport, enabled) instead.",
208+
replaceWith = ReplaceWith("configure(SingletonSupport, enabled)")
209+
)
210+
fun singletonSupport(singletonSupport: SingletonSupport) = when (singletonSupport) {
211+
CANONICALIZE -> enable(KotlinFeature.SingletonSupport)
212+
else -> disable(KotlinFeature.SingletonSupport)
213+
}
214+
215+
@Deprecated(
216+
message = "Deprecated, use isEnabled(StrictNullChecks) instead.",
217+
replaceWith = ReplaceWith("isEnabled(StrictNullChecks)")
218+
)
219+
fun getStrictNullChecks() = isEnabled(StrictNullChecks)
220+
221+
@Deprecated(
222+
message = "Deprecated, use configure(StrictNullChecks, enabled) instead.",
223+
replaceWith = ReplaceWith("configure(StrictNullChecks, enabled)")
224+
)
225+
fun strictNullChecks(strictNullChecks: Boolean) = configure(StrictNullChecks, strictNullChecks)
226+
150227
fun build() = KotlinModule(this)
151228
}
152229
}

src/test/kotlin/com/fasterxml/jackson/module/kotlin/KotlinModuleTest.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@ class KotlinModuleTest {
2121
val module = KotlinModule.Builder().build()
2222

2323
assertEquals(module.reflectionCacheSize, 512)
24-
assertEquals(module.nullToEmptyCollection, NullToEmptyCollection.enabledByDefault())
25-
assertEquals(module.nullToEmptyMap, NullToEmptyMap.enabledByDefault())
26-
assertEquals(module.nullIsSameAsDefault, NullIsSameAsDefault.enabledByDefault())
27-
assertEquals(module.singletonSupport == CANONICALIZE, SingletonSupport.enabledByDefault())
28-
assertEquals(module.strictNullChecks, StrictNullChecks.enabledByDefault())
24+
assertEquals(module.nullToEmptyCollection, NullToEmptyCollection.enabledByDefault)
25+
assertEquals(module.nullToEmptyMap, NullToEmptyMap.enabledByDefault)
26+
assertEquals(module.nullIsSameAsDefault, NullIsSameAsDefault.enabledByDefault)
27+
assertEquals(module.singletonSupport == CANONICALIZE, SingletonSupport.enabledByDefault)
28+
assertEquals(module.strictNullChecks, StrictNullChecks.enabledByDefault)
2929
}
3030

3131
@Test

src/test/kotlin/com/fasterxml/jackson/module/kotlin/test/NullToDefaultTests.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import org.junit.Test
1111
class TestNullToDefault {
1212

1313
private fun createMapper(allowDefaultingByNull: Boolean) = ObjectMapper()
14-
.registerModule(kotlinModule { set(NullIsSameAsDefault, allowDefaultingByNull) })
14+
.registerModule(kotlinModule { configure(NullIsSameAsDefault, allowDefaultingByNull) })
1515

1616
private data class TestClass(val sku: Int = -1,
1717
val text: String,

0 commit comments

Comments
 (0)