001: /**
002: * Licensed to the Apache Software Foundation (ASF) under one
003: * or more contributor license agreements. See the NOTICE file
004: * distributed with this work for additional information
005: * regarding copyright ownership. The ASF licenses this file
006: * to you under the Apache License, Version 2.0 (the
007: * "License"); you may not use this file except in compliance
008: * with the License. You may obtain a copy of the License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing,
013: * software distributed under the License is distributed on an
014: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015: * KIND, either express or implied. See the License for the
016: * specific language governing permissions and limitations
017: * under the License.
018: */package org.apache.cxf.helpers;
019:
020: import java.io.File;
021: import java.text.DecimalFormat;
022: import java.util.Locale;
023: import java.util.Random;
024:
025: public final class FileUtils {
026: private static final int RETRY_SLEEP_MILLIS = 10;
027: private static Random rand = new Random(System.currentTimeMillis()
028: + Runtime.getRuntime().freeMemory());
029:
030: private FileUtils() {
031:
032: }
033:
034: public static void mkDir(File dir) {
035: if (dir == null) {
036: throw new RuntimeException("dir attribute is required");
037: }
038:
039: if (dir.isFile()) {
040: throw new RuntimeException(
041: "Unable to create directory as a file "
042: + "already exists with that name: "
043: + dir.getAbsolutePath());
044: }
045:
046: if (!dir.exists()) {
047: boolean result = doMkDirs(dir);
048: if (!result) {
049: String msg = "Directory "
050: + dir.getAbsolutePath()
051: + " creation was not successful for an unknown reason";
052: throw new RuntimeException(msg);
053: }
054: }
055: }
056:
057: /**
058: * Attempt to fix possible race condition when creating directories on
059: * WinXP, also Windows2000. If the mkdirs does not work, wait a little and
060: * try again.
061: */
062: private static boolean doMkDirs(File f) {
063: if (!f.mkdirs()) {
064: try {
065: Thread.sleep(RETRY_SLEEP_MILLIS);
066: return f.mkdirs();
067: } catch (InterruptedException ex) {
068: return f.mkdirs();
069: }
070: }
071: return true;
072: }
073:
074: public static void removeDir(File d) {
075: String[] list = d.list();
076: if (list == null) {
077: list = new String[0];
078: }
079: for (int i = 0; i < list.length; i++) {
080: String s = list[i];
081: File f = new File(d, s);
082: if (f.isDirectory()) {
083: removeDir(f);
084: } else {
085: delete(f);
086: }
087: }
088: delete(d);
089: }
090:
091: public static void delete(File f) {
092: if (!f.delete()) {
093: if (isWindows()) {
094: System.gc();
095: }
096: try {
097: Thread.sleep(RETRY_SLEEP_MILLIS);
098: } catch (InterruptedException ex) {
099: // Ignore Exception
100: }
101: if (!f.delete()) {
102: f.deleteOnExit();
103: }
104: }
105: }
106:
107: private static boolean isWindows() {
108: String osName = System.getProperty("os.name").toLowerCase(
109: Locale.US);
110: return osName.indexOf("windows") > -1;
111: }
112:
113: public static File createTempFile(String prefix, String suffix) {
114: return createTempFile(prefix, suffix, null, true);
115: }
116:
117: public static File createTempFile(String prefix, String suffix,
118: File parentDir, boolean deleteOnExit) {
119: File result = null;
120: String parent = (parentDir == null) ? System
121: .getProperty("java.io.tmpdir") : parentDir.getPath();
122:
123: DecimalFormat fmt = new DecimalFormat("#####");
124: synchronized (rand) {
125: do {
126: result = new File(parent, prefix
127: + fmt.format(Math.abs(rand.nextInt())) + suffix);
128: } while (result.exists());
129: }
130: if (deleteOnExit) {
131: result.deleteOnExit();
132: }
133: return result;
134: }
135: }
|