package net.sourceforge.cruisecontrol.dashboard.utils; import java.util.Date; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Set; import org.apache.commons.lang.StringUtils; import org.joda.time.DateTime; import org.joda.time.Days; import org.joda.time.Hours; import org.joda.time.Minutes; import org.joda.time.Seconds; public class TimeConverter { static final int HOUR_IN_SECONDS = 60 * 60; static final int DAY_IN_SECONDS = 24 * 60 * 60; static final int MONTH_IN_SECONDS = 30 * DAY_IN_SECONDS; static final int YEAR_IN_SECONDS = 365 * DAY_IN_SECONDS; static final String OVER_2_YEARS = "over $time years ago"; static final String ABOUT_1_YEAR = "about 1 year ago"; static final String FROM_2_TO_12_MONTHS = "$time months ago"; static final String ABOUT_1_MONTH = "about 1 month ago"; static final String FROM_2_TO_29_DAYS = "$time days ago"; static final String ABOUT_1_DAY = "1 day ago"; static final String ABOUT_2_TO_24_HOURS = "about $time hours ago"; static final String ABOUT_1_HOUR = "about 1 hour ago"; static final String FROM_2_TO_44_MINUTES = "$time minutes ago"; static final String FROM_1_MINUTE = "1 minute ago"; static final String LESS_THAN_A_MINUTE = "less than a minute ago"; private static final LinkedHashMap RULES = new LinkedHashMap(); static { RULES.put(Seconds.seconds(29), new TimeConverter.LessThanAMinute()); RULES.put(Minutes.minutes(1).toStandardSeconds().plus(Seconds.seconds(29)), new TimeConverter.AboutOneMinute()); RULES.put(Minutes.minutes(44).toStandardSeconds().plus(Seconds.seconds(29)), new TimeConverter.From2To44Minutes()); RULES.put(Minutes.minutes(89).toStandardSeconds().plus(Seconds.seconds(29)), new TimeConverter.AboutOneHour()); RULES.put(Hours.hours(23).toStandardMinutes().plus(Minutes.minutes(59)).toStandardSeconds().plus( Seconds.seconds(29)), new TimeConverter.About2To24Hours()); RULES.put(Hours.hours(47).toStandardMinutes().plus(Minutes.minutes(59)).toStandardSeconds().plus( Seconds.seconds(29)), new TimeConverter.AboutOneDay()); RULES.put(Days.days(29).toStandardHours().plus(Hours.hours(23)).toStandardMinutes().plus( Minutes.minutes(59)).toStandardSeconds().plus(Seconds.seconds(29)), new TimeConverter.From2To29Days()); RULES.put(Days.days(59).toStandardHours().plus(Hours.hours(23)).toStandardMinutes().plus( Minutes.minutes(59)).toStandardSeconds().plus(Seconds.seconds(29)), new TimeConverter.AboutOneMonth()); RULES.put(Days.days(365).toStandardSeconds().minus(Seconds.seconds(31)), new TimeConverter.From2To12Month()); RULES.put(Days.days(730).toStandardSeconds().minus(Seconds.seconds(31)), new TimeConverter.AboutOneYear()); } public String getConvertedTime(long duration) { Set keys = RULES.keySet(); for (Iterator iterator = keys.iterator(); iterator.hasNext();) { Seconds seconds = (Seconds) iterator.next(); ConvertedTime converted = (ConvertedTime) RULES.get(seconds); if (duration <= seconds.getSeconds()) { return converted.getConvertedTime(duration); } } return new TimeConverter.OverTwoYears().getConvertedTime(duration); } public String getConvertedTime(Date dateFrom) { return getConvertedTime(dateFrom, new Date()); } public String getConvertedTime(Date dateLogFileGenerated, Date dateCheckTheDuration) { if (dateCheckTheDuration.getTime() < dateLogFileGenerated.getTime()) { return CCDateFormatter.getDateStringInHumanBeingReadingStyle(new DateTime(dateLogFileGenerated)); } else { return (String) getConvertedTime((dateCheckTheDuration.getTime() - dateLogFileGenerated.getTime()) / 1000); } } static interface ConvertedTime { String getConvertedTime(long duration); } static class LessThanAMinute implements ConvertedTime { public String getConvertedTime(long duration) { return TimeConverter.LESS_THAN_A_MINUTE; } } static class AboutOneMinute implements ConvertedTime { public String getConvertedTime(long duration) { return TimeConverter.FROM_1_MINUTE; } } static class From2To44Minutes implements ConvertedTime { public String getConvertedTime(long duration) { return StringUtils.replace(TimeConverter.FROM_2_TO_44_MINUTES, "$time", String .valueOf((duration + 30) / 60)); } } static class AboutOneHour implements ConvertedTime { public String getConvertedTime(long duration) { return TimeConverter.ABOUT_1_HOUR; } } static class About2To24Hours implements ConvertedTime { public String getConvertedTime(long duration) { long hours = (duration + 30 * 60 + 30) / TimeConverter.HOUR_IN_SECONDS; return StringUtils.replace(TimeConverter.ABOUT_2_TO_24_HOURS, "$time", String.valueOf(hours >= 23 ? 23 : hours)); } } static class AboutOneDay implements ConvertedTime { public String getConvertedTime(long duration) { return TimeConverter.ABOUT_1_DAY; } } static class From2To29Days implements ConvertedTime { public String getConvertedTime(long duration) { return StringUtils.replace(TimeConverter.FROM_2_TO_29_DAYS, "$time", String .valueOf((duration + 30) / TimeConverter.DAY_IN_SECONDS)); } } static class AboutOneMonth implements ConvertedTime { public String getConvertedTime(long duration) { return TimeConverter.ABOUT_1_MONTH; } } static class From2To12Month implements ConvertedTime { public String getConvertedTime(long duration) { return StringUtils.replace(TimeConverter.FROM_2_TO_12_MONTHS, "$time", String .valueOf((duration + 30) / TimeConverter.MONTH_IN_SECONDS)); } } static class AboutOneYear implements ConvertedTime { public String getConvertedTime(long duration) { return TimeConverter.ABOUT_1_YEAR; } } static class OverTwoYears implements ConvertedTime { public String getConvertedTime(long duration) { return StringUtils.replace(TimeConverter.OVER_2_YEARS, "$time", String.valueOf((duration + 30) / TimeConverter.YEAR_IN_SECONDS)); } } }