package net.pms.configuration;
import com.sun.jna.Platform;
import java.io.File;
import java.io.IOException;
import net.pms.util.FilePermissions;
import net.pms.util.FileUtil;
import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 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 = "UMS";
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 null or empty if specified");
}
File folderFile = new File(userSpecifiedFolder);
folderFile.setReadable(true, false);
folderFile.setWritable(true, false);
FileUtils.forceMkdir(folderFile);
assertFolderIsValid(folderFile);
return folderFile;
}
private static File getSystemTempFolder() throws IOException {
File tmp = new File(System.getProperty("java.io.tmpdir"));
File myTMP;
if (Platform.isWindows()) {
myTMP = new File(tmp, DEFAULT_TEMP_FOLDER_NAME);
} else {
myTMP = new File(tmp, DEFAULT_TEMP_FOLDER_NAME + "-" + System.getProperty("user.name"));
}
myTMP.setReadable(true, false);
myTMP.setWritable(true, false);
FileUtils.forceMkdir(myTMP);
assertFolderIsValid(myTMP);
return myTMP;
}
private static void assertFolderIsValid(File folder) throws IOException {
FilePermissions permission = FileUtil.getFilePermissions(folder);
if (!permission.isFolder()) {
throw new IOException("Temporary folder isn't a folder: " + folder.getAbsolutePath());
}
if (!permission.isBrowsable()) {
throw new IOException("Temporary folder isn't browsable: " + folder.getAbsolutePath());
}
if (!permission.isWritable()) {
throw new IOException("Temporary folder isn't writable: " + folder.getAbsolutePath());
}
}
}