Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 46ab065

Browse filesBrowse files
authored
Switch to JSR 310 Date and Time API (#233)
* Switch to JSR 310 Date and Time API - Removes joda from encoding/decoding - Using Threeten for PeriodDuration
1 parent a5a881f commit 46ab065
Copy full SHA for 46ab065

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Dismiss banner

41 files changed

+324
-294
lines changed

‎CHANGELOG.md

Copy file name to clipboardExpand all lines: CHANGELOG.md
+5Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# Changelog
22

3+
## 2.0.0
4+
5+
* Switch to Java Date/Time API from Joda Time [#233](https://github.com/jasync-sql/jasync-sql/pull/233)
6+
* For postgresql, add support for threeten.PeriodDuration for interval data type. [#233](https://github.com/jasync-sql/jasync-sql/pull/233)
7+
38
## 1.2.3
49

510
* Enable CLIENT_FOUND_ROWS in r2dbc-mysql in favor of spring-data-r2dbc [#240](https://github.com/jasync-sql/jasync-sql/pull/240).

‎build.gradle.kts

Copy file name to clipboardExpand all lines: build.gradle.kts
+1-1Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ apply(plugin = "io.github.gradle-nexus.publish-plugin")
2424
allprojects {
2525

2626
group = "com.github.jasync-sql"
27-
version = "1.2.4"
27+
version = "2.0.0"
2828

2929
apply(plugin = "kotlin")
3030
apply(plugin = "maven-publish")

‎db-async-common/build.gradle.kts

Copy file name to clipboardExpand all lines: db-async-common/build.gradle.kts
-4Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
val KOTLIN_VERSION: String by project
22
val KOTLIN_COROUTINES_VERSION: String by project
33
val SL4J_VERSION: String by project
4-
val JODA_VERSION: String by project
5-
val JODA_CONVERT_VERSION: String by project
64
val NETTY_VERSION: String by project
75
val KOTLIN_LOGGING_VERSION: String by project
86

@@ -17,8 +15,6 @@ dependencies {
1715
api("org.jetbrains.kotlin:kotlin-stdlib-jdk8:$KOTLIN_VERSION")
1816
compile("org.jetbrains.kotlinx:kotlinx-coroutines-core:$KOTLIN_COROUTINES_VERSION")
1917
implementation("org.slf4j:slf4j-api:$SL4J_VERSION")
20-
implementation("joda-time:joda-time:$JODA_VERSION")
21-
implementation("org.joda:joda-convert:$JODA_CONVERT_VERSION")
2218
implementation("io.netty:netty-transport:$NETTY_VERSION")
2319
implementation("io.netty:netty-handler:$NETTY_VERSION")
2420
compileOnly("io.netty:netty-transport-native-epoll:$NETTY_VERSION:linux-x86_64")

‎db-async-common/src/main/java/com/github/jasync/sql/db/RowData.kt

Copy file name to clipboardExpand all lines: db-async-common/src/main/java/com/github/jasync/sql/db/RowData.kt
+1-1Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.github.jasync.sql.db
22

33
import com.github.jasync.sql.db.util.XXX
4-
import org.joda.time.LocalDateTime
4+
import java.time.LocalDateTime
55

66
/**
77
*

‎db-async-common/src/main/java/com/github/jasync/sql/db/column/DateEncoderDecoder.kt

Copy file name to clipboardExpand all lines: db-async-common/src/main/java/com/github/jasync/sql/db/column/DateEncoderDecoder.kt
+7-7Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,27 @@
11
package com.github.jasync.sql.db.column
22

33
import com.github.jasync.sql.db.exceptions.DateEncoderNotAvailableException
4-
import org.joda.time.LocalDate
5-
import org.joda.time.ReadablePartial
6-
import org.joda.time.format.DateTimeFormat
4+
import java.time.LocalDate
5+
import java.time.format.DateTimeFormatter
6+
import java.time.temporal.TemporalAccessor
77

88
object DateEncoderDecoder : ColumnEncoderDecoder {
99

1010
private const val ZeroedDate = "0000-00-00"
1111

12-
private val formatter = DateTimeFormat.forPattern("yyyy-MM-dd")
12+
private val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd")
1313

1414
override fun decode(value: String): LocalDate? =
1515
if (ZeroedDate == value) {
1616
null
1717
} else {
18-
this.formatter.parseLocalDate(value)
18+
LocalDate.parse(value, this.formatter)
1919
}
2020

2121
override fun encode(value: Any): String {
2222
return when (value) {
23-
is java.sql.Date -> this.formatter.print(LocalDate(value))
24-
is ReadablePartial -> this.formatter.print(value)
23+
is java.sql.Date -> value.toLocalDate().format(this.formatter)
24+
is TemporalAccessor -> this.formatter.format(value)
2525
else -> throw DateEncoderNotAvailableException(value)
2626
}
2727
}
+6-8Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,25 @@
11
package com.github.jasync.sql.db.column
22

3-
import org.joda.time.LocalDateTime
4-
import org.joda.time.format.DateTimeFormatterBuilder
3+
import com.github.jasync.sql.db.util.microsecondsFormatter
4+
import java.time.LocalDateTime
5+
import java.time.format.DateTimeFormatterBuilder
56

67
object LocalDateTimeEncoderDecoder : ColumnEncoderDecoder {
78

89
private const val ZeroedTimestamp = "0000-00-00 00:00:00"
910

10-
private val optional = DateTimeFormatterBuilder()
11-
.appendPattern(".SSSSSS").toParser()
12-
1311
private val format = DateTimeFormatterBuilder()
1412
.appendPattern("yyyy-MM-dd HH:mm:ss")
15-
.appendOptional(optional)
13+
.appendOptional(microsecondsFormatter)
1614
.toFormatter()
1715

1816
override fun encode(value: Any): String =
19-
format.print(value as LocalDateTime)
17+
(value as LocalDateTime).format(format)
2018

2119
override fun decode(value: String): LocalDateTime? =
2220
if (ZeroedTimestamp == value) {
2321
null
2422
} else {
25-
format.parseLocalDateTime(value)
23+
LocalDateTime.parse(value, format)
2624
}
2725
}
+2-3Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.github.jasync.sql.db.column
22

3-
import org.joda.time.LocalTime
4-
import org.joda.time.format.DateTimeFormatterBuilder
3+
import java.time.format.DateTimeFormatterBuilder
54

65
object SQLTimeEncoder : ColumnEncoder {
76

@@ -12,6 +11,6 @@ object SQLTimeEncoder : ColumnEncoder {
1211
override fun encode(value: Any): String {
1312
val time = value as java.sql.Time
1413

15-
return format.print(LocalTime(time.time))
14+
return time.toLocalTime().format(format)
1615
}
1716
}
+6-8Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,17 @@
11
package com.github.jasync.sql.db.column
22

3-
import org.joda.time.LocalTime
4-
import org.joda.time.format.DateTimeFormatterBuilder
3+
import com.github.jasync.sql.db.util.microsecondsFormatter
4+
import java.time.LocalTime
5+
import java.time.format.DateTimeFormatterBuilder
56

67
open class TimeEncoderDecoder : ColumnEncoderDecoder {
78
companion object {
89
val Instance = TimeEncoderDecoder()
910
}
1011

11-
private val optional = DateTimeFormatterBuilder()
12-
.appendPattern(".SSSSSS").toParser()
13-
1412
private val format = DateTimeFormatterBuilder()
1513
.appendPattern("HH:mm:ss")
16-
.appendOptional(optional)
14+
.appendOptional(microsecondsFormatter)
1715
.toFormatter()
1816

1917
private val printer = DateTimeFormatterBuilder()
@@ -23,8 +21,8 @@ open class TimeEncoderDecoder : ColumnEncoderDecoder {
2321
open fun formatter() = format
2422

2523
override fun decode(value: String): LocalTime =
26-
format.parseLocalTime(value)
24+
LocalTime.parse(value, formatter())
2725

2826
override fun encode(value: Any): String =
29-
this.printer.print(value as LocalTime)
27+
(value as LocalTime).format(printer)
3028
}
+7-3Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
package com.github.jasync.sql.db.column
22

3-
import org.joda.time.format.DateTimeFormat
4-
import org.joda.time.format.DateTimeFormatter
3+
import com.github.jasync.sql.db.util.microsecondsFormatter
4+
import java.time.format.DateTimeFormatter
5+
import java.time.format.DateTimeFormatterBuilder
56

67
object TimeWithTimezoneEncoderDecoder : TimeEncoderDecoder() {
78

8-
private val format = DateTimeFormat.forPattern("HH:mm:ss.SSSSSSZ")
9+
private val format = DateTimeFormatterBuilder().appendPattern("HH:mm:ss")
10+
.appendOptional(microsecondsFormatter)
11+
.appendPattern("[X][Z]")
12+
.toFormatter()
913

1014
override fun formatter(): DateTimeFormatter = format
1115
}

‎db-async-common/src/main/java/com/github/jasync/sql/db/column/TimestampEncoderDecoder.kt

Copy file name to clipboardExpand all lines: db-async-common/src/main/java/com/github/jasync/sql/db/column/TimestampEncoderDecoder.kt
+16-12Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@ package com.github.jasync.sql.db.column
22

33
import com.github.jasync.sql.db.exceptions.DateEncoderNotAvailableException
44
import java.sql.Timestamp
5+
import java.time.LocalDateTime
6+
import java.time.ZoneOffset
7+
import java.time.format.DateTimeFormatterBuilder
8+
import java.time.temporal.TemporalAccessor
59
import java.util.Calendar
610
import java.util.Date
7-
import org.joda.time.DateTime
8-
import org.joda.time.LocalDateTime
9-
import org.joda.time.ReadableDateTime
10-
import org.joda.time.format.DateTimeFormatterBuilder
1111

1212
open class TimestampEncoderDecoder : ColumnEncoderDecoder {
1313
companion object {
@@ -17,9 +17,9 @@ open class TimestampEncoderDecoder : ColumnEncoderDecoder {
1717
}
1818

1919
private val optional = DateTimeFormatterBuilder()
20-
.appendPattern(MillisFormat).toParser()
20+
.appendPattern(MillisFormat).toFormatter()
2121
private val optionalTimeZone = DateTimeFormatterBuilder()
22-
.appendPattern("Z").toParser()
22+
.appendPattern("[X][Z]").toFormatter()
2323

2424
private val builder = DateTimeFormatterBuilder()
2525
.appendPattern(BaseFormat)
@@ -34,19 +34,23 @@ open class TimestampEncoderDecoder : ColumnEncoderDecoder {
3434

3535
private val format = builder.toFormatter()
3636

37+
// java.util.Dates are constructed using the system default timezone, replicate this behavior when encoding a legacy date
38+
private fun encodeLegacyDate(legacyDate: Date): String =
39+
legacyDate.toInstant().atOffset(ZoneOffset.UTC).format(this.timezonedPrinter)
40+
3741
open fun formatter() = format
3842

3943
override fun decode(value: String): Any {
40-
return formatter().parseLocalDateTime(value)
44+
return LocalDateTime.parse(value, formatter())
4145
}
4246

4347
override fun encode(value: Any): String {
4448
return when (value) {
45-
is Timestamp -> this.timezonedPrinter.print(DateTime(value))
46-
is Date -> this.timezonedPrinter.print(DateTime(value))
47-
is Calendar -> this.timezonedPrinter.print(DateTime(value))
48-
is LocalDateTime -> this.nonTimezonedPrinter.print(value)
49-
is ReadableDateTime -> this.timezonedPrinter.print(value)
49+
is Timestamp -> encodeLegacyDate(value)
50+
is Date -> encodeLegacyDate(value)
51+
is Calendar -> encodeLegacyDate(value.time)
52+
is LocalDateTime -> this.nonTimezonedPrinter.format(value)
53+
is TemporalAccessor -> this.timezonedPrinter.format(value)
5054
else -> throw DateEncoderNotAvailableException(value)
5155
}
5256
}
+9-4Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,20 @@
11
package com.github.jasync.sql.db.column
22

3-
import org.joda.time.format.DateTimeFormat
4-
import org.joda.time.format.DateTimeFormatter
3+
import com.github.jasync.sql.db.util.microsecondsFormatter
4+
import java.time.OffsetDateTime
5+
import java.time.format.DateTimeFormatter
6+
import java.time.format.DateTimeFormatterBuilder
57

68
object TimestampWithTimezoneEncoderDecoder : TimestampEncoderDecoder() {
79

8-
private val format = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.SSSSSSZ")
10+
private val format = DateTimeFormatterBuilder().appendPattern("yyyy-MM-dd HH:mm:ss")
11+
.appendOptional(microsecondsFormatter)
12+
.appendPattern("[X][Z]")
13+
.toFormatter()
914

1015
override fun formatter(): DateTimeFormatter = format
1116

1217
override fun decode(value: String): Any {
13-
return formatter().parseDateTime(value)
18+
return OffsetDateTime.parse(value, formatter())
1419
}
1520
}
+9Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.github.jasync.sql.db.util
2+
3+
import java.time.format.DateTimeFormatter
4+
import java.time.format.DateTimeFormatterBuilder
5+
6+
internal const val ALL_MICROS_FORMAT = ".[SSSSSS][SSSSS][SSSS][SSS][SS][S]"
7+
8+
val microsecondsFormatter: DateTimeFormatter = DateTimeFormatterBuilder()
9+
.appendPattern(ALL_MICROS_FORMAT).toFormatter()

‎db-async-common/src/test/java/com/github/jasync/sql/db/RowDataTest.kt

Copy file name to clipboardExpand all lines: db-async-common/src/test/java/com/github/jasync/sql/db/RowDataTest.kt
+1-1Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.github.jasync.sql.db
22

3+
import java.time.LocalDateTime
34
import org.assertj.core.api.Assertions.assertThat
4-
import org.joda.time.LocalDateTime
55
import org.junit.Test
66

77
class RowDataTest {

‎db-async-common/src/test/java/com/github/jasync/sql/db/column/TimestampEncoderDecoderSpec.kt

Copy file name to clipboardExpand all lines: db-async-common/src/test/java/com/github/jasync/sql/db/column/TimestampEncoderDecoderSpec.kt
+9-9Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
11
package com.github.jasync.sql.db.column
22

3+
import java.sql.Date
34
import java.sql.Timestamp
5+
import java.time.OffsetDateTime
6+
import java.time.ZoneOffset
7+
import java.time.format.DateTimeFormatterBuilder
48
import kotlin.test.assertEquals
5-
import org.joda.time.DateTime
6-
import org.joda.time.format.DateTimeFormatterBuilder
79
import org.junit.Test
810

911
class TimestampEncoderDecoderSpec {
1012

1113
val encoder = TimestampEncoderDecoder()
12-
val dateTime = DateTime()
13-
.withDate(2013, 12, 27)
14-
.withTime(8, 40, 50, 800)
14+
val dateTime = OffsetDateTime.of(2013, 12, 27, 8, 40, 50, 800000000, ZoneOffset.UTC)
1515

1616
val result = "2013-12-27 08:40:50.800000"
1717
val formatter = DateTimeFormatterBuilder().appendPattern("Z").toFormatter()
18-
val resultWithTimezone = "2013-12-27 08:40:50.800000${formatter.print(dateTime)}"
18+
val resultWithTimezone = "2013-12-27 08:40:50.800000${dateTime.format(formatter)}"
1919

2020
@Test
2121
fun `should print a timestamp`() {
22-
val timestamp = Timestamp(dateTime.toDate().time)
22+
val timestamp = Timestamp.from(dateTime.toInstant())
2323
assertEquals(encoder.encode(timestamp), resultWithTimezone)
2424
}
2525

@@ -30,13 +30,13 @@ class TimestampEncoderDecoderSpec {
3030

3131
@Test
3232
fun `should print a date`() {
33-
assertEquals(encoder.encode(dateTime.toDate()), resultWithTimezone)
33+
assertEquals(encoder.encode(Date.from(dateTime.toInstant())), resultWithTimezone)
3434
}
3535

3636
@Test
3737
fun `should print a calendar`() {
3838
val calendar = java.util.Calendar.getInstance()
39-
calendar.time = dateTime.toDate()
39+
calendar.time = Date.from(dateTime.toInstant())
4040
encoder.encode(calendar) === resultWithTimezone
4141
}
4242

‎gradle.properties

Copy file name to clipboardExpand all lines: gradle.properties
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,4 @@ LOGBACK_VERSION=1.1.8
1919
TEST_CONTAINERS_VERSION=1.15.1
2020
MYSQL_CONNECTOR_VERSION=5.1.47
2121
AWAITILITY_VERSION=3.1.5
22+
THREETEN_EXTRA=1.6.0

‎mysql-async/build.gradle.kts

Copy file name to clipboardExpand all lines: mysql-async/build.gradle.kts
-4Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
val KOTLIN_VERSION: String by project
22
val KOTLIN_COROUTINES_VERSION: String by project
33
val SL4J_VERSION: String by project
4-
val JODA_VERSION: String by project
5-
val JODA_CONVERT_VERSION: String by project
64
val NETTY_VERSION: String by project
75
val KOTLIN_LOGGING_VERSION: String by project
86

@@ -20,8 +18,6 @@ dependencies {
2018
compile("org.jetbrains.kotlin:kotlin-stdlib-jdk8:$KOTLIN_VERSION")
2119
compile("org.jetbrains.kotlinx:kotlinx-coroutines-core:$KOTLIN_COROUTINES_VERSION")
2220
compile("org.slf4j:slf4j-api:$SL4J_VERSION")
23-
compile("joda-time:joda-time:$JODA_VERSION")
24-
compile("org.joda:joda-convert:$JODA_CONVERT_VERSION")
2521
compile("io.netty:netty-transport:$NETTY_VERSION")
2622
compile("io.netty:netty-handler:$NETTY_VERSION")
2723
compile("io.github.microutils:kotlin-logging:$KOTLIN_LOGGING_VERSION")

‎mysql-async/src/main/java/com/github/jasync/sql/db/mysql/binary/BinaryRowEncoder.kt

Copy file name to clipboardExpand all lines: mysql-async/src/main/java/com/github/jasync/sql/db/mysql/binary/BinaryRowEncoder.kt
+8-9Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,11 @@ import java.math.BigInteger
3030
import java.nio.ByteBuffer
3131
import java.nio.charset.Charset
3232
import java.time.Duration
33-
import org.joda.time.DateTime
34-
import org.joda.time.LocalDate
35-
import org.joda.time.LocalDateTime
36-
import org.joda.time.LocalTime
37-
import org.joda.time.ReadableDateTime
38-
import org.joda.time.ReadableInstant
33+
import java.time.Instant
34+
import java.time.LocalDate
35+
import java.time.LocalDateTime
36+
import java.time.LocalTime
37+
import java.time.OffsetDateTime
3938

4039
class BinaryRowEncoder(charset: Charset) {
4140

@@ -59,7 +58,7 @@ class BinaryRowEncoder(charset: Charset) {
5958
Double::class.java to DoubleEncoder,
6059
java.lang.Double::class.java to DoubleEncoder,
6160
LocalDateTime::class.java to LocalDateTimeEncoder,
62-
DateTime::class.java to DateTimeEncoder,
61+
OffsetDateTime::class.java to DateTimeEncoder,
6362
LocalDate::class.java to LocalDateEncoder,
6463
java.util.Date::class.java to JavaDateEncoder,
6564
java.sql.Timestamp::class.java to SQLTimestampEncoder,
@@ -78,8 +77,8 @@ class BinaryRowEncoder(charset: Charset) {
7877
is CharSequence -> this.stringEncoder
7978
is java.math.BigInteger -> this.stringEncoder
8079
is BigDecimal -> this.stringEncoder
81-
is ReadableDateTime -> DateTimeEncoder
82-
is ReadableInstant -> ReadableInstantEncoder
80+
is OffsetDateTime -> DateTimeEncoder
81+
is Instant -> ReadableInstantEncoder
8382
is LocalDateTime -> LocalDateTimeEncoder
8483
is java.sql.Timestamp -> SQLTimestampEncoder
8584
is java.sql.Date -> SQLDateEncoder

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.