dev.orne.beans.converters.InstantConverter Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of beans Show documentation
Show all versions of beans Show documentation
Orne bean development utilities
package dev.orne.beans.converters;
/*-
* #%L
* Orne Beans
* %%
* Copyright (C) 2020 Orne Developments
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Lesser Public License for more details.
*
* You should have received a copy of the GNU General Lesser Public
* License along with this program. If not, see
* .
* #L%
*/
import java.time.DateTimeException;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.format.SignStyle;
import java.time.temporal.ChronoField;
import java.time.temporal.TemporalAccessor;
import javax.validation.constraints.NotNull;
/**
* Implementation of {@code Converter} that converts {@code Instant} instances
* to and from {@code String} using the ISO-8601 as {@code String}
* representation.
*
* @author (w) Iker Hernaez
* @version 1.0, 2020-05
* @since 0.1
*/
public class InstantConverter
extends AbstractDateTimeConverter {
/**
* The epoch milliseconds parser.
*/
public static final DateTimeFormatter EPOCH_MILLIS_PARSER =
new DateTimeFormatterBuilder()
.appendValue(ChronoField.INSTANT_SECONDS, 1, 19, SignStyle.NEVER)
.appendValue(ChronoField.MILLI_OF_SECOND, 3)
.toFormatter();
/**
* Creates a new instance that throws a {@code ConversionException} if an
* error occurs.
*/
public InstantConverter() {
super(DateTimeFormatter.ISO_INSTANT);
setDefaultParsers();
}
/**
* Creates a new instance that returns a default value if an error occurs.
*
* @param defaultValue The default value to be returned if the value to be
* converted is missing or an error occurs converting the value
*/
public InstantConverter(final Instant defaultValue) {
super(DateTimeFormatter.ISO_INSTANT, defaultValue);
setDefaultParsers();
}
/**
* Creates a new instance that throws a {@code ConversionException} if an
* error occurs.
*
* @param formatter The temporal value formatter and default parser
*/
public InstantConverter(
final @NotNull DateTimeFormatter formatter) {
super(formatter);
setDefaultParsers();
}
/**
* Creates a new instance that returns a default value if an error occurs.
*
* @param formatter The temporal value formatter and default parser
* @param defaultValue The default value to be returned if the value to be
* converted is missing or an error occurs converting the value
*/
public InstantConverter(
final @NotNull DateTimeFormatter formatter,
final Instant defaultValue) {
super(formatter, defaultValue);
setDefaultParsers();
}
/**
* Sets the default parsers for this converter.
*/
private final void setDefaultParsers() {
setParsers(
DateTimeFormatter.ISO_INSTANT,
DateTimeFormatter.ISO_DATE_TIME,
EPOCH_MILLIS_PARSER);
}
/**
* {@inheritDoc}
*/
@Override
protected @NotNull Class getDefaultType() {
return Instant.class;
}
/**
* {@inheritDoc}
*/
@Override
protected T fromTemporalAccessor(
final @NotNull Class type,
final @NotNull TemporalAccessor value) {
try {
return type.cast(Instant.from(value));
} catch (final DateTimeException dte) {
getLogger().debug("Failed to convert temporal accessor to Instant directly", dte);
}
return type.cast(LocalDateTime.from(value).toInstant(ZoneOffset.UTC));
}
}