package net.thucydides.core.util; import org.junit.Rule; import org.junit.rules.ExternalResource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.io.IOException; public class ExtendedTemporaryFolder extends ExternalResource { private static final Logger logger = LoggerFactory.getLogger(ExtendedTemporaryFolder.class); private final File parentFolder; private File folder; public ExtendedTemporaryFolder() { this(null); } public ExtendedTemporaryFolder(File parentFolder) { this.parentFolder = parentFolder; } @Override protected void before() throws Throwable { create(); } @Override protected void after() { delete(); } // testing purposes only /** * for testing purposes only. Do not use. */ public void create() throws IOException { folder = createTemporaryFolderIn(parentFolder); } /** * @return a new fresh file with a random name under the temporary folder. */ public File newFile() throws IOException { return File.createTempFile("junit", null, getRoot()); } /** * @param folder name of the new temporary directory * @return a new fresh folder with the given name under the temporary folder. */ public File newFolder(String folder) throws IOException { return newFolder(new String[]{folder}); } /** * @param folderNames a sequence of folder names used to create a temporary directory * @return a new fresh folder with the given name(s) under the temporary folder. */ public File newFolder(String... folderNames) throws IOException { File file = getRoot(); for (int i = 0; i < folderNames.length; i++) { String folderName = folderNames[i]; file = new File(file, folderName); if (!file.mkdir() && isLastElementInArray(i, folderNames)) { throw new IOException( "a folder with the name \'" + folderName + "\' already exists"); } } return file; } private boolean isLastElementInArray(int index, String[] array) { return index == array.length - 1; } private File createTemporaryFolderIn(File parentFolder) throws IOException { File createdFolder = File.createTempFile("junit", "", parentFolder); createdFolder.delete(); createdFolder.mkdir(); return createdFolder; } /** * @return the location of this temporary folder. */ public File getRoot() { if (folder == null) { throw new IllegalStateException( "the temporary folder has not yet been created"); } return folder; } /** * Delete all files and folders under the temporary folder. Usually not * called directly, since it is automatically applied by the {@link Rule} */ public void delete() { if (folder != null) { recursiveDelete(folder); } } private void recursiveDelete(File file) { File[] files = file.listFiles(); if (files != null) { for (File each : files) { recursiveDelete(each); } } file.delete(); } protected static synchronized boolean isWindows() { return System.getProperty("os.name").startsWith("Windows"); } public File newFolder() throws IOException { if (isWindows()) { synchronized (this) { try { return createTemporaryFolderIn(getRoot()); } catch (IOException e) { logger.debug("Error when invoke newFolder(): {}", e); throw e; } } } else { return createTemporaryFolderIn(getRoot()); } } public File newFile(String fileName) throws IOException { if (isWindows()) { synchronized (this) { File file= new File(getRoot(), fileName); file.setWritable(true); file.setReadable(true); file.createNewFile(); return file; } } else { File file = new File(getRoot(), fileName); file.createNewFile(); return file; } } }