package com.niklim.clicktrace.service; import java.io.File; import java.io.FilenameFilter; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.inject.Inject; import com.google.inject.Singleton; import com.niklim.clicktrace.ErrorNotifier; import com.niklim.clicktrace.Files; import com.niklim.clicktrace.msg.ErrorMsgs; import com.niklim.clicktrace.props.UserProperties; /** * Manages file paths creating folders, properties files. */ @Singleton public class FileManager { private static final Logger log = LoggerFactory.getLogger(FileManager.class); @Inject private UserProperties props; public static final String DEFAULT_DIR = "sessions/default/"; public static final String SESSION_PROPS_FILENAME = "session.properties"; public static class NoTrashFilter implements FilenameFilter { @Override public boolean accept(File file, String name) { return !".".equals(name) && !"..".equals(name) && !".DS_Store".equals(name) && !name.endsWith("~"); } } public static class ImageFilter extends NoTrashFilter { @Override public boolean accept(File file, String name) { return super.accept(file, name) && !SESSION_PROPS_FILENAME.equals(name); } } public void init() { createIfDirNotExists(props.getSessionsDirPath()); } public String createFilePath(String sessionName, String filename) { if (sessionName == null || sessionName.trim().equals("")) { createIfDirNotExists(DEFAULT_DIR); return DEFAULT_DIR + filename; } else { createIfDirNotExists(props.getSessionsDirPath() + sessionName); return props.getSessionsDirPath() + sessionName + "/" + filename; } } private boolean createIfDirNotExists(String dirName) { File dir = new File(dirName); if (!dir.exists()) { dir.mkdir(); return true; } else { return false; } } public void deleteImage(String sessionName, String imageName) { String filePath = createFilePath(sessionName, imageName); File file = new File(filePath); file.delete(); } public List<String> loadFileNames(String dirName, FilenameFilter filter) { List<String> fileNames = new ArrayList<String>(); File[] files = new File(dirName).listFiles(filter); if (files != null) { for (File sessionDir : files) { fileNames.add(sessionDir.getName()); } } Collections.sort(fileNames); return fileNames; } public boolean createSessionDir(String sessionName) { return createIfDirNotExists(props.getSessionsDirPath() + sessionName); } public void createSessionPropsFile(String sessionName) { File f = new File(props.getSessionsDirPath() + sessionName + File.separator + SESSION_PROPS_FILENAME); try { f.createNewFile(); } catch (IOException e) { log.error("Unable to create session properties file", e); ErrorNotifier.notify(ErrorMsgs.SESSION_SAVE_PROPS_ERROR); } } public boolean sessionExists(String sessionName) { return Files.exists(props.getSessionsDirPath() + sessionName); } public void renameSession(String oldName, String newName) throws IOException { Files.move(props.getSessionsDirPath() + oldName, props.getSessionsDirPath() + newName); } public void createSessionFolder(String sessionName) throws IOException { File newDir = new File(props.getSessionsDirPath() + sessionName); if (!newDir.mkdir()) { throw new IOException(props.getSessionsDirPath() + sessionName); } } public boolean canCreateSession(String sessionName) { File newDir = new File(props.getSessionsDirPath() + sessionName); boolean canCreate = newDir.mkdir(); if (canCreate) { newDir.delete(); } return canCreate; } }