aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--juick-core/src/main/java/com/juick/util/PrettyTimeFormatter.java36
-rw-r--r--juick-www/src/main/java/com/mitchellbosecke/pebble/extension/FormatterExtension.java2
-rw-r--r--juick-www/src/main/java/com/mitchellbosecke/pebble/extension/filters/PrettyTimeFilter.java33
-rw-r--r--juick-www/src/main/webapp/WEB-INF/views/index.html2
4 files changed, 72 insertions, 1 deletions
diff --git a/juick-core/src/main/java/com/juick/util/PrettyTimeFormatter.java b/juick-core/src/main/java/com/juick/util/PrettyTimeFormatter.java
new file mode 100644
index 00000000..69be724b
--- /dev/null
+++ b/juick-core/src/main/java/com/juick/util/PrettyTimeFormatter.java
@@ -0,0 +1,36 @@
+package com.juick.util;
+
+import org.ocpsoft.prettytime.PrettyTime;
+
+import java.util.Date;
+import java.util.LinkedHashMap;
+import java.util.Locale;
+import java.util.Map;
+
+/**
+ * Created by vitalyster on 04.05.2017.
+ */
+public class PrettyTimeFormatter {
+ private static final int MAX_CACHE_SIZE = 20;
+
+ // Cache PrettyTime per locale. LRU cache to prevent memory leak.
+ private static final Map<Locale, PrettyTime> PRETTY_TIME_LOCALE_MAP =
+ new LinkedHashMap<Locale, PrettyTime>(MAX_CACHE_SIZE + 1, 1.1F, true)
+ {
+ @Override
+ protected boolean removeEldestEntry(Map.Entry<Locale, PrettyTime> eldest)
+ {
+ return size() > MAX_CACHE_SIZE;
+ }
+ };
+
+ public String format(final Locale locale, final Date value)
+ {
+ PrettyTime prettyTime;
+
+ synchronized (PRETTY_TIME_LOCALE_MAP) {
+ prettyTime = PRETTY_TIME_LOCALE_MAP.computeIfAbsent(locale, PrettyTime::new);
+ }
+ return prettyTime.format(value);
+ }
+}
diff --git a/juick-www/src/main/java/com/mitchellbosecke/pebble/extension/FormatterExtension.java b/juick-www/src/main/java/com/mitchellbosecke/pebble/extension/FormatterExtension.java
index e26b5c20..220e0460 100644
--- a/juick-www/src/main/java/com/mitchellbosecke/pebble/extension/FormatterExtension.java
+++ b/juick-www/src/main/java/com/mitchellbosecke/pebble/extension/FormatterExtension.java
@@ -1,6 +1,7 @@
package com.mitchellbosecke.pebble.extension;
import com.mitchellbosecke.pebble.extension.filters.FormatMessageFilter;
+import com.mitchellbosecke.pebble.extension.filters.PrettyTimeFilter;
import java.util.HashMap;
import java.util.Map;
@@ -13,6 +14,7 @@ public class FormatterExtension extends AbstractExtension {
public Map<String, Filter> getFilters() {
Map<String, Filter> filters = new HashMap<>();
filters.put("formatMessage", new FormatMessageFilter());
+ filters.put("prettyTime", new PrettyTimeFilter());
return filters;
}
}
diff --git a/juick-www/src/main/java/com/mitchellbosecke/pebble/extension/filters/PrettyTimeFilter.java b/juick-www/src/main/java/com/mitchellbosecke/pebble/extension/filters/PrettyTimeFilter.java
new file mode 100644
index 00000000..bbe31bb7
--- /dev/null
+++ b/juick-www/src/main/java/com/mitchellbosecke/pebble/extension/filters/PrettyTimeFilter.java
@@ -0,0 +1,33 @@
+package com.mitchellbosecke.pebble.extension.filters;
+
+import com.juick.util.PrettyTimeFormatter;
+import com.mitchellbosecke.pebble.extension.Filter;
+import com.mitchellbosecke.pebble.template.EvaluationContext;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+/**
+ * Created by vitalyster on 04.05.2017.
+ */
+public class PrettyTimeFilter implements Filter {
+
+ PrettyTimeFormatter formatter = new PrettyTimeFormatter();
+
+ @Override
+ public Object apply(Object input, Map<String, Object> args) {
+ if (input instanceof Date) {
+ EvaluationContext context = (EvaluationContext) args.get("_context");
+ Locale locale = context.getLocale();
+ return formatter.format(locale, (Date)input);
+ }
+ throw new IllegalArgumentException("invalid input");
+ }
+
+ @Override
+ public List<String> getArgumentNames() {
+ return null;
+ }
+}
diff --git a/juick-www/src/main/webapp/WEB-INF/views/index.html b/juick-www/src/main/webapp/WEB-INF/views/index.html
index a9d6d058..e2a38939 100644
--- a/juick-www/src/main/webapp/WEB-INF/views/index.html
+++ b/juick-www/src/main/webapp/WEB-INF/views/index.html
@@ -16,7 +16,7 @@
<div class="msg-ts">
<a href="/{{ msg.getUser().getName() }}/{{ msg.getMid() }}">
<time>
- {{ msg.getDate() }}
+ {{ msg.getDate() | prettyTime }}
</time>
</a>
</div>