1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * you may not use this file except in compliance with the License. 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * You may obtain a copy of the License at 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage dalvik.system; 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.File; 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Utility class to handle the setup of the core library's concept of 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * what the "default temporary directory" is. Application code may 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * call into this class with an appropriate base directory during its 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * startup, as a reasonably easy way to get the standard property 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <code>java.io.tmpdir</code> to point at something useful. 2704aaaf18dac85eee31b3451226daf586a455feb7Jesse Wilson * 288f273343b7758c09822c74b4f8a0dcf7df3a78b5Jesse Wilson * @hide 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class TemporaryDirectory { 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** system property name for the temporary directory */ 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final String PROPERTY = "java.io.tmpdir"; 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** final path component name for the temporary directory */ 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final String PATH_NAME = "tmp"; 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** whether a temporary directory has been configured yet */ 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static boolean configured = false; 39f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Convenience method which is equivalent to 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <code>setupDirectory(new File(baseDir))</code>. 43f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param baseDir the base directory of the temporary directory 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static void setUpDirectory(String baseDir) { 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project setUpDirectory(new File(baseDir)); 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 49f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets up the temporary directory, but only if one isn't already 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * defined for this process, and only if it is possible (e.g., the 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * directory already exists and is read-write, or the directory 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * can be created). This call will do one of three things: 55f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul> 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>return without error and without doing anything, if a 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * previous call to this method succeeded</li> 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>return without error, having either created a temporary 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * directory under the given base or verified that such a directory 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * already exists</li> 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>throw <code>UnsupportedOperationException</code> if the 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * directory could not be created or accessed</li> 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul> 65f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param baseDir the base directory of the temporary directory 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static synchronized void setUpDirectory(File baseDir) { 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (configured) { 70a7ef55258ac71153487357b861c7639d627df82fElliott Hughes System.logE("Already set to: " + System.getProperty(PROPERTY)); 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return; 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project File dir = new File(baseDir, PATH_NAME); 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String absolute = dir.getAbsolutePath(); 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (dir.exists()) { 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!dir.isDirectory()) { 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new UnsupportedOperationException( 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project "Name is used by a non-directory file: " + 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project absolute); 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else if (!(dir.canRead() && dir.canWrite())) { 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new UnsupportedOperationException( 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project "Existing directory is not readable and writable: " + 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project absolute); 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!dir.mkdirs()) { 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new UnsupportedOperationException( 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project "Failed to create directory: " + absolute); 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 93f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project System.setProperty(PROPERTY, absolute); 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project configured = true; 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 98