From 27ae9095639bb228a1b7ff86a3ebe4264abf05be Mon Sep 17 00:00:00 2001
From: mschaefers <mschaefers@scoop-gmbh.de>
Date: Thu, 29 Nov 2012 12:33:09 -0500
Subject: [PATCH] feature: when using LdapUserService one can configure Gitblit to fetch all users from ldap that can possibly login. This allows to see newly generated LDAP users instantly in Gitblit. By now an LDAP user had to log in once to appear in GitBlit.
---
src/com/gitblit/utils/TimeUtils.java | 284 ++++++++++++++++++++++++++++++++++++++++++++------------
1 files changed, 223 insertions(+), 61 deletions(-)
diff --git a/src/com/gitblit/utils/TimeUtils.java b/src/com/gitblit/utils/TimeUtils.java
index 16aea77..ec8871c 100644
--- a/src/com/gitblit/utils/TimeUtils.java
+++ b/src/com/gitblit/utils/TimeUtils.java
@@ -15,8 +15,18 @@
*/
package com.gitblit.utils;
+import java.text.MessageFormat;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
import java.util.Date;
+import java.util.ResourceBundle;
+/**
+ * Utility class of time functions.
+ *
+ * @author James Moger
+ *
+ */
public class TimeUtils {
public static final long MIN = 1000 * 60L;
@@ -27,56 +37,86 @@
public static final long ONEDAY = ONEHOUR * 24L;
public static final long ONEYEAR = ONEDAY * 365L;
+
+ private final ResourceBundle translation;
+
+ public TimeUtils() {
+ this(null);
+ }
+
+ public TimeUtils(ResourceBundle translation) {
+ this.translation = translation;
+ }
- @SuppressWarnings("deprecation")
+ /**
+ * Returns true if date is today.
+ *
+ * @param date
+ * @return true if date is today
+ */
public static boolean isToday(Date date) {
- Date now = new Date();
- return now.getDate() == date.getDate() && now.getMonth() == date.getMonth()
- && now.getYear() == date.getYear();
+ return (System.currentTimeMillis() - date.getTime()) < ONEDAY;
}
- @SuppressWarnings("deprecation")
+ /**
+ * Returns true if date is yesterday.
+ *
+ * @param date
+ * @return true if date is yesterday
+ */
public static boolean isYesterday(Date date) {
- Date now = new Date();
- return now.getDate() == (date.getDate() + 1) && now.getMonth() == date.getMonth()
- && now.getYear() == date.getYear();
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(new Date());
+ cal.add(Calendar.DATE, -1);
+ SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
+ return df.format(cal.getTime()).equals(df.format(date));
}
- public static String duration(int days) {
+ /**
+ * Returns the string representation of the duration as days, months and/or
+ * years.
+ *
+ * @param days
+ * @return duration as string in days, months, and/or years
+ */
+ public String duration(int days) {
if (days <= 60) {
- return days + (days > 1 ? " days" : " day");
- } else if (days <= 365) {
+ return (days > 1 ? translate(days, "gb.duration.days", "{0} days") : translate("gb.duration.oneDay", "1 day"));
+ } else if (days < 365) {
int rem = days % 30;
- return (days / 30) + " months, " + rem + (rem > 1 ? " days" : " day");
+ return translate(((days / 30) + (rem >= 15 ? 1 : 0)), "gb.duration.months", "{0} months");
} else {
int years = days / 365;
int rem = days % 365;
- String yearsString = years + (years > 1 ? " years" : " year");
+ String yearsString = (years > 1 ? translate(years, "gb.duration.years", "{0} years") : translate("gb.duration.oneYear", "1 year"));
if (rem < 30) {
if (rem == 0) {
return yearsString;
} else {
- return yearsString + ", " + rem + (rem > 1 ? " days" : " day");
+ return yearsString + (rem >= 15 ? (", " + translate("gb.duration.oneMonth", "1 month")): "");
}
} else {
int months = rem / 30;
int remDays = rem % 30;
- String monthsString;
- if (months == 0) {
- monthsString = yearsString;
- } else {
- monthsString = yearsString + ", " + months
- + (months > 1 ? " months" : " month");
+ if (remDays >= 15) {
+ months++;
}
- if (remDays == 0) {
- return monthsString;
- } else {
- return monthsString + ", " + remDays + (remDays > 1 ? " days" : " day");
- }
+ String monthsString = yearsString + ", "
+ + (months > 1 ? translate(months, "gb.duration.months", "{0} months") : translate("gb.duration.oneMonth", "1 month"));
+ return monthsString;
}
}
}
+ /**
+ * Returns the number of minutes ago between the start time and the end
+ * time.
+ *
+ * @param date
+ * @param endTime
+ * @param roundup
+ * @return difference in minutes
+ */
public static int minutesAgo(Date date, long endTime, boolean roundup) {
long diff = endTime - date.getTime();
int mins = (int) (diff / MIN);
@@ -86,10 +126,24 @@
return mins;
}
+ /**
+ * Return the difference in minutes between now and the date.
+ *
+ * @param date
+ * @param roundup
+ * @return minutes ago
+ */
public static int minutesAgo(Date date, boolean roundup) {
return minutesAgo(date, System.currentTimeMillis(), roundup);
}
+ /**
+ * Return the difference in hours between now and the date.
+ *
+ * @param date
+ * @param roundup
+ * @return hours ago
+ */
public static int hoursAgo(Date date, boolean roundup) {
long diff = System.currentTimeMillis() - date.getTime();
int hours = (int) (diff / ONEHOUR);
@@ -99,81 +153,189 @@
return hours;
}
- public static int daysAgo(Date date, boolean roundup) {
- long diff = System.currentTimeMillis() - date.getTime();
+ /**
+ * Return the difference in days between now and the date.
+ *
+ * @param date
+ * @return days ago
+ */
+ public static int daysAgo(Date date) {
+ long today = ONEDAY * (System.currentTimeMillis()/ONEDAY);
+ long day = ONEDAY * (date.getTime()/ONEDAY);
+ long diff = today - day;
int days = (int) (diff / ONEDAY);
- if (roundup && (diff % ONEDAY) > 0) {
- days++;
- }
return days;
}
- public static String timeAgo(Date date) {
+ public String today() {
+ return translate("gb.time.today", "today");
+ }
+
+ public String yesterday() {
+ return translate("gb.time.yesterday", "yesterday");
+ }
+
+ /**
+ * Returns the string representation of the duration between now and the
+ * date.
+ *
+ * @param date
+ * @return duration as a string
+ */
+ public String timeAgo(Date date) {
return timeAgo(date, false);
}
- public static String timeAgoCss(Date date) {
+ /**
+ * Returns the CSS class for the date based on its age from Now.
+ *
+ * @param date
+ * @return the css class
+ */
+ public String timeAgoCss(Date date) {
return timeAgo(date, true);
}
- private static String timeAgo(Date date, boolean css) {
- String ago = null;
+ /**
+ * Returns the string representation of the duration OR the css class for
+ * the duration.
+ *
+ * @param date
+ * @param css
+ * @return the string representation of the duration OR the css class
+ */
+ private String timeAgo(Date date, boolean css) {
if (isToday(date) || isYesterday(date)) {
int mins = minutesAgo(date, true);
- if (mins > 120) {
+ if (mins >= 120) {
if (css) {
return "age1";
}
int hours = hoursAgo(date, true);
if (hours > 23) {
- ago = "yesterday";
+ return yesterday();
} else {
- ago = hours + " hour" + (hours > 1 ? "s" : "") + " ago";
+ return translate(hours, "gb.time.hoursAgo", "{0} hours ago");
}
- } else {
- if (css) {
- return "age0";
- }
- ago = mins + " min" + (mins > 1 ? "s" : "") + " ago";
}
- } else {
if (css) {
- return "age2";
+ return "age0";
}
- int days = daysAgo(date, true);
+ if (mins > 2) {
+ return translate(mins, "gb.time.minsAgo", "{0} mins ago");
+ }
+ return translate("gb.time.justNow", "just now");
+ } else {
+ int days = daysAgo(date);
+ if (css) {
+ if (days <= 7) {
+ return "age2";
+ } if (days <= 30) {
+ return "age3";
+ } else {
+ return "age4";
+ }
+ }
if (days < 365) {
if (days <= 30) {
- ago = days + " day" + (days > 1 ? "s" : "") + " ago";
+ return translate(days, "gb.time.daysAgo", "{0} days ago");
} else if (days <= 90) {
int weeks = days / 7;
if (weeks == 12) {
- ago = "3 months ago";
+ return translate(3, "gb.time.monthsAgo", "{0} months ago");
} else {
- ago = weeks + " weeks ago";
+ return translate(weeks, "gb.time.weeksAgo", "{0} weeks ago");
}
- } else if (days > 90) {
- int months = days / 30;
- int weeks = (days % 30) / 7;
- if (weeks >= 2) {
- months++;
- }
- ago = months + " month" + (months > 1 ? "s" : "") + " ago";
- } else {
- ago = days + " day" + (days > 1 ? "s" : "") + " ago";
}
+ int months = days / 30;
+ int weeks = (days % 30) / 7;
+ if (weeks >= 2) {
+ months++;
+ }
+ return translate(months, "gb.time.monthsAgo", "{0} months ago");
} else if (days == 365) {
- ago = "1 year ago";
+ return translate("gb.time.oneYearAgo", "1 year ago");
} else {
int yr = days / 365;
days = days % 365;
int months = (yr * 12) + (days / 30);
if (months > 23) {
- ago = yr + " years ago";
+ return translate(yr, "gb.time.yearsAgo", "{0} years ago");
} else {
- ago = months + " months ago";
+ return translate(months, "gb.time.monthsAgo", "{0} months ago");
}
}
}
- return ago;
+ }
+
+ public String inFuture(Date date) {
+ long diff = date.getTime() - System.currentTimeMillis();
+ if (diff > ONEDAY) {
+ double days = ((double) diff)/ONEDAY;
+ return translate((int) Math.round(days), "gb.time.inDays", "in {0} days");
+ } else {
+ double hours = ((double) diff)/ONEHOUR;
+ if (hours > 2) {
+ return translate((int) Math.round(hours), "gb.time.inHours", "in {0} hours");
+ } else {
+ int mins = (int) (diff/MIN);
+ return translate(mins, "gb.time.inMinutes", "in {0} minutes");
+ }
+ }
+ }
+
+ private String translate(String key, String defaultValue) {
+ String value = defaultValue;
+ if (translation != null && translation.containsKey(key)) {
+ String aValue = translation.getString(key);
+ if (!StringUtils.isEmpty(aValue)) {
+ value = aValue;
+ }
+ }
+ return value;
+ }
+
+ private String translate(int val, String key, String defaultPattern) {
+ String pattern = defaultPattern;
+ if (translation != null && translation.containsKey(key)) {
+ String aValue = translation.getString(key);
+ if (!StringUtils.isEmpty(aValue)) {
+ pattern = aValue;
+ }
+ }
+ return MessageFormat.format(pattern, val);
+ }
+
+ /**
+ * Convert a frequency string into minutes.
+ *
+ * @param frequency
+ * @return minutes
+ */
+ public static int convertFrequencyToMinutes(String frequency) {
+ // parse the frequency
+ frequency = frequency.toLowerCase();
+ int mins = 60;
+ if (!StringUtils.isEmpty(frequency)) {
+ try {
+ String str = frequency.trim();
+ if (frequency.indexOf(' ') > -1) {
+ str = str.substring(0, str.indexOf(' ')).trim();
+ }
+ mins = (int) Float.parseFloat(str);
+ } catch (NumberFormatException e) {
+ }
+ if (mins < 5) {
+ mins = 5;
+ }
+ }
+ if (frequency.indexOf("day") > -1) {
+ // convert to minutes
+ mins *= 1440;
+ } else if (frequency.indexOf("hour") > -1) {
+ // convert to minutes
+ mins *= 60;
+ }
+ return mins;
}
}
--
Gitblit v1.9.1