/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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. */ package org.apache.falcon.regression.core.util; import org.apache.falcon.regression.core.enumsAndConstants.FreqType; import org.apache.log4j.Logger; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.concurrent.TimeUnit; /** All time / date related util methods for merlin . need to move methods from instanceUtil to here , pending item. */ public final class TimeUtil { private TimeUtil() { throw new AssertionError("Instantiating utility class..."); } private static final Logger LOGGER = Logger.getLogger(TimeUtil.class); public static void sleepSeconds(double seconds) { long ms = (long) (seconds * 1000); try { TimeUnit.MILLISECONDS.sleep(ms); } catch (InterruptedException e) { LOGGER.info("Sleep was interrupted"); } } public static String get20roundedTime(String oozieBaseTime) { DateTime startTime = new DateTime(oozieDateToDate(oozieBaseTime), DateTimeZone.UTC); if (startTime.getMinuteOfHour() < 20) { startTime = startTime.minusMinutes(startTime.getMinuteOfHour()); } else if (startTime.getMinuteOfHour() < 40) { startTime = startTime.minusMinutes(startTime.getMinuteOfHour() + 20); } else { startTime = startTime.minusMinutes(startTime.getMinuteOfHour() + 40); } return dateToOozieDate(startTime.toDate()); } public static List<String> getMinuteDatesOnEitherSide(int interval, int minuteSkip) { DateTime today = new DateTime(DateTimeZone.UTC); LOGGER.info("today is: " + today.toString()); return getMinuteDatesOnEitherSide(today.minusMinutes(interval), today.plusMinutes(interval), minuteSkip); } public static List<String> getMinuteDatesOnEitherSide(String startOozieDate, String endOozieDate, int minuteSkip) { DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy/MM/dd/HH/mm"); formatter.withZoneUTC(); return getMinuteDatesOnEitherSide(TimeUtil.oozieDateToDate(startOozieDate), TimeUtil.oozieDateToDate(endOozieDate), minuteSkip, formatter); } public static List<String> getMinuteDatesOnEitherSide(DateTime startDate, DateTime endDate, int minuteSkip) { DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy/MM/dd/HH/mm"); formatter.withZoneUTC(); return getMinuteDatesOnEitherSide(startDate, endDate, minuteSkip, formatter); } public static List<String> getMinuteDatesOnEitherSide(String startOozieDate, String endOozieDate, int minuteSkip, DateTimeFormatter formatter) { return getMinuteDatesOnEitherSide(TimeUtil.oozieDateToDate(startOozieDate), TimeUtil.oozieDateToDate(endOozieDate), minuteSkip, formatter); } public static List<String> getMinuteDatesOnEitherSide(DateTime startDate, DateTime endDate, int minuteSkip, DateTimeFormatter formatter) { LOGGER.info("generating data between " + formatter.print(startDate) + " and " + formatter.print(endDate)); if (minuteSkip == 0) { minuteSkip = 1; } List<String> dates = new ArrayList<>(); while (!startDate.isAfter(endDate)) { dates.add(formatter.print(startDate)); startDate = startDate.plusMinutes(minuteSkip); } return dates; } /** * Convert list of dates to list of string according to the supplied format. * * @param dates list of dates * @param formatter formatter to be used for converting dates * @return list of strings corresponding to given dates */ public static List<String> convertDatesToString(List<DateTime> dates, DateTimeFormatter formatter) { List<String> dateString = new ArrayList<>(); formatter.withZoneUTC(); for (DateTime date : dates) { dateString.add(formatter.print(date)); } return dateString; } /** * Get all possible dates between start and end date gap between subsequent dates be one unit. * of freqType * * @param startDate start date * @param endDate end date * @param freqType type of the feed * @return list of dates */ public static List<DateTime> getDatesOnEitherSide(DateTime startDate, DateTime endDate, FreqType freqType) { return getDatesOnEitherSide(startDate, endDate, 1, freqType); } /** * Get all possible dates between start and end date gap between subsequent dates be one unit. * of freqType * * @param startDate start date * @param endDate end date * @param skip amount of skipping * @param freqType type of the feed * @return list of dates */ public static List<DateTime> getDatesOnEitherSide(DateTime startDate, DateTime endDate, int skip, FreqType freqType) { final List<DateTime> dates = new ArrayList<>(); if (!startDate.isAfter(endDate)) { dates.add(startDate); } for (int counter = 0; !startDate.isAfter(endDate) && counter < 1000; ++counter) { startDate = freqType.addTime(startDate, skip); dates.add(startDate); } return dates; } public static String getTimeWrtSystemTime(int minutes) { DateTime jodaTime = new DateTime(DateTimeZone.UTC); if (minutes > 0) { jodaTime = jodaTime.plusMinutes(minutes); } else { jodaTime = jodaTime.minusMinutes(-1 * minutes); } DateTimeFormatter fmt = OozieUtil.getOozieDateTimeFormatter(); DateTimeZone tz = DateTimeZone.getDefault(); return fmt.print(tz.convertLocalToUTC(jodaTime.getMillis(), false)); } public static String addMinsToTime(String time, int minutes) { DateTimeFormatter fmt = OozieUtil.getOozieDateTimeFormatter(); DateTime jodaTime = fmt.parseDateTime(time); jodaTime = jodaTime.plusMinutes(minutes); return fmt.print(jodaTime); } public static DateTime oozieDateToDate(String time) { DateTimeFormatter fmt = OozieUtil.getOozieDateTimeFormatter(); fmt = fmt.withZoneUTC(); return fmt.parseDateTime(time); } public static String dateToOozieDate(Date dt) { DateTime jodaTime = new DateTime(dt, DateTimeZone.UTC); LOGGER.info("SystemTime: " + jodaTime); DateTimeFormatter fmt = OozieUtil.getOozieDateTimeFormatter(); return fmt.print(jodaTime); } public static void sleepTill(String startTimeOfLateCoord) { DateTime finalDate = new DateTime(oozieDateToDate(startTimeOfLateCoord)); while (true) { DateTime sysDate = oozieDateToDate(getTimeWrtSystemTime(0)); LOGGER.info("sysDate: " + sysDate + " finalDate: " + finalDate); if (sysDate.compareTo(finalDate) > 0) { break; } TimeUtil.sleepSeconds(15); } } public static Date getMinutes(String expression, Calendar time) { int hr; int mins; int day; int month; Calendar cal = Calendar.getInstance(); cal.setTime(time.getTime()); if (expression.contains("now")) { hr = getInt(expression, 0); mins = getInt(expression, 1); cal.add(Calendar.HOUR, hr); cal.add(Calendar.MINUTE, mins); } else if (expression.contains("today")) { hr = getInt(expression, 0); mins = getInt(expression, 1); cal.add(Calendar.HOUR, hr - (cal.get(Calendar.HOUR_OF_DAY))); cal.add(Calendar.MINUTE, mins); } else if (expression.contains("yesterday")) { hr = getInt(expression, 0); mins = getInt(expression, 1); cal.add(Calendar.HOUR, hr - (cal.get(Calendar.HOUR_OF_DAY)) - 24); cal.add(Calendar.MINUTE, mins); } else if (expression.contains("currentMonth")) { day = getInt(expression, 0); hr = getInt(expression, 1); mins = getInt(expression, 2); cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), 1, 0, 0); cal.add(Calendar.HOUR, 24 * day + hr); cal.add(Calendar.MINUTE, mins); } else if (expression.contains("lastMonth")) { day = getInt(expression, 0); hr = getInt(expression, 1); mins = getInt(expression, 2); cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH) - 1, 1, 0, 0); cal.add(Calendar.HOUR, 24 * day + hr); cal.add(Calendar.MINUTE, mins); } else if (expression.contains("currentYear")) { month = getInt(expression, 0); day = getInt(expression, 1); hr = getInt(expression, 2); mins = getInt(expression, 3); cal.set(cal.get(Calendar.YEAR), 1, 1, 0, 0); cal.add(Calendar.MONTH, month - 1); cal.add(Calendar.HOUR, 24 * day + hr); cal.add(Calendar.MINUTE, mins); } else if (expression.contains("lastYear")) { month = getInt(expression, 0); day = getInt(expression, 1); hr = getInt(expression, 2); mins = getInt(expression, 3); cal.set(cal.get(Calendar.YEAR) - 1, 1, 1, 0, 0); cal.add(Calendar.MONTH, month - 1); cal.add(Calendar.HOUR, 24 * day + hr); cal.add(Calendar.MINUTE, mins); } return cal.getTime(); } private static int getInt(String expression, int position) { String numbers = expression.substring(expression.indexOf('(') + 1, expression.indexOf(')')); return Integer.parseInt(numbers.split(",")[position]); } /** * Converts given date from one format to another. * * @param date input date * @param myFormat input date format * @param userFormat required format * @return date in userFormat */ public static String parseDate(String date, String myFormat, String userFormat) throws ParseException { SimpleDateFormat formatter = new SimpleDateFormat(myFormat); SimpleDateFormat fromUser = new SimpleDateFormat(userFormat); String reformattedStr=""; try { reformattedStr = formatter.format(fromUser.parse(date)); LOGGER.info(reformattedStr); } catch (ParseException e) { e.printStackTrace(); } return reformattedStr; } }