1 /***********************************************************************
2  * Copyright (c) 2013-2024 Commonwealth Computer Research, Inc.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Apache License, Version 2.0
5  * which accompanies this distribution and is available at
6  * http://www.opensource.org/licenses/apache2.0.php.
7  ***********************************************************************/
8 
9 package org.locationtech.geomesa.utils.geotools.converters
10 
11 import org.geotools.util.factory.Hints
12 import org.geotools.util.{Converter, ConverterFactory}
13 import org.locationtech.geomesa.utils.text.DateParsing
14 
15 import java.time._
16 import java.time.temporal.{ChronoField, TemporalAccessor}
17 import java.util.Date
18 
19 class JavaTimeConverterFactory extends ConverterFactory {
20   def createConverter(source: Class[_], target: Class[_], hints: Hints): Converter = {
21     if (classOf[Date].isAssignableFrom(source) && classOf[String].isAssignableFrom(target)) {
22       JavaTimeConverterFactory.DateToStringConverter
23     } else if (classOf[Date].isAssignableFrom(target)) {
24       if (classOf[String].isAssignableFrom(source)) {
25         JavaTimeConverterFactory.StringToDateConverter
26       } else if (classOf[ZonedDateTime].isAssignableFrom(source) || classOf[Instant].isAssignableFrom(source)
27           || classOf[OffsetDateTime].isAssignableFrom(source)) {
28         JavaTimeConverterFactory.TemporalToDateConverter
29       } else if (classOf[LocalDateTime].isAssignableFrom(source)) {
30         JavaTimeConverterFactory.LocalDateTimeToDateConverter
31       } else if (classOf[LocalDate].isAssignableFrom(source)) {
32         JavaTimeConverterFactory.LocalDateToDateConverter
33       } else {
34         null
35       }
36     } else {
37       null
38     }
39   }
40 }
41 
42 object JavaTimeConverterFactory {
43 
44   private val DateToStringConverter = new Converter {
45     override def convert[T](source: AnyRef, target: Class[T]): T =
46       DateParsing.formatDate(source.asInstanceOf[Date]).asInstanceOf[T]
47   }
48 
49   private val StringToDateConverter = new Converter {
50     override def convert[T](source: AnyRef, target: Class[T]): T =
51       DateParsing.parseDate(source.asInstanceOf[String]).asInstanceOf[T]
52   }
53 
54   private val TemporalToDateConverter = new Converter {
55     override def convert[T](source: AnyRef, target: Class[T]): T = {
56       val accessor = source.asInstanceOf[TemporalAccessor]
57       val millis = accessor.getLong(ChronoField.INSTANT_SECONDS) * 1000 +
58           accessor.getLong(ChronoField.MILLI_OF_SECOND)
59       new Date(millis).asInstanceOf[T]
60     }
61   }
62 
63   private val LocalDateToDateConverter = new Converter {
64     override def convert[T](source: AnyRef, target: Class[T]): T =
65       TemporalToDateConverter.convert(source.asInstanceOf[LocalDate].atStartOfDay(ZoneOffset.UTC), target)
66   }
67 
68   private val LocalDateTimeToDateConverter = new Converter {
69     override def convert[T](source: AnyRef, target: Class[T]): T =
70       TemporalToDateConverter.convert(source.asInstanceOf[LocalDateTime].atZone(ZoneOffset.UTC), target)
71   }
72 }
Line Stmt Id Pos Tree Symbol Tests Code
21 6664 928 - 941 Literal <nosymbol> classOf[java.util.Date]
21 6665 970 - 1010 Apply java.lang.Class.isAssignableFrom classOf[java.lang.String].isAssignableFrom(target)
21 6666 928 - 1010 Apply scala.Boolean.&& classOf[java.util.Date].isAssignableFrom(source).&&(classOf[java.lang.String].isAssignableFrom(target))
22 6667 1020 - 1066 Select org.locationtech.geomesa.utils.geotools.converters.JavaTimeConverterFactory.DateToStringConverter JavaTimeConverterFactory.DateToStringConverter
22 6668 1020 - 1066 Block org.locationtech.geomesa.utils.geotools.converters.JavaTimeConverterFactory.DateToStringConverter JavaTimeConverterFactory.DateToStringConverter
23 6669 1082 - 1120 Apply java.lang.Class.isAssignableFrom classOf[java.util.Date].isAssignableFrom(target)
23 6693 1078 - 1782 If <nosymbol> if (classOf[java.util.Date].isAssignableFrom(target)) if (classOf[java.lang.String].isAssignableFrom(source)) JavaTimeConverterFactory.StringToDateConverter else if (classOf[java.time.ZonedDateTime].isAssignableFrom(source).||(classOf[java.time.Instant].isAssignableFrom(source)).||(classOf[java.time.OffsetDateTime].isAssignableFrom(source))) JavaTimeConverterFactory.TemporalToDateConverter else if (classOf[java.time.LocalDateTime].isAssignableFrom(source)) JavaTimeConverterFactory.LocalDateTimeToDateConverter else if (classOf[java.time.LocalDate].isAssignableFrom(source)) JavaTimeConverterFactory.LocalDateToDateConverter else null else null
24 6670 1134 - 1174 Apply java.lang.Class.isAssignableFrom classOf[java.lang.String].isAssignableFrom(source)
24 6690 1130 - 1752 If <nosymbol> if (classOf[java.lang.String].isAssignableFrom(source)) JavaTimeConverterFactory.StringToDateConverter else if (classOf[java.time.ZonedDateTime].isAssignableFrom(source).||(classOf[java.time.Instant].isAssignableFrom(source)).||(classOf[java.time.OffsetDateTime].isAssignableFrom(source))) JavaTimeConverterFactory.TemporalToDateConverter else if (classOf[java.time.LocalDateTime].isAssignableFrom(source)) JavaTimeConverterFactory.LocalDateTimeToDateConverter else if (classOf[java.time.LocalDate].isAssignableFrom(source)) JavaTimeConverterFactory.LocalDateToDateConverter else null
25 6671 1186 - 1232 Select org.locationtech.geomesa.utils.geotools.converters.JavaTimeConverterFactory.StringToDateConverter JavaTimeConverterFactory.StringToDateConverter
25 6672 1186 - 1232 Block org.locationtech.geomesa.utils.geotools.converters.JavaTimeConverterFactory.StringToDateConverter JavaTimeConverterFactory.StringToDateConverter
26 6673 1250 - 1272 Literal <nosymbol> classOf[java.time.ZonedDateTime]
26 6674 1301 - 1342 Apply java.lang.Class.isAssignableFrom classOf[java.time.Instant].isAssignableFrom(source)
26 6689 1246 - 1752 If <nosymbol> if (classOf[java.time.ZonedDateTime].isAssignableFrom(source).||(classOf[java.time.Instant].isAssignableFrom(source)).||(classOf[java.time.OffsetDateTime].isAssignableFrom(source))) JavaTimeConverterFactory.TemporalToDateConverter else if (classOf[java.time.LocalDateTime].isAssignableFrom(source)) JavaTimeConverterFactory.LocalDateTimeToDateConverter else if (classOf[java.time.LocalDate].isAssignableFrom(source)) JavaTimeConverterFactory.LocalDateToDateConverter else null
27 6675 1356 - 1404 Apply java.lang.Class.isAssignableFrom classOf[java.time.OffsetDateTime].isAssignableFrom(source)
27 6676 1250 - 1404 Apply scala.Boolean.|| classOf[java.time.ZonedDateTime].isAssignableFrom(source).||(classOf[java.time.Instant].isAssignableFrom(source)).||(classOf[java.time.OffsetDateTime].isAssignableFrom(source))
28 6677 1416 - 1464 Select org.locationtech.geomesa.utils.geotools.converters.JavaTimeConverterFactory.TemporalToDateConverter JavaTimeConverterFactory.TemporalToDateConverter
28 6678 1416 - 1464 Block org.locationtech.geomesa.utils.geotools.converters.JavaTimeConverterFactory.TemporalToDateConverter JavaTimeConverterFactory.TemporalToDateConverter
29 6679 1482 - 1529 Apply java.lang.Class.isAssignableFrom classOf[java.time.LocalDateTime].isAssignableFrom(source)
29 6688 1478 - 1752 If <nosymbol> if (classOf[java.time.LocalDateTime].isAssignableFrom(source)) JavaTimeConverterFactory.LocalDateTimeToDateConverter else if (classOf[java.time.LocalDate].isAssignableFrom(source)) JavaTimeConverterFactory.LocalDateToDateConverter else null
30 6680 1541 - 1594 Select org.locationtech.geomesa.utils.geotools.converters.JavaTimeConverterFactory.LocalDateTimeToDateConverter JavaTimeConverterFactory.LocalDateTimeToDateConverter
30 6681 1541 - 1594 Block org.locationtech.geomesa.utils.geotools.converters.JavaTimeConverterFactory.LocalDateTimeToDateConverter JavaTimeConverterFactory.LocalDateTimeToDateConverter
31 6682 1612 - 1655 Apply java.lang.Class.isAssignableFrom classOf[java.time.LocalDate].isAssignableFrom(source)
31 6687 1608 - 1752 If <nosymbol> if (classOf[java.time.LocalDate].isAssignableFrom(source)) JavaTimeConverterFactory.LocalDateToDateConverter else null
32 6683 1667 - 1716 Select org.locationtech.geomesa.utils.geotools.converters.JavaTimeConverterFactory.LocalDateToDateConverter JavaTimeConverterFactory.LocalDateToDateConverter
32 6684 1667 - 1716 Block org.locationtech.geomesa.utils.geotools.converters.JavaTimeConverterFactory.LocalDateToDateConverter JavaTimeConverterFactory.LocalDateToDateConverter
34 6685 1740 - 1744 Literal <nosymbol> null
34 6686 1740 - 1744 Block <nosymbol> null
37 6691 1772 - 1776 Literal <nosymbol> null
37 6692 1772 - 1776 Block <nosymbol> null
44 6696 1863 - 1866 Apply org.locationtech.geomesa.utils.geotools.converters.JavaTimeConverterFactory.$anon.<init> new $anon()
46 6694 1975 - 2000 TypeApply scala.Any.asInstanceOf source.asInstanceOf[java.util.Date]
46 6695 1952 - 2017 TypeApply scala.Any.asInstanceOf org.locationtech.geomesa.utils.text.DateParsing.formatDate(source.asInstanceOf[java.util.Date], org.locationtech.geomesa.utils.text.DateParsing.formatDate$default$2).asInstanceOf[T]
49 6699 2061 - 2064 Apply org.locationtech.geomesa.utils.geotools.converters.JavaTimeConverterFactory.$anon.<init> new $anon()
51 6697 2172 - 2199 TypeApply scala.Any.asInstanceOf source.asInstanceOf[String]
51 6698 2150 - 2216 TypeApply scala.Any.asInstanceOf org.locationtech.geomesa.utils.text.DateParsing.parseDate(source.asInstanceOf[String], org.locationtech.geomesa.utils.text.DateParsing.parseDate$default$2).asInstanceOf[T]
54 6706 2262 - 2265 Apply org.locationtech.geomesa.utils.geotools.converters.JavaTimeConverterFactory.$anon.<init> new $anon()
56 6700 2368 - 2405 TypeApply scala.Any.asInstanceOf source.asInstanceOf[java.time.temporal.TemporalAccessor]
57 6701 2442 - 2469 Literal <nosymbol> INSTANT_SECONDS
57 6702 2473 - 2477 Literal <nosymbol> 1000
57 6704 2425 - 2535 Apply scala.Long.+ accessor.getLong(INSTANT_SECONDS).*(1000).+(accessor.getLong(MILLI_OF_SECOND))
58 6703 2490 - 2535 Apply java.time.temporal.TemporalAccessor.getLong accessor.getLong(MILLI_OF_SECOND)
59 6705 2542 - 2574 TypeApply scala.Any.asInstanceOf new java.util.Date(millis).asInstanceOf[T]
63 6710 2627 - 2630 Apply org.locationtech.geomesa.utils.geotools.converters.JavaTimeConverterFactory.$anon.<init> new $anon()
65 6707 2792 - 2806 Select java.time.ZoneOffset.UTC java.time.ZoneOffset.UTC
65 6708 2748 - 2807 Apply java.time.LocalDate.atStartOfDay source.asInstanceOf[java.time.LocalDate].atStartOfDay(java.time.ZoneOffset.UTC)
65 6709 2716 - 2816 Apply org.geotools.util.Converter.convert JavaTimeConverterFactory.this.TemporalToDateConverter.convert[T](source.asInstanceOf[java.time.LocalDate].atStartOfDay(java.time.ZoneOffset.UTC), target)
68 6714 2867 - 2870 Apply org.locationtech.geomesa.utils.geotools.converters.JavaTimeConverterFactory.$anon.<init> new $anon()
70 6711 3030 - 3044 Select java.time.ZoneOffset.UTC java.time.ZoneOffset.UTC
70 6712 2988 - 3045 Apply java.time.LocalDateTime.atZone source.asInstanceOf[java.time.LocalDateTime].atZone(java.time.ZoneOffset.UTC)
70 6713 2956 - 3054 Apply org.geotools.util.Converter.convert JavaTimeConverterFactory.this.TemporalToDateConverter.convert[T](source.asInstanceOf[java.time.LocalDateTime].atZone(java.time.ZoneOffset.UTC), target)