package com.megatim.module.compression.impl;
|
|
import java.io.File;
|
import java.io.FileInputStream;
|
import java.io.IOException;
|
import java.util.zip.ZipEntry;
|
import java.util.zip.ZipOutputStream;
|
|
import net.lingala.zip4j.ZipFile;
|
import net.lingala.zip4j.model.ZipParameters;
|
import net.lingala.zip4j.model.enums.CompressionLevel;
|
import net.lingala.zip4j.model.enums.EncryptionMethod;
|
import com.megatim.module.compression.ifaces.CompressionFace;
|
import java.util.Arrays;
|
import net.lingala.zip4j.exception.ZipException;
|
import net.lingala.zip4j.model.enums.CompressionMethod;
|
|
/**
|
* Classe implementant l'algorithme Zip4J
|
*
|
* @author derteuffel
|
*
|
*/
|
public class JavaZipZip4Impl implements CompressionFace {
|
|
public void zipFile(File sourceFile, File destinationFolder, int splitLength) throws ZipException {
|
ZipParameters zipParameters = new ZipParameters();
|
zipParameters.setCompressionMethod(CompressionMethod.DEFLATE);
|
zipParameters.setCompressionLevel(CompressionLevel.NORMAL);
|
|
ZipFile zipFile = new ZipFile(new File(destinationFolder.getAbsolutePath(), removeExtension(sourceFile.getName()) + ".zip"));
|
|
// Create the split zip file from a single file
|
zipFile.createSplitZipFile(Arrays.asList(sourceFile), zipParameters, true, splitLength * 1024 * 1024);
|
|
}
|
|
public void mergeSplitFiles(File mainZip, File destinationDir, String outputName) throws ZipException {
|
// Create a ZipFile instance for the first part
|
ZipFile zipFile = new ZipFile(mainZip);
|
File mergedZipFile = new File(destinationDir, outputName);
|
|
// Merge the split files into a single ZIP file
|
zipFile.mergeSplitFiles(mergedZipFile);
|
}
|
|
public File zipFile(File fichierAZipper) throws IOException {
|
// TODO Auto-generated method stub
|
|
ZipFile zipFile = new ZipFile(removeExtension(fichierAZipper.getPath()) + ".zip");
|
zipFile.addFile(new File(fichierAZipper.getPath()));
|
|
// return new File(removeExtension(fichierAZipper.getPath()) + ".zip");
|
return zipFile.getFile();
|
}
|
|
public File zipFile(File fichierAZipper, File destination) throws IOException {
|
// TODO Auto-generated method stub
|
|
ZipFile zipFile = new ZipFile(new File(destination.getPath(), removeExtension(fichierAZipper.getName()) + ".zip"));
|
zipFile.addFile(fichierAZipper);
|
|
return zipFile.getFile();
|
}
|
|
public File zipRepository(File repertoireAZipper, File destination) throws IOException {
|
// TODO Auto-generated method stub
|
|
ZipFile zipFile = new ZipFile(new File(destination.getPath(), removeExtension(repertoireAZipper.getName()) + ".zip"));
|
zipFile.addFolder(repertoireAZipper);
|
|
return zipFile.getFile();
|
}
|
|
public File zipFile(File fichierAZipper, File repertoireDestination, String password) throws IOException {
|
String sourceFile = fichierAZipper.getAbsolutePath();
|
|
ZipParameters zipParameters = new ZipParameters();
|
|
zipParameters.setEncryptFiles(true);
|
|
zipParameters.setCompressionLevel(CompressionLevel.HIGHER);
|
|
zipParameters.setEncryptionMethod(EncryptionMethod.AES);
|
File fileToAdd = new File(sourceFile);
|
|
if (!fileToAdd.exists()) {
|
|
fileToAdd.createNewFile();
|
|
}
|
ZipFile zipFile = new ZipFile(new File(repertoireDestination.getPath(), removeExtension(fichierAZipper.getName()) + ".zip"), password.toCharArray());
|
zipFile.addFile(fichierAZipper, zipParameters);
|
|
zipFile.close();
|
|
return zipFile.getFile();
|
}
|
|
// Zip directory
|
public File zipRepository(File repertoireAZipper) throws IOException {
|
// TODO Auto-generated method stub
|
|
new ZipFile(removeExtension(repertoireAZipper.getPath()) + ".zip").addFolder(new File(repertoireAZipper.getPath()));
|
|
return new File(removeExtension(repertoireAZipper.getPath()) + ".zip");
|
}
|
|
// Dezipper un fichier zipper
|
public void unZipFile(File fichierZipper, File repertoireSorti) throws IOException {
|
// TODO Auto-generated method stub
|
|
new ZipFile(removeExtension(fichierZipper.getPath()) + ".zip").extractAll(repertoireSorti.getPath());
|
|
}
|
|
// Dezipper un repertoir
|
public void unZipRepository(File repertoireZipper, File repertoireSorti) throws IOException {
|
// TODO Auto-generated method stub
|
|
new ZipFile(removeExtension(repertoireZipper.getPath()) + ".zip").extractAll(repertoireSorti.getPath());
|
|
}
|
|
public void addFile(File fichier, File zipFile) throws Exception {
|
// TODO Auto-generated method stub
|
|
if (zipFile.createNewFile()) {
|
|
System.out.println("Zip file created");
|
|
} else {
|
|
System.out.println("Zip file already exist");
|
|
}
|
|
new ZipFile(zipFile.getPath()).addFile(new File(fichier.getPath()));
|
|
}
|
|
// Add repository to existed zip file
|
public void addRepository(File repository, File zipFile) throws Exception {
|
// TODO Auto-generated method stub
|
|
if (zipFile.createNewFile()) {
|
|
System.out.println("Zip file created");
|
|
} else {
|
|
System.out.println("Zip file already exist");
|
|
}
|
|
new ZipFile(zipFile.getPath()).addFolder(new File(repository.getPath()));
|
|
}
|
|
// Zip file with password
|
public File zipFile(File fichierAZipper, String password) throws Exception {
|
// TODO Auto-generated method stub
|
|
String sourceFile = fichierAZipper.getAbsolutePath();
|
|
ZipParameters zipParameters = new ZipParameters();
|
|
zipParameters.setEncryptFiles(true);
|
|
zipParameters.setCompressionLevel(CompressionLevel.HIGHER);
|
|
zipParameters.setEncryptionMethod(EncryptionMethod.AES);
|
File fileToAdd = new File(sourceFile);
|
|
if (!fileToAdd.exists()) {
|
|
fileToAdd.createNewFile();
|
|
}
|
|
ZipFile zipFile = new ZipFile(removeExtension(fileToAdd.getPath()) + ".zip", password.toCharArray());
|
|
zipFile.addFile(fileToAdd, zipParameters);
|
|
zipFile.close();
|
|
return new File(removeExtension(fileToAdd.getPath()) + ".zip");
|
}
|
|
// Zip directory with passwor
|
public File zipRepository(File repertoireAZipper, String password) throws Exception {
|
// TODO Auto-generated method stub
|
|
String sourceFile = repertoireAZipper.getAbsolutePath();
|
|
ZipParameters zipParameters = new ZipParameters();
|
|
zipParameters.setEncryptFiles(true);
|
|
zipParameters.setCompressionLevel(CompressionLevel.HIGHER);
|
|
zipParameters.setEncryptionMethod(EncryptionMethod.AES);
|
|
File fileToAdd = new File(sourceFile);
|
|
if (!fileToAdd.exists()) {
|
|
fileToAdd.mkdirs();
|
|
}
|
|
ZipFile zipFile = new ZipFile(removeExtension(fileToAdd.getPath()) + ".zip", password.toCharArray());
|
|
zipFile.addFolder(fileToAdd, zipParameters);
|
|
zipFile.close();
|
|
return new File(removeExtension(fileToAdd.getPath()) + ".zip");
|
|
}
|
|
// dezippage d'un fichier zipper
|
public void unZipFile(File fichierZipper, File repertoireSorti, String password) throws Exception {
|
// TODO Auto-generated method stub
|
|
String sourceFile = repertoireSorti.getAbsolutePath();
|
|
File outFile = new File(sourceFile);
|
|
// Check if directory exist
|
if (!outFile.exists()) {
|
|
outFile.mkdirs();
|
|
}
|
|
// Initialize zip file reader to prepare extraction
|
ZipFile zipFile = new ZipFile(fichierZipper.getPath(), password.toCharArray());
|
|
zipFile.extractAll(outFile.getPath());
|
|
// Close the reader
|
zipFile.close();
|
|
}
|
|
// Dezipper un repertoire
|
public void unZipRepository(File repertoireZipper, File repertoireSorti, String password) throws Exception {
|
// TODO Auto-generated method stub
|
|
String sourceFile = repertoireSorti.getAbsolutePath();
|
|
File outFile = new File(sourceFile);
|
|
// Check if directory exist
|
if (!outFile.exists()) {
|
|
outFile.mkdirs();
|
|
}
|
|
// Initialize zip file reader to prepare extraction
|
ZipFile zipFile = new ZipFile(repertoireZipper.getPath(), password.toCharArray());
|
|
zipFile.extractAll(outFile.getPath());
|
|
// Close the reader
|
zipFile.close();
|
|
}
|
|
public void addFile(File fichier, File zipFile, String password) throws Exception {
|
// TODO Auto-generated method stub
|
|
// Test d'existance du repertoire de destination
|
if (zipFile.createNewFile()) {
|
|
System.out.println("Zip file created");
|
|
} else {
|
|
System.out.println("Zip file already exist");
|
|
}
|
|
ZipParameters zipParameters = new ZipParameters();
|
|
zipParameters.setEncryptFiles(true);
|
|
zipParameters.setCompressionLevel(CompressionLevel.HIGHER);
|
|
zipParameters.setEncryptionMethod(EncryptionMethod.AES);
|
|
//Ajouter le fichier dans le fichier zipper et association du mot de passe
|
new ZipFile(zipFile.getPath(), password.toCharArray()).addFile(new File(fichier.getPath()), zipParameters);
|
|
}
|
|
public void addRepository(File repository, File zipFile, String password) throws Exception {
|
// TODO Auto-generated method stub
|
|
//Test d'existance du repertoire de destination
|
if (zipFile.createNewFile()) {
|
|
System.out.println("Zip file created");
|
|
} else {
|
|
System.out.println("Zip file already exist");
|
|
}
|
|
ZipParameters zipParameters = new ZipParameters();
|
|
zipParameters.setEncryptFiles(true);
|
|
zipParameters.setCompressionLevel(CompressionLevel.HIGHER);
|
|
zipParameters.setEncryptionMethod(EncryptionMethod.AES);
|
|
//Ajouter le repertoire dans le fichier zipper et association du mot de passe
|
new ZipFile(zipFile.getPath(), password.toCharArray()).addFolder(new File(repository.getPath()), zipParameters);
|
|
}
|
|
// Remove extension before zip file
|
public static String removeExtension(String s) {
|
|
String separator = System.getProperty("file.separator");
|
|
String filename;
|
|
// Remove the path upto the filename.
|
/*
|
* int lastSeparatorIndex = s.lastIndexOf(separator); if (lastSeparatorIndex ==
|
* -1) { filename = s; } else { filename = s.substring(lastSeparatorIndex + 1);
|
* }
|
*/
|
// Remove the extension.
|
int extensionIndex = s.lastIndexOf(".");
|
|
if (extensionIndex == -1) {
|
return s;
|
}
|
|
return s.substring(0, extensionIndex);
|
}
|
|
// create directory and check if there are many contained files
|
private static void zipFile(File fileToZip, String fileName, ZipOutputStream zipOut) throws IOException {
|
|
if (fileToZip.isHidden()) {
|
|
return;
|
|
}
|
|
if (fileToZip.isDirectory()) {
|
|
if (fileName.endsWith("/")) {
|
|
zipOut.putNextEntry(new ZipEntry(fileName));
|
|
zipOut.closeEntry();
|
|
} else {
|
|
zipOut.putNextEntry(new ZipEntry(fileName + "/"));
|
|
zipOut.closeEntry();
|
|
}
|
File[] children = fileToZip.listFiles();
|
|
for (File childFile : children) {
|
|
zipFile(childFile, fileName + "/" + childFile.getName(), zipOut);
|
|
}
|
|
return;
|
|
}
|
|
FileInputStream fis = new FileInputStream(fileToZip);
|
|
ZipEntry zipEntry = new ZipEntry(fileName);
|
|
zipOut.putNextEntry(zipEntry);
|
|
byte[] bytes = new byte[1024];
|
|
int length;
|
|
while ((length = fis.read(bytes)) >= 0) {
|
|
zipOut.write(bytes, 0, length);
|
|
}
|
|
fis.close();
|
}
|
|
// Create new file after unzip
|
public static File newFile(File destinationDir, ZipEntry zipEntry) throws IOException {
|
|
File destFile = new File(destinationDir, zipEntry.getName());
|
|
String destDirPath = destinationDir.getCanonicalPath();
|
|
String destFilePath = destFile.getCanonicalPath();
|
|
if (!destFilePath.startsWith(destDirPath + File.separator)) {
|
|
throw new IOException("Entry is outside of the target dir: " + zipEntry.getName());
|
|
}
|
|
return destFile;
|
}
|
}
|