Eliminate generated Kt classes

* Move CP_PROGRAM_ID into companion object
* Move COMMODITY_PROGRAM_ID into companion object
* Remove unused convenience function from FinanceTypes before we end up committing to maintaining it indefinitely.
* Move calculateDaysBetween into BusinessCalendar to eliminate FinanceTypesKt
This commit is contained in:
Ross Nicoll 2017-09-01 11:10:59 +01:00 committed by GitHub
parent 7e3dd4c12c
commit 2a794d9523
4 changed files with 30 additions and 27 deletions

View File

@ -40,10 +40,11 @@ import java.util.*
* which may need to be tracked. That, in turn, requires validation logic (there is a bean validator that knows how * which may need to be tracked. That, in turn, requires validation logic (there is a bean validator that knows how
* to do this in the Apache BVal project). * to do this in the Apache BVal project).
*/ */
val CP_PROGRAM_ID = CommercialPaper()
// TODO: Generalise the notion of an owned instrument into a superclass/supercontract. Consider composition vs inheritance. // TODO: Generalise the notion of an owned instrument into a superclass/supercontract. Consider composition vs inheritance.
class CommercialPaper : Contract { class CommercialPaper : Contract {
companion object {
val CP_PROGRAM_ID = CommercialPaper()
}
data class State( data class State(
val issuance: PartyAndReference, val issuance: PartyAndReference,
override val owner: AbstractParty, override val owner: AbstractParty,

View File

@ -83,7 +83,7 @@ data class Tenor(val name: String) {
} }
// Move date to the closest business day when it falls on a weekend/holiday // Move date to the closest business day when it falls on a weekend/holiday
val adjustedMaturityDate = calendar.applyRollConvention(maturityDate, DateRollConvention.ModifiedFollowing) val adjustedMaturityDate = calendar.applyRollConvention(maturityDate, DateRollConvention.ModifiedFollowing)
val daysToMaturity = calculateDaysBetween(startDate, adjustedMaturityDate, DayCountBasisYear.Y360, DayCountBasisDay.DActual) val daysToMaturity = BusinessCalendar.calculateDaysBetween(startDate, adjustedMaturityDate, DayCountBasisYear.Y360, DayCountBasisDay.DActual)
return daysToMaturity return daysToMaturity
} }
@ -190,10 +190,6 @@ enum class Frequency(val annualCompoundCount: Int, val offset: LocalDate.(Long)
Daily(365, { plusDays(1 * it) }); Daily(365, { plusDays(1 * it) });
} }
@Suppress("unused") // This utility may be useful in future. TODO: Review before API stability guarantees in place.
fun LocalDate.isWorkingDay(accordingToCalendar: BusinessCalendar): Boolean = accordingToCalendar.isWorkingDay(this)
// TODO: Make Calendar data come from an oracle // TODO: Make Calendar data come from an oracle
/** /**
@ -213,10 +209,26 @@ open class BusinessCalendar (val holidayDates: List<LocalDate>) {
it to BusinessCalendar::class.java.getResourceAsStream("${it}HolidayCalendar.txt").bufferedReader().readText() it to BusinessCalendar::class.java.getResourceAsStream("${it}HolidayCalendar.txt").bufferedReader().readText()
}.toMap() }.toMap()
@JvmStatic
fun calculateDaysBetween(startDate: LocalDate,
endDate: LocalDate,
dcbYear: DayCountBasisYear,
dcbDay: DayCountBasisDay): Int {
// Right now we are only considering Actual/360 and 30/360 .. We'll do the rest later.
// TODO: The rest.
return when {
dcbDay == DayCountBasisDay.DActual -> (endDate.toEpochDay() - startDate.toEpochDay()).toInt()
dcbDay == DayCountBasisDay.D30 && dcbYear == DayCountBasisYear.Y360 -> ((endDate.year - startDate.year) * 360.0 + (endDate.monthValue - startDate.monthValue) * 30.0 + endDate.dayOfMonth - startDate.dayOfMonth).toInt()
else -> TODO("Can't calculate days using convention $dcbDay / $dcbYear")
}
}
/** Parses a date of the form YYYY-MM-DD, like 2016-01-10 for 10th Jan. */ /** Parses a date of the form YYYY-MM-DD, like 2016-01-10 for 10th Jan. */
@JvmStatic
fun parseDateFromString(it: String): LocalDate = LocalDate.parse(it, DateTimeFormatter.ISO_LOCAL_DATE) fun parseDateFromString(it: String): LocalDate = LocalDate.parse(it, DateTimeFormatter.ISO_LOCAL_DATE)
/** Returns a business calendar that combines all the named holiday calendars into one list of holiday dates. */ /** Returns a business calendar that combines all the named holiday calendars into one list of holiday dates. */
@JvmStatic
fun getInstance(vararg calname: String) = BusinessCalendar( fun getInstance(vararg calname: String) = BusinessCalendar(
calname.flatMap { (TEST_CALENDAR_DATA[it] ?: throw UnknownCalendar(it)).split(",") }. calname.flatMap { (TEST_CALENDAR_DATA[it] ?: throw UnknownCalendar(it)).split(",") }.
toSet(). toSet().
@ -225,6 +237,7 @@ open class BusinessCalendar (val holidayDates: List<LocalDate>) {
) )
/** Calculates an event schedule that moves events around to ensure they fall on working days. */ /** Calculates an event schedule that moves events around to ensure they fall on working days. */
@JvmStatic
fun createGenericSchedule(startDate: LocalDate, fun createGenericSchedule(startDate: LocalDate,
period: Frequency, period: Frequency,
calendar: BusinessCalendar = getInstance(), calendar: BusinessCalendar = getInstance(),
@ -248,9 +261,11 @@ open class BusinessCalendar (val holidayDates: List<LocalDate>) {
return ret return ret
} }
/** Calculates the date from @startDate moving forward @steps of time size @period. Does not apply calendar /**
* Calculates the date from @startDate moving forward 'steps' of time size 'period'. Does not apply calendar
* logic / roll conventions. * logic / roll conventions.
*/ */
@JvmStatic
fun getOffsetDate(startDate: LocalDate, period: Frequency, steps: Int = 1): LocalDate { fun getOffsetDate(startDate: LocalDate, period: Frequency, steps: Int = 1): LocalDate {
if (steps == 0) return startDate if (steps == 0) return startDate
return period.offset(startDate, steps.toLong()) return period.offset(startDate, steps.toLong())
@ -316,19 +331,6 @@ open class BusinessCalendar (val holidayDates: List<LocalDate>) {
} }
} }
fun calculateDaysBetween(startDate: LocalDate,
endDate: LocalDate,
dcbYear: DayCountBasisYear,
dcbDay: DayCountBasisDay): Int {
// Right now we are only considering Actual/360 and 30/360 .. We'll do the rest later.
// TODO: The rest.
return when {
dcbDay == DayCountBasisDay.DActual -> (endDate.toEpochDay() - startDate.toEpochDay()).toInt()
dcbDay == DayCountBasisDay.D30 && dcbYear == DayCountBasisYear.Y360 -> ((endDate.year - startDate.year) * 360.0 + (endDate.monthValue - startDate.monthValue) * 30.0 + endDate.dayOfMonth - startDate.dayOfMonth).toInt()
else -> TODO("Can't calculate days using convention $dcbDay / $dcbYear")
}
}
/** A common netting command for contracts whose states can be netted. */ /** A common netting command for contracts whose states can be netted. */
interface NetCommand : CommandData { interface NetCommand : CommandData {
/** The type of netting to apply, see [NetType] for options. */ /** The type of netting to apply, see [NetType] for options. */

View File

@ -19,9 +19,6 @@ import java.util.*
// Commodity // Commodity
// //
// Just a fake program identifier for now. In a real system it could be, for instance, the hash of the program bytecode.
val COMMODITY_PROGRAM_ID = CommodityContract()
/** /**
* A commodity contract represents an amount of some commodity, tracked on a distributed ledger. The design of this * A commodity contract represents an amount of some commodity, tracked on a distributed ledger. The design of this
* contract is intentionally similar to the [Cash] contract, and the same commands (issue, move, exit) apply, the * contract is intentionally similar to the [Cash] contract, and the same commands (issue, move, exit) apply, the
@ -34,6 +31,11 @@ val COMMODITY_PROGRAM_ID = CommodityContract()
*/ */
// TODO: Need to think about expiry of commodities, how to require payment of storage costs, etc. // TODO: Need to think about expiry of commodities, how to require payment of storage costs, etc.
class CommodityContract : OnLedgerAsset<Commodity, CommodityContract.Commands, CommodityContract.State>() { class CommodityContract : OnLedgerAsset<Commodity, CommodityContract.Commands, CommodityContract.State>() {
companion object {
// Just a fake program identifier for now. In a real system it could be, for instance, the hash of the program bytecode.
val COMMODITY_PROGRAM_ID = CommodityContract()
}
/** A state representing a commodity claim against some party */ /** A state representing a commodity claim against some party */
data class State( data class State(
override val amount: Amount<Issued<Commodity>>, override val amount: Amount<Issued<Commodity>>,

View File

@ -2,7 +2,6 @@ package net.corda.irs.contract
import com.fasterxml.jackson.annotation.JsonIgnoreProperties import com.fasterxml.jackson.annotation.JsonIgnoreProperties
import net.corda.core.contracts.* import net.corda.core.contracts.*
import net.corda.core.crypto.containsAny
import net.corda.core.flows.FlowLogicRefFactory import net.corda.core.flows.FlowLogicRefFactory
import net.corda.core.identity.AbstractParty import net.corda.core.identity.AbstractParty
import net.corda.core.identity.Party import net.corda.core.identity.Party
@ -18,7 +17,6 @@ import org.apache.commons.jexl3.JexlBuilder
import org.apache.commons.jexl3.MapContext import org.apache.commons.jexl3.MapContext
import java.math.BigDecimal import java.math.BigDecimal
import java.math.RoundingMode import java.math.RoundingMode
import java.security.PublicKey
import java.time.LocalDate import java.time.LocalDate
import java.util.* import java.util.*
@ -76,7 +74,7 @@ abstract class RatePaymentEvent(date: LocalDate,
abstract val flow: Amount<Currency> abstract val flow: Amount<Currency>
val days: Int get() = calculateDaysBetween(accrualStartDate, accrualEndDate, dayCountBasisYear, dayCountBasisDay) val days: Int get() = BusinessCalendar.calculateDaysBetween(accrualStartDate, accrualEndDate, dayCountBasisYear, dayCountBasisDay)
// TODO : Fix below (use daycount convention for division, not hardcoded 360 etc) // TODO : Fix below (use daycount convention for division, not hardcoded 360 etc)
val dayCountFactor: BigDecimal get() = (BigDecimal(days).divide(BigDecimal(360.0), 8, RoundingMode.HALF_UP)).setScale(4, RoundingMode.HALF_UP) val dayCountFactor: BigDecimal get() = (BigDecimal(days).divide(BigDecimal(360.0), 8, RoundingMode.HALF_UP)).setScale(4, RoundingMode.HALF_UP)