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) {