/
DatabaseHolderDefinition.kt
64 lines (47 loc) · 2.27 KB
/
DatabaseHolderDefinition.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package com.raizlabs.android.dbflow.processor.definition
import com.raizlabs.android.dbflow.processor.ClassNames
import com.raizlabs.android.dbflow.processor.DatabaseHandler
import com.raizlabs.android.dbflow.processor.ProcessorManager
import com.squareup.javapoet.MethodSpec
import com.squareup.javapoet.TypeSpec
import javax.lang.model.element.Modifier
/**
* Description: Top-level writer that handles writing all [DatabaseDefinition]
* and [com.raizlabs.android.dbflow.annotation.TypeConverter]
*/
class DatabaseHolderDefinition(private val processorManager: ProcessorManager) : TypeDefinition {
private var className = ""
init {
val options = this.processorManager.processingEnvironment.options
if (options.containsKey(OPTION_TARGET_MODULE_NAME)) {
className = options[OPTION_TARGET_MODULE_NAME] ?: ""
}
className += ClassNames.DATABASE_HOLDER_STATIC_CLASS_NAME
}
override val typeSpec: TypeSpec
get() {
val typeBuilder = TypeSpec.classBuilder(this.className)
.addModifiers(Modifier.PUBLIC, Modifier.FINAL)
.superclass(ClassNames.DATABASE_HOLDER)
val constructor = MethodSpec.constructorBuilder().addModifiers(Modifier.PUBLIC)
processorManager.getTypeConverters().forEach {
constructor.addStatement("\$L.put(\$T.class, new \$T())",
DatabaseHandler.TYPE_CONVERTER_MAP_FIELD_NAME, it.modelTypeName, it.className)
if (it.allowedSubTypes?.isNotEmpty() ?: false) {
it.allowedSubTypes?.forEach { subType ->
constructor.addStatement("\$L.put(\$T.class, new \$T())",
DatabaseHandler.TYPE_CONVERTER_MAP_FIELD_NAME, subType, it.className)
}
}
}
processorManager.getDatabaseHolderDefinitionMap().forEach { databaseDefinition ->
databaseDefinition.databaseDefinition?.let { constructor.addStatement("new \$T(this)", it.outputClassName) }
}
typeBuilder.addMethod(constructor.build())
return typeBuilder.build()
}
companion object {
@JvmField
val OPTION_TARGET_MODULE_NAME = "targetModuleName"
}
}