Created
June 14, 2013 08:06
-
-
Save wendelicious/5780251 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.infusionsoft.personalization; | |
/** | |
* This represents the valid date formats Infusionsoft will accept and render. | |
*/ | |
public class StyleGuide { | |
public enum Date { | |
ReadableDowMonthDdYear("formats.readable.dow-month-dd-year"), | |
ReadableMonthDdYear("formats.readable.month-dd-year"), | |
ReadableMonDdYearTime("formats.readable.mon-dd-year-time"), | |
ReadableMonDdYear("formats.readable.mon-dd-year"), | |
ReadableMonYear("formats.readable.mon-year"), | |
SlashDateMD("formats.slash.m-d"), | |
SlashDateStandard("formats.slash.date"), | |
SlashDateMMDD("formats.slash.mm-dd"), | |
SlashDateMMDDYY("formats.slash.date.short-year"), | |
SlashDateMDYYYY("formats.slash.date.no-zero"), | |
SlashDateTimeMDYYYY("formats.slash.datetime.no-zero"), | |
SlashDateTime("formats.slash.datetime"), | |
SlashDateMDYY("formats.slash.date.no-zero-short-year"), | |
DateDateStandard("formats.dash.date"), | |
DashDateDDMonYYYY("formats.dash.dd-mon-yyyy"), | |
DashDateMMDD("formats.dash.mm-dd"), | |
DashDateTimeYearFirst("formats.dash.datetime.year-first"), | |
DashDateFormDisplay("formats.dash.form-display"), | |
DumpDate("formats.dump.date"), | |
DumpDateTime("formats.dump.datetime"), | |
IcalDateTime("formats.ical.datetime"), | |
InternalDate("formats.internal"), | |
MySqlDateBinding("formats.mysql.date-binding"), | |
MySqlDateTimeBinding("formats.mysql.datetime-binding"), | |
DnsBinding("formats.dns-binding"), | |
CompanionlinkDate("formats.companionlink.date"), | |
CompanionlinkDateTime("formats.companionlink.datetime"), | |
CompanionlinkAdhocDate("formats.companionlink.adhoc-date") | |
; | |
private final String messageCode; | |
private Date(String messageCode) { | |
this.messageCode = messageCode; | |
} | |
public String getMessageCode(){ | |
return messageCode; | |
} | |
} | |
// not meant to instantiated | |
private StyleGuide(){} | |
} | |
package com.infusionsoft.personalization.dates; | |
import com.infusion.util.AssertUtils; | |
import org.joda.time.DateTime; | |
import org.joda.time.LocalDateTime; | |
import org.joda.time.format.DateTimeFormat; | |
import org.joda.time.format.DateTimeFormatter; | |
/** | |
* This interface defines the contract between the app and the outside world. | |
* | |
* Contextually, the app will request one of these appropriate for what it is doing. | |
*/ | |
public class PersonalizedDateFormat { | |
private final String dateMask; | |
private final DateTimeFormatter formatter; | |
public PersonalizedDateFormat(String dateMask){ | |
AssertUtils.paramNotNull(dateMask, "date format mask"); | |
this.dateMask = dateMask; | |
formatter = DateTimeFormat.forPattern(dateMask); | |
} | |
public String format(DateTime date) { | |
return formatter.print(date); | |
} | |
public String format(LocalDateTime local) { | |
return formatter.print(local); | |
} | |
public DateTime parseDateTime(String dateString) { | |
return formatter.parseDateTime(dateString); | |
} | |
public LocalDateTime parseLocalDateTime(String dateString){ | |
return parseDateTime(dateString).toLocalDateTime(); | |
} | |
} | |
package com.infusionsoft.personalization.service; | |
import com.infusionsoft.personalization.StyleGuide; | |
import com.infusionsoft.personalization.dates.PersonalizedDateFormat; | |
import org.springframework.stereotype.Service; | |
import javax.annotation.PostConstruct; | |
import java.util.Locale; | |
import java.util.Map; | |
import java.util.concurrent.ConcurrentHashMap; | |
/** | |
* This factory service will give you a locale-appropriate formatter/renderer for the style you request. | |
*/ | |
@Service | |
public class PersonalizedDateFormatFactory { | |
static final String DATE_FORMAT_BUNDLE_NAME = "date"; | |
private static final Map<Locale, PersonalizedDateFormatStyleFactory> localeStyleFactories = new ConcurrentHashMap<Locale, PersonalizedDateFormatStyleFactory>(); | |
@PostConstruct | |
public void init(){ | |
PersonalizedDateFormatStyleFactory us = new PersonalizedDateFormatStyleFactory(Locale.US); | |
PersonalizedDateFormatStyleFactory uk = new PersonalizedDateFormatStyleFactory(Locale.UK); | |
localeStyleFactories.put(us.getLocale(), us); | |
localeStyleFactories.put(uk.getLocale(), uk); | |
} | |
public PersonalizedDateFormat getLocalizedFormat(StyleGuide.Date style, Locale locale){ | |
PersonalizedDateFormatStyleFactory localeStyles = localeStyleFactories.get(locale); | |
if(localeStyles == null){ | |
localeStyles = new PersonalizedDateFormatStyleFactory(locale); | |
localeStyleFactories.put(locale, localeStyles); | |
} | |
return localeStyles.getStyleFormat(style); | |
} | |
} | |
package com.infusionsoft.personalization.service; | |
import com.infusion.util.AssertUtils; | |
import com.infusionsoft.personalization.StyleGuide; | |
import com.infusionsoft.personalization.dates.PersonalizedDateFormat; | |
import java.util.Locale; | |
import java.util.Map; | |
import java.util.ResourceBundle; | |
import java.util.concurrent.ConcurrentHashMap; | |
/** | |
* This uses the per-locale resources to identify the mask and initialize the appropriate personalized format. | |
*/ | |
class PersonalizedDateFormatStyleFactory { | |
private final Locale locale; | |
private final ResourceBundle dateFormatsBundle; | |
private final Map<StyleGuide.Date, PersonalizedDateFormat> namedFormats; | |
PersonalizedDateFormatStyleFactory(Locale locale) { | |
this.locale = locale; | |
this.dateFormatsBundle = ResourceBundle.getBundle(PersonalizedDateFormatFactory.DATE_FORMAT_BUNDLE_NAME, locale); | |
this.namedFormats = new ConcurrentHashMap<StyleGuide.Date, PersonalizedDateFormat>(); | |
} | |
public PersonalizedDateFormat getStyleFormat(StyleGuide.Date style){ | |
PersonalizedDateFormat format = namedFormats.get(style); | |
if(format == null){ | |
final String mask = dateFormatsBundle.getString(style.getMessageCode()); | |
AssertUtils.paramNotNull(mask, String.format("Missing localized date format named '%s' (mask '%s') for locale '%s'", style.name(), style.getMessageCode(), locale)); | |
format = new PersonalizedDateFormat(mask); | |
namedFormats.put(style, format); | |
} | |
return format; | |
} | |
public Locale getLocale(){ | |
return locale; | |
} | |
} |
date_en_GB.properties:
formats.slash.m-d = M/d
formats.slash.mm-dd = dd/MM
formats.slash.date = dd/MM/yyyy
formats.slash.date.short-year = dd/MM/yy
formats.slash.date.no-zero = M/d/yyyy
formats.slash.datetime.no-zero = M/d/yyyy h:mm a
formats.slash.datetime = dd/MM/yyyy h:mm a
formats.slash.date.no-zero-short-year = M/d/yyyy h:mm a
formats.dash.dd-mon-yyyy = dd-MMM-yyyy
formats.dash.mm-dd = dd-MM
formats.dash.date = dd-MM-yyyy
formats.dash.datetime.year-first = yyyy-dd-MM h:mm a
formats.dash.form-display = dd-MM-yyyy,HH:mm
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
date_en_US.properties:
formats.slash.m-d = M/d
formats.slash.mm-dd = MM/dd
formats.slash.date = MM/dd/yyyy
formats.slash.date.short-year = MM/dd/yy
formats.slash.date.no-zero = M/d/yyyy
formats.slash.datetime.no-zero = M/d/yyyy h:mm a
formats.slash.datetime = MM/dd/yyyy h:mm a
formats.slash.date.no-zero-short-year = M/d/yyyy h:mm a
formats.dash.dd-mon-yyyy = dd-MMM-yyyy
formats.dash.mm-dd = MM-dd
formats.dash.date = MM-dd-yyyy
formats.dash.datetime.year-first = yyyy-MM-dd h:mm a
formats.dash.form-display = MM-dd-yyyy,HH:mm