diff --git a/src/main/org/apache/tools/ant/taskdefs/FixCRLF.java b/src/main/org/apache/tools/ant/taskdefs/FixCRLF.java
index 63c68e12f..53522c5ef 100644
--- a/src/main/org/apache/tools/ant/taskdefs/FixCRLF.java
+++ b/src/main/org/apache/tools/ant/taskdefs/FixCRLF.java
@@ -58,6 +58,7 @@ import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.DirectoryScanner;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.types.EnumeratedAttribute;
+import org.apache.tools.ant.util.FileUtils;
import java.io.File;
import java.io.BufferedReader;
@@ -65,7 +66,6 @@ import java.io.FileReader;
import java.io.IOException;
import java.io.BufferedWriter;
import java.io.FileWriter;
-import java.util.Random;
import java.util.Enumeration;
import java.util.NoSuchElementException;
@@ -148,6 +148,8 @@ public class FixCRLF extends MatchingTask {
private File srcDir;
private File destDir = null;
+ private FileUtils fileUtils = FileUtils.newFileUtils();
+
/**
* Defaults the properties based on the system type.
*
- Unix: eol="LF" tab="asis" eof="remove"
@@ -355,19 +357,6 @@ public class FixCRLF extends MatchingTask {
}
}
- /**
- * Creates a temporary file.
- */
- private File createTempFile() {
- String name = "fixcrlf"
- + (new Random(System.currentTimeMillis())).nextLong();
- if (destDir == null) {
- return new File(srcDir, name);
- } else {
- return new File(destDir, name);
- }
- }
-
/**
* Checks for the inequality of two files
*/
@@ -413,6 +402,7 @@ public class FixCRLF extends MatchingTask {
private void processFile(String file) throws BuildException {
File srcFile = new File(srcDir, file);
+ File destD = destDir == null ? srcDir : destDir;
File tmpFile = null;
BufferedWriter outWriter;
OneLiner.BufferLine line;
@@ -423,7 +413,7 @@ public class FixCRLF extends MatchingTask {
try {
// Set up the output Writer
try {
- tmpFile = createTempFile();
+ tmpFile = fileUtils.createTempFile("fixcrlf", "", destD);
FileWriter writer = new FileWriter(tmpFile);
outWriter = new BufferedWriter(writer);
} catch (IOException e) {
@@ -554,8 +544,7 @@ public class FixCRLF extends MatchingTask {
throw new BuildException(e);
} // end of try-catch
- File destFile = new File(destDir == null ? srcDir : destDir,
- file);
+ File destFile = new File(destD, file);
try {
lines.close();
diff --git a/src/main/org/apache/tools/ant/taskdefs/Javadoc.java b/src/main/org/apache/tools/ant/taskdefs/Javadoc.java
index 9e6f00979..5d588d661 100644
--- a/src/main/org/apache/tools/ant/taskdefs/Javadoc.java
+++ b/src/main/org/apache/tools/ant/taskdefs/Javadoc.java
@@ -61,7 +61,6 @@ import java.io.FilenameFilter;
import java.util.Vector;
import java.util.Enumeration;
import java.util.StringTokenizer;
-import java.util.Random;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.DirectoryScanner;
import org.apache.tools.ant.Project;
@@ -73,6 +72,7 @@ import org.apache.tools.ant.types.Reference;
import org.apache.tools.ant.types.EnumeratedAttribute;
import org.apache.tools.ant.types.Commandline;
import org.apache.tools.ant.types.FileSet;
+import org.apache.tools.ant.util.FileUtils;
/**
* This task makes it easy to generate Javadoc documentation for a collection
@@ -279,6 +279,8 @@ public class Javadoc extends Task {
private boolean useExternalFile = false;
private File tmpList = null;
+ private FileUtils fileUtils = FileUtils.newFileUtils();
+
/**
* Work around command line length limit by using an external file
* for the sourcefiles.
@@ -924,7 +926,7 @@ public class Javadoc extends Task {
*/
if (useExternalFile) {
if (tmpList == null) {
- tmpList = createTempFile();
+ tmpList = fileUtils.createTempFile("javadoc", "", null);
toExecute.createArgument().setValue("@" + tmpList.getAbsolutePath());
}
srcListWriter = new PrintWriter(new FileWriter(tmpList.getAbsolutePath(),
@@ -1055,7 +1057,7 @@ public class Javadoc extends Task {
PrintWriter packageListWriter = null;
try {
if (useExternalFile) {
- tmpList = createTempFile();
+ tmpList = fileUtils.createTempFile("javadoc", "", null);
toExecute.createArgument().setValue("@" + tmpList.getAbsolutePath());
packageListWriter = new PrintWriter(new FileWriter(tmpList));
}
@@ -1148,13 +1150,6 @@ public class Javadoc extends Task {
project.getProperties());
}
- /**
- * Creates a temporary file.
- */
- private File createTempFile() {
- return new File("javadoc" + (new Random(System.currentTimeMillis())).nextLong());
- }
-
private String getJavadocExecutableName()
{
// This is the most common extension case - exe for windows and OS/2,
diff --git a/src/main/org/apache/tools/ant/taskdefs/compilers/DefaultCompilerAdapter.java b/src/main/org/apache/tools/ant/taskdefs/compilers/DefaultCompilerAdapter.java
index 61f733be1..63759ea8c 100644
--- a/src/main/org/apache/tools/ant/taskdefs/compilers/DefaultCompilerAdapter.java
+++ b/src/main/org/apache/tools/ant/taskdefs/compilers/DefaultCompilerAdapter.java
@@ -63,12 +63,12 @@ import org.apache.tools.ant.taskdefs.LogStreamHandler;
import org.apache.tools.ant.types.Path;
import org.apache.tools.ant.types.Commandline;
import org.apache.tools.ant.types.FileSet;
+import org.apache.tools.ant.util.FileUtils;
import java.io.File;
import java.io.PrintWriter;
import java.io.FileWriter;
import java.io.IOException;
-import java.util.Random;
/**
* This is the default implementation for the CompilerAdapter interface.
@@ -108,6 +108,8 @@ public abstract class DefaultCompilerAdapter implements CompilerAdapter {
protected static String lSep = System.getProperty("line.separator");
protected Javac attributes;
+ private FileUtils fileUtils = FileUtils.newFileUtils();
+
public void setJavac( Javac attributes ) {
this.attributes = attributes;
src = attributes.getSrcdir();
@@ -362,7 +364,7 @@ public abstract class DefaultCompilerAdapter implements CompilerAdapter {
if (Commandline.toString(args).length() > 4096) {
PrintWriter out = null;
try {
- tmpFile = new File("jikes"+(new Random(System.currentTimeMillis())).nextLong());
+ tmpFile = fileUtils.createTempFile("jikes", "", null);
out = new PrintWriter(new FileWriter(tmpFile));
for (int i = firstFileName; i < args.length; i++) {
out.println(args[i]);
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/Cab.java b/src/main/org/apache/tools/ant/taskdefs/optional/Cab.java
index 127d4c5ab..02ae4312a 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/Cab.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/Cab.java
@@ -62,6 +62,7 @@ import org.apache.tools.ant.taskdefs.ExecTask;
import org.apache.tools.ant.taskdefs.condition.Os;
import org.apache.tools.ant.types.FileSet;
import org.apache.tools.ant.types.Commandline;
+import org.apache.tools.ant.util.FileUtils;
import java.io.File;
import java.io.IOException;
@@ -71,7 +72,6 @@ import java.io.OutputStream;
import java.util.Enumeration;
import java.util.Vector;
-import java.util.Random;
import java.text.DecimalFormat;
/**
@@ -93,6 +93,8 @@ public class Cab extends MatchingTask {
private static String myos;
+ private FileUtils fileUtils = FileUtils.newFileUtils();
+
/**
* This is the name/location of where to
* create the .cab file.
@@ -213,27 +215,6 @@ public class Cab extends MatchingTask {
return command;
}
- private static int counter = new Random().nextInt() % 100000;
- protected File createTempFile(String prefix, String suffix)
- {
- if (suffix == null)
- {
- suffix = ".tmp";
- }
-
- String name = prefix +
- new DecimalFormat("#####").format(new Integer(counter++)) +
- suffix;
-
- String tmpdir = System.getProperty("java.io.tmpdir");
-
- // java.io.tmpdir is not present in 1.1
- if (tmpdir == null)
- return new File(name);
- else
- return new File(tmpdir, name);
- }
-
/**
* Creates a list file. This temporary file contains a list of all files
* to be included in the cab, one file per line.
@@ -241,7 +222,7 @@ public class Cab extends MatchingTask {
protected File createListFile(Vector files)
throws IOException
{
- File listFile = createTempFile("ant", null);
+ File listFile = fileUtils.createTempFile("ant", "", null);
PrintWriter writer = new PrintWriter(new FileOutputStream(listFile));
@@ -342,7 +323,7 @@ public class Cab extends MatchingTask {
exec.setDir(baseDir);
if (!doVerbose) {
- outFile = createTempFile("ant", null);
+ outFile = fileUtils.createTempFile("ant", "", null);
exec.setOutput(outFile);
}
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/ReplaceRegExp.java b/src/main/org/apache/tools/ant/taskdefs/optional/ReplaceRegExp.java
index 14ae31ff4..bcdfb6c3a 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/ReplaceRegExp.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/ReplaceRegExp.java
@@ -61,6 +61,7 @@ import org.apache.tools.ant.util.regexp.Regexp;
import org.apache.tools.ant.types.RegularExpression;
import org.apache.tools.ant.types.Substitution;
import org.apache.tools.ant.types.FileSet;
+import org.apache.tools.ant.util.FileUtils;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
@@ -162,6 +163,8 @@ public class ReplaceRegExp extends Task
private RegularExpression regex;
private Substitution subs;
+ private FileUtils fileUtils = FileUtils.newFileUtils();
+
/***
* Default Constructor
*/
@@ -260,7 +263,7 @@ public class ReplaceRegExp extends Task
throws IOException
{
File parentDir = new File(new File(f.getAbsolutePath()).getParent());
- File temp = createTempFile(parentDir);
+ File temp = fileUtils.createTempFile("replace", ".txt", parentDir);
FileReader r = null;
FileWriter w = null;
@@ -420,13 +423,6 @@ public class ReplaceRegExp extends Task
}
}
- /**
- * Creates a temporary file.
- */
- private File createTempFile(File dir) {
- return new File(dir, "replace" + (new Random(System.currentTimeMillis())).nextLong()+".txt");
- }
-
}
diff --git a/src/main/org/apache/tools/ant/util/FileUtils.java b/src/main/org/apache/tools/ant/util/FileUtils.java
index ad5867f26..560f008bb 100644
--- a/src/main/org/apache/tools/ant/util/FileUtils.java
+++ b/src/main/org/apache/tools/ant/util/FileUtils.java
@@ -63,8 +63,10 @@ import java.io.FileWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.lang.reflect.Method;
-import java.util.StringTokenizer;
+import java.text.DecimalFormat;
+import java.util.Random;
import java.util.Stack;
+import java.util.StringTokenizer;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
@@ -79,9 +81,12 @@ import org.apache.tools.ant.types.FilterSetCollection;
* @author duncan@x180.com
* @author Conor MacNeill
* @author Stefan Bodewig
+ *
+ * @version $Revision$
*/
public class FileUtils {
+ private static Random rand = new Random(System.currentTimeMillis());
private static Object lockReflection = new Object();
private static java.lang.reflect.Method setLastModified = null;
@@ -467,5 +472,37 @@ public class FileUtils {
}
return new File(path);
}
+
+ /**
+ * Create a temporary file in a given directory.
+ *
+ *
The file denoted by the returned abstract pathname did not
+ * exist before this method was invoked, any subsequent invocation
+ * of this method will yield a different file name.
+ *
+ * This method is different to File.createTempFile of JDK 1.2
+ * as it doesn't create the file itself and doesn't use platform
+ * specific temporary directory when the parentDir attribute is
+ * null.
+ *
+ * @param parentDir Directory to create the temporary file in -
+ * current working directory will be assumed if this parameter is
+ * null.
+ *
+ * @since 1.8
+ */
+ public File createTempFile(String prefix, String suffix, File parentDir) {
+
+ File result = null;
+ DecimalFormat fmt = new DecimalFormat("#####");
+ synchronized (rand) {
+ do {
+ result = new File(parentDir,
+ prefix + fmt.format(rand.nextInt())
+ + suffix);
+ } while (result.exists());
+ }
+ return result;
+ }
}
diff --git a/src/testcases/org/apache/tools/ant/util/FileUtilsTest.java b/src/testcases/org/apache/tools/ant/util/FileUtilsTest.java
index 4da6fcbb8..8227c973a 100644
--- a/src/testcases/org/apache/tools/ant/util/FileUtilsTest.java
+++ b/src/testcases/org/apache/tools/ant/util/FileUtilsTest.java
@@ -273,6 +273,31 @@ public class FileUtilsTest extends TestCase {
assertEquals(f, new File("a"));
}
+ /**
+ * Test createTempFile
+ */
+ public void testCreateTempFile() {
+ File parent = new File((new File("/tmp")).getAbsolutePath());
+ File tmp1 = fu.createTempFile("pre", ".suf", parent);
+ assertTrue("new file", !tmp1.exists());
+
+ String name = tmp1.getName();
+ assertTrue("starts with pre", name.startsWith("pre"));
+ assertTrue("ends with .suf", name.endsWith(".suf"));
+ assertEquals("is inside parent dir",
+ parent.getAbsolutePath(),
+ tmp1.getParent());
+
+ File tmp2 = fu.createTempFile("pre", ".suf", parent);
+ assertTrue("files are different",
+ !tmp1.getAbsolutePath().equals(tmp2.getAbsolutePath()));
+
+ // null parent dir
+ File tmp3 = fu.createTempFile("pre", ".suf", null);
+ assertEquals((new File(tmp3.getName())).getAbsolutePath(),
+ tmp3.getAbsolutePath());
+ }
+
/**
* adapt file separators to local conventions
*/