Skip to content

Remove reflective access to java.time classes. #1970

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ final public class ElasticsearchDateConverter {

/**
* Creates an ElasticsearchDateConverter for the given {@link DateFormat}.
*
*
* @param dateFormat must not be @{literal null}
* @return converter
*/
Expand Down Expand Up @@ -135,7 +135,7 @@ public Date parse(String input) {
/**
* Creates a {@link DateFormatter} for a given pattern. The pattern can be the name of a {@link DateFormat} enum value
* or a literal pattern.
*
*
* @param pattern the pattern to use
* @return DateFormatter
*/
Expand Down Expand Up @@ -172,8 +172,73 @@ private static DateFormatter forPattern(String pattern) {
return new PatternDateFormatter(dateTimeFormatter);
}

@SuppressWarnings("unchecked")
private static <T extends TemporalAccessor> TemporalQuery<T> getTemporalQuery(Class<T> type) {
return temporal -> {
// no reflection for java.time classes (GraalVM native)
if (type == java.time.chrono.HijrahDate.class) {
return (T) java.time.chrono.HijrahDate.from(temporal);
}
if (type == java.time.chrono.JapaneseDate.class) {
return (T) java.time.chrono.JapaneseDate.from(temporal);
}
if (type == java.time.ZonedDateTime.class) {
return (T) java.time.ZonedDateTime.from(temporal);
}
if (type == java.time.LocalDateTime.class) {
return (T) java.time.LocalDateTime.from(temporal);
}
if (type == java.time.chrono.ThaiBuddhistDate.class) {
return (T) java.time.chrono.ThaiBuddhistDate.from(temporal);
}
if (type == java.time.LocalTime.class) {
return (T) java.time.LocalTime.from(temporal);
}
if (type == java.time.ZoneOffset.class) {
return (T) java.time.ZoneOffset.from(temporal);
}
if (type == java.time.OffsetTime.class) {
return (T) java.time.OffsetTime.from(temporal);
}
if (type == java.time.chrono.ChronoLocalDate.class) {
return (T) java.time.chrono.ChronoLocalDate.from(temporal);
}
if (type == java.time.Month.class) {
return (T) java.time.Month.from(temporal);
}
if (type == java.time.chrono.ChronoLocalDateTime.class) {
return (T) java.time.chrono.ChronoLocalDateTime.from(temporal);
}
if (type == java.time.MonthDay.class) {
return (T) java.time.MonthDay.from(temporal);
}
if (type == java.time.Instant.class) {
return (T) java.time.Instant.from(temporal);
}
if (type == java.time.OffsetDateTime.class) {
return (T) java.time.OffsetDateTime.from(temporal);
}
if (type == java.time.chrono.ChronoZonedDateTime.class) {
return (T) java.time.chrono.ChronoZonedDateTime.from(temporal);
}
if (type == java.time.chrono.MinguoDate.class) {
return (T) java.time.chrono.MinguoDate.from(temporal);
}
if (type == java.time.Year.class) {
return (T) java.time.Year.from(temporal);
}
if (type == java.time.DayOfWeek.class) {
return (T) java.time.DayOfWeek.from(temporal);
}
if (type == java.time.LocalDate.class) {
return (T) java.time.LocalDate.from(temporal);
}
if (type == java.time.YearMonth.class) {
return (T) java.time.YearMonth.from(temporal);
}

// for implementations not covered until here use reflection to check for the existence of a static
// from(TemporalAccessor) method
try {
Method method = type.getMethod("from", TemporalAccessor.class);
Object o = method.invoke(null, temporal);
Expand All @@ -184,7 +249,8 @@ private static <T extends TemporalAccessor> TemporalQuery<T> getTemporalQuery(Cl
throw new ConversionException("could not create object of class " + type.getName(), e);
}
};
} // endregion
}
// endregion

/**
* a DateFormatter to convert epoch milliseconds
Expand Down