From 2a5443d52d2dc49579f9aec5f2a29dba2b86ccd9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Aur=C3=A9lien=20Mino?= <aurelien.mino@gmail.com>
Date: Sat, 2 May 2020 15:46:27 +0200
Subject: [PATCH] Elasticsearch: custom converters for java.time classes

---
 .../ElasticsearchConfiguration.java.ejs       | 96 ++++++++++++++++++-
 1 file changed, 93 insertions(+), 3 deletions(-)

diff --git a/generators/server/templates/src/main/java/package/config/ElasticsearchConfiguration.java.ejs b/generators/server/templates/src/main/java/package/config/ElasticsearchConfiguration.java.ejs
index b1b89777798d..75b92179b635 100644
--- a/generators/server/templates/src/main/java/package/config/ElasticsearchConfiguration.java.ejs
+++ b/generators/server/templates/src/main/java/package/config/ElasticsearchConfiguration.java.ejs
@@ -18,10 +18,13 @@
 -%>
 package <%= packageName %>.config;
 
-<%_ if (databaseType === 'mongodb') { _%>
 import org.springframework.context.annotation.Bean;
-<%_ } _%>
 import org.springframework.context.annotation.Configuration;
+import org.springframework.core.convert.converter.Converter;
+import org.springframework.data.convert.ReadingConverter;
+import org.springframework.data.convert.WritingConverter;
+import org.springframework.data.elasticsearch.config.ElasticsearchConfigurationSupport;
+import org.springframework.data.elasticsearch.core.convert.ElasticsearchCustomConversions;
 <%_ if (databaseType === 'mongodb') { _%>
 import org.springframework.data.elasticsearch.core.mapping.SimpleElasticsearchMappingContext;
 import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty;
@@ -32,8 +35,95 @@ import org.springframework.data.mapping.model.SimpleTypeHolder;
 import org.springframework.data.elasticsearch.core.mapping.SimpleElasticsearchPersistentEntity;
 <%_ } _%>
 
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.util.Arrays;
+
 @Configuration
-public class ElasticsearchConfiguration {
+public class ElasticsearchConfiguration extends ElasticsearchConfigurationSupport {
+
+    @Bean
+    @Override
+    public ElasticsearchCustomConversions elasticsearchCustomConversions() {
+        return new ElasticsearchCustomConversions(
+            Arrays.asList(
+                new ZonedDateTimeWritingConverter(),
+                new ZonedDateTimeReadingConverter(),
+                new InstantWritingConverter(),
+                new InstantReadingConverter(),
+                new LocalDateWritingConverter(),
+                new LocalDateReadingConverter()
+            )
+        );
+    }
+
+    @WritingConverter
+    static class ZonedDateTimeWritingConverter implements Converter<ZonedDateTime, String> {
+        @Override
+        public String convert(ZonedDateTime source) {
+            if (source == null) {
+                return null;
+            }
+            return source.toInstant().toString();
+        }
+    }
+
+    @ReadingConverter
+    static class ZonedDateTimeReadingConverter implements Converter<String, ZonedDateTime> {
+        @Override
+        public ZonedDateTime convert(String source) {
+            if (source == null) {
+                return null;
+            }
+            return Instant.parse(source).atZone(ZoneId.systemDefault());
+        }
+    }
+
+    @WritingConverter
+    static class InstantWritingConverter implements Converter<Instant, String> {
+        @Override
+        public String convert(Instant source) {
+            if (source == null) {
+                return null;
+            }
+            return source.toString();
+        }
+    }
+
+    @ReadingConverter
+    static class InstantReadingConverter implements Converter<String, Instant> {
+        @Override
+        public Instant convert(String source) {
+            if (source == null) {
+                return null;
+            }
+            return Instant.parse(source);
+        }
+    }
+
+    @WritingConverter
+    static class LocalDateWritingConverter implements Converter<LocalDate, String> {
+        @Override
+        public String convert(LocalDate source) {
+            if (source == null) {
+                return null;
+            }
+            return source.toString();
+        }
+    }
+
+    @ReadingConverter
+    static class LocalDateReadingConverter implements Converter<String, LocalDate> {
+        @Override
+        public LocalDate convert(String source) {
+            if (source == null) {
+                return null;
+            }
+            return LocalDate.parse(source);
+        }
+    }
 <%_ if (databaseType === 'mongodb') { _%>
 
     @Bean