@@ -23,11 +23,10 @@ import java.io.BufferedWriter;
import java.io.File;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Reader;
import java.io.Writer;
import java.io.Writer;
@@ -351,8 +350,9 @@ public class Replace extends MatchingTask {
* a StringBuffer. Compatible with the Replacefilter.
* a StringBuffer. Compatible with the Replacefilter.
* @since 1.7
* @since 1.7
*/
*/
private class FileInput {
private class FileInput /* JDK 5: implements Closeable */ {
private StringBuffer outputBuffer;
private StringBuffer outputBuffer;
private final InputStream is;
private Reader reader;
private Reader reader;
private char[] buffer;
private char[] buffer;
private static final int BUFF_SIZE = 4096;
private static final int BUFF_SIZE = 4096;
@@ -365,11 +365,13 @@ public class Replace extends MatchingTask {
FileInput(File source) throws IOException {
FileInput(File source) throws IOException {
outputBuffer = new StringBuffer();
outputBuffer = new StringBuffer();
buffer = new char[BUFF_SIZE];
buffer = new char[BUFF_SIZE];
if (encoding == null) {
reader = new BufferedReader(new FileReader(source));
} else {
reader = new BufferedReader(new InputStreamReader(
new FileInputStream(source), encoding));
is = new FileInputStream(source);
try {
reader = new BufferedReader(encoding != null ? new InputStreamReader(is, encoding) : new InputStreamReader(is));
} finally {
if (reader == null) {
is.close();
}
}
}
}
}
@@ -401,15 +403,8 @@ public class Replace extends MatchingTask {
* Closes the file.
* Closes the file.
* @throws IOException When the file cannot be closed.
* @throws IOException When the file cannot be closed.
*/
*/
void close() throws IOException {
reader.close();
}
/**
* Closes file but doesn't throw exception
*/
void closeQuietly() {
FileUtils.close(reader);
public void close() throws IOException {
is.close();
}
}
}
}
@@ -419,8 +414,9 @@ public class Replace extends MatchingTask {
* Replacefilter.
* Replacefilter.
* @since 1.7
* @since 1.7
*/
*/
private class FileOutput {
private class FileOutput /* JDK 5: implements Closeable */ {
private StringBuffer inputBuffer;
private StringBuffer inputBuffer;
private final OutputStream os;
private Writer writer;
private Writer writer;
/**
/**
@@ -429,12 +425,14 @@ public class Replace extends MatchingTask {
* @throws IOException When the file cannot be read from.
* @throws IOException When the file cannot be read from.
*/
*/
FileOutput(File out) throws IOException {
FileOutput(File out) throws IOException {
if (encoding == null) {
writer = new BufferedWriter(new FileWriter(out));
} else {
writer = new BufferedWriter(new OutputStreamWriter
(new FileOutputStream(out), encoding));
os = new FileOutputStream(out);
try {
writer = new BufferedWriter(encoding != null ? new OutputStreamWriter(os, encoding) : new OutputStreamWriter(os));
} finally {
if (writer == null) {
os.close();
}
}
}
}
}
/**
/**
@@ -475,16 +473,10 @@ public class Replace extends MatchingTask {
* Closes the file.
* Closes the file.
* @throws IOException When the file cannot be closed.
* @throws IOException When the file cannot be closed.
*/
*/
void close() throws IOException {
writer .close();
public void close() throws IOException {
os .close();
}
}
/**
* Closes file but doesn't throw exception
*/
void closeQuietly() {
FileUtils.close(writer);
}
}
}
/**
/**
@@ -665,62 +657,52 @@ public class Replace extends MatchingTask {
+ " doesn't exist", getLocation());
+ " doesn't exist", getLocation());
}
}
File temp = null;
FileInput in = null;
FileOutput out = null;
try {
in = new FileInput(src);
int repCountStart = replaceCount;
logFilterChain(src.getPath());
temp = FILE_UTILS.createTempFile("rep", ".tmp",
try {
File temp = FILE_UTILS.createTempFile("rep", ".tmp",
src.getParentFile(), false, true);
src.getParentFile(), false, true);
out = new FileOutput(temp);
int repCountStart = replaceCount;
logFilterChain(src.getPath());
out.setInputBuffer(buildFilterChain(in.getOutputBuffer()));
while (in.readChunk()) {
if (processFilterChain()) {
out.process();
try {
FileInput in = new FileInput(src);
try {
FileOutput out = new FileOutput(temp);
try {
out.setInputBuffer(buildFilterChain(in.getOutputBuffer()));
while (in.readChunk()) {
if (processFilterChain()) {
out.process();
}
}
flushFilterChain();
out.flush();
} finally {
out.close();
}
} finally {
in.close();
}
}
}
flushFilterChain();
out.flush();
in.close();
in = null;
out.close();
out = null;
boolean changes = (replaceCount != repCountStart);
if (changes) {
fileCount++;
long origLastModified = src.lastModified();
FILE_UTILS.rename(temp, src);
if (preserveLastModified) {
FILE_UTILS.setFileLastModified(src, origLastModified);
boolean changes = (replaceCount != repCountStart);
if (changes) {
fileCount++;
long origLastModified = src.lastModified();
FILE_UTILS.rename(temp, src);
if (preserveLastModified) {
FILE_UTILS.setFileLastModified(src, origLastModified);
}
}
} finally {
if (temp.isFile() && !temp.delete()) {
temp.deleteOnExit();
}
}
temp = null;
}
}
} catch (IOException ioe) {
} catch (IOException ioe) {
throw new BuildException("IOException in " + src + " - "
throw new BuildException("IOException in " + src + " - "
+ ioe.getClass().getName() + ":"
+ ioe.getClass().getName() + ":"
+ ioe.getMessage(), ioe, getLocation());
+ ioe.getMessage(), ioe, getLocation());
} finally {
if (null != in) {
in.closeQuietly();
}
if (null != out) {
out.closeQuietly();
}
if (temp != null) {
if (!temp.delete()) {
temp.deleteOnExit();
}
}
}
}
}
}