package com.constellio.data.io.services.facades; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.Collection; import java.util.List; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.io.filefilter.IOFileFilter; import com.constellio.data.dao.services.idGenerator.UUIDV1Generator; import com.constellio.data.io.services.facades.FileServiceRuntimeException.CannotCreateTemporaryFolder; import com.constellio.data.io.services.facades.FileServiceRuntimeException.FileServiceRuntimeException_CannotReadFile; public class FileService { private static String REPLACE_FILE_CONTENT_TEMP_FILE = "replaceFileContentTempFile"; private File tempFolder; public FileService(File tempFolder) { this.tempFolder = tempFolder; } public void copyDirectory(File srcDir, File destDir) throws IOException { FileUtils.copyDirectory(srcDir, destDir); } public void copyDirectoryWithoutExpectableIOException(File srcDir, File destDir) { try { FileUtils.copyDirectory(srcDir, destDir); } catch (IOException e) { throw new FileServiceRuntimeException.CannotCopyFile(srcDir.getPath(), destDir.getPath(), e); } } public void copyFile(File srcFile, File destFile) throws IOException { FileUtils.copyFile(srcFile, destFile); } public void copyFileWithoutExpectableIOException(File srcFile, File destFile) { try { FileUtils.copyFile(srcFile, destFile); } catch (IOException e) { throw new FileServiceRuntimeException.CannotCopyFile(srcFile.getPath(), destFile.getPath(), e); } } public String readFileToString(File file) throws IOException { return FileUtils.readFileToString(file); } public String readFileToStringWithoutExpectableIOException(File file) { try { return FileUtils.readFileToString(file); } catch (IOException e) { throw new FileServiceRuntimeException_CannotReadFile(file.getPath(), e); } } public List<String> readFileToLinesWithoutExpectableIOException(File file) { try { return FileUtils.readLines(file); } catch (IOException e) { throw new FileServiceRuntimeException_CannotReadFile(file.getPath(), e); } } public void replaceFileContent(File file, String data) throws IOException { File tempFile = getAtomicWriteTempFileFor(file); FileUtils.writeStringToFile(tempFile, data, false); moveFile(tempFile, file); } public synchronized void appendFileContent(File file, String data) throws IOException { FileUtils.writeStringToFile(file, data, true); } public synchronized void appendFileContent(File file, String data, String encoding) throws IOException { FileUtils.writeStringToFile(file, data, encoding, true); } public void ensureWritePermissions(File file) throws IOException { if (!(file.canRead() && file.canWrite())) { throw new IOException(); } } public Collection<File> listFiles(File directory, IOFileFilter fileFilter, IOFileFilter dirFilter) { return FileUtils.listFiles(directory, fileFilter, dirFilter); } public Collection<File> listRecursiveFiles(File directory) { return FileUtils.listFiles(directory, newAcceptAllFileFilter(), newAcceptAllFileFilter()); } public Collection<File> listRecursiveFiles(File directory, IOFileFilter fileFilter) { return FileUtils.listFiles(directory, fileFilter, newAcceptAllFileFilter()); } public Collection<File> listRecursiveFilesWithName(File directory, final String name) { return FileUtils.listFiles(directory, new IOFileFilter() { @Override public boolean accept(File dir, String fileName) { return fileName.equals(name); } @Override public boolean accept(File file) { return file.getName().equals(name); } }, newAcceptAllFileFilter()); } private IOFileFilter newAcceptAllFileFilter() { return new IOFileFilter() { @Override public boolean accept(File dir, String name) { return true; } @Override public boolean accept(File file) { return true; } }; } public void deleteDirectory(File directory) throws IOException { FileUtils.deleteDirectory(directory); } public void deleteDirectoryWithoutExpectableIOException(File directory) { try { FileUtils.deleteDirectory(directory); } catch (IOException e) { throw new FileServiceRuntimeException.CannotDeleteFile(directory.getPath(), e); } } public File newTemporaryFolder(String resourceName) { File temporaryFolder = new File(tempFolder, "tmp" + System.nanoTime()); temporaryFolder.mkdirs(); if (!temporaryFolder.exists()) { throw new CannotCreateTemporaryFolder(); } return temporaryFolder; } public String readStreamToStringWithoutExpectableIOException(InputStream inputStream) { try { return readStreamToString(inputStream); } catch (IOException e) { throw new FileServiceRuntimeException.CannotReadStreamToString(e); } } public String readStreamToString(InputStream inputStream) throws IOException { StringBuilder content = new StringBuilder(); boolean first = true; for (String line : IOUtils.readLines(inputStream)) { if (!first) { content.append("\n"); } first = false; content.append(line); } return content.toString(); } public List<String> readStreamToLines(InputStream inputStream) throws IOException { return IOUtils.readLines(inputStream); } public void deleteQuietly(File file) { if (file != null) { OpenedResourcesWatcher.onClose(file); } FileUtils.deleteQuietly(file); } public File newTemporaryFile(String resourceName, String extension) { final String name = resourceName + "_" + UUIDV1Generator.newRandomId() + "." + extension; File file = new File(tempFolder, name) { @Override public String toString() { return name + "[" + getPath() + "]"; } }; OpenedResourcesWatcher.onOpen(file); return file; } public File newTemporaryFile(String resourceName) { final String name = resourceName + "_" + UUIDV1Generator.newRandomId(); File file = new File(tempFolder, name) { @Override public String toString() { return name + "[" + getPath() + "]"; } }; OpenedResourcesWatcher.onOpen(file); return file; } public void writeLinesToFile(File file, List<String> lines) { try { FileUtils.writeLines(file, lines); } catch (IOException e) { throw new RuntimeException(e); } } public File getAtomicWriteTempFileFor(File file) { String filePath = file.getAbsoluteFile().getPath(); int indexOfLastSlash = filePath.lastIndexOf(File.separator); String tempFilePath; if (indexOfLastSlash == -1) { tempFilePath = "." + filePath; } else { tempFilePath = filePath.substring(0, indexOfLastSlash) + File.separator + "." + filePath.substring(indexOfLastSlash + 1); } return new File(tempFilePath); } public void moveFolder(File src, File dest) { src.renameTo(dest); } public void moveFile(File src, File dest) { if (dest.exists() && !dest.delete()) { throw new FileServiceRuntimeException.CannotMoveFile(src.getAbsolutePath(), dest.getAbsolutePath(), null); } try { FileUtils.moveFile(src, dest); } catch (IOException e) { try { Thread.sleep(100); } catch (InterruptedException e1) { e1.printStackTrace(); } try { FileUtils.moveFile(src, dest); } catch (IOException e2) { throw new FileServiceRuntimeException.CannotMoveFile(src.getAbsolutePath(), dest.getAbsolutePath(), e2); } } } }