From bad2718b1b85d806221fce52c76fa1d388993396 Mon Sep 17 00:00:00 2001 From: Alexander Alexeev Date: Wed, 7 Dec 2016 18:53:37 +0700 Subject: singleton java 8 date formatters --- .../main/java/com/juick/util/DateFormatter.java | 38 ++++++++++++++++++ .../java/com/juick/util/DateFormattersHolder.java | 43 +++++++++++++++++++++ .../src/main/java/com/juick/util/MessageUtils.java | 2 + .../com/juick/xml/adapters/SimpleDateAdapter.java | 23 ++--------- .../src/test/java/com/juick/FormatterTest.java | 45 ++++++++++++++++++++++ 5 files changed, 132 insertions(+), 19 deletions(-) create mode 100644 juick-core/src/main/java/com/juick/util/DateFormatter.java create mode 100644 juick-core/src/main/java/com/juick/util/DateFormattersHolder.java create mode 100644 juick-core/src/test/java/com/juick/FormatterTest.java (limited to 'juick-core/src') diff --git a/juick-core/src/main/java/com/juick/util/DateFormatter.java b/juick-core/src/main/java/com/juick/util/DateFormatter.java new file mode 100644 index 00000000..34585c63 --- /dev/null +++ b/juick-core/src/main/java/com/juick/util/DateFormatter.java @@ -0,0 +1,38 @@ +package com.juick.util; + +import org.apache.commons.lang3.StringUtils; + +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.time.format.DateTimeFormatter; +import java.util.Date; + +/** + * Created by aalexeev on 12/7/16. + */ +public class DateFormatter { + private final DateTimeFormatter formatter; + + DateFormatter(String pattern) { + formatter = DateTimeFormatter.ofPattern(pattern); + } + + public String format(final Date date) { + if (date == null) + return null; + + LocalDateTime ldt = LocalDateTime.ofInstant(date.toInstant(), ZoneOffset.UTC); + + return ldt.format(formatter); + } + + + public Date parse(final String v) { + if (StringUtils.isBlank(v)) + return null; + + LocalDateTime ldt = LocalDateTime.parse(v, formatter); + + return Date.from(ldt.toInstant(ZoneOffset.UTC)); + } +} diff --git a/juick-core/src/main/java/com/juick/util/DateFormattersHolder.java b/juick-core/src/main/java/com/juick/util/DateFormattersHolder.java new file mode 100644 index 00000000..79414808 --- /dev/null +++ b/juick-core/src/main/java/com/juick/util/DateFormattersHolder.java @@ -0,0 +1,43 @@ +package com.juick.util; + +/** + * Created by aalexeev on 12/7/16. + */ +public class DateFormattersHolder { + + private DateFormattersHolder() { + throw new IllegalStateException(); + } + + private static volatile DateFormatter messageFormatter; + + public static DateFormatter getMessageFormatterInstance() { + DateFormatter localInstance = messageFormatter; + + if (localInstance == null) { + synchronized (DateFormatter.class) { + localInstance = messageFormatter; + + if (localInstance == null) + messageFormatter = localInstance = new DateFormatter("yyyy-MM-dd HH:mm:ss"); + } + } + return localInstance; + } + + private static volatile DateFormatter rssFormatter; + + public static DateFormatter getRssFormatterInstance() { + DateFormatter localInstance = rssFormatter; + + if (localInstance == null) { + synchronized (DateFormatter.class) { + localInstance = rssFormatter; + + if (localInstance == null) + rssFormatter = localInstance = new DateFormatter("EEE, d MMM yyyy HH:mm:ss"); + } + } + return localInstance; + } +} diff --git a/juick-core/src/main/java/com/juick/util/MessageUtils.java b/juick-core/src/main/java/com/juick/util/MessageUtils.java index 12ae71c1..96d650a8 100644 --- a/juick-core/src/main/java/com/juick/util/MessageUtils.java +++ b/juick-core/src/main/java/com/juick/util/MessageUtils.java @@ -24,6 +24,7 @@ public class MessageUtils { return result; } + private static Pattern regexLinks2 = Pattern.compile("((?<=\\s)|(?<=\\A))([\\[\\{]|<)((?:ht|f)tps?://(?:www\\.)?([^\\/\\s\\\"\\)\\!]+)/?(?:[^\\]\\}](?" + msg + ""; } + public static String formatMessage(String msg) { msg = msg.replaceAll("&", "&"); msg = msg.replaceAll("<", "<"); diff --git a/juick-core/src/main/java/com/juick/xml/adapters/SimpleDateAdapter.java b/juick-core/src/main/java/com/juick/xml/adapters/SimpleDateAdapter.java index 1093e47a..382db45a 100644 --- a/juick-core/src/main/java/com/juick/xml/adapters/SimpleDateAdapter.java +++ b/juick-core/src/main/java/com/juick/xml/adapters/SimpleDateAdapter.java @@ -1,10 +1,9 @@ package com.juick.xml.adapters; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.TimeZone; +import com.juick.util.DateFormattersHolder; import javax.xml.bind.annotation.adapters.XmlAdapter; +import java.util.Date; /** * Created by vitalyster on 15.11.2016. @@ -12,27 +11,13 @@ import javax.xml.bind.annotation.adapters.XmlAdapter; public class SimpleDateAdapter extends XmlAdapter { - private final SimpleDateFormat dateFormat; - public SimpleDateAdapter() { - dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); - } - @Override public String marshal(Date v) throws Exception { - if (v == null) { - return null; - } - synchronized (dateFormat) { - return dateFormat.format(v); - } + return DateFormattersHolder.getMessageFormatterInstance().format(v); } @Override public Date unmarshal(String v) throws Exception { - synchronized (dateFormat) { - return dateFormat.parse(v); - } + return DateFormattersHolder.getMessageFormatterInstance().parse(v); } - } diff --git a/juick-core/src/test/java/com/juick/FormatterTest.java b/juick-core/src/test/java/com/juick/FormatterTest.java new file mode 100644 index 00000000..d246c369 --- /dev/null +++ b/juick-core/src/test/java/com/juick/FormatterTest.java @@ -0,0 +1,45 @@ +package com.juick; + +import com.juick.util.DateFormattersHolder; +import org.apache.commons.lang3.RandomUtils; +import org.junit.Test; + +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.TimeZone; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; + +/** + * Created by aalexeev on 12/7/16. + */ +public class FormatterTest { + + @Test + public void forAnyDateFormatterShouldReturnNotEmptyString() throws Exception { + Date date = new Date(); + + assertThat(DateFormattersHolder.getMessageFormatterInstance().format(date), not(isEmptyOrNullString())); + assertThat(DateFormattersHolder.getRssFormatterInstance().format(date), not(isEmptyOrNullString())); + + date = new Date(RandomUtils.nextLong(1, Long.MAX_VALUE / 10000)); + + assertThat(DateFormattersHolder.getMessageFormatterInstance().format(date), not(isEmptyOrNullString())); + assertThat(DateFormattersHolder.getRssFormatterInstance().format(date), not(isEmptyOrNullString())); + } + + @Test + public void forConcreteDateShouldReturnCorrectString() throws Exception { + Calendar calendar = GregorianCalendar.getInstance(); + + calendar.set(2012, 0, 1, 0, 0, 0); + calendar.setTimeZone(TimeZone.getTimeZone("UTC")); + + Date date = calendar.getTime(); + + assertThat(DateFormattersHolder.getMessageFormatterInstance().format(date), equalTo("2012-01-01 00:00:00")); + assertThat(DateFormattersHolder.getRssFormatterInstance().format(date), equalTo("Sun, 1 Jan 2012 00:00:00")); + } +} -- cgit v1.2.3