package com.intuit.tank.storage; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.IOUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; /** * FileStorage that writes to the file system. * * @author denisa * */ public class FileSystemFileStorage implements FileStorage, Serializable { private static final long serialVersionUID = 1L; private static final Logger LOG = LogManager.getLogger(FileSystemFileStorage.class); private String basePath; private boolean compress = true; /** * @param basePath */ public FileSystemFileStorage(String basePath, boolean compress) { super(); this.basePath = FilenameUtils.normalizeNoEndSeparator(basePath); this.compress = compress; File dir = new File(basePath); if (!dir.exists()) { LOG.info("Creating storage dir " + dir.getAbsolutePath()); } } @Override public void storeFileData(FileData fileData, InputStream in) { File f = new File(FilenameUtils.normalize(basePath + "/" + fileData.getPath() + "/" + fileData.getFileName())); if (!f.getParentFile().exists()) { f.getParentFile().mkdirs(); } OutputStream out = null; try { out = new FileOutputStream(f); if (compress) { out = new GZIPOutputStream(out); } IOUtils.copy(in, out); } catch (Exception e) { LOG.error("Error storing file: " + e, e); throw new RuntimeException(e); } finally { IOUtils.closeQuietly(out); } } @Override public InputStream readFileData(FileData fileData) { File f = new File(FilenameUtils.normalize(basePath + "/" + fileData.getPath() + "/" + fileData.getFileName())); InputStream ret = null; try { ret = new FileInputStream(f); if (compress) { ret = new GZIPInputStream(ret); } } catch (Exception e) { LOG.error("Error storing file: " + e, e); throw new RuntimeException(e); } return ret; } @Override public boolean exists(FileData fileData) { File f = new File(FilenameUtils.normalize(basePath + "/" + fileData.getPath() + "/" + fileData.getFileName())); return f.exists(); } @Override public List<FileData> listFileData(String path) { List<FileData> ret = new ArrayList<FileData>(); File dir = new File(FilenameUtils.normalize(basePath + "/" + path)); for (File f : dir.listFiles()) { if (f.isFile()) { ret.add(new FileData(path, f.getName())); } } return ret; } @Override public boolean delete(FileData fileData) { File f = new File(FilenameUtils.normalize(basePath + "/" + fileData.getPath() + "/" + fileData.getFileName())); return f.delete(); } }