diff --git a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/dss/reporting-plugins/exports-api/exportsApi.py b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/dss/reporting-plugins/exports-api/exportsApi.py index 5b2123c18abba4161fdb550f1d251723a0f50e0a..c72cebeccb5ee56222b7f9e0096c996e9388ba2d 100644 --- a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/dss/reporting-plugins/exports-api/exportsApi.py +++ b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/dss/reporting-plugins/exports-api/exportsApi.py @@ -21,14 +21,13 @@ import jarray from ch.systemsx.cisd.openbis.dss.generic.server import DataStoreServer from ch.systemsx.cisd.openbis.generic.client.web.client.exception import UserFailureException # Zip Format -from java.io import File +from java.io import File, BufferedInputStream from java.io import FileInputStream from java.io import FileOutputStream from java.lang import String from java.lang import StringBuilder from java.util import ArrayList -from java.util.zip import ZipEntry, Deflater -from java.util.zip import ZipOutputStream +from java.util.zip import ZipEntry, Deflater, ZipOutputStream, CRC32 from org.apache.commons.io import FileUtils # Java Core from org.apache.commons.io import IOUtils @@ -263,7 +262,7 @@ def cleanUp(tempDirPath, tempZipFilePath): FileUtils.forceDelete(File(tempZipFilePath)); -def generateFilesInZip(zos, entities, includeRoot, sessionToken, tempDirPath): +def generateFilesInZip(zos, entities, includeRoot, sessionToken, tempDirPath, deflated=True): # Services used during the export process v3 = ServiceProvider.getV3ApplicationService(); v3d = ServiceProvider.getApplicationContext().getBean(V3_DSS_BEAN); @@ -364,7 +363,7 @@ def generateFilesInZip(zos, entities, includeRoot, sessionToken, tempDirPath): rawFile = File(tempDirPath + filePath + ".json"); rawFile.getParentFile().mkdirs(); IOUtils.copyLarge(rawFileInputStream, FileOutputStream(rawFile)); - addToZipFile(filePath, rawFile, zos); + addToZipFile(filePath, rawFile, zos, deflated=deflated); emptyZip = False # To avoid empty directories on the zip file, it makes the first found entity the base directory @@ -382,20 +381,20 @@ def generateFilesInZip(zos, entities, includeRoot, sessionToken, tempDirPath): if entityObj is not None and entityFilePath is not None: # JSON entityJson = String(objectMapper.writeValueAsString(entityObj)); - fileMetadatum = addFile(tempDirPath, entityFilePath, "json", entityJson.getBytes(), zos); + fileMetadatum = addFile(tempDirPath, entityFilePath, "json", entityJson.getBytes(), zos, deflated=deflated); fileMetadata.append(fileMetadatum) emptyZip = False # TEXT entityTXT = String(getTXT(entityObj, v3, sessionToken, False)); - fileMetadatum = addFile(tempDirPath, entityFilePath, "txt", entityTXT.getBytes(), zos); + fileMetadatum = addFile(tempDirPath, entityFilePath, "txt", entityTXT.getBytes(), zos, deflated=deflated); fileMetadata.append(fileMetadatum) # DOCX entityDOCX = getDOCX(entityObj, v3, sessionToken, False); - fileMetadatum = addFile(tempDirPath, entityFilePath, "docx", entityDOCX, zos); + fileMetadatum = addFile(tempDirPath, entityFilePath, "docx", entityDOCX, zos, deflated=deflated); fileMetadata.append(fileMetadatum) # HTML entityHTML = getDOCX(entityObj, v3, sessionToken, True); - fileMetadatum = addFile(tempDirPath, entityFilePath, "html", entityHTML, zos); + fileMetadatum = addFile(tempDirPath, entityFilePath, "html", entityHTML, zos, deflated=deflated); fileMetadata.append(fileMetadatum) operationLog.info("--> Entity type: " + type + " permId: " + permId + " post html."); if emptyZip: @@ -651,12 +650,12 @@ def objToStrArray(objArray): return result -def addFile(tempDirPath, entityFilePath, extension, fileContent, zos): +def addFile(tempDirPath, entityFilePath, extension, fileContent, zos, deflated=True): entityFileNameWithExtension = entityFilePath + "." + extension entityFile = File(tempDirPath + entityFileNameWithExtension); entityFile.getParentFile().mkdirs(); IOUtils.write(fileContent, FileOutputStream(entityFile)); - addToZipFile(entityFileNameWithExtension, entityFile, zos); + addToZipFile(entityFileNameWithExtension, entityFile, zos, deflated=deflated); FileUtils.forceDelete(entityFile); extensionToMimeType = { @@ -685,9 +684,17 @@ def getFilePath(spaceCode, projCode, expCode, sampCode, dataCode): fileName += "/" + dataCode; return fileName; -def addToZipFile(path, file, zos): +def addToZipFile(path, file, zos, deflated=True): fis = FileInputStream(file); zipEntry = ZipEntry(path[1:]); # Making paths relative to make them compatible with Windows zip implementation + if not deflated: + zipEntry.setMethod(ZipOutputStream.STORED) + zipEntry.setSize(file.length()) + zipEntry.setCompressedSize(-1) + crc = getFileCRC(file) + zipEntry.setCrc(crc) + else: + zipEntry.setMethod(ZipOutputStream.DEFLATED) zos.putNextEntry(zipEntry); bytes = jarray.zeros(1024, "b"); @@ -699,6 +706,21 @@ def addToZipFile(path, file, zos): zos.closeEntry(); fis.close(); +def getFileCRC(file): + bis = None + crc = CRC32() + try: + bis = BufferedInputStream(FileInputStream(file), 1024) + b = jarray.zeros(1024, "b") + i = bis.read(b) + while i != -1: + crc.update(b, 0, i) + i = bis.read(b) + finally: + if bis is not None: + bis.close() + return crc.getValue() + def getConfigurationProperty(transaction, propertyName): threadProperties = transaction.getGlobalState().getThreadParameters().getThreadProperties(); try: @@ -719,9 +741,10 @@ def generateZipFile(entities, params, tempDirPath, tempZipFilePath, deflated=Tru fos = FileOutputStream(tempZipFilePath) zos = ZipOutputStream(fos) if not deflated: + zos.setMethod(ZipOutputStream.STORED) zos.setLevel(Deflater.NO_COMPRESSION) - fileMetadata = generateFilesInZip(zos, entities, includeRoot, sessionToken, tempDirPath) + fileMetadata = generateFilesInZip(zos, entities, includeRoot, sessionToken, tempDirPath, deflated=deflated) finally: if zos is not None: zos.close() diff --git a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/dss/reporting-plugins/rc-exports-api/rcExports.py b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/dss/reporting-plugins/rc-exports-api/rcExports.py index e7ec266b7609e990e4a8992e5563e7457dc9d623..2c48c58426a2dd243546ee575f825c3ae7296423 100644 --- a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/dss/reporting-plugins/rc-exports-api/rcExports.py +++ b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/dss/reporting-plugins/rc-exports-api/rcExports.py @@ -228,9 +228,10 @@ def generateExternalZipFile(params, exportDirPath, contentZipFilePath, contentZi fos = FileOutputStream(exportZipFileName) zos = ZipOutputStream(fos) if not deflated: + zos.setMethod(ZipOutputStream.STORED) zos.setLevel(Deflater.NO_COMPRESSION) - addToZipFile(' ' + contentZipFileName, File(contentZipFilePath), zos) + addToZipFile(' ' + contentZipFileName, File(contentZipFilePath), zos, deflated) generateXML(zipOutputStream=zos, fileMetadata=fileMetadata, exportDirPath=exportDirPath, userInformation=userInformation, entities=entities, params=params)