Use apache commons for creating proper unix style ZIP64 archives

Change-Id: I50a09824440b394ccfc9cd949d8c4e64ef4c0a19
diff --git a/app/build.gradle b/app/build.gradle
index 8be8109..361ba8d 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -46,6 +46,7 @@
     implementation 'org.apache.opennlp:opennlp-tools:2.5.3'
     implementation 'org.slf4j:slf4j-simple:2.1.0-alpha1'
     implementation 'org.apache.ant:ant:1.10.15'
+    implementation 'org.apache.commons:commons-compress:1.27.1'
 
 }
 
diff --git a/app/src/main/kotlin/de/ids_mannheim/korapxmltools/KorapXml2Conllu.kt b/app/src/main/kotlin/de/ids_mannheim/korapxmltools/KorapXml2Conllu.kt
index 3e6738c..14d9f20 100644
--- a/app/src/main/kotlin/de/ids_mannheim/korapxmltools/KorapXml2Conllu.kt
+++ b/app/src/main/kotlin/de/ids_mannheim/korapxmltools/KorapXml2Conllu.kt
@@ -2,6 +2,8 @@
 
 import de.ids_mannheim.korapxmltools.AnnotationToolBridgeFactory.Companion.parserFoundries
 import de.ids_mannheim.korapxmltools.AnnotationToolBridgeFactory.Companion.taggerFoundries
+import org.apache.commons.compress.archivers.zip.Zip64Mode
+import org.apache.commons.compress.archivers.zip.ZipArchiveEntry
 import org.w3c.dom.Document
 import org.w3c.dom.Element
 import org.w3c.dom.NodeList
@@ -28,7 +30,7 @@
 import java.util.zip.ZipEntry
 
 import java.util.zip.ZipFile
-import java.util.zip.ZipOutputStream
+import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream
 import javax.xml.parsers.DocumentBuilder
 import javax.xml.parsers.DocumentBuilderFactory
 import javax.xml.transform.OutputKeys
@@ -260,7 +262,7 @@
 
     var dbFactory: DocumentBuilderFactory? = null
     var dBuilder: DocumentBuilder? = null
-    var morphoZipOutputStream: ZipOutputStream? = null
+    var morphoZipOutputStream: ZipArchiveOutputStream? = null
 
     fun String.hasCorrespondingBaseZip(): Boolean {
         if (!this.matches(Regex(".*\\.([^/.]+)\\.zip$"))) return false
@@ -342,7 +344,7 @@
                 if (tagger != null) {
                     targetFoundry = tagger.foundry
                 }
-            } else {
+            } else if (parserName != null) {
                 targetFoundry = parserName!!
             }
             dbFactory = DocumentBuilderFactory.newInstance()
@@ -357,7 +359,9 @@
                 exitProcess(1)
             }
             val fileOutputStream = FileOutputStream(outputMorphoZipFileName)
-            morphoZipOutputStream = ZipOutputStream(fileOutputStream)
+            morphoZipOutputStream = ZipArchiveOutputStream(fileOutputStream).apply {
+                setUseZip64(Zip64Mode.Always)
+            }
         }
         if (zipFilePath.hasCorrespondingBaseZip()) {
             val zips = arrayOf(zipFilePath, zipFilePath.correspondingBaseZip()!!)
@@ -572,13 +576,12 @@
             val entryPath = if (parserName != null)  docId.replace(Regex("[_.]"), "/").plus("/$parserName/").plus("dependency.xml")
             else
                 docId.replace(Regex("[_.]"), "/").plus("/$morphoFoundry/").plus("morpho.xml")
-            val zipEntry = ZipEntry(entryPath)
-            // val zipEntry = org.apache.tools.zip.ZipEntry(entryPath)
-            // zipEntry.unixMode = 65535
+            val zipEntry = ZipArchiveEntry(entryPath)
+            zipEntry.unixMode = ZIP_ENTRY_UNIX_MODE
             synchronized(morphoZipOutputStream!!) {
-                morphoZipOutputStream!!.putNextEntry(zipEntry)
+                morphoZipOutputStream!!.putArchiveEntry(zipEntry)
                 morphoZipOutputStream!!.write(output.toString().toByteArray())
-                morphoZipOutputStream!!.closeEntry()
+                morphoZipOutputStream!!.closeArchiveEntry()
             }
             output.clear()
         }