From 6fa1996d41fea8d5e53fe74ed8fe749b1ce22392 Mon Sep 17 00:00:00 2001 From: imod Date: Thu, 7 Aug 2014 14:29:05 +0200 Subject: [PATCH] fix date parsing (GH issue #8) --- .../social/xing/api/XingDate.java | 83 ++++++++++++------- .../social/xing/api/XingDateTest.java | 37 +++++++++ 2 files changed, 90 insertions(+), 30 deletions(-) create mode 100644 spring-social-xing/src/test/java/org/springframework/social/xing/api/XingDateTest.java diff --git a/spring-social-xing/src/main/java/org/springframework/social/xing/api/XingDate.java b/spring-social-xing/src/main/java/org/springframework/social/xing/api/XingDate.java index 5c9b2d0..fb3e408 100644 --- a/spring-social-xing/src/main/java/org/springframework/social/xing/api/XingDate.java +++ b/spring-social-xing/src/main/java/org/springframework/social/xing/api/XingDate.java @@ -1,41 +1,64 @@ package org.springframework.social.xing.api; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - import java.io.Serializable; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + public class XingDate implements Serializable { - private static final Log logger = LogFactory.getLog(XingDate.class); - - private static final long serialVersionUID = 6747607636067970948L; - private Integer year; - private Integer month; - - - public XingDate(String dateString) { - SimpleDateFormat format = new SimpleDateFormat("yyyy-MM"); - try { - Calendar cal = Calendar.getInstance(); - Date date = format.parse(dateString); - cal.setTime(date); - month = cal.get(Calendar.MONTH) + 1; // MONTH is zero based - year = cal.get(Calendar.YEAR); - } catch (ParseException e) { - logger.fatal("failed to parse date string " + dateString, e); - } - } - - public Integer getMonth() { - return month; - } - - public Integer getYear() { - return year; - } + private static final String DEFAULT_DATE_FORMAT = "yyyy-MM"; + private static final String FALLBACK_DATE_FORMAT = "yyyy"; + + private static final Log logger = LogFactory.getLog(XingDate.class); + + private static final long serialVersionUID = 6747607636067970948L; + private Integer year; + private Integer month; + + public XingDate(String dateString) { + + if (dateString != null && !"".equals(dateString.trim())) { + + if (DEFAULT_DATE_FORMAT.length() == dateString.length()) { + try { + SimpleDateFormat format = new SimpleDateFormat( + DEFAULT_DATE_FORMAT); + Calendar cal = Calendar.getInstance(); + Date date = format.parse(dateString); + cal.setTime(date); + month = cal.get(Calendar.MONTH) + 1; // MONTH is zero based + year = cal.get(Calendar.YEAR); + } catch (ParseException e) { + logger.fatal("failed to parse date string " + dateString, e); + } + } else if (FALLBACK_DATE_FORMAT.length() == dateString.length()) { + try { + SimpleDateFormat fallbackFormat = new SimpleDateFormat( + FALLBACK_DATE_FORMAT); + Calendar cal = Calendar.getInstance(); + Date date = fallbackFormat.parse(dateString); + cal.setTime(date); + year = cal.get(Calendar.YEAR); + } catch (ParseException e) { + logger.fatal("failed to parse date string " + dateString, e); + } + } else { + logger.fatal("unknown date format: " + dateString); + } + + } + } + + public Integer getMonth() { + return month; + } + + public Integer getYear() { + return year; + } } diff --git a/spring-social-xing/src/test/java/org/springframework/social/xing/api/XingDateTest.java b/spring-social-xing/src/test/java/org/springframework/social/xing/api/XingDateTest.java new file mode 100644 index 0000000..2913ba3 --- /dev/null +++ b/spring-social-xing/src/test/java/org/springframework/social/xing/api/XingDateTest.java @@ -0,0 +1,37 @@ +package org.springframework.social.xing.api; + +import static org.junit.Assert.*; + +import org.junit.Test; + +public class XingDateTest { + + @Test + public void testDifferentDateFormats() { + + { + XingDate date = new XingDate("2010-01"); + assertEquals(Integer.valueOf(2010), date.getYear()); + assertEquals(Integer.valueOf(1), date.getMonth()); + } + + { + XingDate date = new XingDate("2007"); + assertEquals(Integer.valueOf(2007), date.getYear()); + assertNull(date.getMonth()); + } + + { + XingDate date = new XingDate(""); + assertNull(date.getYear()); + assertNull(date.getMonth()); + } + + { + XingDate date = new XingDate(null); + assertNull(date.getYear()); + assertNull(date.getMonth()); + } + } + +}