package net.pms.configuration; import net.pms.util.FileUtil; import org.apache.commons.io.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.io.IOException; /** * Handles finding a temporary directory. * * @author Tim Cox (mail@tcox.org) */ class TempFolder { private static final Logger logger = LoggerFactory.getLogger(TempFolder.class); private static final String DEFAULT_TEMP_FOLDER_NAME = "ps3mediaserver"; private final String userSpecifiedFolder; private File tempFolder; /** * userSpecifiedFolder may be null */ public TempFolder(String userSpecifiedFolder) { this.userSpecifiedFolder = userSpecifiedFolder; } public synchronized File getTempFolder() throws IOException { if (tempFolder == null) { tempFolder = getTempFolder(userSpecifiedFolder); } return tempFolder; } private File getTempFolder(String userSpecifiedFolder) throws IOException { if (userSpecifiedFolder == null) { return getSystemTempFolder(); } try { return getUserSpecifiedTempFolder(userSpecifiedFolder); } catch (IOException e) { logger.error("Problem with user specified temp directory - using system", e); return getSystemTempFolder(); } } private File getUserSpecifiedTempFolder(String userSpecifiedFolder) throws IOException { if (userSpecifiedFolder != null && userSpecifiedFolder.length() == 0) { throw new IOException("Temporary directory path must not be empty if specified"); } File folderFile = new File(userSpecifiedFolder); FileUtils.forceMkdir(folderFile); assertFolderIsValid(folderFile); return folderFile; } private static File getSystemTempFolder() throws IOException { File tmp = new File(System.getProperty("java.io.tmpdir")); File myTMP = new File(tmp, DEFAULT_TEMP_FOLDER_NAME); FileUtils.forceMkdir(myTMP); assertFolderIsValid(myTMP); return myTMP; } private static void assertFolderIsValid(File folder) throws IOException { if (!folder.isDirectory()) { throw new IOException("Temp directory must be a directory: " + folder); } if (!FileUtil.isDirectoryWritable(folder)) { throw new IOException("Temp directory is not writable: " + folder); } } }