package org.torrent.basnark.storage; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.log4j.PropertyConfigurator; import org.torrent.basnark.storage.domain.FileInfo; import java.io.File; import java.io.FileInputStream; import java.util.*; /** * Date: 26.09.2009 * Time: 21:01:48 (Moscow Standard Time) * * @author Vlad Vinichenko (akerigan@gmail.com) */ public class FileReader { private static Log log = LogFactory.getLog(FileReader.class); public static void main(String[] args) { PropertyConfigurator.configure("./app/conf/log4j.properties"); try { Properties properties = new Properties(); properties.load(new FileInputStream("app/conf/born-again-snark.properties")); String contentDirs = properties.getProperty("storage.content.dirs"); if (contentDirs == null) { throw new IllegalStateException("'storage.content.dirs' not set"); } StorageDao storageDao = new StorageDao(); Map<String, FileInfo> storedFiles = new HashMap<String, FileInfo>(); for (FileInfo fileInfo : storageDao.findAllFiles()) { storedFiles.put(fileInfo.getPath(), fileInfo); } Map<String, FileInfo> scannedFiles = new HashMap<String, FileInfo>(); for (String baseDirectory : contentDirs.trim().split("\\s*:\\s*")) { List<File> files = new ArrayList<File>(); walkDir(new File(baseDirectory), files); for (File file : files) { FileInfo fileInfo = new FileInfo(); fileInfo.setBaseDirectory(baseDirectory); String directory = file.getParentFile().getCanonicalPath(); if (!baseDirectory.equals(directory)) { fileInfo.setDirectory(directory.substring(baseDirectory.length() + 1, directory.length())); } fileInfo.setFileName(file.getName()); fileInfo.setSize(file.length()); // fileInfo.setMd5Hash(hexencode(DigestUtils.md5(new FileInputStream(file)))); scannedFiles.put(fileInfo.getPath(), fileInfo); } } Set<String> keys = new HashSet<String>(storedFiles.keySet()); keys.removeAll(scannedFiles.keySet()); for (String key : keys) { FileInfo fileInfo = storedFiles.get(key); log.info("remove entry for: " + key); storageDao.deleteFile(fileInfo); } keys.clear(); keys.addAll(scannedFiles.keySet()); keys.removeAll(storedFiles.keySet()); for (String key : keys) { FileInfo fileInfo = scannedFiles.get(key); log.info("create entry for: " + fileInfo); storageDao.createFile(fileInfo); } keys.clear(); keys.addAll(scannedFiles.keySet()); keys.retainAll(storedFiles.keySet()); for (String key : keys) { FileInfo fileInfoOld = storedFiles.get(key); FileInfo fileInfoNew = scannedFiles.get(key); if (!fileInfoNew.equals(fileInfoOld)) { log.info("update entry for: " + key); fileInfoNew.setId(fileInfoOld.getId()); storageDao.updateFile(fileInfoNew); } } } catch (Exception e) { log.error("", e); } } private static void walkDir(File dir, List<File> result) { if (dir.exists() && dir.isDirectory()) { File[] files = dir.listFiles(); for (File file : files) { if (file.isDirectory()) { walkDir(file, result); } else { result.add(file); } } } } }