Fix ConcurrentModificationException
at
de.ids_mannheim.korapxmltools.KorapXmlTool.scanAndOutputCompleteTexts$lambda$2(KorapXmlTool.kt:3699)
Change-Id: I1a7841f6c13673372f951c80b086c28523fd5e0d
diff --git a/app/src/main/kotlin/de/ids_mannheim/korapxmltools/KorapXmlTool.kt b/app/src/main/kotlin/de/ids_mannheim/korapxmltools/KorapXmlTool.kt
index 6716b66..67e90d3 100644
--- a/app/src/main/kotlin/de/ids_mannheim/korapxmltools/KorapXmlTool.kt
+++ b/app/src/main/kotlin/de/ids_mannheim/korapxmltools/KorapXmlTool.kt
@@ -3610,24 +3610,28 @@
// Compress text data in parallel, then write to TAR sequentially
private fun compressKrillText(textId: String, textData: KrillJsonGenerator.KrillTextData) {
try {
- val corpusSigle = textId.substringBefore('_')
- val docSigle = textId.substringBeforeLast('.')
+ val json = synchronized(textData) {
+ // Synchronize access to textData to prevent ConcurrentModificationException
+ // during JSON generation while other threads might still be modifying it
+ val corpusSigle = textId.substringBefore('_')
+ val docSigle = textId.substringBeforeLast('.')
- // Apply corpus-level metadata
- corpusMetadata[corpusSigle]?.forEach { (key, value) ->
- if (!textData.headerMetadata.containsKey(key)) {
- textData.headerMetadata[key] = value
+ // Apply corpus-level metadata
+ corpusMetadata[corpusSigle]?.forEach { (key, value) ->
+ if (!textData.headerMetadata.containsKey(key)) {
+ textData.headerMetadata[key] = value
+ }
}
- }
- // Apply doc-level metadata
- docMetadata[docSigle]?.forEach { (key, value) ->
- if (!textData.headerMetadata.containsKey(key)) {
- textData.headerMetadata[key] = value
+ // Apply doc-level metadata
+ docMetadata[docSigle]?.forEach { (key, value) ->
+ if (!textData.headerMetadata.containsKey(key)) {
+ textData.headerMetadata[key] = value
+ }
}
- }
- val json = KrillJsonGenerator.generate(textData, corpusMetadata, docMetadata, includeNonWordTokens)
+ KrillJsonGenerator.generate(textData, corpusMetadata, docMetadata, includeNonWordTokens)
+ }
// Choose compression format based on --lz4 flag
val (jsonFileName, compressedData) = if (useLz4) {