package com.thinkbiganalytics.scheduler.util; /*- * #%L * thinkbig-commons-util * %% * Copyright (C) 2017 ThinkBig Analytics * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * #L% */ import org.apache.commons.lang3.StringUtils; import org.joda.time.Hours; import org.joda.time.Minutes; import org.joda.time.Period; import org.joda.time.PeriodType; import org.joda.time.Seconds; import org.quartz.CronExpression; import java.text.ParseException; /** * Converts a simple timer string such as 5 sec, 200 min, 50 days and converts it to a valid cron Expression */ public class TimerToCronExpression { /** * Parse a timer string to a Joda time period * * @param timer a string indicating a time unit (i.e. 5 sec) * @param periodType the Period unit to use. */ public static Period timerStringToPeriod(String timer, PeriodType periodType) { String cronString = null; Integer time = Integer.parseInt(StringUtils.substringBefore(timer, " ")); String units = StringUtils.substringAfter(timer, " ").toLowerCase(); //time to years,days,months,hours,min, sec Integer days = 0; Integer hours = 0; Integer min = 0; Integer sec = 0; Period p = null; if (units.startsWith("sec")) { p = Period.seconds(time); } else if (units.startsWith("min")) { p = Period.minutes(time); } else if (units.startsWith("hr") || units.startsWith("hour")) { p = Period.hours(time); } else if (units.startsWith("day")) { p = Period.days(time); } if (periodType != null) { p = p.normalizedStandard(periodType); } else { } return p; } /** * Parse a timer string to a Joda time period */ public static Period timerStringToPeriod(String timer) { return timerStringToPeriod(timer, PeriodType.dayTime()); } /** * Pass in a time String with a single unit the Max Unit is days (sec or secs, min or mins, hrs or hours, day or days) Examples: 5 sec, 100 min, 30 days, 20 hrs */ public static CronExpression timerToCronExpression(String timer) throws ParseException { Period p = timerStringToPeriod(timer); if (p != null) { String cron = getSecondsCron(p) + " " + getMinutesCron(p) + " " + getHoursCron(p) + " " + getDaysCron(p) + " * ? *"; return new CronExpression(cron); } return null; } private static String getSecondsCron(Period p) { Integer sec = p.getSeconds(); Seconds s = p.toStandardSeconds(); Integer seconds = s.getSeconds(); String str = "0" + (sec > 0 ? "/" + sec : ""); if (seconds > 60) { str = sec + ""; } return str; } private static String getMinutesCron(Period p) { Integer min = p.getMinutes(); Minutes m = p.toStandardMinutes(); Integer minutes = m.getMinutes(); String str = "0" + (min > 0 ? "/" + min : ""); if (minutes > 60) { str = min + ""; } return str; } private static String getHoursCron(Period p) { Integer hrs = p.getHours(); Hours h = p.toStandardHours(); Integer hours = h.getHours(); String str = "0" + (hrs > 0 ? "/" + hrs : ""); if (hours > 24) { str = hrs + ""; } return str; } private static String getDaysCron(Period p) { Integer days = p.getDays(); String str = "1" + (days > 0 ? "/" + days : "/1"); return str; } }