Skip to content

Commit a92e93c

Browse files
committed
Add a SyncJobStatus result callback amid Sync retries
- google#2049
1 parent e3a524c commit a92e93c

File tree

1 file changed

+29
-0
lines changed

1 file changed

+29
-0
lines changed

engine/src/main/java/com/google/android/fhir/sync/FhirSyncWorker.kt

+29
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,9 @@ abstract class FhirSyncWorker(appContext: Context, workerParams: WorkerParameter
9191
)
9292
.apply { subscribe(flow) }
9393
.synchronize()
94+
95+
if (result is SyncJobStatus.Failed) onFailedSyncJobResult(result)
96+
9497
val output = buildWorkData(result)
9598

9699
// await/join is needed to collect states completely
@@ -118,6 +121,32 @@ abstract class FhirSyncWorker(appContext: Context, workerParams: WorkerParameter
118121
}
119122
}
120123

124+
open fun onFailedSyncJobResult(failedSyncJobStatus: SyncJobStatus.Failed) {
125+
try {
126+
CoroutineScope(Dispatchers.IO).launch {
127+
val jsonParser = FhirContext.forR4().newJsonParser()
128+
129+
(result).exceptions.filterIsInstance<HttpException>().forEach { resourceSyncHTTPException ->
130+
val operationOutcome =
131+
jsonParser.parseResource(
132+
IOUtils.toString(
133+
resourceSyncHTTPException.response()?.errorBody()?.byteStream(),
134+
StandardCharsets.UTF_8
135+
)
136+
) as OperationOutcome
137+
138+
operationOutcome.issue.forEach { operationOutcome ->
139+
Timber.e(
140+
"SERVER ${operationOutcome.severity} - HTTP ${resourceSyncHTTPException.code()} | Code - ${operationOutcome.code} | Diagnostics - ${operationOutcome.diagnostics}"
141+
)
142+
}
143+
}
144+
}
145+
} catch (e: Exception) {
146+
Timber.e(e)
147+
}
148+
}
149+
121150
private fun buildWorkData(state: SyncJobStatus): Data {
122151
return workDataOf(
123152
// send serialized state and type so that consumer can convert it back

0 commit comments

Comments
 (0)