All Downloads are FREE. Search and download functionalities are using the official Maven repository.

internal.config.flex.MybatisConfigSealedObject.kt Maven / Gradle / Ivy

package com.mybatisflex.kotlin.ksp.internal.config.flex

import com.mybatisflex.kotlin.ksp.illegalValueWarning
import com.mybatisflex.kotlin.ksp.internal.config.flex.Enable.value
import com.mybatisflex.kotlin.ksp.logger
import java.io.File
import java.nio.charset.Charset
import java.nio.charset.UnsupportedCharsetException

/**
 * 是否开启 ksp 生成。若 [value] 为 false,则不生成。
 * @author CloudPlayer
 */
internal object Enable : MybatisFlexConfiguration {
    override val key: String = "processor.enable"

    override var value: Boolean = true

    override fun initValue(value: String) {
        Enable.value = value.toBoolean()
    }
}

/**
 * 是否停止向上级合并配置。即在子项目 mybatis-flex.config 中的键值对,会和父项目 mybatis-flex.config 中的键值对进行合并。
 *
 * 假设我们在子项目的 mybatis-flex.config 中进行了如下定义:
 * ```mybatis-flex.config
 * processor.tableDef.classSuffix=KtTableDef
 * ```
 *
 * 而在父项目的 mybatis-flex.config 中进行了如下定义:
 * ```mybatis-flex.config
 * processor.tableDef.classSuffix=TableDef
 * ```
 *
 * 那么经由合并后,ksp为子项目生成的 TableDef 类的后缀将是 `KtTableDef` 而不是 `TableDef` 。
 *
 * 如果父项目中已定义的键值对而子类没有定义,则父项目中此键值对也对子项目有效,反之则子项目会进行合并。
 * 在多数键值对下,这个合并操作指的是重写,即使用子项目的值。
 *
 * @author CloudPlayer
 */
internal object StopBubbling : MybatisFlexConfiguration {
    override val key: String = "processor.stopBubbling"

    override var value: Boolean = false

    override fun initValue(value: String) {
        StopBubbling.value = value.toBoolean()
    }
}

// 暂不支持
@Suppress("unused")
internal object GenPath : MybatisFlexConfiguration {
    override val key: String = "processor.genPath"

    override var value: String = "target/generated-sources/annotations"

    override fun initValue(value: String) {
        GenPath.value = value
        val file = File(value)
        if (!file.exists()) {
            logger.warn("Generated source folder does not exist: `${file.absolutePath}`")
        }
    }
}

/**
 * 生成的文件的字符集。
 * @author CloudPlayer
 */
internal object FlexCharset : MybatisFlexConfiguration {
    override val key: String = "processor.charset"

    private var _value: Charset = Charsets.UTF_8

    override val value: Charset
        get() = _value

    override fun initValue(value: String) {
        try {
            val charset = Charset.forName(value)
            _value = charset
        } catch (_: UnsupportedCharsetException) {  // 若字符集不合法则警告
            illegalValueWarning(key, value)
        }
    }
}

/**
 * 是否额外生成一个类,用于存放生成的所有类的静态实例。
 *
 * 即官网中所说的 Tables 类。如有需要,ksp会为此生成一个 kotlin 对象。
 *
 * 如果开启生成,必须配置 [AllInTablesPackage] 来指定包名。
 * @author CloudPlayer
 */
internal object AllInTablesEnable : MybatisFlexConfiguration {
    override val key: String = "processor.allInTables.enable"

    override var value: Boolean = false

    override fun initValue(value: String) {
        AllInTablesEnable.value = value.toBoolean()
    }
}

/**
 * Tables 类在哪个包中生成。如果没有指定包名,则不予生成。
 * @author CloudPlayer
 */
internal object AllInTablesPackage : MybatisFlexConfiguration {
    override val key: String = "processor.allInTables.package"

    override var value: String? = null

    override fun initValue(value: String) {
        AllInTablesPackage.value = value
    }
}

/**
 * Tables 类的类名。
 * @author CloudPlayer
 */
internal object AllInTablesClassName : MybatisFlexConfiguration {
    override val key: String = "processor.allInTables.className"

    override var value: String = "Tables"

    override fun initValue(value: String) {
        AllInTablesClassName.value = value
    }
}

/**
 * 是否开启 Mapper 接口的生成。
 *
 * @author CloudPlayer
 */
internal object MapperGenerateEnable : MybatisFlexConfiguration {
    override val key: String = "processor.mapper.generateEnable"

    override var value: Boolean = false

    override fun initValue(value: String) {
        MapperGenerateEnable.value = value.toBoolean()
    }
}

/**
 * 是否打上 [@Mapper] 注解。
 *
 * @author CloudPlayer
 */
internal object MapperAnnotation : MybatisFlexConfiguration {
    override val key: String = "processor.mapper.annotation"

    override var value: Boolean = false

    override fun initValue(value: String) {
        MapperAnnotation.value = value.toBoolean()
    }
}

/**
 * Mapper 接口的父类。
 *
 * 现阶段合法的 Mapper 父类只有两种:
 *
 * 1,没有定义泛型的 Mapper。
 *
 * 2,定义了有且仅有一个泛型的 Mapper,没有声明协变或逆变,且该泛型传递至 BaseMapper 中。
 *
 * 换言之,以下 Mapper 在现阶段是不合法的:
 * ```kotlin
 * interface MyMapper1 : BaseMapper // 定义了两个泛型。
 * interface MyMapper3 : BaseMapper // 定义的泛型声明为协变。
 * interface MyMapper5 : BaseMapper // 声明的泛型没有传递至 BaseMapper 中。
 * ```
 * @author CloudPlayer
 */
internal object MapperBaseClass : MybatisFlexConfiguration {
    const val BASE_MAPPER: String = "com.mybatisflex.core.BaseMapper"

    override val key: String = "processor.mapper.baseClass"

    override var value: String = BASE_MAPPER

    val packageName: String
        get() = value.substringBeforeLast(".")

    override fun initValue(value: String) {
        MapperBaseClass.value = value
    }

    val isOriginalBaseMapper: Boolean
        get() = value == BASE_MAPPER
}

/**
 * 指定 Mapper 生成在哪个包下。
 * @author CloudPlayer
 */
internal object MapperPackage : MybatisFlexConfiguration {
    override val key: String = "processor.mapper.package"

    override var value: String? = null

    override fun initValue(value: String) {
        MapperPackage.value = value
    }
}

/**
 * 指定 TableDef 类中属性的命名风格。
 *
 * 目前仅支持以下四种命名风格:
 *
 * 1,upperCase:大写 + 下划线,例如:USER_NAME
 *
 * 2,lowerCase:小写 + 下划线,例如:user_name
 *
 * 3,upperCamelCase:首字母大写的驼峰命名,例如:UserName
 *
 * 4,lowerCamelCase:首字母小写的驼峰命名,例如:userName
 *
 * 5,original:原始字符串,不做任何改动。
 *
 * @author CloudPlayer
 */
internal object TableDefPropertiesNameStyle : MybatisFlexConfiguration {
    override val key: String  = "processor.tableDef.propertiesNameStyle"

    override var value: PropertiesNameStyle = PropertiesNameStyle.upperCase

    override fun initValue(value: String) {
        try {
            TableDefPropertiesNameStyle.value = PropertiesNameStyle.valueOf(value)
        } catch (_: IllegalArgumentException) {
            illegalValueWarning(key, value)
        }
    }
}

/**
 * 指定 TableDef 类中实例属性的后缀。
 *
 * 假设我们为此项设置的值为 `Kotlin`,在 [TableDefPropertiesNameStyle] 中指定其值为 [PropertiesNameStyle.upperCase] 那么ksp在生成实例属性时将是:
 * ```kotlin
 * object MyTableDef : TableDef(..., ...) {
 *      ... // ksp 生成的其他内容
 *      val MY_TABLE_DEF_KOTLIN = MyTableDef  // 实例属性名将连同 `Kotlin` 一同解析
 * }
 * ```
 * @author CloudPlayer
 */
internal object TableDefInstanceSuffix : MybatisFlexConfiguration {
    override val key: String = "processor.tableDef.instanceSuffix"

    override var value = ""

    override fun initValue(value: String) {
        TableDefInstanceSuffix.value = value
    }
}

/**
 * 指定 TableDef 类类名的后缀。
 *
 * 假设我们为此项设定的值为 `KotlinTableDef` ,我们自定义的实体类为 `MyEntity` , 那么 ksp 会生成如下代码:
 *
 * ```kotlin
 * object MyEntityKotlinTableDef : TableDef(..., ...)
 * ```
 *
 * @author CloudPlayer
 */
internal object TableDefClassSuffix : MybatisFlexConfiguration {
    override val key: String = "processor.tableDef.classSuffix"

    override var value: String = "TableDef"

    override fun initValue(value: String) {
        TableDefClassSuffix.value = value
    }
}

/**
 * 需要忽略的实体类后缀。
 *
 * 子项目与父项目均定义了此项时,二者定义需要忽略的实体类后缀将取二者定义的并集。即都会忽略。
 *
 * @author CloudPlayer
 */
internal object TableDefIgnoreEntitySuffixes : MybatisFlexConfiguration> {
    override val key: String = "processor.tableDef.ignoreEntitySuffixes"

    private val _value = LinkedHashSet()

    override val value: Set
        get() = _value

    override fun initValue(value: String) {
        if (value.isNotBlank()) {
            _value += value.split(",").map {
                it.trim()
            }
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy