/**
* The contents of this file are subject to the OpenMRS Public License
* Version 1.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://license.openmrs.org
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
* License for the specific language governing rights and limitations
* under the License.
*
* Copyright (C) OpenMRS, LLC. All Rights Reserved.
*/
package org.openmrs.module.sync.serialization;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;
import java.util.zip.Adler32;
import java.util.zip.CheckedOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openmrs.module.sync.SyncConstants;
/**
*
*/
public class ZipPackage {
private static Log log = LogFactory.getLog(FilePackage.class);
static final int BUFFER = 2048;
private String rootName;
private String targetName;
private FileOutputStream dest;
private CheckedOutputStream checksum;
private ZipOutputStream out;
private byte data[];
public ZipPackage(File root, String target) {
try {
this.rootName = root.getAbsolutePath();
this.targetName = target;
File archiveFolder = new File(root, "archive");
archiveFolder.mkdir();
File f = new File(archiveFolder, targetName);
f.mkdir();
if (!f.exists())
f.mkdirs();
File outputStreamDir = new File(f, targetName + "_"
+ SyncConstants.SYNC_FILENAME_MASK.format(new Date()) + ".zip");
this.dest = new FileOutputStream(outputStreamDir);
this.checksum = new CheckedOutputStream(dest, new Adler32());
this.out = new ZipOutputStream(new BufferedOutputStream(checksum));
this.data = new byte[BUFFER];
} catch (Exception e) {
log.error(e.toString());
}
}
public boolean zip(boolean clearDir) {
if (this.addFile(this.targetName)) {
try {
this.out.close();
if (clearDir) {
File dir = new File(this.rootName + "archive/" + this.targetName);
this.clearPath(dir);
}
} catch (Exception e) {
log.error(e.toString());
return false;
}
log.info("ZIP FILE: " + this.rootName + "archive/" + this.targetName
+ ".zip archived successifully");
return true;
} else {
try {
this.out.close();
} catch (Exception e) {
e.printStackTrace();
return false;
}
log.error("ERROR while archiving folder " + this.rootName + "archive/"
+ this.targetName);
return false;
}
}
public void clearPath(File path) throws IOException {
File[] files = path.listFiles();
for (int i = 0; i < files.length; ++i) {
if (files[i].isDirectory()) {
clearPath(files[i]);
}
files[i].delete();
}
}
public boolean addFile(String rootRelativeName) {
try {
File currentFile = new File(rootName + "archive/" + rootRelativeName);
if (currentFile.isFile()) {
BufferedInputStream origin = new BufferedInputStream(new FileInputStream(currentFile),
BUFFER);
ZipEntry entry = new ZipEntry(rootRelativeName);
this.out.putNextEntry(entry);
int count;
while ((count = origin.read(this.data, 0, BUFFER)) != -1) {
this.out.write(this.data, 0, count);
}
origin.close();
return true;
} else if (currentFile.isDirectory()) {
File[] fileList = currentFile.listFiles();
for (int i = 0; i < fileList.length; i++) {
if (!addFile(rootRelativeName + "/" + fileList[i].getName())) {
return false;
}
}
return true;
}
} catch (Exception e) {
log.error(e.toString());
return false;
}
return false;
}
}