Add special string for annotation and its processor for only field

Updated std money and add money arithemtic
This commit is contained in:
Sambo Chea 2020-08-27 21:42:05 +07:00
parent 4dc6ae521c
commit e82fb280ab
8 changed files with 102 additions and 12 deletions

View File

@ -2,7 +2,7 @@ package com.cubetiqs.libra.moneyutils
open class Money( open class Money(
var value: Double, var value: Double,
private var currency: String = "USD" @SpecialString(trim = true, upperCase = true) private var currency: String = "USD"
) : StdMoney { ) : StdMoney {
//////////////////// - PROPERTIES - //////////////////// //////////////////// - PROPERTIES - ////////////////////
@ -12,7 +12,7 @@ open class Money(
} }
override fun getMoneyCurrency(): String { override fun getMoneyCurrency(): String {
return this.currency.toUpperCase() return this.currency
} }
//////////////////// - GENERIC - //////////////////// //////////////////// - GENERIC - ////////////////////

View File

@ -0,0 +1,5 @@
package com.cubetiqs.libra.moneyutils
fun StdMoney.addMoney(value: Double, currency: String): StdMoney {
return this + Money.create(value, currency)
}

View File

@ -1,3 +1,7 @@
package com.cubetiqs.libra.moneyutils package com.cubetiqs.libra.moneyutils
fun StdMoney fun StdMoney.exchangeTo(currency: String): StdMoney {
return MoneyExchangeUtils.exchange(this, currency)
}
fun StdMoney.isMatchedCurrency(currency: String) = this.getMoneyCurrency().equals(currency, ignoreCase = true)

View File

@ -0,0 +1,5 @@
package com.cubetiqs.libra.moneyutils
@Target(AnnotationTarget.FIELD)
@Retention(AnnotationRetention.RUNTIME)
annotation class SpecialString(val value: String = "", val upperCase: Boolean = true, val trim: Boolean = true)

View File

@ -0,0 +1,37 @@
package com.cubetiqs.libra.moneyutils
import java.lang.reflect.Field
class SpecialStringProcessor: ISerializer {
override fun <T> serialize(data: T?): T? {
if (data == null) return null
val clazz = data.javaClass
clazz.declaredFields.forEach {
it.isAccessible = true
if (it.isAnnotationPresent(SpecialString::class.java) && it.genericType == String::class.java) {
val annotationValues = it.getAnnotation(SpecialString::class.java)
var value = it.get(data).toString()
if (annotationValues.trim) {
value = value.trim()
}
if (annotationValues.upperCase) {
value = value.toUpperCase()
}
it.set(data, value)
}
}
return data
}
private fun getSerializeKey(field: Field): String {
val annotationValue = field.getAnnotation(SpecialString::class.java).value
return if (annotationValue.isEmpty()) {
field.name
} else annotationValue
}
}
interface ISerializer {
fun <T> serialize(data: T?): T?
}

View File

@ -20,5 +20,6 @@ interface StdMoney {
* *
* @return String * @return String
*/ */
@SpecialString
fun getMoneyCurrency(): String fun getMoneyCurrency(): String
} }

View File

@ -2,20 +2,21 @@ import com.cubetiqs.libra.moneyutils.Money
import com.cubetiqs.libra.moneyutils.MoneyConfig import com.cubetiqs.libra.moneyutils.MoneyConfig
import com.cubetiqs.libra.moneyutils.MoneyCurrency import com.cubetiqs.libra.moneyutils.MoneyCurrency
import com.cubetiqs.libra.moneyutils.MoneyExchangeUtils import com.cubetiqs.libra.moneyutils.MoneyExchangeUtils
import com.cubetiqs.libra.moneyutils.plus import com.cubetiqs.libra.moneyutils.SpecialStringProcessor
import com.cubetiqs.libra.moneyutils.times
import com.cubetiqs.libra.moneyutils.timesAssign
import org.junit.Assert import org.junit.Assert
import org.junit.Test import org.junit.Test
class MoneyTests { class MoneyTests {
@Test @Test
fun money_operator_test() { fun money_operator_test() {
val money = Money(10.0) // val money = Money(10.0)
val money2 = Money(20.0) // val money2 = Money(20.0)
money *= money // money *= money
println((money + money2) * money2) // println((money + money2) * money2)
Assert.assertEquals(100.0, money.value, 0.0) // Assert.assertEquals(100.0, money.value, 0.0)
val test = SpecialStringProcessor().serialize(Money(1.0, " usd "))
println(test)
} }
@Test @Test
@ -47,7 +48,7 @@ class MoneyTests {
.setDeliEqual('=') .setDeliEqual('=')
.setDeliSplit(';') .setDeliSplit(';')
MoneyConfig.parse("USD=1,KHR=4000,EUR=0.99") MoneyConfig.parse("USD:1,KHR=4000,EUR=0.99")
val moneyUsd = Money.ONE val moneyUsd = Money.ONE
val moneyKhr = Money.create(20000.0, MoneyCurrency.KHR) val moneyKhr = Money.create(20000.0, MoneyCurrency.KHR)

View File

@ -0,0 +1,37 @@
import org.junit.Test
class ObjectTests {
@Test
fun builder_object_test() {
val person = Person
.builder()
.name("Sambo Chea")
.id(10)
.build()
println(person)
}
}
data class Person(val id: Long? = null, val name: String? = null) {
companion object {
fun builder(): PersonBuilder {
return PersonBuilder()
}
}
}
class PersonBuilder {
private var id: Long? = null
private var name: String? = null
fun id(id: Long?) = apply { this.id = id }
fun name(name: String?) = apply { this.name = name }
fun build(): Person {
return Person(id, name)
}
}