in core/src/main/kotlin/org/opensearch/alerting/core/model/Schedule.kt [42:97]
fun parse(xcp: XContentParser): Schedule {
var expression: String? = null
var timezone: ZoneId? = null
var interval: Int? = null
var unit: ChronoUnit? = null
var schedule: Schedule? = null
var type: TYPE? = null
ensureExpectedToken(XContentParser.Token.START_OBJECT, xcp.currentToken(), xcp)
while (xcp.nextToken() != XContentParser.Token.END_OBJECT) {
val fieldname = xcp.currentName()
xcp.nextToken()
// If the type field has already been set the customer has provide more than one type of schedule.
if (type != null) {
throw IllegalArgumentException("You can only specify one type of schedule.")
}
when (fieldname) {
CRON_FIELD -> {
type = TYPE.CRON
while (xcp.nextToken() != XContentParser.Token.END_OBJECT) {
val cronFieldName = xcp.currentName()
xcp.nextToken()
when (cronFieldName) {
EXPRESSION_FIELD -> expression = xcp.textOrNull()
TIMEZONE_FIELD -> timezone = getTimeZone(xcp.text())
}
}
}
PERIOD_FIELD -> {
type = TYPE.INTERVAL
while (xcp.nextToken() != XContentParser.Token.END_OBJECT) {
val cronFieldName = xcp.currentName()
xcp.nextToken()
when (cronFieldName) {
INTERVAL_FIELD -> interval = xcp.intValue()
UNIT_FIELD -> unit = ChronoUnit.valueOf(xcp.text().toUpperCase())
}
}
}
else -> {
throw IllegalArgumentException("Invalid field: [$fieldname] found in schedule.")
}
}
}
if (type == TYPE.CRON) {
schedule = CronSchedule(
requireNotNull(expression) { "Expression in cron schedule is null." },
requireNotNull(timezone) { "Timezone in cron schedule is null." }
)
} else if (type == TYPE.INTERVAL) {
schedule = IntervalSchedule(
requireNotNull(interval) { "Interval in period schedule is null." },
requireNotNull(unit) { "Unit in period schedule is null." }
)
}
return requireNotNull(schedule) { "Schedule is null." }
}