in tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/DateRenderer.java [215:309]
protected Converter getConverter(FacesContext facesContext, T component, Object value) {
final Converter converter = component.getConverter();
if (converter != null) {
// todo: should we warn here, if the type is not "text"?
return converter;
} else {
Class<?> estimatedType = estimateValueType(facesContext, component);
if (estimatedType == null) {
// todo: log debug instead of warn
LOG.warn("Can't estimate type (clientId='{}')!", component.getClientId(facesContext));
return null;
} else if (estimatedType.isAssignableFrom(String.class)) {
// todo: log debug instead of warn
LOG.warn("No converter for java.lang.String");
return null;
} else {
final DateTimeConverter dateTimeConverter = (DateTimeConverter)
facesContext.getApplication().createConverter("jakarta.faces.DateTime");
if (estimatedType.isAssignableFrom(LocalDateTime.class)) {
dateTimeConverter.setType("localDateTime");
final Double step = component.getStep();
if (step == null || step >= 60) {
dateTimeConverter.setPattern(DateType.PATTERN_DATETIME_LOCAL);
} else if (step >= 1) {
dateTimeConverter.setPattern(DateType.PATTERN_DATETIME_LOCAL_SECONDS);
} else {
dateTimeConverter.setPattern(DateType.PATTERN_DATETIME_LOCAL_MILLIS);
}
} else if (estimatedType.isAssignableFrom(LocalDate.class)) {
dateTimeConverter.setType("localDate");
dateTimeConverter.setPattern(DateType.PATTERN_DATE);
} else if (estimatedType.isAssignableFrom(LocalTime.class)) {
dateTimeConverter.setType("localTime");
final Double step = component.getStep();
if (step == null || step >= 60) {
dateTimeConverter.setPattern(DateType.PATTERN_TIME);
} else if (step >= 1) {
dateTimeConverter.setPattern(DateType.PATTERN_TIME_SECONDS);
} else {
dateTimeConverter.setPattern(DateType.PATTERN_TIME_MILLIS);
}
} else if (estimatedType.isAssignableFrom(ZonedDateTime.class)) {
dateTimeConverter.setType("zonedDateTime");
final Double step = component.getStep();
if (step == null || step >= 60) {
dateTimeConverter.setPattern(DateType.PATTERN_DATETIME_LOCAL);
} else if (step >= 1) {
dateTimeConverter.setPattern(DateType.PATTERN_DATETIME_LOCAL_SECONDS);
} else {
dateTimeConverter.setPattern(DateType.PATTERN_DATETIME_LOCAL_MILLIS);
}
} else if (estimatedType.isAssignableFrom(Long.class)) {
dateTimeConverter.setType("date");
dateTimeConverter.setPattern(DateType.PATTERN_DATE);
} else if (estimatedType.isAssignableFrom(Date.class)) {
dateTimeConverter.setType("date");
final DateType type = component.getType();
if (DateType.DATETIME_LOCAL.equals(type)) {
final Double step = component.getStep();
if (step == null || step >= 60) {
dateTimeConverter.setPattern(DateType.PATTERN_DATETIME_LOCAL);
} else if (step >= 1) {
dateTimeConverter.setPattern(DateType.PATTERN_DATETIME_LOCAL_SECONDS);
} else {
dateTimeConverter.setPattern(DateType.PATTERN_DATETIME_LOCAL_MILLIS);
}
} else if (DateType.TIME.equals(type)) {
final Double step = component.getStep();
if (step == null || step >= 60) {
dateTimeConverter.setPattern(DateType.PATTERN_TIME);
} else if (step >= 1) {
dateTimeConverter.setPattern(DateType.PATTERN_TIME_SECONDS);
} else {
dateTimeConverter.setPattern(DateType.PATTERN_TIME_MILLIS);
}
} else {
dateTimeConverter.setPattern(DateType.PATTERN_DATE);
}
} else if (estimatedType.isAssignableFrom(Number.class)) {
LOG.error("date");
dateTimeConverter.setType("date");
dateTimeConverter.setPattern(DateType.PATTERN_DATE);
} else {
LOG.warn("Type might not be supported (type='{}' clientId='{}')!",
estimatedType.getName(), component.getClientId(facesContext));
throw new RuntimeException();
}
if (LOG.isDebugEnabled()) {
LOG.debug("type='{}' pattern='{}'", dateTimeConverter.getType(), dateTimeConverter.getPattern());
}
return dateTimeConverter;
}
}
}