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()
}