package com.niklim.clicktrace.service;
import java.io.File;
import java.io.FileInputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import org.apache.commons.io.output.ByteArrayOutputStream;
import org.apache.xml.security.utils.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.inject.Inject;
import com.niklim.clicktrace.model.Session;
import com.niklim.clicktrace.props.UserProperties;
/**
* Compresses Clicktrace session folder using zip.
*/
public class SessionCompressor {
private static final Logger log = LoggerFactory.getLogger(SessionCompressor.class);
@Inject
private FileManager fileManager;
@Inject
private UserProperties props;
/**
* Compresses given Clicktrace session and encodes it as String.
*
* @param session
* @return encoded and compressed Clicktrace session
* @throws IOException
*/
public String compress(Session session) throws IOException {
String sessionName = session.getName();
byte[] zipBytes = zip(sessionName);
log.debug("Zipped size={}", zipBytes.length);
String content = Base64.encode(zipBytes);
return content;
}
private byte[] zip(String sessionName) throws IOException {
log.debug("Zip compression started");
byte[] buffer = new byte[1024];
String source = props.getSessionsDirPath() + sessionName;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ZipOutputStream zos = new ZipOutputStream(bos);
List<String> filenames = fileManager.loadFileNames(source, new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return !".DS_Store".equals(name) && !name.endsWith("~");
}
});
for (String file : filenames) {
log.debug("File Added : " + file);
ZipEntry ze = new ZipEntry(sessionName + File.separator + file);
zos.putNextEntry(ze);
FileInputStream in = new FileInputStream(source + File.separator + file);
int len;
while ((len = in.read(buffer)) > 0) {
zos.write(buffer, 0, len);
}
in.close();
}
zos.closeEntry();
zos.close();
log.debug("Zip compression finished");
return bos.toByteArray();
}
}