@@ -14,6 +14,7 @@ import java.net.URI
1414import java.text.SimpleDateFormat
1515import java.util.Date
1616import java.util.Locale
17+ import java.util.TimeZone
1718import com.couchbase.lite.Collection as CBLCollection
1819
1920object DataAdapter {
@@ -336,36 +337,43 @@ object DataAdapter {
336337 val iterator = map.keySetIterator()
337338 var count = 0
338339 while (iterator.hasNextKey()) {
339- val key = iterator.nextKey()
340- val nestedMap = map.getMap(key)
341- val nestedType = nestedMap?.getString(" type" )
342- count + = 1
343- when (nestedType) {
344- " int" -> queryParameters.setInt(key, nestedMap.getDouble(" value" ).toInt())
345- " long" -> queryParameters.setLong(key, nestedMap.getDouble(" value" ).toLong())
346- " float" -> queryParameters.setFloat(key, nestedMap.getDouble(" value" ).toFloat())
347- " double" -> queryParameters.setDouble(key, nestedMap.getDouble(" value" ))
348- " boolean" -> queryParameters.setBoolean(key, nestedMap.getBoolean(" value" ))
349- " string" -> queryParameters.setString(key, nestedMap.getString(" value" ))
350- " date" -> {
351- val stringValue = map.getString(" value" )
352- stringValue?.let { strValue ->
353- val dateFormat = SimpleDateFormat (" yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" , Locale .getDefault())
354- val date = dateFormat.parse(strValue)
355- date?.let { d ->
356- queryParameters.setDate(key, d)
340+ val key = iterator.nextKey()
341+ val nestedMap = map.getMap(key)
342+ val nestedType = nestedMap?.getString(" type" )
343+ count + = 1
344+ when (nestedType) {
345+ " int" -> queryParameters.setInt(key, nestedMap.getDouble(" value" ).toInt())
346+ " long" -> queryParameters.setLong(key, nestedMap.getDouble(" value" ).toLong())
347+ " float" -> queryParameters.setFloat(key, nestedMap.getDouble(" value" ).toFloat())
348+ " double" -> queryParameters.setDouble(key, nestedMap.getDouble(" value" ))
349+ " boolean" -> queryParameters.setBoolean(key, nestedMap.getBoolean(" value" ))
350+ " string" -> queryParameters.setString(key, nestedMap.getString(" value" ))
351+ " date" -> {
352+ val stringValue = nestedMap.getString(" value" )
353+ stringValue?.let { strValue ->
354+ val date = parseIsoDate(strValue)
355+ date?.let { d ->
356+ queryParameters.setDate(key, d)
357+ }
358+ }
357359 }
358- }
360+ " value" -> {
361+ val value = nestedMap.getDynamic(" value" )
362+ when (value.type) {
363+ ReadableType .Boolean -> queryParameters.setBoolean(key, value.asBoolean())
364+ ReadableType .Number -> queryParameters.setDouble(key, value.asDouble())
365+ ReadableType .String -> queryParameters.setString(key, value.asString())
366+ else -> queryParameters.setValue(key, value)
367+ }
368+ }
369+ else -> throw Exception (" Error: Invalid parameter type: $nestedType " )
359370 }
360-
361- else -> throw Exception (" Error: Invalid parameter type" )
362- }
363371 }
364372 if (count == 0 ) {
365- return null
373+ return null
366374 }
367375 return queryParameters
368- }
376+ }
369377
370378 /* *
371379 * Converts a `ReadableMap` to a `ReplicatorConfiguration` object.
@@ -559,4 +567,21 @@ object DataAdapter {
559567 }
560568 return map
561569 }
570+
571+ private fun parseIsoDate (dateString : String ): Date ? {
572+ val formats = listOf (
573+ " yyyy-MM-dd'T'HH:mm:ss.SSSX" , // Handles Z or +hh:mm
574+ " yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" , // Handles Z
575+ " yyyy-MM-dd'T'HH:mm:ssX" , // No milliseconds, with zone
576+ " yyyy-MM-dd'T'HH:mm:ss" // No milliseconds, no zone
577+ )
578+ for (format in formats) {
579+ try {
580+ val sdf = SimpleDateFormat (format, Locale .getDefault())
581+ sdf.timeZone = TimeZone .getTimeZone(" UTC" )
582+ return sdf.parse(dateString)
583+ } catch (_: Exception ) { }
584+ }
585+ return null
586+ }
562587}
0 commit comments