Last active
April 13, 2016 20:22
-
-
Save gilbertoca/863a0027e6c0d497b8825695599a9dc0 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
import java.time.LocalDate; | |
import java.time.ZoneId; | |
import java.time.format.DateTimeFormatter; | |
import java.time.format.DateTimeParseException; | |
import java.util.Locale; | |
import java.util.TimeZone; | |
import javax.faces.application.FacesMessage; | |
import javax.faces.component.UIComponent; | |
import javax.faces.context.FacesContext; | |
import javax.faces.convert.Converter; | |
import javax.faces.convert.ConverterException; | |
import javax.faces.convert.FacesConverter; | |
/** | |
* | |
* Faces converter for support of LocalDate | |
* | |
*/ | |
@FacesConverter(forClass = LocalDate.class, value = "localDateConverter") | |
public class LocalDateConverter implements Converter { | |
@Override | |
public String getAsString(FacesContext context, UIComponent component, Object modelValue) { | |
if (modelValue == null) { | |
return ""; | |
} | |
if (modelValue instanceof LocalDate) { | |
return getFormatter(context, component).format((LocalDate)modelValue); | |
} else { | |
throw new ConverterException(new FacesMessage(modelValue + " is not a valid LocalDate")); | |
} | |
} | |
@Override | |
public Object getAsObject(FacesContext context, UIComponent component, String submittedValue) { | |
if (submittedValue == null || submittedValue.isEmpty()) { | |
return null; | |
} | |
try { | |
return LocalDate.parse(submittedValue, getFormatter(context, component)); | |
} catch (DateTimeParseException e) { | |
throw new ConverterException(new FacesMessage(submittedValue + " is not a valid local date"), e); | |
} | |
} | |
private DateTimeFormatter getFormatter(FacesContext context, UIComponent component) { | |
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(getPattern(component), getLocale(context, component)); | |
ZoneId zone = getZoneId(component); | |
return (zone != null) ? formatter.withZone(zone) : formatter; | |
} | |
private String getPattern(UIComponent component) { | |
String pattern = (String) component.getAttributes().get("pattern"); | |
if (pattern == null) { | |
throw new IllegalArgumentException("pattern attribute is required"); | |
} | |
return pattern; | |
} | |
private Locale getLocale(FacesContext context, UIComponent component) { | |
Object locale = component.getAttributes().get("locale"); | |
return (locale instanceof Locale) ? (Locale) locale | |
: (locale instanceof String) ? new Locale((String) locale) | |
: context.getViewRoot().getLocale(); | |
} | |
private ZoneId getZoneId(UIComponent component) { | |
Object timeZone = component.getAttributes().get("timeZone"); | |
return (timeZone instanceof TimeZone) ? ((TimeZone) timeZone).toZoneId() | |
: (timeZone instanceof String) ? ZoneId.of((String) timeZone) | |
: null; | |
} | |
} | |
import java.time.LocalDateTime; | |
import java.time.ZoneId; | |
import java.time.ZoneOffset; | |
import java.time.ZonedDateTime; | |
import java.time.format.DateTimeFormatter; | |
import java.time.format.DateTimeParseException; | |
import java.util.Locale; | |
import java.util.TimeZone; | |
import javax.faces.application.FacesMessage; | |
import javax.faces.component.UIComponent; | |
import javax.faces.context.FacesContext; | |
import javax.faces.convert.Converter; | |
import javax.faces.convert.ConverterException; | |
import javax.faces.convert.FacesConverter; | |
/** | |
* | |
* Faces converter for support of LocalDateTime | |
* | |
*/ | |
@FacesConverter(forClass = LocalDateTime.class, value = "localDateTimeConverter") | |
public class LocalDateTimeConverter implements Converter { | |
@Override | |
public String getAsString(FacesContext context, UIComponent component, Object modelValue) { | |
if (modelValue == null) { | |
return ""; | |
} | |
if (modelValue instanceof LocalDateTime) { | |
return getFormatter(context, component).format(ZonedDateTime.of((LocalDateTime) modelValue, ZoneOffset.UTC)); | |
} else { | |
throw new ConverterException(new FacesMessage(modelValue + " is not a valid LocalDateTime")); | |
} | |
} | |
@Override | |
public Object getAsObject(FacesContext context, UIComponent component, String submittedValue) { | |
if (submittedValue == null || submittedValue.isEmpty()) { | |
return null; | |
} | |
try { | |
return ZonedDateTime.parse(submittedValue, getFormatter(context, component)).withZoneSameInstant(ZoneOffset.UTC).toLocalDateTime(); | |
} catch (DateTimeParseException e) { | |
throw new ConverterException(new FacesMessage(submittedValue + " is not a valid local date time"), e); | |
} | |
} | |
private DateTimeFormatter getFormatter(FacesContext context, UIComponent component) { | |
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(getPattern(component), getLocale(context, component)); | |
ZoneId zone = getZoneId(component); | |
return (zone != null) ? formatter.withZone(zone) : formatter; | |
} | |
private String getPattern(UIComponent component) { | |
String pattern = (String) component.getAttributes().get("pattern"); | |
if (pattern == null) { | |
throw new IllegalArgumentException("pattern attribute is required"); | |
} | |
return pattern; | |
} | |
private Locale getLocale(FacesContext context, UIComponent component) { | |
Object locale = component.getAttributes().get("locale"); | |
return (locale instanceof Locale) ? (Locale) locale | |
: (locale instanceof String) ? new Locale((String) locale) | |
: context.getViewRoot().getLocale(); | |
} | |
private ZoneId getZoneId(UIComponent component) { | |
Object timeZone = component.getAttributes().get("timeZone"); | |
return (timeZone instanceof TimeZone) ? ((TimeZone) timeZone).toZoneId() | |
: (timeZone instanceof String) ? ZoneId.of((String) timeZone) | |
: null; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment