Skip to content
Merged
Show file tree
Hide file tree
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 @@ -6,23 +6,72 @@ import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import timber.log.Timber
import java.time.Instant
import java.time.LocalDateTime
import java.time.OffsetDateTime
import java.time.ZoneId
import java.time.ZonedDateTime
import java.time.format.DateTimeFormatter
import java.time.format.DateTimeParseException

/**
* Created by Michael Ruppen on 05.07.2024
*/
object LocalDateTimeSerializer : KSerializer<LocalDateTime> {
private val formatter = DateTimeFormatter.ISO_DATE_TIME
class LocalDateTimeSerializer(
private val zone: ZoneId
) : KSerializer<LocalDateTime> {

override val descriptor: SerialDescriptor =
PrimitiveSerialDescriptor("LocalDateTime", PrimitiveKind.STRING)
PrimitiveSerialDescriptor("LocalDateTimeAsInstant", PrimitiveKind.STRING)

override fun serialize(encoder: Encoder, value: LocalDateTime) {
encoder.encodeString(value.format(formatter))
val instant = value.atZone(zone).toInstant()
encoder.encodeString(DateTimeFormatter.ISO_INSTANT.format(instant))
}

override fun deserialize(decoder: Decoder): LocalDateTime {
return LocalDateTime.parse(decoder.decodeString(), formatter)
val text = decoder.decodeString()
return parseToLocalDateTime(text, zone)
}
}

companion object {
private val ZONED = DateTimeFormatter.ISO_ZONED_DATE_TIME
private val OFFSET = DateTimeFormatter.ISO_OFFSET_DATE_TIME
private val INSTANT = DateTimeFormatter.ISO_INSTANT
private val LOCAL = DateTimeFormatter.ISO_LOCAL_DATE_TIME

fun parseToLocalDateTime(text: String, zone: ZoneId): LocalDateTime {
try {
return ZonedDateTime.parse(text, ZONED)
.withZoneSameInstant(zone)
.toLocalDateTime()
} catch (exception: DateTimeParseException) {
Timber.e("Could not parse ZONED $exception")
}

try {
return OffsetDateTime.parse(text, OFFSET)
.atZoneSameInstant(zone)
.toLocalDateTime()
} catch (exception: DateTimeParseException) {
Timber.e("Could not parse OFFSET $exception")
}

try {
return INSTANT.parse(text, Instant::from)
.atZone(zone)
.toLocalDateTime()
} catch (exception: Exception) {
Timber.e("Could not parse INSTANT $exception")
}

try {
return LocalDateTime.parse(text, LOCAL)
} catch (exception: Exception) {
Timber.e("Could not parse LOCAL $exception")
}
return LocalDateTime.now()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@ package ch.opentransportdata.ojp.data.dto.request
import ch.opentransportdata.ojp.data.dto.OJP_NAME_SPACE
import ch.opentransportdata.ojp.data.dto.SIRI_NAME_SPACE
import ch.opentransportdata.ojp.data.dto.SIRI_PREFIX
import ch.opentransportdata.ojp.data.dto.converter.LocalDateTimeSerializer
import ch.opentransportdata.ojp.data.dto.request.lir.LocationInformationRequestDto
import ch.opentransportdata.ojp.data.dto.request.trr.TripRefineRequestDto
import ch.opentransportdata.ojp.data.dto.request.tir.TripRequestDto
import ch.opentransportdata.ojp.data.dto.request.trr.TripRefineRequestDto
import kotlinx.serialization.Contextual
import nl.adaptivity.xmlutil.serialization.XmlElement
import nl.adaptivity.xmlutil.serialization.XmlSerialName
import java.time.LocalDateTime
Expand All @@ -24,7 +24,7 @@ internal data class ServiceRequestDto(

@XmlElement(true)
@XmlSerialName("RequestTimestamp", SIRI_NAME_SPACE, SIRI_PREFIX)
@kotlinx.serialization.Serializable(with = LocalDateTimeSerializer::class)
@Contextual
val requestTimestamp: LocalDateTime,

@XmlElement(true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package ch.opentransportdata.ojp.data.dto.request.lir
import ch.opentransportdata.ojp.data.dto.OJP_NAME_SPACE
import ch.opentransportdata.ojp.data.dto.SIRI_NAME_SPACE
import ch.opentransportdata.ojp.data.dto.SIRI_PREFIX
import ch.opentransportdata.ojp.data.dto.converter.LocalDateTimeSerializer
import kotlinx.serialization.Contextual
import nl.adaptivity.xmlutil.serialization.XmlElement
import nl.adaptivity.xmlutil.serialization.XmlSerialName
import java.time.LocalDateTime
Expand All @@ -18,7 +18,7 @@ internal data class LocationInformationRequestDto(

@XmlElement(true)
@XmlSerialName("RequestTimestamp", SIRI_NAME_SPACE, SIRI_PREFIX)
@kotlinx.serialization.Serializable(with = LocalDateTimeSerializer::class)
@Contextual
val requestTimestamp: LocalDateTime,

@XmlElement(true)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package ch.opentransportdata.ojp.data.dto.request.tir

import ch.opentransportdata.ojp.data.dto.OJP_NAME_SPACE
import ch.opentransportdata.ojp.data.dto.converter.LocalDateTimeSerializer
import kotlinx.serialization.Contextual
import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement
import nl.adaptivity.xmlutil.serialization.XmlSerialName
import kotlinx.serialization.Serializable
import java.time.LocalDateTime

/**
Expand All @@ -18,6 +18,6 @@ internal data class PlaceContextDto(

@XmlElement(true)
@XmlSerialName("DepArrTime", OJP_NAME_SPACE, "")
@Serializable(with = LocalDateTimeSerializer::class)
@Contextual
val departureArrivalTime: LocalDateTime? = null
)
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package ch.opentransportdata.ojp.data.dto.request.tir
import ch.opentransportdata.ojp.data.dto.OJP_NAME_SPACE
import ch.opentransportdata.ojp.data.dto.SIRI_NAME_SPACE
import ch.opentransportdata.ojp.data.dto.SIRI_PREFIX
import ch.opentransportdata.ojp.data.dto.converter.LocalDateTimeSerializer
import kotlinx.serialization.Contextual
import nl.adaptivity.xmlutil.serialization.XmlElement
import nl.adaptivity.xmlutil.serialization.XmlSerialName
import java.time.LocalDateTime
Expand All @@ -17,7 +17,7 @@ internal data class TripRequestDto(

@XmlElement(true)
@XmlSerialName("RequestTimestamp", SIRI_NAME_SPACE, SIRI_PREFIX)
@kotlinx.serialization.Serializable(with = LocalDateTimeSerializer::class)
@Contextual
val requestTimestamp: LocalDateTime,

@XmlElement(true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ package ch.opentransportdata.ojp.data.dto.request.trr
import ch.opentransportdata.ojp.data.dto.OJP_NAME_SPACE
import ch.opentransportdata.ojp.data.dto.SIRI_NAME_SPACE
import ch.opentransportdata.ojp.data.dto.SIRI_PREFIX
import ch.opentransportdata.ojp.data.dto.converter.LocalDateTimeSerializer
import ch.opentransportdata.ojp.data.dto.response.tir.TripResultDto
import kotlinx.serialization.Contextual
import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement
import nl.adaptivity.xmlutil.serialization.XmlSerialName
Expand All @@ -20,7 +20,7 @@ internal data class TripRefineRequestDto(

@XmlElement(true)
@XmlSerialName("RequestTimestamp", SIRI_NAME_SPACE, SIRI_PREFIX)
@Serializable(with = LocalDateTimeSerializer::class)
@Contextual
val requestTimestamp: LocalDateTime,

@XmlElement(true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@ package ch.opentransportdata.ojp.data.dto.response
import ch.opentransportdata.ojp.data.dto.OJP_NAME_SPACE
import ch.opentransportdata.ojp.data.dto.SIRI_NAME_SPACE
import ch.opentransportdata.ojp.data.dto.SIRI_PREFIX
import ch.opentransportdata.ojp.data.dto.converter.LocalDateTimeSerializer
import ch.opentransportdata.ojp.data.dto.response.delivery.AbstractDeliveryDto
import ch.opentransportdata.ojp.data.dto.response.delivery.LocationInformationDeliveryDto
import ch.opentransportdata.ojp.data.dto.response.delivery.TripDeliveryDto
import ch.opentransportdata.ojp.data.dto.response.delivery.TripRefineDeliveryDto
import kotlinx.serialization.Contextual
import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement
import nl.adaptivity.xmlutil.serialization.XmlSerialName
Expand All @@ -21,16 +21,13 @@ import java.time.LocalDateTime
internal data class ServiceDeliveryDto(
@XmlElement(true)
@XmlSerialName("ResponseTimestamp", SIRI_NAME_SPACE, SIRI_PREFIX)
@Serializable(with = LocalDateTimeSerializer::class)
@Contextual
val responseTimestamp: LocalDateTime,

@XmlElement(true)
@XmlSerialName("ProducerRef", SIRI_NAME_SPACE, SIRI_PREFIX)
val producerRef: String? = null,

// Polymorphic child: tag name determines the concrete delivery subtype.
// You can either rely on @XmlSerialName on the subtypes (with a polymorphic SerializersModule),
// or explicitly list the element names here via @XmlPolyChildren:
@XmlElement(true)
@XmlSerialName("OJPLocationInformationDelivery", OJP_NAME_SPACE, "")
val ojpLocationInformationDelivery: LocationInformationDeliveryDto? = null,
Expand All @@ -42,18 +39,7 @@ internal data class ServiceDeliveryDto(
@XmlElement(true)
@XmlSerialName("OJPTripRefineDelivery", OJP_NAME_SPACE, "")
val ojpTripRefineDelivery: TripRefineDeliveryDto? = null,
// @XmlElement(true)
// @XmlPolyChildren(
// value = [
// // childSerialName[=[prefix:]localName]
// "OJPLocationInformationDelivery=ojp:OJPLocationInformationDelivery",
// "OJPTripDelivery=ojp:OJPTripDelivery",
// "OJPTripRefineDelivery=ojp:OJPTripRefineDelivery"
// ]
// )
// val ojpDelivery: AbstractDeliveryDto
) {
// Optional: keep a convenience getter so the rest of your code hardly changes
val ojpDelivery: AbstractDeliveryDto?
get() = ojpLocationInformationDelivery
?: ojpTripDelivery
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ package ch.opentransportdata.ojp.data.dto.response.delivery
import ch.opentransportdata.ojp.data.dto.OJP_NAME_SPACE
import ch.opentransportdata.ojp.data.dto.SIRI_NAME_SPACE
import ch.opentransportdata.ojp.data.dto.SIRI_PREFIX
import ch.opentransportdata.ojp.data.dto.converter.LocalDateTimeSerializer
import ch.opentransportdata.ojp.data.dto.response.PlaceResultDto
import kotlinx.serialization.Contextual
import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement
import nl.adaptivity.xmlutil.serialization.XmlSerialName
Expand All @@ -18,7 +18,7 @@ import java.time.LocalDateTime
internal data class LocationInformationDeliveryDto(
@XmlElement(true)
@XmlSerialName("ResponseTimestamp", SIRI_NAME_SPACE, SIRI_PREFIX)
@Serializable(with = LocalDateTimeSerializer::class)
@Contextual
override val responseTimestamp: LocalDateTime,

@XmlElement(true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ package ch.opentransportdata.ojp.data.dto.response.delivery
import ch.opentransportdata.ojp.data.dto.OJP_NAME_SPACE
import ch.opentransportdata.ojp.data.dto.SIRI_NAME_SPACE
import ch.opentransportdata.ojp.data.dto.SIRI_PREFIX
import ch.opentransportdata.ojp.data.dto.converter.LocalDateTimeSerializer
import ch.opentransportdata.ojp.data.dto.response.tir.TripResponseContextDto
import ch.opentransportdata.ojp.data.dto.response.tir.TripResultDto
import kotlinx.serialization.Contextual
import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement
import nl.adaptivity.xmlutil.serialization.XmlSerialName
Expand All @@ -20,7 +20,7 @@ import java.time.LocalDateTime
data class TripDeliveryDto(
@XmlElement(true)
@XmlSerialName("ResponseTimestamp", SIRI_NAME_SPACE, SIRI_PREFIX)
@Serializable(with = LocalDateTimeSerializer::class)
@Contextual
override val responseTimestamp: LocalDateTime,

@XmlElement(true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ package ch.opentransportdata.ojp.data.dto.response.delivery
import ch.opentransportdata.ojp.data.dto.OJP_NAME_SPACE
import ch.opentransportdata.ojp.data.dto.SIRI_NAME_SPACE
import ch.opentransportdata.ojp.data.dto.SIRI_PREFIX
import ch.opentransportdata.ojp.data.dto.converter.LocalDateTimeSerializer
import ch.opentransportdata.ojp.data.dto.response.tir.TripResponseContextDto
import ch.opentransportdata.ojp.data.dto.response.tir.TripResultDto
import kotlinx.serialization.Contextual
import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement
import nl.adaptivity.xmlutil.serialization.XmlSerialName
Expand All @@ -21,7 +21,7 @@ import java.time.LocalDateTime
data class TripRefineDeliveryDto(
@XmlElement(true)
@XmlSerialName("ResponseTimestamp", SIRI_NAME_SPACE, SIRI_PREFIX)
@Serializable(with = LocalDateTimeSerializer::class)
@Contextual
override val responseTimestamp: LocalDateTime,

@XmlElement(true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ package ch.opentransportdata.ojp.data.dto.response.tir.leg

import android.os.Parcelable
import ch.opentransportdata.ojp.data.dto.OJP_NAME_SPACE
import ch.opentransportdata.ojp.data.dto.converter.LocalDateTimeSerializer
import kotlinx.parcelize.Parcelize
import kotlinx.serialization.Contextual
import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement
import nl.adaptivity.xmlutil.serialization.XmlSerialName
Expand All @@ -18,12 +18,12 @@ import java.time.LocalDateTime
data class ServiceTimeDto(
@XmlElement(true)
@XmlSerialName("TimetabledTime", OJP_NAME_SPACE, "")
@Serializable(with = LocalDateTimeSerializer::class)
@Contextual
val timetabledTime: LocalDateTime,

@XmlElement(true)
@XmlSerialName("EstimatedTime", OJP_NAME_SPACE, "")
@Serializable(with = LocalDateTimeSerializer::class)
@Contextual
val estimatedTime: LocalDateTime? = null
) : Parcelable {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ import android.os.Parcelable
import ch.opentransportdata.ojp.data.dto.OJP_NAME_SPACE
import ch.opentransportdata.ojp.data.dto.SIRI_NAME_SPACE
import ch.opentransportdata.ojp.data.dto.SIRI_PREFIX
import ch.opentransportdata.ojp.data.dto.converter.LocalDateTimeSerializer
import ch.opentransportdata.ojp.domain.model.ScopeType
import kotlinx.parcelize.Parcelize
import kotlinx.serialization.Contextual
import nl.adaptivity.xmlutil.serialization.XmlElement
import nl.adaptivity.xmlutil.serialization.XmlSerialName
import java.time.LocalDateTime
Expand All @@ -20,7 +20,7 @@ import java.time.LocalDateTime
data class PtSituationDto(
@XmlElement(true)
@XmlSerialName("CreationTime", SIRI_NAME_SPACE, SIRI_PREFIX)
@kotlinx.serialization.Serializable(with = LocalDateTimeSerializer::class)
@Contextual
val creationTime: LocalDateTime? = null,

@XmlElement(true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ package ch.opentransportdata.ojp.data.dto.response.tir.situations
import android.os.Parcelable
import ch.opentransportdata.ojp.data.dto.SIRI_NAME_SPACE
import ch.opentransportdata.ojp.data.dto.SIRI_PREFIX
import ch.opentransportdata.ojp.data.dto.converter.LocalDateTimeSerializer
import kotlinx.parcelize.Parcelize
import kotlinx.serialization.Contextual
import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement
import nl.adaptivity.xmlutil.serialization.XmlSerialName
Expand Down Expand Up @@ -43,7 +43,7 @@ data class PublishingActionDto(
data class PassengerInformationActionDto(
@XmlElement(true)
@XmlSerialName("RecordedAtTime", SIRI_NAME_SPACE, SIRI_PREFIX)
@Serializable(with = LocalDateTimeSerializer::class)
@Contextual
val recordedAtTime: LocalDateTime? = null,

@XmlElement(true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ package ch.opentransportdata.ojp.data.dto.response.tir.situations
import android.os.Parcelable
import ch.opentransportdata.ojp.data.dto.SIRI_NAME_SPACE
import ch.opentransportdata.ojp.data.dto.SIRI_PREFIX
import ch.opentransportdata.ojp.data.dto.converter.LocalDateTimeSerializer
import kotlinx.parcelize.Parcelize
import kotlinx.serialization.Contextual
import kotlinx.serialization.Serializable
import nl.adaptivity.xmlutil.serialization.XmlElement
import nl.adaptivity.xmlutil.serialization.XmlSerialName
Expand All @@ -19,11 +19,11 @@ import java.time.LocalDateTime
data class ValidityPeriodDto(
@XmlElement(true)
@XmlSerialName("StartTime", SIRI_NAME_SPACE, SIRI_PREFIX)
@Serializable(with = LocalDateTimeSerializer::class)
@Contextual
val startTime: LocalDateTime,

@XmlElement(true)
@XmlSerialName("EndTime", SIRI_NAME_SPACE, SIRI_PREFIX)
@Serializable(with = LocalDateTimeSerializer::class)
@Contextual
val endTime: LocalDateTime
) : Parcelable
Loading
Loading